编译器
0.8.26+commit.8a97fa7a
文件 1 的 8:Address.sol
pragma solidity ^0.8.20;
library Address {
error AddressInsufficientBalance(address account);
error AddressEmptyCode(address target);
error FailedInnerCall();
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
function _revert(bytes memory returndata) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
文件 2 的 8:Context.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 3 的 8:IOrderStorage.sol
pragma solidity 0.8.26;
import "@envelop-protocol-v2/src/utils/LibET.sol";
interface IOrderStorage {
event EnvelopP2PNewOrder(
bytes32 indexed OrderId,
address indexed OrderMaker,
address indexed AssetAddress,
uint256 TokenId,
uint256 AssetAmount,
address PayToken,
uint256 PayAmount,
uint8 OrderType
);
event EnvelopOrderRemoved(
bytes32 indexed OrderId,
address indexed AssetAddress,
uint256 indexed TokenId,
uint256 AssetAmount,
uint8 OrderType
);
function makeOrder(
ET.AssetItem memory _assetItem,
ET.Price calldata _price,
ET.OrderType _ordeType,
address orderMaker
)
external
returns (bytes32 orderId);
function removeOrder(
bytes32 _orderId,
ET.AssetItem memory _assetItem,
address _orderMaker
) external returns(bool deleted);
function getOrdersForItem(ET.AssetItem memory _assetItem)
external
view
returns(ET.Order[] memory orderList);
function getPriceForOrder(
bytes32 _orderId,
ET.OrderType _orderType,
ET.AssetItem memory _assetItem
)
external view returns(ET.Price memory pr, address payer, address maker);
}
文件 4 的 8:LibET.sol
pragma solidity ^0.8.20;
library ET {
enum AssetType {EMPTY, NATIVE, ERC20, ERC721, ERC1155, FUTURE1, FUTURE2, FUTURE3}
enum OrderType {SELL, BUY, FUTURE1, FUTURE2, FUTURE3, FUTURE4, FUTURE5, FUTURE6}
struct Asset {
AssetType assetType;
address contractAddress;
}
struct AssetItem {
Asset asset;
uint256 tokenId;
uint256 amount;
}
struct Price {
address payToken;
uint256 payAmount;
}
struct Order {
bytes32 orderId;
OrderType orderType;
address orderBook;
address orderMaker;
uint256 amount;
Price price;
bool assetApproveExist;
}
}
文件 5 的 8:Ownable.sol
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 6 的 8:P2POrderManager.sol
pragma solidity 0.8.26;
import "@envelop-protocol-v2/src/utils/TokenService.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./interface/IOrderStorage.sol";
contract P2POrderManager is TokenService, ReentrancyGuard, Ownable {
uint256 public FEE_PERCENT_DENOMINATOR = 10000;
address public immutable FEE_BENEFICIARY;
uint256 public immutable FEE_PERCENT;
mapping(ET.AssetType => address) public orderBooks;
mapping(address => bool) public orderBooksStatus;
event EnvelopP2POrderTaked(
address indexed AssetAddress,
uint256 indexed TokenId,
bytes32 indexed OrderId,
address OrderMaker,
address OrderTaker,
address PayToken,
uint256 PayAmount,
uint8 OrderType
);
error ErrorDeleteOrder(bytes32 OrderId);
constructor (uint256 _feePercent, address _feeBeneficiary)
Ownable(msg.sender)
{
FEE_BENEFICIARY = _feeBeneficiary;
FEE_PERCENT = _feePercent;
}
function makeOrder(
ET.AssetItem memory _assetItem,
ET.Price calldata _price,
ET.OrderType _ordeType
) external returns (bytes32 orderId) {
orderId = IOrderStorage(
orderBooks[_assetItem.asset.assetType]
).makeOrder(_assetItem, _price, _ordeType, msg.sender);
}
function removeOrder(
bytes32 _orderId,
ET.AssetItem memory _assetItem
) external returns(bool deleted){
deleted = IOrderStorage(
orderBooks[_assetItem.asset.assetType]
).removeOrder(_orderId, _assetItem, msg.sender);
}
function takeOrder(
bytes32 _orderId,
address _orderBook,
ET.OrderType _orderType,
ET.AssetItem memory _assetItem
)
external
payable
nonReentrant
{
address _currentAssetOwner = _ownerOf(_assetItem);
require(orderBooksStatus[_orderBook], "OrderBook is not enabled");
(ET.Price memory p, address payer, address maker) = IOrderStorage(
orderBooks[_assetItem.asset.assetType]
).getPriceForOrder(_orderId, _orderType, _assetItem);
if (payer == address(0)) {
payer = msg.sender;
}
if (_orderType == ET.OrderType.BUY) {
require(msg.sender == _currentAssetOwner, "Only asset owner can take BUY order");
}
if (!
IOrderStorage(_orderBook).removeOrder(
_orderId,
_assetItem,
maker
)
) {
revert ErrorDeleteOrder(_orderId);
}
uint256 change;
if (p.payToken == address(0)) {
change = msg.value - p.payAmount;
}
uint256 feeAmount = p.payAmount * FEE_PERCENT/ (100 * FEE_PERCENT_DENOMINATOR);
if (FEE_BENEFICIARY != address(0)){
p.payAmount -= _transferSafe(
ET.AssetItem(
ET.Asset(
p.payToken == address(0) ? ET.AssetType.NATIVE : ET.AssetType.ERC20,
p.payToken
), 0, feeAmount
),
payer,
FEE_BENEFICIARY
);
}
_transfer(
ET.AssetItem(
ET.Asset(
p.payToken == address(0) ? ET.AssetType.NATIVE : ET.AssetType.ERC20,
p.payToken
), 0, p.payAmount
), payer, _currentAssetOwner
);
_transfer(_assetItem, _currentAssetOwner, payer);
if (change > 0) {
address payable s = payable(payer);
s.transfer(change);
}
emit EnvelopP2POrderTaked(
_assetItem.asset.contractAddress,
_assetItem.tokenId,
_orderId,
maker,
msg.sender,
p.payToken,
p.payAmount,
uint8(_orderType)
);
}
function setOrderBookAddressForAssetType(
ET.AssetType _contractType,
address _orderBookAddress
)
external onlyOwner
{
require(_orderBookAddress != address(0), "No Zero address");
orderBooks[_contractType] = _orderBookAddress;
orderBooksStatus[_orderBookAddress] = true;
}
function setOrderBookStatus(
address _orderBookAddress,
bool _status
)
external onlyOwner
{
require(_orderBookAddress != address(0), "No Zero address");
orderBooksStatus[_orderBookAddress] = _status;
}
function getOrdersForItem(ET.AssetItem memory _assetItem)
external view returns(ET.Order[] memory orderList)
{
return IOrderStorage(
orderBooks[_assetItem.asset.assetType]
).getOrdersForItem(_assetItem);
}
}
文件 7 的 8:ReentrancyGuard.sol
pragma solidity ^0.8.20;
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
_status = ENTERED;
}
function _nonReentrantAfter() private {
_status = NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
文件 8 的 8:TokenService.sol
pragma solidity ^0.8.20;
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import "./LibET.sol";
abstract contract TokenService {
using Address for address;
error UnSupportedAsset(ET.AssetItem asset);
error TokenTransferFailed(address assetAddress);
function _getTransferTxData(
ET.AssetItem memory _assetItem,
address _from,
address _to
) internal view returns(bytes memory _calldata) {
if (_assetItem.asset.assetType == ET.AssetType.NATIVE) {
} else if (_assetItem.asset.assetType == ET.AssetType.ERC20) {
if (_from == address(this)){
_calldata = abi.encodeWithSignature("transfer(address,uint256)", _to, _assetItem.amount);
} else {
_calldata = abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _assetItem.amount);
}
} else if (_assetItem.asset.assetType == ET.AssetType.ERC721) {
_calldata = abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _assetItem.tokenId);
} else if (_assetItem.asset.assetType == ET.AssetType.ERC1155) {
_calldata = abi.encodeWithSignature("safeTransferFrom(address,address,uint256,uint256,bytes)",
_from, _to, _assetItem.tokenId, _assetItem.amount, bytes(''));
} else {
revert UnSupportedAsset(_assetItem);
}
}
function _transferEmergency(
ET.AssetItem memory _assetItem,
address _from,
address _to
) internal virtual returns (bytes memory _returndata){
bytes memory transferCallData;
if (_assetItem.asset.assetType == ET.AssetType.NATIVE) {
Address.sendValue(payable(_to), _assetItem.amount);
} else {
transferCallData = _getTransferTxData(_assetItem, _from, _to);
_returndata = _assetItem.asset.contractAddress.functionCall(
transferCallData);
}
}
function _transfer(
ET.AssetItem memory _assetItem,
address _from,
address _to
) internal virtual returns (bytes memory returndata) {
returndata = _transferEmergency(_assetItem, _from, _to);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert TokenTransferFailed(_assetItem.asset.contractAddress);
}
}
function _transferSafe(
ET.AssetItem memory _assetItem,
address _from,
address _to
) internal virtual returns (uint256 _transferedValue){
uint256 balanceBefore;
if (_assetItem.asset.assetType == ET.AssetType.NATIVE) {
balanceBefore = _to.balance;
_transfer(_assetItem, _from, _to);
_transferedValue = _to.balance - balanceBefore;
} else if (_assetItem.asset.assetType == ET.AssetType.ERC20) {
balanceBefore = _balanceOf(_assetItem, _to);
_transfer(_assetItem, _from, _to);
_transferedValue = _balanceOf(_assetItem, _to) - balanceBefore;
} else if (_assetItem.asset.assetType == ET.AssetType.ERC721 && _ownerOf(_assetItem) == _from){
balanceBefore = _balanceOf(_assetItem, _to);
_transfer(_assetItem, _from, _to);
if (_ownerOf(_assetItem) == _to && _balanceOf(_assetItem, _to) - balanceBefore == 1) {
_transferedValue = 1;
}
} else if (_assetItem.asset.assetType == ET.AssetType.ERC1155) {
balanceBefore = _balanceOf(_assetItem, _to);
_transfer(_assetItem, _from, _to);
_transferedValue = _balanceOf(_assetItem, _to) - balanceBefore;
} else {
revert UnSupportedAsset(_assetItem);
}
return _transferedValue;
}
function _balanceOf(
ET.AssetItem memory _assetItem,
address _holder
) internal view virtual returns (uint256 _balance){
bytes memory _calldata;
bytes memory _returnedData;
if (_assetItem.asset.assetType == ET.AssetType.NATIVE) {
_balance = _holder.balance;
} else if (_assetItem.asset.assetType == ET.AssetType.ERC20) {
_calldata = abi.encodeWithSignature("balanceOf(address)", _holder);
} else if (_assetItem.asset.assetType == ET.AssetType.ERC721) {
_calldata = abi.encodeWithSignature("balanceOf(address)", _holder);
} else if (_assetItem.asset.assetType == ET.AssetType.ERC1155) {
_calldata = abi.encodeWithSignature("balanceOf(address,uint256)", _holder, _assetItem.tokenId);
} else {
revert UnSupportedAsset(_assetItem);
}
if (_assetItem.asset.assetType != ET.AssetType.NATIVE) {
_returnedData = _assetItem.asset.contractAddress.functionStaticCall(_calldata);
_balance = abi.decode(_returnedData, (uint256));
}
}
function _ownerOf(
ET.AssetItem memory _assetItem
) internal view virtual returns (address _owner){
if (_assetItem.asset.assetType == ET.AssetType.NATIVE) {
_owner = address(0);
} else if (_assetItem.asset.assetType == ET.AssetType.ERC20) {
_owner = address(0);
} else if (_assetItem.asset.assetType == ET.AssetType.ERC721) {
bytes memory _calldata = abi.encodeWithSignature("ownerOf(uint256)", _assetItem.tokenId);
bytes memory _returnedData = _assetItem.asset.contractAddress.functionStaticCall(_calldata);
_owner = abi.decode(_returnedData, (address));
} else if (_assetItem.asset.assetType == ET.AssetType.ERC1155) {
_owner = address(0);
} else {
revert UnSupportedAsset(_assetItem);
}
}
function _isApprovedFor(
ET.AssetItem memory _assetItem,
address _owner,
address _spender
) internal view virtual returns (uint256 _approvedBalance){
bytes memory _calldata;
bytes memory _returnedData;
if (_assetItem.asset.assetType == ET.AssetType.NATIVE) {
_approvedBalance = 0;
} else if (_assetItem.asset.assetType == ET.AssetType.ERC20) {
_calldata = abi.encodeWithSignature("allowance(address,address)", _owner, _spender);
_returnedData = _assetItem.asset.contractAddress.functionStaticCall(_calldata);
_approvedBalance = abi.decode(_returnedData, (uint256));
} else if (_assetItem.asset.assetType == ET.AssetType.ERC721) {
_calldata = abi.encodeWithSignature("isApprovedForAll(address,address)", _owner, _spender);
_returnedData = _assetItem.asset.contractAddress.functionStaticCall(_calldata);
if (abi.decode(_returnedData, (bool))) {
_approvedBalance = 1;
} else {
_calldata = abi.encodeWithSignature("getApproved(uint256)", _assetItem.tokenId);
_returnedData = _assetItem.asset.contractAddress.functionStaticCall(_calldata);
address _spndr = abi.decode(_returnedData, (address));
if (_spndr == _spender){
_approvedBalance = 1;
}
}
} else if (_assetItem.asset.assetType == ET.AssetType.ERC1155) {
_calldata = abi.encodeWithSignature("isApprovedForAll(address,address)", _owner, _spender);
_returnedData = _assetItem.asset.contractAddress.functionStaticCall(_calldata);
if (abi.decode(_returnedData, (bool))) {
_approvedBalance = 1;
}
} else {
revert UnSupportedAsset(_assetItem);
}
}
}
{
"compilationTarget": {
"src/P2POrderManager.sol": "P2POrderManager"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@envelop-protocol-v2/=lib/envelop-protocol-v2/",
":@openzeppelin/=lib/openzeppelin-contracts/",
":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
":@uniswap/=lib/",
":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
":envelop-protocol-v2/=lib/envelop-protocol-v2/",
":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/"
]
}
[{"inputs":[{"internalType":"uint256","name":"_feePercent","type":"uint256"},{"internalType":"address","name":"_feeBeneficiary","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"bytes32","name":"OrderId","type":"bytes32"}],"name":"ErrorDeleteOrder","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"assetAddress","type":"address"}],"name":"TokenTransferFailed","type":"error"},{"inputs":[{"components":[{"components":[{"internalType":"enum ET.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ET.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ET.AssetItem","name":"asset","type":"tuple"}],"name":"UnSupportedAsset","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"AssetAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"TokenId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"OrderId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"OrderMaker","type":"address"},{"indexed":false,"internalType":"address","name":"OrderTaker","type":"address"},{"indexed":false,"internalType":"address","name":"PayToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"PayAmount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"OrderType","type":"uint8"}],"name":"EnvelopP2POrderTaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"FEE_BENEFICIARY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_PERCENT_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ET.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ET.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ET.AssetItem","name":"_assetItem","type":"tuple"}],"name":"getOrdersForItem","outputs":[{"components":[{"internalType":"bytes32","name":"orderId","type":"bytes32"},{"internalType":"enum ET.OrderType","name":"orderType","type":"uint8"},{"internalType":"address","name":"orderBook","type":"address"},{"internalType":"address","name":"orderMaker","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint256","name":"payAmount","type":"uint256"}],"internalType":"struct ET.Price","name":"price","type":"tuple"},{"internalType":"bool","name":"assetApproveExist","type":"bool"}],"internalType":"struct ET.Order[]","name":"orderList","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ET.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ET.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ET.AssetItem","name":"_assetItem","type":"tuple"},{"components":[{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint256","name":"payAmount","type":"uint256"}],"internalType":"struct ET.Price","name":"_price","type":"tuple"},{"internalType":"enum ET.OrderType","name":"_ordeType","type":"uint8"}],"name":"makeOrder","outputs":[{"internalType":"bytes32","name":"orderId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ET.AssetType","name":"","type":"uint8"}],"name":"orderBooks","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"orderBooksStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_orderId","type":"bytes32"},{"components":[{"components":[{"internalType":"enum ET.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ET.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ET.AssetItem","name":"_assetItem","type":"tuple"}],"name":"removeOrder","outputs":[{"internalType":"bool","name":"deleted","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ET.AssetType","name":"_contractType","type":"uint8"},{"internalType":"address","name":"_orderBookAddress","type":"address"}],"name":"setOrderBookAddressForAssetType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_orderBookAddress","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setOrderBookStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_orderId","type":"bytes32"},{"internalType":"address","name":"_orderBook","type":"address"},{"internalType":"enum ET.OrderType","name":"_orderType","type":"uint8"},{"components":[{"components":[{"internalType":"enum ET.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ET.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ET.AssetItem","name":"_assetItem","type":"tuple"}],"name":"takeOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]