文件 1 的 71:AddressUpgradeable.sol
pragma solidity >=0.6.2 <0.8.0;
library AddressUpgradeable {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 71:AssetMatcher.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/exchange-interfaces/contracts/IAssetMatcher.sol";
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
abstract contract AssetMatcher is Initializable, OwnableUpgradeable {
bytes constant EMPTY = "";
mapping(bytes4 => address) internal matchers;
event MatcherChange(bytes4 indexed assetType, address matcher);
function setAssetMatcher(bytes4 assetType, address matcher) external onlyOwner {
matchers[assetType] = matcher;
emit MatcherChange(assetType, matcher);
}
function matchAssets(LibAsset.AssetType memory leftAssetType, LibAsset.AssetType memory rightAssetType) internal view returns (LibAsset.AssetType memory) {
LibAsset.AssetType memory result = matchAssetOneSide(leftAssetType, rightAssetType);
if (result.assetClass == 0) {
return matchAssetOneSide(rightAssetType, leftAssetType);
} else {
return result;
}
}
function matchAssetOneSide(LibAsset.AssetType memory leftAssetType, LibAsset.AssetType memory rightAssetType) private view returns (LibAsset.AssetType memory) {
bytes4 classLeft = leftAssetType.assetClass;
bytes4 classRight = rightAssetType.assetClass;
if (classLeft == LibAsset.ETH_ASSET_CLASS) {
if (classRight == LibAsset.ETH_ASSET_CLASS) {
return leftAssetType;
}
return LibAsset.AssetType(0, EMPTY);
}
if (classLeft == LibAsset.ERC20_ASSET_CLASS) {
if (classRight == LibAsset.ERC20_ASSET_CLASS) {
return simpleMatch(leftAssetType, rightAssetType);
}
return LibAsset.AssetType(0, EMPTY);
}
if (classLeft == LibAsset.ERC721_ASSET_CLASS) {
if (classRight == LibAsset.ERC721_ASSET_CLASS) {
return simpleMatch(leftAssetType, rightAssetType);
}
return LibAsset.AssetType(0, EMPTY);
}
if (classLeft == LibAsset.ERC1155_ASSET_CLASS) {
if (classRight == LibAsset.ERC1155_ASSET_CLASS) {
return simpleMatch(leftAssetType, rightAssetType);
}
return LibAsset.AssetType(0, EMPTY);
}
address matcher = matchers[classLeft];
if (matcher != address(0)) {
return IAssetMatcher(matcher).matchAssets(leftAssetType, rightAssetType);
}
if (classLeft == classRight) {
return simpleMatch(leftAssetType, rightAssetType);
}
revert("not found IAssetMatcher");
}
function simpleMatch(LibAsset.AssetType memory leftAssetType, LibAsset.AssetType memory rightAssetType) private pure returns (LibAsset.AssetType memory) {
bytes32 leftHash = keccak256(leftAssetType.data);
bytes32 rightHash = keccak256(rightAssetType.data);
if (leftHash == rightHash) {
return leftAssetType;
}
return LibAsset.AssetType(0, EMPTY);
}
uint256[49] private __gap;
}
文件 3 的 71:BpLibrary.sol
pragma solidity 0.7.6;
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
library BpLibrary {
using SafeMathUpgradeable for uint;
function bp(uint value, uint bpValue) internal pure returns (uint) {
return value.mul(bpValue).div(10000);
}
}
文件 4 的 71:Context.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 5 的 71:ContextUpgradeable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../proxy/Initializable.sol";
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
uint256[50] private __gap;
}
文件 6 的 71:EIP712Upgradeable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../proxy/Initializable.sol";
abstract contract EIP712Upgradeable is Initializable {
bytes32 private _HASHED_NAME;
bytes32 private _HASHED_VERSION;
bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
function __EIP712_init(string memory name, string memory version) internal initializer {
__EIP712_init_unchained(name, version);
}
function __EIP712_init_unchained(string memory name, string memory version) internal initializer {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
}
function _domainSeparatorV4() internal view returns (bytes32) {
return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());
}
function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
return keccak256(
abi.encode(
typeHash,
name,
version,
_getChainId(),
address(this)
)
);
}
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", _domainSeparatorV4(), structHash));
}
function _getChainId() private view returns (uint256 chainId) {
this;
assembly {
chainId := chainid()
}
}
function _EIP712NameHash() internal virtual view returns (bytes32) {
return _HASHED_NAME;
}
function _EIP712VersionHash() internal virtual view returns (bytes32) {
return _HASHED_VERSION;
}
uint256[50] private __gap;
}
文件 7 的 71:ERC1155Holder.sol
pragma solidity >=0.6.0 <0.8.0;
import "./ERC1155Receiver.sol";
contract ERC1155Holder is ERC1155Receiver {
function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
文件 8 的 71:ERC1155Receiver.sol
pragma solidity >=0.6.0 <0.8.0;
import "./IERC1155Receiver.sol";
import "../../introspection/ERC165.sol";
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
constructor() internal {
_registerInterface(
ERC1155Receiver(address(0)).onERC1155Received.selector ^
ERC1155Receiver(address(0)).onERC1155BatchReceived.selector
);
}
}
文件 9 的 71:ERC165.sol
pragma solidity >=0.6.0 <0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
mapping(bytes4 => bool) private _supportedInterfaces;
constructor () internal {
_registerInterface(_INTERFACE_ID_ERC165);
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return _supportedInterfaces[interfaceId];
}
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}
文件 10 的 71:ERC20TransferProxy.sol
pragma solidity >=0.6.9 <0.8.0;
import "@rarible/role-operator/contracts/OperatorRole.sol";
import "@rarible/exchange-interfaces/contracts/IERC20TransferProxy.sol";
contract ERC20TransferProxy is IERC20TransferProxy, Initializable, OperatorRole {
function __ERC20TransferProxy_init() external initializer {
__Ownable_init();
}
function erc20safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) override external onlyOperator {
require(token.transferFrom(from, to, value), "failure while transferring");
}
}
文件 11 的 71:ERC721Holder.sol
pragma solidity >=0.6.0 <0.8.0;
import "./IERC721Receiver.sol";
contract ERC721Holder is IERC721Receiver {
function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}
文件 12 的 71:ExchangeV2.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "./ExchangeV2Core.sol";
import "@rarible/transfer-manager/contracts/RaribleTransferManager.sol";
contract ExchangeV2 is ExchangeV2Core, RaribleTransferManager {
function __ExchangeV2_init(
address _transferProxy,
address _erc20TransferProxy,
uint newProtocolFee,
address newDefaultFeeReceiver,
IRoyaltiesProvider newRoyaltiesProvider
) external initializer {
__Context_init_unchained();
__Ownable_init_unchained();
__TransferExecutor_init_unchained(_transferProxy, _erc20TransferProxy);
__RaribleTransferManager_init_unchained(newProtocolFee, newDefaultFeeReceiver, newRoyaltiesProvider);
__OrderValidator_init_unchained();
}
}
文件 13 的 71:ExchangeV2Core.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "./libraries/LibFill.sol";
import "./libraries/LibOrderData.sol";
import "./libraries/LibDirectTransfer.sol";
import "./OrderValidator.sol";
import "./AssetMatcher.sol";
import "@rarible/transfer-manager/contracts/TransferExecutor.sol";
import "@rarible/transfer-manager/contracts/interfaces/ITransferManager.sol";
import "@rarible/transfer-manager/contracts/lib/LibDeal.sol";
abstract contract ExchangeV2Core is Initializable, OwnableUpgradeable, AssetMatcher, TransferExecutor, OrderValidator, ITransferManager {
using SafeMathUpgradeable for uint;
using LibTransfer for address;
uint256 private constant UINT256_MAX = type(uint256).max;
mapping(bytes32 => uint) public fills;
event Cancel(bytes32 hash);
event Match(bytes32 leftHash, bytes32 rightHash, uint newLeftFill, uint newRightFill);
function cancel(LibOrder.Order memory order) external {
require(_msgSender() == order.maker, "not a maker");
require(order.salt != 0, "0 salt can't be used");
bytes32 orderKeyHash = LibOrder.hashKey(order);
fills[orderKeyHash] = UINT256_MAX;
emit Cancel(orderKeyHash);
}
function directPurchase(
LibDirectTransfer.Purchase calldata direct
) external payable{
LibAsset.AssetType memory paymentAssetType = getPaymentAssetType(direct.paymentToken);
LibOrder.Order memory sellOrder = LibOrder.Order(
direct.sellOrderMaker,
LibAsset.Asset(
LibAsset.AssetType(
direct.nftAssetClass,
direct.nftData
),
direct.sellOrderNftAmount
),
address(0),
LibAsset.Asset(
paymentAssetType,
direct.sellOrderPaymentAmount
),
direct.sellOrderSalt,
direct.sellOrderStart,
direct.sellOrderEnd,
direct.sellOrderDataType,
direct.sellOrderData
);
LibOrder.Order memory buyOrder = LibOrder.Order(
address(0),
LibAsset.Asset(
paymentAssetType,
direct.buyOrderPaymentAmount
),
address(0),
LibAsset.Asset(
LibAsset.AssetType(
direct.nftAssetClass,
direct.nftData
),
direct.buyOrderNftAmount
),
0,
0,
0,
direct.sellOrderDataType,
direct.buyOrderData
);
validateFull(sellOrder, direct.sellOrderSignature);
matchAndTransfer(sellOrder, buyOrder);
}
function directAcceptBid(
LibDirectTransfer.AcceptBid calldata direct
) external payable {
LibAsset.AssetType memory paymentAssetType = getPaymentAssetType(direct.paymentToken);
LibOrder.Order memory buyOrder = LibOrder.Order(
direct.bidMaker,
LibAsset.Asset(
paymentAssetType,
direct.bidPaymentAmount
),
address(0),
LibAsset.Asset(
LibAsset.AssetType(
direct.nftAssetClass,
direct.nftData
),
direct.bidNftAmount
),
direct.bidSalt,
direct.bidStart,
direct.bidEnd,
direct.bidDataType,
direct.bidData
);
LibOrder.Order memory sellOrder = LibOrder.Order(
address(0),
LibAsset.Asset(
LibAsset.AssetType(
direct.nftAssetClass,
direct.nftData
),
direct.sellOrderNftAmount
),
address(0),
LibAsset.Asset(
paymentAssetType,
direct.sellOrderPaymentAmount
),
0,
0,
0,
direct.bidDataType,
direct.sellOrderData
);
validateFull(buyOrder, direct.bidSignature);
matchAndTransfer(sellOrder, buyOrder);
}
function matchOrders(
LibOrder.Order memory orderLeft,
bytes memory signatureLeft,
LibOrder.Order memory orderRight,
bytes memory signatureRight
) external payable {
validateOrders(orderLeft, signatureLeft, orderRight, signatureRight);
matchAndTransfer(orderLeft, orderRight);
}
function validateOrders(LibOrder.Order memory orderLeft, bytes memory signatureLeft, LibOrder.Order memory orderRight, bytes memory signatureRight) internal view {
validateFull(orderLeft, signatureLeft);
validateFull(orderRight, signatureRight);
if (orderLeft.taker != address(0)) {
if (orderRight.maker != address(0))
require(orderRight.maker == orderLeft.taker, "leftOrder.taker verification failed");
}
if (orderRight.taker != address(0)) {
if (orderLeft.maker != address(0))
require(orderRight.taker == orderLeft.maker, "rightOrder.taker verification failed");
}
}
function matchAndTransfer(LibOrder.Order memory orderLeft, LibOrder.Order memory orderRight) internal {
(LibAsset.AssetType memory makeMatch, LibAsset.AssetType memory takeMatch) = matchAssets(orderLeft, orderRight);
(LibOrderData.GenericOrderData memory leftOrderData, LibOrderData.GenericOrderData memory rightOrderData, LibFill.FillResult memory newFill) =
parseOrdersSetFillEmitMatch(orderLeft, orderRight);
(uint totalMakeValue, uint totalTakeValue) = doTransfers(
LibDeal.DealSide({
asset: LibAsset.Asset({
assetType: makeMatch,
value: newFill.leftValue
}),
payouts: leftOrderData.payouts,
originFees: leftOrderData.originFees,
proxy: proxies[makeMatch.assetClass],
from: orderLeft.maker
}),
LibDeal.DealSide({
asset: LibAsset.Asset(
takeMatch,
newFill.rightValue
),
payouts: rightOrderData.payouts,
originFees: rightOrderData.originFees,
proxy: proxies[takeMatch.assetClass],
from: orderRight.maker
}),
LibFeeSide.getFeeSide(makeMatch.assetClass, takeMatch.assetClass)
);
if (makeMatch.assetClass == LibAsset.ETH_ASSET_CLASS) {
require(takeMatch.assetClass != LibAsset.ETH_ASSET_CLASS);
require(msg.value >= totalMakeValue, "not enough eth");
if (msg.value > totalMakeValue) {
address(msg.sender).transferEth(msg.value.sub(totalMakeValue));
}
} else if (takeMatch.assetClass == LibAsset.ETH_ASSET_CLASS) {
require(msg.value >= totalTakeValue, "not enough eth");
if (msg.value > totalTakeValue) {
address(msg.sender).transferEth(msg.value.sub(totalTakeValue));
}
}
}
function parseOrdersSetFillEmitMatch(
LibOrder.Order memory orderLeft,
LibOrder.Order memory orderRight
) internal returns (LibOrderData.GenericOrderData memory leftOrderData, LibOrderData.GenericOrderData memory rightOrderData, LibFill.FillResult memory newFill) {
bytes32 leftOrderKeyHash = LibOrder.hashKey(orderLeft);
bytes32 rightOrderKeyHash = LibOrder.hashKey(orderRight);
address msgSender = _msgSender();
if (orderLeft.maker == address(0)) {
orderLeft.maker = msgSender;
}
if (orderRight.maker == address(0)) {
orderRight.maker = msgSender;
}
leftOrderData = LibOrderData.parse(orderLeft);
rightOrderData = LibOrderData.parse(orderRight);
newFill = setFillEmitMatch(
orderLeft,
orderRight,
leftOrderKeyHash,
rightOrderKeyHash,
leftOrderData.isMakeFill,
rightOrderData.isMakeFill
);
}
function setFillEmitMatch(
LibOrder.Order memory orderLeft,
LibOrder.Order memory orderRight,
bytes32 leftOrderKeyHash,
bytes32 rightOrderKeyHash,
bool leftMakeFill,
bool rightMakeFill
) internal returns (LibFill.FillResult memory) {
uint leftOrderFill = getOrderFill(orderLeft.salt, leftOrderKeyHash);
uint rightOrderFill = getOrderFill(orderRight.salt, rightOrderKeyHash);
LibFill.FillResult memory newFill = LibFill.fillOrder(orderLeft, orderRight, leftOrderFill, rightOrderFill, leftMakeFill, rightMakeFill);
if (orderLeft.makeAsset.value != 0 || orderRight.takeAsset.value != 0) {
require(newFill.leftValue > 0, "nothing to fill");
}
if (orderLeft.takeAsset.value != 0 || orderRight.makeAsset.value != 0) {
require(newFill.rightValue > 0, "nothing to fill");
}
if (orderLeft.salt != 0) {
if (leftMakeFill) {
fills[leftOrderKeyHash] = leftOrderFill.add(newFill.leftValue);
} else {
fills[leftOrderKeyHash] = leftOrderFill.add(newFill.rightValue);
}
}
if (orderRight.salt != 0) {
if (rightMakeFill) {
fills[rightOrderKeyHash] = rightOrderFill.add(newFill.rightValue);
} else {
fills[rightOrderKeyHash] = rightOrderFill.add(newFill.leftValue);
}
}
emit Match(leftOrderKeyHash, rightOrderKeyHash, newFill.rightValue, newFill.leftValue);
return newFill;
}
function getOrderFill(uint salt, bytes32 hash) internal view returns (uint fill) {
if (salt == 0) {
fill = 0;
} else {
fill = fills[hash];
}
}
function matchAssets(LibOrder.Order memory orderLeft, LibOrder.Order memory orderRight) internal view returns (LibAsset.AssetType memory makeMatch, LibAsset.AssetType memory takeMatch) {
makeMatch = matchAssets(orderLeft.makeAsset.assetType, orderRight.takeAsset.assetType);
require(makeMatch.assetClass != 0, "assets don't match");
takeMatch = matchAssets(orderLeft.takeAsset.assetType, orderRight.makeAsset.assetType);
require(takeMatch.assetClass != 0, "assets don't match");
}
function validateFull(LibOrder.Order memory order, bytes memory signature) internal view {
LibOrder.validateOrderTime(order);
validate(order, signature);
}
function getPaymentAssetType(address token) internal pure returns(LibAsset.AssetType memory){
LibAsset.AssetType memory result;
if(token == address(0)) {
result.assetClass = LibAsset.ETH_ASSET_CLASS;
} else {
result.assetClass = LibAsset.ERC20_ASSET_CLASS;
result.data = abi.encode(token);
}
return result;
}
uint256[49] private __gap;
}
文件 14 的 71:IAssetMatcher.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-asset/contracts/LibAsset.sol";
interface IAssetMatcher {
function matchAssets(
LibAsset.AssetType memory leftAssetType,
LibAsset.AssetType memory rightAssetType
) external view returns (LibAsset.AssetType memory);
}
文件 15 的 71:IBlur.sol
pragma solidity 0.7.6;
pragma abicoder v2;
interface IBlur {
enum Side { Buy, Sell }
enum SignatureVersion { Single, Bulk }
enum AssetType { ERC721, ERC1155 }
struct Fee {
uint16 rate;
address payable recipient;
}
struct Order {
address trader;
Side side;
address matchingPolicy;
address collection;
uint256 tokenId;
uint256 amount;
address paymentToken;
uint256 price;
uint256 listingTime;
uint256 expirationTime;
Fee[] fees;
uint256 salt;
bytes extraParams;
}
struct Input {
Order order;
uint8 v;
bytes32 r;
bytes32 s;
bytes extraSignature;
SignatureVersion signatureVersion;
uint256 blockNumber;
}
function execute(Input calldata sell, Input calldata buy)
external
payable;
}
文件 16 的 71:IERC1155Receiver.sol
pragma solidity >=0.6.0 <0.8.0;
import "../../introspection/IERC165.sol";
interface IERC1155Receiver is IERC165 {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
returns(bytes4);
}
文件 17 的 71:IERC1155Upgradeable.sol
pragma solidity >=0.6.2 <0.8.0;
import "../../introspection/IERC165Upgradeable.sol";
interface IERC1155Upgradeable is IERC165Upgradeable {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}
文件 18 的 71:IERC1271.sol
pragma solidity 0.7.6;
interface IERC1271 {
function isValidSignature(bytes32 _hash, bytes calldata _signature) virtual external view returns (bytes4 magicValue);
}
文件 19 的 71:IERC165.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 20 的 71:IERC165Upgradeable.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC165Upgradeable {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 21 的 71:IERC20TransferProxy.sol
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
interface IERC20TransferProxy {
function erc20safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) external;
}
文件 22 的 71:IERC20Upgradeable.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC20Upgradeable {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 23 的 71:IERC2981.sol
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
interface IERC2981 {
function royaltyInfo(
uint256 _tokenId,
uint256 _salePrice
) external view returns (
address receiver,
uint256 royaltyAmount
);
}
文件 24 的 71:IERC721Receiver.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC721Receiver {
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
文件 25 的 71:IERC721Upgradeable.sol
pragma solidity >=0.6.2 <0.8.0;
import "../../introspection/IERC165Upgradeable.sol";
interface IERC721Upgradeable is IERC165Upgradeable {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
文件 26 的 71:IExchangeV2.sol
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "@rarible/exchange-v2/contracts/ExchangeV2.sol";
import {RoyaltiesRegistry} from "@rarible/royalties-registry/contracts/RoyaltiesRegistry.sol";
import {TransferProxy} from "@rarible/transfer-proxy/contracts/proxy/TransferProxy.sol";
import {ERC20TransferProxy} from "@rarible/transfer-proxy/contracts/proxy/ERC20TransferProxy.sol";
interface IExchangeV2 {
function matchOrders(
LibOrder.Order memory orderLeft,
bytes memory signatureLeft,
LibOrder.Order memory orderRight,
bytes memory signatureRight
) external payable;
function directPurchase(
LibDirectTransfer.Purchase calldata direct
) external payable;
}
文件 27 的 71:ILooksRare.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "../libraries/LibLooksRare.sol";
interface ILooksRare {
function matchAskWithTakerBidUsingETHAndWETH(LibLooksRare.TakerOrder calldata takerBid, LibLooksRare.MakerOrder calldata makerAsk) external payable;
function executeTakerBid(LibLooksRare.Taker calldata takerBid, LibLooksRare.Maker calldata makerAsk, bytes calldata makerSignature, LibLooksRare.MerkleTree calldata merkleTree, address affiliate) external payable;
}
文件 28 的 71:INftTransferProxy.sol
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol";
interface INftTransferProxy {
function erc721safeTransferFrom(IERC721Upgradeable token, address from, address to, uint256 tokenId) external;
function erc1155safeTransferFrom(IERC1155Upgradeable token, address from, address to, uint256 id, uint256 value, bytes calldata data) external;
}
文件 29 的 71:IRoyaltiesProvider.sol
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
interface IRoyaltiesProvider {
function getRoyalties(address token, uint tokenId) external returns (LibPart.Part[] memory);
}
文件 30 的 71:ISeaPort.sol
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "../libraries/LibSeaPort.sol";
interface ISeaPort {
function fulfillAdvancedOrder(
LibSeaPort.AdvancedOrder calldata advancedOrder,
LibSeaPort.CriteriaResolver[] calldata criteriaResolvers,
bytes32 fulfillerConduitKey,
address recipient
) external payable returns (bool fulfilled);
function fulfillAvailableAdvancedOrders(
LibSeaPort.AdvancedOrder[] memory advancedOrders,
LibSeaPort.CriteriaResolver[] calldata criteriaResolvers,
LibSeaPort.FulfillmentComponent[][] calldata offerFulfillments,
LibSeaPort.FulfillmentComponent[][] calldata considerationFulfillments,
bytes32 fulfillerConduitKey,
address recipient,
uint256 maximumFulfilled
) external payable returns (bool[] memory availableOrders, LibSeaPort.Execution[] memory executions);
function fulfillBasicOrder(LibSeaPort.BasicOrderParameters calldata parameters)
external
payable
returns (bool fulfilled);
}
文件 31 的 71:ITransferExecutor.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-asset/contracts/LibAsset.sol";
abstract contract ITransferExecutor {
function transfer(
LibAsset.Asset memory asset,
address from,
address to,
address proxy
) internal virtual;
}
文件 32 的 71:ITransferManager.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "../lib/LibDeal.sol";
import "./ITransferExecutor.sol";
abstract contract ITransferManager is ITransferExecutor {
function doTransfers(
LibDeal.DealSide memory left,
LibDeal.DealSide memory right,
LibFeeSide.FeeSide feeSide
) internal virtual returns (uint totalMakeValue, uint totalTakeValue);
}
文件 33 的 71:ITransferProxy.sol
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
import "@rarible/lib-asset/contracts/LibAsset.sol";
interface ITransferProxy {
function transfer(LibAsset.Asset calldata asset, address from, address to) external;
}
文件 34 的 71:IWyvernExchange.sol
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
interface IWyvernExchange {
function atomicMatch_(
address[14] memory addrs,
uint[18] memory uints,
uint8[8] memory feeMethodsSidesKindsHowToCalls,
bytes memory calldataBuy,
bytes memory calldataSell,
bytes memory replacementPatternBuy,
bytes memory replacementPatternSell,
bytes memory staticExtradataBuy,
bytes memory staticExtradataSell,
uint8[2] memory vs,
bytes32[5] memory rssMetadata)
external
payable;
enum Side {
Buy,
Sell
}
enum SaleKind {
FixedPrice,
DutchAuction
}
function calculateFinalPrice(
Side side,
SaleKind saleKind,
uint256 basePrice,
uint256 extra,
uint256 listingTime,
uint256 expirationTime
) external view returns (uint256);
}
文件 35 的 71:Initializable.sol
pragma solidity >=0.4.24 <0.8.0;
import "../utils/AddressUpgradeable.sol";
abstract contract Initializable {
bool private _initialized;
bool private _initializing;
modifier initializer() {
require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
function _isConstructor() private view returns (bool) {
return !AddressUpgradeable.isContract(address(this));
}
}
文件 36 的 71:IsPausable.sol
pragma solidity 0.7.6;
import "@openzeppelin/contracts/access/Ownable.sol";
abstract contract IsPausable is Ownable {
bool public paused;
event Paused(bool paused);
function pause(bool _paused) external onlyOwner {
paused = _paused;
emit Paused(_paused);
}
function requireNotPaused() internal view {
require (!paused, "the contract is paused");
}
}
文件 37 的 71:Ix2y2.sol
pragma solidity >=0.6.9 <0.8.0;
pragma abicoder v2;
interface Ix2y2 {
struct OrderItem {
uint256 price;
bytes data;
}
struct Pair721 {
address token;
uint256 tokenId;
}
struct Pair1155 {
address token;
uint256 tokenId;
uint256 amount;
}
struct Order {
uint256 salt;
address user;
uint256 network;
uint256 intent;
uint256 delegateType;
uint256 deadline;
address currency;
bytes dataMask;
OrderItem[] items;
bytes32 r;
bytes32 s;
uint8 v;
uint8 signVersion;
}
struct Fee {
uint256 percentage;
address to;
}
struct SettleDetail {
Op op;
uint256 orderIdx;
uint256 itemIdx;
uint256 price;
bytes32 itemHash;
address executionDelegate;
bytes dataReplacement;
uint256 bidIncentivePct;
uint256 aucMinIncrementPct;
uint256 aucIncDurationSecs;
Fee[] fees;
}
struct SettleShared {
uint256 salt;
uint256 deadline;
uint256 amountToEth;
uint256 amountToWeth;
address user;
bool canFail;
}
struct RunInput {
Order[] orders;
SettleDetail[] details;
SettleShared shared;
bytes32 r;
bytes32 s;
uint8 v;
}
enum Op {
INVALID,
COMPLETE_SELL_OFFER,
COMPLETE_BUY_OFFER,
CANCEL_OFFER,
BID,
COMPLETE_AUCTION,
REFUND_AUCTION,
REFUND_AUCTION_STUCK_ITEM
}
function run(RunInput memory input) external payable;
}
文件 38 的 71:LibAsset.sol
pragma solidity 0.7.6;
library LibAsset {
bytes4 constant public ETH_ASSET_CLASS = bytes4(keccak256("ETH"));
bytes4 constant public ERC20_ASSET_CLASS = bytes4(keccak256("ERC20"));
bytes4 constant public ERC721_ASSET_CLASS = bytes4(keccak256("ERC721"));
bytes4 constant public ERC1155_ASSET_CLASS = bytes4(keccak256("ERC1155"));
bytes4 constant public COLLECTION = bytes4(keccak256("COLLECTION"));
bytes4 constant public CRYPTO_PUNKS = bytes4(keccak256("CRYPTO_PUNKS"));
bytes32 constant ASSET_TYPE_TYPEHASH = keccak256(
"AssetType(bytes4 assetClass,bytes data)"
);
bytes32 constant ASSET_TYPEHASH = keccak256(
"Asset(AssetType assetType,uint256 value)AssetType(bytes4 assetClass,bytes data)"
);
struct AssetType {
bytes4 assetClass;
bytes data;
}
struct Asset {
AssetType assetType;
uint value;
}
function hash(AssetType memory assetType) internal pure returns (bytes32) {
return keccak256(abi.encode(
ASSET_TYPE_TYPEHASH,
assetType.assetClass,
keccak256(assetType.data)
));
}
function hash(Asset memory asset) internal pure returns (bytes32) {
return keccak256(abi.encode(
ASSET_TYPEHASH,
hash(asset.assetType),
asset.value
));
}
}
文件 39 的 71:LibDeal.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
import "@rarible/lib-asset/contracts/LibAsset.sol";
import "./LibFeeSide.sol";
library LibDeal {
struct DealSide {
LibAsset.Asset asset;
LibPart.Part[] payouts;
LibPart.Part[] originFees;
address proxy;
address from;
}
}
文件 40 的 71:LibDirectTransfer.sol
pragma solidity 0.7.6;
import "@rarible/lib-asset/contracts/LibAsset.sol";
library LibDirectTransfer {
struct Purchase {
address sellOrderMaker;
uint256 sellOrderNftAmount;
bytes4 nftAssetClass;
bytes nftData;
uint256 sellOrderPaymentAmount;
address paymentToken;
uint256 sellOrderSalt;
uint sellOrderStart;
uint sellOrderEnd;
bytes4 sellOrderDataType;
bytes sellOrderData;
bytes sellOrderSignature;
uint256 buyOrderPaymentAmount;
uint256 buyOrderNftAmount;
bytes buyOrderData;
}
struct AcceptBid {
address bidMaker;
uint256 bidNftAmount;
bytes4 nftAssetClass;
bytes nftData;
uint256 bidPaymentAmount;
address paymentToken;
uint256 bidSalt;
uint bidStart;
uint bidEnd;
bytes4 bidDataType;
bytes bidData;
bytes bidSignature;
uint256 sellOrderPaymentAmount;
uint256 sellOrderNftAmount;
bytes sellOrderData;
}
}
文件 41 的 71:LibERC1155LazyMint.sol
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibERC1155LazyMint {
bytes4 constant public ERC1155_LAZY_ASSET_CLASS = bytes4(keccak256("ERC1155_LAZY"));
bytes4 constant _INTERFACE_ID_MINT_AND_TRANSFER = 0x6db15a0f;
struct Mint1155Data {
uint tokenId;
string tokenURI;
uint supply;
LibPart.Part[] creators;
LibPart.Part[] royalties;
bytes[] signatures;
}
bytes32 public constant MINT_AND_TRANSFER_TYPEHASH = keccak256("Mint1155(uint256 tokenId,uint256 supply,string tokenURI,Part[] creators,Part[] royalties)Part(address account,uint96 value)");
function hash(Mint1155Data memory data) internal pure returns (bytes32) {
bytes32[] memory royaltiesBytes = new bytes32[](data.royalties.length);
for (uint i = 0; i < data.royalties.length; ++i) {
royaltiesBytes[i] = LibPart.hash(data.royalties[i]);
}
bytes32[] memory creatorsBytes = new bytes32[](data.creators.length);
for (uint i = 0; i < data.creators.length; ++i) {
creatorsBytes[i] = LibPart.hash(data.creators[i]);
}
return keccak256(abi.encode(
MINT_AND_TRANSFER_TYPEHASH,
data.tokenId,
data.supply,
keccak256(bytes(data.tokenURI)),
keccak256(abi.encodePacked(creatorsBytes)),
keccak256(abi.encodePacked(royaltiesBytes))
));
}
}
文件 42 的 71:LibERC721LazyMint.sol
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibERC721LazyMint {
bytes4 constant public ERC721_LAZY_ASSET_CLASS = bytes4(keccak256("ERC721_LAZY"));
bytes4 constant _INTERFACE_ID_MINT_AND_TRANSFER = 0x8486f69f;
struct Mint721Data {
uint tokenId;
string tokenURI;
LibPart.Part[] creators;
LibPart.Part[] royalties;
bytes[] signatures;
}
bytes32 public constant MINT_AND_TRANSFER_TYPEHASH = keccak256("Mint721(uint256 tokenId,string tokenURI,Part[] creators,Part[] royalties)Part(address account,uint96 value)");
function hash(Mint721Data memory data) internal pure returns (bytes32) {
bytes32[] memory royaltiesBytes = new bytes32[](data.royalties.length);
for (uint i = 0; i < data.royalties.length; ++i) {
royaltiesBytes[i] = LibPart.hash(data.royalties[i]);
}
bytes32[] memory creatorsBytes = new bytes32[](data.creators.length);
for (uint i = 0; i < data.creators.length; ++i) {
creatorsBytes[i] = LibPart.hash(data.creators[i]);
}
return keccak256(abi.encode(
MINT_AND_TRANSFER_TYPEHASH,
data.tokenId,
keccak256(bytes(data.tokenURI)),
keccak256(abi.encodePacked(creatorsBytes)),
keccak256(abi.encodePacked(royaltiesBytes))
));
}
}
文件 43 的 71:LibFeeSide.sol
pragma solidity 0.7.6;
import "@rarible/lib-asset/contracts/LibAsset.sol";
library LibFeeSide {
enum FeeSide {NONE, LEFT, RIGHT}
function getFeeSide(bytes4 leftClass, bytes4 rightClass) internal pure returns (FeeSide) {
if (leftClass == LibAsset.ETH_ASSET_CLASS) {
return FeeSide.LEFT;
}
if (rightClass == LibAsset.ETH_ASSET_CLASS) {
return FeeSide.RIGHT;
}
if (leftClass == LibAsset.ERC20_ASSET_CLASS) {
return FeeSide.LEFT;
}
if (rightClass == LibAsset.ERC20_ASSET_CLASS) {
return FeeSide.RIGHT;
}
if (leftClass == LibAsset.ERC1155_ASSET_CLASS) {
return FeeSide.LEFT;
}
if (rightClass == LibAsset.ERC1155_ASSET_CLASS) {
return FeeSide.RIGHT;
}
return FeeSide.NONE;
}
}
文件 44 的 71:LibFill.sol
pragma solidity 0.7.6;
import "./LibOrder.sol";
library LibFill {
struct FillResult {
uint leftValue;
uint rightValue;
}
struct IsMakeFill {
bool leftMake;
bool rightMake;
}
function fillOrder(LibOrder.Order memory leftOrder, LibOrder.Order memory rightOrder, uint leftOrderFill, uint rightOrderFill, bool leftIsMakeFill, bool rightIsMakeFill) internal pure returns (FillResult memory) {
(uint leftMakeValue, uint leftTakeValue) = LibOrder.calculateRemaining(leftOrder, leftOrderFill, leftIsMakeFill);
(uint rightMakeValue, uint rightTakeValue) = LibOrder.calculateRemaining(rightOrder, rightOrderFill, rightIsMakeFill);
if (rightTakeValue > leftMakeValue || (rightTakeValue == leftMakeValue && leftMakeValue == 0)) {
return fillLeft(leftMakeValue, leftTakeValue, rightOrder.makeAsset.value, rightOrder.takeAsset.value);
}
return fillRight(leftOrder.makeAsset.value, leftOrder.takeAsset.value, rightMakeValue, rightTakeValue);
}
function fillRight(uint leftMakeValue, uint leftTakeValue, uint rightMakeValue, uint rightTakeValue) internal pure returns (FillResult memory result) {
uint makerValue = LibMath.safeGetPartialAmountFloor(rightTakeValue, leftMakeValue, leftTakeValue);
require(makerValue <= rightMakeValue, "fillRight: unable to fill");
return FillResult(rightTakeValue, makerValue);
}
function fillLeft(uint leftMakeValue, uint leftTakeValue, uint rightMakeValue, uint rightTakeValue) internal pure returns (FillResult memory result) {
uint rightTake = LibMath.safeGetPartialAmountFloor(leftTakeValue, rightMakeValue, rightTakeValue);
require(rightTake <= leftMakeValue, "fillLeft: unable to fill");
return FillResult(leftMakeValue, leftTakeValue);
}
}
文件 45 的 71:LibLooksRare.sol
pragma solidity 0.7.6;
pragma abicoder v2;
library LibLooksRare {
struct MakerOrder {
bool isOrderAsk;
address signer;
address collection;
uint256 price;
uint256 tokenId;
uint256 amount;
address strategy;
address currency;
uint256 nonce;
uint256 startTime;
uint256 endTime;
uint256 minPercentageToAsk;
bytes params;
uint8 v;
bytes32 r;
bytes32 s;
}
struct TakerOrder {
bool isOrderAsk;
address taker;
uint256 price;
uint256 tokenId;
uint256 minPercentageToAsk;
bytes params;
}
enum CollectionType {
ERC721,
ERC1155
}
enum QuoteType {
Bid,
Ask
}
struct Maker {
QuoteType quoteType;
uint256 globalNonce;
uint256 subsetNonce;
uint256 orderNonce;
uint256 strategyId;
CollectionType collectionType;
address collection;
address currency;
address signer;
uint256 startTime;
uint256 endTime;
uint256 price;
uint256[] itemIds;
uint256[] amounts;
bytes additionalParameters;
}
struct Taker {
address recipient;
bytes additionalParameters;
}
enum MerkleTreeNodePosition {
Left,
Right
}
struct MerkleTreeNode {
bytes32 value;
MerkleTreeNodePosition position;
}
struct MerkleTree {
bytes32 root;
MerkleTreeNode[] proof;
}
}
文件 46 的 71:LibMath.sol
pragma solidity 0.7.6;
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
library LibMath {
using SafeMathUpgradeable for uint;
function safeGetPartialAmountFloor(
uint256 numerator,
uint256 denominator,
uint256 target
) internal pure returns (uint256 partialAmount) {
if (isRoundingErrorFloor(numerator, denominator, target)) {
revert("rounding error");
}
partialAmount = numerator.mul(target).div(denominator);
}
function isRoundingErrorFloor(
uint256 numerator,
uint256 denominator,
uint256 target
) internal pure returns (bool isError) {
if (denominator == 0) {
revert("division by zero");
}
if (target == 0 || numerator == 0) {
return false;
}
uint256 remainder = mulmod(
target,
numerator,
denominator
);
isError = remainder.mul(1000) >= numerator.mul(target);
}
function safeGetPartialAmountCeil(
uint256 numerator,
uint256 denominator,
uint256 target
) internal pure returns (uint256 partialAmount) {
if (isRoundingErrorCeil(numerator, denominator, target)) {
revert("rounding error");
}
partialAmount = numerator.mul(target).add(denominator.sub(1)).div(denominator);
}
function isRoundingErrorCeil(
uint256 numerator,
uint256 denominator,
uint256 target
) internal pure returns (bool isError) {
if (denominator == 0) {
revert("division by zero");
}
if (target == 0 || numerator == 0) {
return false;
}
uint256 remainder = mulmod(
target,
numerator,
denominator
);
remainder = denominator.sub(remainder) % denominator;
isError = remainder.mul(1000) >= numerator.mul(target);
return isError;
}
}
文件 47 的 71:LibOrder.sol
pragma solidity 0.7.6;
import "@rarible/lib-asset/contracts/LibAsset.sol";
import "./LibMath.sol";
import "./LibOrderDataV3.sol";
import "./LibOrderDataV2.sol";
import "./LibOrderDataV1.sol";
library LibOrder {
using SafeMathUpgradeable for uint;
bytes32 constant ORDER_TYPEHASH = keccak256(
"Order(address maker,Asset makeAsset,address taker,Asset takeAsset,uint256 salt,uint256 start,uint256 end,bytes4 dataType,bytes data)Asset(AssetType assetType,uint256 value)AssetType(bytes4 assetClass,bytes data)"
);
bytes4 constant DEFAULT_ORDER_TYPE = 0xffffffff;
struct Order {
address maker;
LibAsset.Asset makeAsset;
address taker;
LibAsset.Asset takeAsset;
uint salt;
uint start;
uint end;
bytes4 dataType;
bytes data;
}
function calculateRemaining(Order memory order, uint fill, bool isMakeFill) internal pure returns (uint makeValue, uint takeValue) {
if (isMakeFill) {
makeValue = order.makeAsset.value.sub(fill);
takeValue = LibMath.safeGetPartialAmountFloor(order.takeAsset.value, order.makeAsset.value, makeValue);
} else {
takeValue = order.takeAsset.value.sub(fill);
makeValue = LibMath.safeGetPartialAmountFloor(order.makeAsset.value, order.takeAsset.value, takeValue);
}
}
function hashKey(Order memory order) internal pure returns (bytes32) {
if (order.dataType == LibOrderDataV1.V1 || order.dataType == DEFAULT_ORDER_TYPE) {
return keccak256(abi.encode(
order.maker,
LibAsset.hash(order.makeAsset.assetType),
LibAsset.hash(order.takeAsset.assetType),
order.salt
));
} else {
return keccak256(abi.encode(
order.maker,
LibAsset.hash(order.makeAsset.assetType),
LibAsset.hash(order.takeAsset.assetType),
order.salt,
order.data
));
}
}
function hash(Order memory order) internal pure returns (bytes32) {
return keccak256(abi.encode(
ORDER_TYPEHASH,
order.maker,
LibAsset.hash(order.makeAsset),
order.taker,
LibAsset.hash(order.takeAsset),
order.salt,
order.start,
order.end,
order.dataType,
keccak256(order.data)
));
}
function validateOrderTime(LibOrder.Order memory order) internal view {
require(order.start == 0 || order.start < block.timestamp, "Order start validation failed");
require(order.end == 0 || order.end > block.timestamp, "Order end validation failed");
}
}
文件 48 的 71:LibOrderData.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "./LibOrder.sol";
library LibOrderData {
struct GenericOrderData {
LibPart.Part[] payouts;
LibPart.Part[] originFees;
bool isMakeFill;
}
function parse(LibOrder.Order memory order) pure internal returns (GenericOrderData memory dataOrder) {
if (order.dataType == LibOrderDataV1.V1) {
LibOrderDataV1.DataV1 memory data = abi.decode(order.data, (LibOrderDataV1.DataV1));
dataOrder.payouts = data.payouts;
dataOrder.originFees = data.originFees;
} else if (order.dataType == LibOrderDataV2.V2) {
LibOrderDataV2.DataV2 memory data = abi.decode(order.data, (LibOrderDataV2.DataV2));
dataOrder.payouts = data.payouts;
dataOrder.originFees = data.originFees;
dataOrder.isMakeFill = data.isMakeFill;
} else if (order.dataType == 0xffffffff) {
} else {
revert("Unknown Order data type");
}
if (dataOrder.payouts.length == 0) {
dataOrder.payouts = payoutSet(order.maker);
}
}
function payoutSet(address orderAddress) pure internal returns (LibPart.Part[] memory) {
LibPart.Part[] memory payout = new LibPart.Part[](1);
payout[0].account = payable(orderAddress);
payout[0].value = 10000;
return payout;
}
function parseOriginFeeData(uint dataFirst, uint dataSecond) internal pure returns(LibPart.Part[] memory) {
LibPart.Part[] memory originFee;
if (dataFirst > 0 && dataSecond > 0){
originFee = new LibPart.Part[](2);
originFee[0] = uintToLibPart(dataFirst);
originFee[1] = uintToLibPart(dataSecond);
}
if (dataFirst > 0 && dataSecond == 0) {
originFee = new LibPart.Part[](1);
originFee[0] = uintToLibPart(dataFirst);
}
if (dataFirst == 0 && dataSecond > 0) {
originFee = new LibPart.Part[](1);
originFee[0] = uintToLibPart(dataSecond);
}
return originFee;
}
function parsePayouts(uint data) internal pure returns(LibPart.Part[] memory) {
LibPart.Part[] memory payouts;
if (data > 0) {
payouts = new LibPart.Part[](1);
payouts[0] = uintToLibPart(data);
}
return payouts;
}
function uintToLibPart(uint data) internal pure returns(LibPart.Part memory result) {
if (data > 0){
result.account = payable(address(data));
result.value = uint96(data >> 160);
}
}
}
文件 49 的 71:LibOrderDataV1.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibOrderDataV1 {
bytes4 constant public V1 = bytes4(keccak256("V1"));
struct DataV1 {
LibPart.Part[] payouts;
LibPart.Part[] originFees;
}
}
文件 50 的 71:LibOrderDataV2.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibOrderDataV2 {
bytes4 constant public V2 = bytes4(keccak256("V2"));
struct DataV2 {
LibPart.Part[] payouts;
LibPart.Part[] originFees;
bool isMakeFill;
}
}
文件 51 的 71:LibOrderDataV3.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibOrderDataV3 {
bytes4 constant public V3_SELL = bytes4(keccak256("V3_SELL"));
bytes4 constant public V3_BUY = bytes4(keccak256("V3_BUY"));
struct DataV3_SELL {
uint payouts;
uint originFeeFirst;
uint originFeeSecond;
uint maxFeesBasePoint;
bytes32 marketplaceMarker;
}
struct DataV3_BUY {
uint payouts;
uint originFeeFirst;
uint originFeeSecond;
bytes32 marketplaceMarker;
}
}
文件 52 的 71:LibPart.sol
pragma solidity >=0.6.2 <0.8.0;
library LibPart {
bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)");
struct Part {
address payable account;
uint96 value;
}
function hash(Part memory part) internal pure returns (bytes32) {
return keccak256(abi.encode(TYPE_HASH, part.account, part.value));
}
}
文件 53 的 71:LibRoyalties2981.sol
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibRoyalties2981 {
bytes4 constant _INTERFACE_ID_ROYALTIES = 0x2a55205a;
uint96 constant _WEIGHT_VALUE = 1000000;
function calculateRoyalties(address to, uint256 amount) internal view returns (LibPart.Part[] memory) {
LibPart.Part[] memory result;
if (amount == 0) {
return result;
}
uint256 percent = amount * 10000 / _WEIGHT_VALUE;
require(percent < 10000, "Royalties 2981 exceeds 100%");
result = new LibPart.Part[](1);
result[0].account = payable(to);
result[0].value = uint96(percent);
return result;
}
}
文件 54 的 71:LibRoyaltiesV1.sol
pragma solidity >=0.6.2 <0.8.0;
library LibRoyaltiesV1 {
bytes4 constant _INTERFACE_ID_FEES = 0xb7799584;
}
文件 55 的 71:LibRoyaltiesV2.sol
pragma solidity >=0.6.2 <0.8.0;
library LibRoyaltiesV2 {
bytes4 constant _INTERFACE_ID_ROYALTIES = 0xcad96cca;
}
文件 56 的 71:LibSeaPort.sol
pragma solidity 0.7.6;
pragma abicoder v2;
library LibSeaPort {
struct BasicOrderParameters {
address considerationToken;
uint256 considerationIdentifier;
uint256 considerationAmount;
address payable offerer;
address zone;
address offerToken;
uint256 offerIdentifier;
uint256 offerAmount;
BasicOrderType basicOrderType;
uint256 startTime;
uint256 endTime;
bytes32 zoneHash;
uint256 salt;
bytes32 offererConduitKey;
bytes32 fulfillerConduitKey;
uint256 totalOriginalAdditionalRecipients;
AdditionalRecipient[] additionalRecipients;
bytes signature;
}
struct AdditionalRecipient {
uint256 amount;
address payable recipient;
}
enum BasicOrderType {
ETH_TO_ERC721_FULL_OPEN,
ETH_TO_ERC721_PARTIAL_OPEN,
ETH_TO_ERC721_FULL_RESTRICTED,
ETH_TO_ERC721_PARTIAL_RESTRICTED,
ETH_TO_ERC1155_FULL_OPEN,
ETH_TO_ERC1155_PARTIAL_OPEN,
ETH_TO_ERC1155_FULL_RESTRICTED,
ETH_TO_ERC1155_PARTIAL_RESTRICTED,
ERC20_TO_ERC721_FULL_OPEN,
ERC20_TO_ERC721_PARTIAL_OPEN,
ERC20_TO_ERC721_FULL_RESTRICTED,
ERC20_TO_ERC721_PARTIAL_RESTRICTED,
ERC20_TO_ERC1155_FULL_OPEN,
ERC20_TO_ERC1155_PARTIAL_OPEN,
ERC20_TO_ERC1155_FULL_RESTRICTED,
ERC20_TO_ERC1155_PARTIAL_RESTRICTED,
ERC721_TO_ERC20_FULL_OPEN,
ERC721_TO_ERC20_PARTIAL_OPEN,
ERC721_TO_ERC20_FULL_RESTRICTED,
ERC721_TO_ERC20_PARTIAL_RESTRICTED,
ERC1155_TO_ERC20_FULL_OPEN,
ERC1155_TO_ERC20_PARTIAL_OPEN,
ERC1155_TO_ERC20_FULL_RESTRICTED,
ERC1155_TO_ERC20_PARTIAL_RESTRICTED
}
struct OrderParameters {
address offerer;
address zone;
OfferItem[] offer;
ConsiderationItem[] consideration;
OrderType orderType;
uint256 startTime;
uint256 endTime;
bytes32 zoneHash;
uint256 salt;
bytes32 conduitKey;
uint256 totalOriginalConsiderationItems;
}
struct Order {
OrderParameters parameters;
bytes signature;
}
struct AdvancedOrder {
OrderParameters parameters;
uint120 numerator;
uint120 denominator;
bytes signature;
bytes extraData;
}
struct OfferItem {
ItemType itemType;
address token;
uint256 identifierOrCriteria;
uint256 startAmount;
uint256 endAmount;
}
struct ConsiderationItem {
ItemType itemType;
address token;
uint256 identifierOrCriteria;
uint256 startAmount;
uint256 endAmount;
address payable recipient;
}
enum OrderType {
FULL_OPEN,
PARTIAL_OPEN,
FULL_RESTRICTED,
PARTIAL_RESTRICTED
}
enum ItemType {
NATIVE,
ERC20,
ERC721,
ERC1155,
ERC721_WITH_CRITERIA,
ERC1155_WITH_CRITERIA
}
struct Fulfillment {
FulfillmentComponent[] offerComponents;
FulfillmentComponent[] considerationComponents;
}
struct FulfillmentComponent {
uint256 orderIndex;
uint256 itemIndex;
}
struct Execution {
ReceivedItem item;
address offerer;
bytes32 conduitKey;
}
struct ReceivedItem {
ItemType itemType;
address token;
uint256 identifier;
uint256 amount;
address payable recipient;
}
struct CriteriaResolver {
uint256 orderIndex;
Side side;
uint256 index;
uint256 identifier;
bytes32[] criteriaProof;
}
enum Side {
OFFER,
CONSIDERATION
}
}
文件 57 的 71:LibSignature.sol
pragma solidity ^0.7.0;
library LibSignature {
function recover(bytes32 hash, bytes memory signature)
internal
pure
returns (address)
{
if (signature.length != 65) {
revert("ECDSA: invalid signature length");
}
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return recover(hash, v, r, s);
}
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
require(
uint256(s) <=
0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
"ECDSA: invalid signature 's' value"
);
address signer;
if (v > 30) {
require(
v - 4 == 27 || v - 4 == 28,
"ECDSA: invalid signature 'v' value"
);
signer = ecrecover(toEthSignedMessageHash(hash), v - 4, r, s);
} else {
require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
signer = ecrecover(hash, v, r, s);
}
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
function toEthSignedMessageHash(bytes32 hash)
internal
pure
returns (bytes32)
{
return
keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
);
}
}
文件 58 的 71:LibTransfer.sol
pragma solidity 0.7.6;
library LibTransfer {
function transferEth(address to, uint value) internal {
(bool success,) = to.call{ value: value }("");
require(success, "transfer failed");
}
}
文件 59 的 71:OperatorRole.sol
pragma solidity >=0.6.9 <0.8.0;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
contract OperatorRole is OwnableUpgradeable {
mapping (address => bool) operators;
function __OperatorRole_init() external initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function addOperator(address operator) external onlyOwner {
operators[operator] = true;
}
function removeOperator(address operator) external onlyOwner {
operators[operator] = false;
}
modifier onlyOperator() {
require(operators[_msgSender()], "OperatorRole: caller is not the operator");
_;
}
}
文件 60 的 71:OrderValidator.sol
pragma solidity 0.7.6;
import "./libraries/LibOrder.sol";
import "@rarible/lib-signature/contracts/IERC1271.sol";
import "@rarible/lib-signature/contracts/LibSignature.sol";
import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol";
abstract contract OrderValidator is Initializable, ContextUpgradeable, EIP712Upgradeable {
using LibSignature for bytes32;
using AddressUpgradeable for address;
bytes4 constant internal MAGICVALUE = 0x1626ba7e;
function __OrderValidator_init_unchained() internal initializer {
__EIP712_init_unchained("Exchange", "2");
}
function validate(LibOrder.Order memory order, bytes memory signature) internal view {
if (order.salt == 0) {
if (order.maker != address(0)) {
require(_msgSender() == order.maker, "maker is not tx sender");
}
} else {
if (_msgSender() != order.maker) {
bytes32 hash = LibOrder.hash(order);
if (order.maker.isContract()) {
require(
IERC1271(order.maker).isValidSignature(_hashTypedDataV4(hash), signature) == MAGICVALUE,
"contract order signature verification error"
);
} else {
if (_hashTypedDataV4(hash).recover(signature) != order.maker) {
revert("order signature verification error");
} else {
require (order.maker != address(0), "no maker");
}
}
}
}
}
uint256[50] private __gap;
}
文件 61 的 71:Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 62 的 71:OwnableUpgradeable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/Initializable.sol";
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
uint256[49] private __gap;
}
文件 63 的 71:RaribleExchangeWrapper.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/transfer-manager/contracts/lib/LibTransfer.sol";
import "@rarible/lib-bp/contracts/BpLibrary.sol";
import "@rarible/lib-part/contracts/LibPart.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721Holder.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import "./interfaces/IWyvernExchange.sol";
import "./interfaces/IExchangeV2.sol";
import "./interfaces/ISeaPort.sol";
import "./interfaces/Ix2y2.sol";
import "./interfaces/ILooksRare.sol";
import "./interfaces/IBlur.sol";
import "./libraries/IsPausable.sol";
contract RaribleExchangeWrapper is Ownable, ERC721Holder, ERC1155Holder, IsPausable {
using LibTransfer for address;
using BpLibrary for uint;
using SafeMath for uint;
address public immutable wyvernExchange;
address public immutable exchangeV2;
address public immutable seaPort_1_1;
address public immutable x2y2;
address public immutable looksRare;
address public immutable sudoswap;
address public immutable seaPort_1_4;
address public immutable looksRareV2;
address public immutable blur;
address public immutable seaPort_1_5;
address public immutable seaPort_1_6;
address public immutable weth;
uint256 private constant UINT256_MAX = type(uint256).max;
event Execution(bool result);
enum Markets {
ExchangeV2,
WyvernExchange,
SeaPort_1_1,
X2Y2,
LooksRareOrders,
SudoSwap,
SeaPort_1_4,
LooksRareV2,
Blur,
SeaPort_1_5,
SeaPort_1_6
}
enum AdditionalDataTypes {
NoAdditionalData,
RoyaltiesAdditionalData
}
enum Currencies {
ETH,
WETH
}
struct PurchaseDetails {
Markets marketId;
uint256 amount;
uint fees;
bytes data;
}
struct AdditionalData {
bytes data;
uint[] additionalRoyalties;
}
constructor(
address[11] memory marketplaces,
address _weth,
address[] memory transferProxies
) {
wyvernExchange = marketplaces[0];
exchangeV2 = marketplaces[1];
seaPort_1_1 = marketplaces[2];
x2y2 = marketplaces[3];
looksRare = marketplaces[4];
sudoswap = marketplaces[5];
seaPort_1_4 = marketplaces[6];
looksRareV2 = marketplaces[7];
blur = marketplaces[8];
seaPort_1_5 = marketplaces[9];
seaPort_1_6 = marketplaces[10];
weth = _weth;
for (uint i = 0; i < transferProxies.length; ++i) {
if (_weth != address(0)){
IERC20Upgradeable(_weth).approve(transferProxies[i], UINT256_MAX);
}
}
}
function singlePurchase(PurchaseDetails memory purchaseDetails, address feeRecipientFirst, address feeRecipientSecond) external payable {
requireNotPaused();
uint wethAmountNeeded = getAmountOfWethForPurchase(purchaseDetails);
if (wethAmountNeeded > 0) {
IERC20Upgradeable(weth).transferFrom(_msgSender(), address(this), wethAmountNeeded);
}
Currencies currency = getCurrency(purchaseDetails.fees);
bool success;
uint firstFeeAmount;
uint secondFeeAmount;
if (currency == Currencies.ETH) {
(success, firstFeeAmount, secondFeeAmount) = purchase(purchaseDetails, false);
transferFeeETH(firstFeeAmount, feeRecipientFirst);
transferFeeETH(secondFeeAmount, feeRecipientSecond);
} else if (currency == Currencies.WETH) {
(success, firstFeeAmount, secondFeeAmount) = purchaseWETH(purchaseDetails, false);
transferFeeWETH(firstFeeAmount, feeRecipientFirst);
transferFeeWETH(secondFeeAmount, feeRecipientSecond);
} else {
revert("Unknown purchase currency");
}
emit Execution(success);
transferChange();
if (wethAmountNeeded > 0) {
transferChangeWETH();
}
}
function bulkPurchase(PurchaseDetails[] memory purchaseDetails, address feeRecipientFirst, address feeRecipientSecond, bool allowFail) external payable {
requireNotPaused();
uint sumFirstFeesETH = 0;
uint sumSecondFeesETH = 0;
uint sumFirstFeesWETH = 0;
uint sumSecondFeesWETH = 0;
bool result = false;
uint wethAmountNeeded = 0;
for (uint i = 0; i < purchaseDetails.length; ++i) {
wethAmountNeeded = wethAmountNeeded + getAmountOfWethForPurchase(purchaseDetails[i]);
}
if (wethAmountNeeded > 0) {
IERC20Upgradeable(weth).transferFrom(_msgSender(), address(this), wethAmountNeeded);
}
for (uint i = 0; i < purchaseDetails.length; ++i) {
Currencies currency = getCurrency(purchaseDetails[i].fees);
bool success;
uint firstFeeAmount;
uint secondFeeAmount;
if (currency == Currencies.ETH) {
(success, firstFeeAmount, secondFeeAmount) = purchase(purchaseDetails[i], allowFail);
sumFirstFeesETH = sumFirstFeesETH.add(firstFeeAmount);
sumSecondFeesETH = sumSecondFeesETH.add(secondFeeAmount);
} else if (currency == Currencies.WETH) {
(success, firstFeeAmount, secondFeeAmount) = purchaseWETH(purchaseDetails[i], allowFail);
sumFirstFeesWETH = sumFirstFeesWETH.add(firstFeeAmount);
sumSecondFeesWETH = sumSecondFeesWETH.add(secondFeeAmount);
} else {
revert("Unknown purchase currency");
}
result = result || success;
emit Execution(success);
}
require(result, "no successful executions");
transferFeeETH(sumFirstFeesETH, feeRecipientFirst);
transferFeeETH(sumSecondFeesETH, feeRecipientSecond);
transferFeeWETH(sumFirstFeesWETH, feeRecipientFirst);
transferFeeWETH(sumSecondFeesWETH, feeRecipientSecond);
transferChange();
if (wethAmountNeeded > 0) {
transferChangeWETH();
}
}
function purchase(PurchaseDetails memory purchaseDetails, bool allowFail) internal returns(bool, uint, uint) {
(bytes memory marketData, uint[] memory additionalRoyalties) = getDataAndAdditionalData (purchaseDetails.data, purchaseDetails.fees, purchaseDetails.marketId);
uint paymentAmount = purchaseDetails.amount;
if (purchaseDetails.marketId == Markets.SeaPort_1_1){
(bool success,) = address(seaPort_1_1).call{value : paymentAmount}(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase SeaPort_1_1 failed");
}
} else if (purchaseDetails.marketId == Markets.WyvernExchange) {
(bool success,) = address(wyvernExchange).call{value : paymentAmount}(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase wyvernExchange failed");
}
} else if (purchaseDetails.marketId == Markets.ExchangeV2) {
(bool success,) = address(exchangeV2).call{value : paymentAmount}(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase rarible failed");
}
} else if (purchaseDetails.marketId == Markets.X2Y2) {
Ix2y2.RunInput memory input = abi.decode(marketData, (Ix2y2.RunInput));
if (allowFail) {
try Ix2y2(x2y2).run{value : paymentAmount}(input) {
} catch {
return (false, 0, 0);
}
} else {
Ix2y2(x2y2).run{value : paymentAmount}(input);
}
for (uint i = 0; i < input.details.length; ++i) {
uint orderId = input.details[i].orderIdx;
uint itemId = input.details[i].itemIdx;
bytes memory data = input.orders[orderId].items[itemId].data;
{
if (input.orders[orderId].dataMask.length > 0 && input.details[i].dataReplacement.length > 0) {
_arrayReplace(data, input.details[i].dataReplacement, input.orders[orderId].dataMask);
}
}
if (input.orders[orderId].delegateType == 1) {
Ix2y2.Pair721[] memory pairs = abi.decode(data, (Ix2y2.Pair721[]));
for (uint256 j = 0; j < pairs.length; j++) {
Ix2y2.Pair721 memory p = pairs[j];
IERC721Upgradeable(address(p.token)).safeTransferFrom(address(this), _msgSender(), p.tokenId);
}
} else if (input.orders[orderId].delegateType == 2) {
Ix2y2.Pair1155[] memory pairs = abi.decode(data, (Ix2y2.Pair1155[]));
for (uint256 j = 0; j < pairs.length; j++) {
Ix2y2.Pair1155 memory p = pairs[j];
IERC1155Upgradeable(address(p.token)).safeTransferFrom(address(this), _msgSender(), p.tokenId, p.amount, "");
}
} else {
revert("unknown delegateType x2y2");
}
}
} else if (purchaseDetails.marketId == Markets.LooksRareOrders) {
(LibLooksRare.TakerOrder memory takerOrder, LibLooksRare.MakerOrder memory makerOrder, bytes4 typeNft) = abi.decode(marketData, (LibLooksRare.TakerOrder, LibLooksRare.MakerOrder, bytes4));
if (allowFail) {
try ILooksRare(looksRare).matchAskWithTakerBidUsingETHAndWETH{value : paymentAmount}(takerOrder, makerOrder) {
} catch {
return (false, 0, 0);
}
} else {
ILooksRare(looksRare).matchAskWithTakerBidUsingETHAndWETH{value : paymentAmount}(takerOrder, makerOrder);
}
if (typeNft == LibAsset.ERC721_ASSET_CLASS) {
IERC721Upgradeable(makerOrder.collection).safeTransferFrom(address(this), _msgSender(), makerOrder.tokenId);
} else if (typeNft == LibAsset.ERC1155_ASSET_CLASS) {
IERC1155Upgradeable(makerOrder.collection).safeTransferFrom(address(this), _msgSender(), makerOrder.tokenId, makerOrder.amount, "");
} else {
revert("Unknown token type");
}
} else if (purchaseDetails.marketId == Markets.SudoSwap) {
(bool success,) = address(sudoswap).call{value : paymentAmount}(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase sudoswap failed");
}
} else if (purchaseDetails.marketId == Markets.SeaPort_1_4){
(bool success,) = address(seaPort_1_4).call{value : paymentAmount}(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase SeaPort_1_4 failed");
}
} else if (purchaseDetails.marketId == Markets.LooksRareV2){
(bool success,) = address(looksRareV2).call{value : paymentAmount}(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase LooksRareV2 failed");
}
} else if (purchaseDetails.marketId == Markets.Blur){
(IBlur.Input memory sell, IBlur.Input memory buy, bytes4 typeNft) = abi.decode(marketData, (IBlur.Input, IBlur.Input, bytes4));
if (allowFail) {
try IBlur(blur).execute{value : paymentAmount}(sell, buy) {
} catch {
return (false, 0, 0);
}
} else {
IBlur(blur).execute{value : paymentAmount}(sell, buy);
}
if (typeNft == LibAsset.ERC721_ASSET_CLASS) {
IERC721Upgradeable(sell.order.collection).safeTransferFrom(address(this), _msgSender(), sell.order.tokenId);
} else if (typeNft == LibAsset.ERC1155_ASSET_CLASS) {
IERC1155Upgradeable(sell.order.collection).safeTransferFrom(address(this), _msgSender(), sell.order.tokenId, sell.order.amount, "");
} else {
revert("Unknown token type");
}
} else if (purchaseDetails.marketId == Markets.SeaPort_1_5){
(bool success,) = address(seaPort_1_5).call{value : paymentAmount}(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase SeaPort_1_5 failed");
}
} else if (purchaseDetails.marketId == Markets.SeaPort_1_6){
(bool success,) = address(seaPort_1_6).call{value : paymentAmount}(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase SeaPort_1_6 failed");
}
} else {
revert("Unknown marketId ETH");
}
transferAdditionalRoyaltiesETH(additionalRoyalties, purchaseDetails.amount);
(uint firstFeeAmount, uint secondFeeAmount) = getFees(purchaseDetails.fees, purchaseDetails.amount);
return (true, firstFeeAmount, secondFeeAmount);
}
function purchaseWETH(PurchaseDetails memory purchaseDetails, bool allowFail) internal returns(bool, uint, uint) {
(bytes memory marketData, uint[] memory additionalRoyalties) = getDataAndAdditionalData (purchaseDetails.data, purchaseDetails.fees, purchaseDetails.marketId);
if (purchaseDetails.marketId == Markets.SeaPort_1_1){
(bool success,) = address(seaPort_1_1).call(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase SeaPort_1_1 failed WETH");
}
} else if (purchaseDetails.marketId == Markets.ExchangeV2) {
(bool success,) = address(exchangeV2).call(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase rarible failed WETH");
}
} else if (purchaseDetails.marketId == Markets.SeaPort_1_4){
(bool success,) = address(seaPort_1_4).call(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase SeaPort_1_4 failed WETH");
}
} else if (purchaseDetails.marketId == Markets.SeaPort_1_5){
(bool success,) = address(seaPort_1_5).call(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase SeaPort_1_5 failed WETH");
}
} else if (purchaseDetails.marketId == Markets.SeaPort_1_6){
(bool success,) = address(seaPort_1_6).call(marketData);
if (allowFail) {
if (!success) {
return (false, 0, 0);
}
} else {
require(success, "Purchase SeaPort_1_6 failed WETH");
}
} else {
revert("Unknown marketId WETH");
}
transferAdditionalRoyaltiesWETH(additionalRoyalties, purchaseDetails.amount);
(uint firstFeeAmount, uint secondFeeAmount) = getFees(purchaseDetails.fees, purchaseDetails.amount);
return (true, firstFeeAmount, secondFeeAmount);
}
function transferFeeETH(uint feeAmount, address feeRecipient) internal {
if (feeAmount > 0 && feeRecipient != address(0)) {
LibTransfer.transferEth(feeRecipient, feeAmount);
}
}
function transferFeeWETH(uint feeAmount, address feeRecipient) internal {
if (feeAmount > 0 && feeRecipient != address(0)) {
IERC20Upgradeable(weth).transfer(feeRecipient, feeAmount);
}
}
function transferChange() internal {
uint ethAmount = address(this).balance;
if (ethAmount > 0) {
address(msg.sender).transferEth(ethAmount);
}
}
function transferChangeWETH() internal {
uint wethAmount = IERC20Upgradeable(weth).balanceOf(address(this));
if (wethAmount > 0) {
IERC20Upgradeable(weth).transfer(_msgSender(), wethAmount);
}
}
function getFees(uint fees, uint amount) internal pure returns(uint, uint) {
uint firstFee = uint(uint16(fees >> 16));
uint secondFee = uint(uint16(fees));
return (amount.bp(firstFee), amount.bp(secondFee));
}
function getCurrency(uint fees) internal pure returns(Currencies) {
return Currencies(uint16(fees >> 48));
}
function getDataAndAdditionalData (bytes memory _data, uint feesAndDataType, Markets marketId) internal pure returns (bytes memory, uint[] memory) {
AdditionalDataTypes dataType = AdditionalDataTypes(uint16(feesAndDataType >> 32));
uint[] memory additionalRoyalties;
if (dataType == AdditionalDataTypes.NoAdditionalData) {
return (_data, additionalRoyalties);
}
if (dataType == AdditionalDataTypes.RoyaltiesAdditionalData) {
AdditionalData memory additionalData = abi.decode(_data, (AdditionalData));
if (supportsRoyalties(marketId)) {
return (additionalData.data, additionalData.additionalRoyalties);
} else {
return (additionalData.data, additionalRoyalties);
}
}
revert("unknown additionalDataType");
}
function transferAdditionalRoyaltiesETH (uint[] memory _additionalRoyalties, uint amount) internal {
for (uint i = 0; i < _additionalRoyalties.length; ++i) {
if (_additionalRoyalties[i] > 0) {
address payable account = payable(address(_additionalRoyalties[i]));
uint basePoint = uint(_additionalRoyalties[i] >> 160);
uint value = amount.bp(basePoint);
transferFeeETH(value, account);
}
}
}
function transferAdditionalRoyaltiesWETH (uint[] memory _additionalRoyalties, uint amount) internal {
for (uint i = 0; i < _additionalRoyalties.length; ++i) {
if (_additionalRoyalties[i] > 0) {
address payable account = payable(address(_additionalRoyalties[i]));
uint basePoint = uint(_additionalRoyalties[i] >> 160);
uint value = amount.bp(basePoint);
transferFeeWETH(value, account);
}
}
}
function _arrayReplace(
bytes memory src,
bytes memory replacement,
bytes memory mask
) internal view virtual {
require(src.length == replacement.length);
require(src.length == mask.length);
for (uint256 i = 0; i < src.length; ++i) {
if (mask[i] != 0) {
src[i] = replacement[i];
}
}
}
function supportsRoyalties(Markets marketId) internal pure returns (bool){
if (
marketId == Markets.SudoSwap ||
marketId == Markets.LooksRareOrders ||
marketId == Markets.LooksRareV2
) {
return true;
}
return false;
}
function getAmountOfWethForPurchase(PurchaseDetails memory detail) internal pure returns (uint) {
uint result = 0;
Currencies currency = getCurrency(detail.fees);
if (currency == Currencies.WETH) {
result = result + detail.amount;
(uint firstFeeAmount, uint secondFeeAmount) = getFees(detail.fees, detail.amount);
result = result + firstFeeAmount + secondFeeAmount;
(, uint[] memory royalties) = getDataAndAdditionalData (detail.data, detail.fees, detail.marketId);
for (uint j = 0; j < royalties.length; ++j) {
uint royaltyBasePoint = uint(royalties[j] >> 160);
uint royaltyValue = detail.amount.bp(royaltyBasePoint);
result = result + royaltyValue;
}
}
return result;
}
function approveWETH(address[] calldata transferProxies) external onlyOwner {
for (uint i = 0; i < transferProxies.length; ++i) {
IERC20Upgradeable(weth).approve(transferProxies[i], UINT256_MAX);
}
}
receive() external payable {}
}
文件 64 的 71:RaribleTransferManager.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@rarible/lazy-mint/contracts/erc-721/LibERC721LazyMint.sol";
import "@rarible/lazy-mint/contracts/erc-1155/LibERC1155LazyMint.sol";
import "@rarible/exchange-interfaces/contracts/IRoyaltiesProvider.sol";
import "@rarible/lib-bp/contracts/BpLibrary.sol";
import "./interfaces/ITransferManager.sol";
abstract contract RaribleTransferManager is OwnableUpgradeable, ITransferManager {
using BpLibrary for uint;
using SafeMathUpgradeable for uint;
ProtocolFeeData public protocolFee;
IRoyaltiesProvider public royaltiesRegistry;
address private defaultFeeReceiver;
mapping(address => address) private feeReceivers;
event BuyerFeeAmountChanged(uint oldValue, uint newValue);
event SellerFeeAmountChanged(uint oldValue, uint newValue);
event FeeReceiverChanged(address oldValue, address newValue);
struct ProtocolFeeData {
address receiver;
uint48 buyerAmount;
uint48 sellerAmount;
}
function __RaribleTransferManager_init_unchained(
uint newProtocolFee,
address newDefaultFeeReceiver,
IRoyaltiesProvider newRoyaltiesProvider
) internal initializer {
royaltiesRegistry = newRoyaltiesProvider;
}
function setRoyaltiesRegistry(IRoyaltiesProvider newRoyaltiesRegistry) external onlyOwner {
royaltiesRegistry = newRoyaltiesRegistry;
}
function setPrtocolFeeReceiver(address _receiver) public onlyOwner {
emit FeeReceiverChanged(protocolFee.receiver, _receiver);
protocolFee.receiver = _receiver;
}
function setPrtocolFeeBuyerAmount(uint48 _buyerAmount) public onlyOwner {
emit BuyerFeeAmountChanged(protocolFee.buyerAmount, _buyerAmount);
protocolFee.buyerAmount = _buyerAmount;
}
function setPrtocolFeeSellerAmount(uint48 _sellerAmount) public onlyOwner {
emit SellerFeeAmountChanged(protocolFee.sellerAmount, _sellerAmount);
protocolFee.sellerAmount = _sellerAmount;
}
function setAllProtocolFeeData(address _receiver, uint48 _buyerAmount, uint48 _sellerAmount) public onlyOwner {
setPrtocolFeeReceiver(_receiver);
setPrtocolFeeBuyerAmount(_buyerAmount);
setPrtocolFeeSellerAmount(_sellerAmount);
}
function doTransfers(
LibDeal.DealSide memory left,
LibDeal.DealSide memory right,
LibFeeSide.FeeSide feeSide
) override internal returns (uint totalLeftValue, uint totalRightValue) {
totalLeftValue = left.asset.value;
totalRightValue = right.asset.value;
if (feeSide == LibFeeSide.FeeSide.LEFT) {
totalLeftValue = doTransfersWithFees(left, right, protocolFee);
transferPayouts(right.asset.assetType, right.asset.value, right.from, left.payouts, right.proxy);
} else if (feeSide == LibFeeSide.FeeSide.RIGHT) {
totalRightValue = doTransfersWithFees(right, left,protocolFee);
transferPayouts(left.asset.assetType, left.asset.value, left.from, right.payouts, left.proxy);
} else {
transferPayouts(left.asset.assetType, left.asset.value, left.from, right.payouts, left.proxy);
transferPayouts(right.asset.assetType, right.asset.value, right.from, left.payouts, right.proxy);
}
}
function doTransfersWithFees(
LibDeal.DealSide memory paymentSide,
LibDeal.DealSide memory nftSide,
ProtocolFeeData memory _protocolFee
) internal returns (uint totalAmount) {
totalAmount = calculateTotalAmount(paymentSide.asset.value, _protocolFee, paymentSide.originFees);
uint rest = transferProtocolFee(totalAmount, paymentSide.asset.value, paymentSide.from, _protocolFee, paymentSide.asset.assetType, paymentSide.proxy);
rest = transferRoyalties(paymentSide.asset.assetType, nftSide.asset.assetType, nftSide.payouts, rest, paymentSide.asset.value, paymentSide.from, paymentSide.proxy);
if (
paymentSide.originFees.length == 1 &&
nftSide.originFees.length == 1 &&
nftSide.originFees[0].account == paymentSide.originFees[0].account
) {
LibPart.Part[] memory origin = new LibPart.Part[](1);
origin[0].account = nftSide.originFees[0].account;
origin[0].value = nftSide.originFees[0].value + paymentSide.originFees[0].value;
(rest,) = transferFees(paymentSide.asset.assetType, rest, paymentSide.asset.value, origin, paymentSide.from, paymentSide.proxy);
} else {
(rest,) = transferFees(paymentSide.asset.assetType, rest, paymentSide.asset.value, paymentSide.originFees, paymentSide.from, paymentSide.proxy);
(rest,) = transferFees(paymentSide.asset.assetType, rest, paymentSide.asset.value, nftSide.originFees, paymentSide.from, paymentSide.proxy);
}
transferPayouts(paymentSide.asset.assetType, rest, paymentSide.from, nftSide.payouts, paymentSide.proxy);
}
function transferProtocolFee(
uint totalAmount,
uint amount,
address from,
ProtocolFeeData memory _protocolFee,
LibAsset.AssetType memory matchCalculate,
address proxy
) internal returns (uint) {
(uint rest, uint fee) = subFeeInBp(totalAmount, amount, _protocolFee.buyerAmount + _protocolFee.sellerAmount);
if (fee > 0) {
transfer(LibAsset.Asset(matchCalculate, fee), from, _protocolFee.receiver, proxy);
}
return rest;
}
function transferRoyalties(
LibAsset.AssetType memory paymentAssetType,
LibAsset.AssetType memory nftAssetType,
LibPart.Part[] memory payouts,
uint rest,
uint amount,
address from,
address proxy
) internal returns (uint) {
LibPart.Part[] memory royalties = getRoyaltiesByAssetType(nftAssetType);
if (
royalties.length == 1 &&
payouts.length == 1 &&
royalties[0].account == payouts[0].account
) {
require(royalties[0].value <= 5000, "Royalties are too high (>50%)");
return rest;
}
(uint result, uint totalRoyalties) = transferFees(paymentAssetType, rest, amount, royalties, from, proxy);
require(totalRoyalties <= 5000, "Royalties are too high (>50%)");
return result;
}
function getRoyaltiesByAssetType(LibAsset.AssetType memory nftAssetType) internal returns (LibPart.Part[] memory) {
if (nftAssetType.assetClass == LibAsset.ERC1155_ASSET_CLASS || nftAssetType.assetClass == LibAsset.ERC721_ASSET_CLASS) {
(address token, uint tokenId) = abi.decode(nftAssetType.data, (address, uint));
return royaltiesRegistry.getRoyalties(token, tokenId);
} else if (nftAssetType.assetClass == LibERC1155LazyMint.ERC1155_LAZY_ASSET_CLASS) {
(, LibERC1155LazyMint.Mint1155Data memory data) = abi.decode(nftAssetType.data, (address, LibERC1155LazyMint.Mint1155Data));
return data.royalties;
} else if (nftAssetType.assetClass == LibERC721LazyMint.ERC721_LAZY_ASSET_CLASS) {
(, LibERC721LazyMint.Mint721Data memory data) = abi.decode(nftAssetType.data, (address, LibERC721LazyMint.Mint721Data));
return data.royalties;
}
LibPart.Part[] memory empty;
return empty;
}
function transferFees(
LibAsset.AssetType memory assetType,
uint rest,
uint amount,
LibPart.Part[] memory fees,
address from,
address proxy
) internal returns (uint newRest, uint totalFees) {
totalFees = 0;
newRest = rest;
for (uint256 i = 0; i < fees.length; ++i) {
totalFees = totalFees.add(fees[i].value);
uint feeValue;
(newRest, feeValue) = subFeeInBp(newRest, amount, fees[i].value);
if (feeValue > 0) {
transfer(LibAsset.Asset(assetType, feeValue), from, fees[i].account, proxy);
}
}
}
function transferPayouts(
LibAsset.AssetType memory assetType,
uint amount,
address from,
LibPart.Part[] memory payouts,
address proxy
) internal {
require(payouts.length > 0, "transferPayouts: nothing to transfer");
uint sumBps = 0;
uint rest = amount;
for (uint256 i = 0; i < payouts.length - 1; ++i) {
uint currentAmount = amount.bp(payouts[i].value);
sumBps = sumBps.add(payouts[i].value);
if (currentAmount > 0) {
rest = rest.sub(currentAmount);
transfer(LibAsset.Asset(assetType, currentAmount), from, payouts[i].account, proxy);
}
}
LibPart.Part memory lastPayout = payouts[payouts.length - 1];
sumBps = sumBps.add(lastPayout.value);
require(sumBps == 10000, "Sum payouts Bps not equal 100%");
if (rest > 0) {
transfer(LibAsset.Asset(assetType, rest), from, lastPayout.account, proxy);
}
}
function calculateTotalAmount(
uint amount,
ProtocolFeeData memory _protocolFee,
LibPart.Part[] memory orderOriginFees
) internal pure returns (uint) {
uint fees = _protocolFee.buyerAmount;
for (uint256 i = 0; i < orderOriginFees.length; ++i) {
require(orderOriginFees[i].value <= 10000, "origin fee is too big");
fees = fees + orderOriginFees[i].value;
}
return amount.add(amount.bp(fees));
}
function subFeeInBp(uint value, uint total, uint feeInBp) internal pure returns (uint newValue, uint realFee) {
return subFee(value, total.bp(feeInBp));
}
function subFee(uint value, uint fee) internal pure returns (uint newValue, uint realFee) {
if (value > fee) {
newValue = value.sub(fee);
realFee = fee;
} else {
newValue = 0;
realFee = value;
}
}
uint256[46] private __gap;
}
文件 65 的 71:RoyaltiesRegistry.sol
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@rarible/exchange-interfaces/contracts/IRoyaltiesProvider.sol";
import "@rarible/royalties/contracts/LibRoyaltiesV2.sol";
import "@rarible/royalties/contracts/LibRoyaltiesV1.sol";
import "@rarible/royalties/contracts/LibRoyalties2981.sol";
import "@rarible/royalties/contracts/RoyaltiesV1.sol";
import "@rarible/royalties/contracts/RoyaltiesV2.sol";
import "@rarible/royalties/contracts/IERC2981.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
contract RoyaltiesRegistry is IRoyaltiesProvider, OwnableUpgradeable {
event RoyaltiesSetForToken(address indexed token, uint indexed tokenId, LibPart.Part[] royalties);
event RoyaltiesSetForContract(address indexed token, LibPart.Part[] royalties);
struct RoyaltiesSet {
bool initialized;
LibPart.Part[] royalties;
}
mapping(bytes32 => RoyaltiesSet) public royaltiesByTokenAndTokenId;
mapping(address => RoyaltiesSet) public royaltiesByToken;
mapping(address => uint) public royaltiesProviders;
uint constant royaltiesTypesAmount = 6;
function __RoyaltiesRegistry_init() external initializer {
__Ownable_init_unchained();
}
function setProviderByToken(address token, address provider) external {
checkOwner(token);
setRoyaltiesType(token, 4, provider);
}
function getProvider(address token) public view returns(address) {
return address(royaltiesProviders[token]);
}
function getRoyaltiesType(address token) external view returns(uint) {
return _getRoyaltiesType(royaltiesProviders[token]);
}
function _getRoyaltiesType(uint data) internal pure returns(uint) {
for (uint i = 1; i <= royaltiesTypesAmount; ++i) {
if (data / 2**(256-i) == 1) {
return i;
}
}
return 0;
}
function setRoyaltiesType(address token, uint royaltiesType, address royaltiesProvider) internal {
require(royaltiesType > 0 && royaltiesType <= royaltiesTypesAmount, "wrong royaltiesType");
royaltiesProviders[token] = uint(royaltiesProvider) + 2**(256 - royaltiesType);
}
function forceSetRoyaltiesType(address token, uint royaltiesType) external {
checkOwner(token);
setRoyaltiesType(token, royaltiesType, getProvider(token));
}
function clearRoyaltiesType(address token) external {
checkOwner(token);
royaltiesProviders[token] = uint(getProvider(token));
}
function setRoyaltiesByToken(address token, LibPart.Part[] memory royalties) external {
checkOwner(token);
delete royaltiesProviders[token];
setRoyaltiesType(token, 1, address(0));
uint sumRoyalties = 0;
delete royaltiesByToken[token];
for (uint i = 0; i < royalties.length; ++i) {
require(royalties[i].account != address(0x0), "RoyaltiesByToken recipient should be present");
require(royalties[i].value != 0, "Royalty value for RoyaltiesByToken should be > 0");
royaltiesByToken[token].royalties.push(royalties[i]);
sumRoyalties += royalties[i].value;
}
require(sumRoyalties < 10000, "Set by token royalties sum more, than 100%");
royaltiesByToken[token].initialized = true;
emit RoyaltiesSetForContract(token, royalties);
}
function checkOwner(address token) internal view {
if ((owner() != _msgSender()) && (OwnableUpgradeable(token).owner() != _msgSender())) {
revert("Token owner not detected");
}
}
function calculateRoyaltiesType(address token, address royaltiesProvider ) internal view returns(uint) {
try IERC165Upgradeable(token).supportsInterface(LibRoyaltiesV2._INTERFACE_ID_ROYALTIES) returns(bool result) {
if (result) {
return 2;
}
} catch { }
try IERC165Upgradeable(token).supportsInterface(LibRoyaltiesV1._INTERFACE_ID_FEES) returns(bool result) {
if (result) {
return 3;
}
} catch { }
try IERC165Upgradeable(token).supportsInterface(LibRoyalties2981._INTERFACE_ID_ROYALTIES) returns(bool result) {
if (result) {
return 5;
}
} catch { }
if (royaltiesProvider != address(0)) {
return 4;
}
if (royaltiesByToken[token].initialized) {
return 1;
}
return 6;
}
function getRoyalties(address token, uint tokenId) override external returns (LibPart.Part[] memory) {
uint royaltiesProviderData = royaltiesProviders[token];
address royaltiesProvider = address(royaltiesProviderData);
uint royaltiesType = _getRoyaltiesType(royaltiesProviderData);
if (royaltiesType == 0) {
royaltiesType = calculateRoyaltiesType(token, royaltiesProvider);
setRoyaltiesType(token, royaltiesType, royaltiesProvider);
}
if (royaltiesType == 1) {
return royaltiesByToken[token].royalties;
}
if (royaltiesType == 2) {
return getRoyaltiesRaribleV2(token,tokenId);
}
if (royaltiesType == 3) {
return getRoyaltiesRaribleV1(token, tokenId);
}
if (royaltiesType == 4) {
return providerExtractor(token, tokenId, royaltiesProvider);
}
if (royaltiesType == 5) {
return getRoyaltiesEIP2981(token, tokenId);
}
if (royaltiesType == 6) {
return new LibPart.Part[](0);
}
revert("something wrong in getRoyalties");
}
function getRoyaltiesRaribleV2(address token, uint tokenId) internal view returns (LibPart.Part[] memory) {
try RoyaltiesV2(token).getRaribleV2Royalties(tokenId) returns (LibPart.Part[] memory result) {
return result;
} catch {
return new LibPart.Part[](0);
}
}
function getRoyaltiesRaribleV1(address token, uint tokenId) internal view returns (LibPart.Part[] memory) {
RoyaltiesV1 v1 = RoyaltiesV1(token);
address payable[] memory recipients;
try v1.getFeeRecipients(tokenId) returns (address payable[] memory resultRecipients) {
recipients = resultRecipients;
} catch {
return new LibPart.Part[](0);
}
uint[] memory values;
try v1.getFeeBps(tokenId) returns (uint[] memory resultValues) {
values = resultValues;
} catch {
return new LibPart.Part[](0);
}
if (values.length != recipients.length) {
return new LibPart.Part[](0);
}
LibPart.Part[] memory result = new LibPart.Part[](values.length);
for (uint256 i = 0; i < values.length; ++i) {
result[i].value = uint96(values[i]);
result[i].account = recipients[i];
}
return result;
}
function getRoyaltiesEIP2981(address token, uint tokenId) internal view returns (LibPart.Part[] memory) {
try IERC2981(token).royaltyInfo(tokenId, LibRoyalties2981._WEIGHT_VALUE) returns (address receiver, uint256 royaltyAmount) {
return LibRoyalties2981.calculateRoyalties(receiver, royaltyAmount);
} catch {
return new LibPart.Part[](0);
}
}
function providerExtractor(address token, uint tokenId, address providerAddress) internal returns (LibPart.Part[] memory) {
try IRoyaltiesProvider(providerAddress).getRoyalties(token, tokenId) returns (LibPart.Part[] memory result) {
return result;
} catch {
return new LibPart.Part[](0);
}
}
uint256[46] private __gap;
}
文件 66 的 71:RoyaltiesV1.sol
pragma solidity >=0.6.2 <0.8.0;
interface RoyaltiesV1 {
event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps);
function getFeeRecipients(uint256 id) external view returns (address payable[] memory);
function getFeeBps(uint256 id) external view returns (uint[] memory);
}
文件 67 的 71:RoyaltiesV2.sol
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
interface RoyaltiesV2 {
event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties);
function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory);
}
文件 68 的 71:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
文件 69 的 71:SafeMathUpgradeable.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMathUpgradeable {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
文件 70 的 71:TransferExecutor.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@rarible/exchange-interfaces/contracts/ITransferProxy.sol";
import "@rarible/exchange-interfaces/contracts/INftTransferProxy.sol";
import "@rarible/exchange-interfaces/contracts/IERC20TransferProxy.sol";
import "./interfaces/ITransferExecutor.sol";
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "./lib/LibTransfer.sol";
abstract contract TransferExecutor is Initializable, OwnableUpgradeable, ITransferExecutor {
using LibTransfer for address;
mapping (bytes4 => address) internal proxies;
event ProxyChange(bytes4 indexed assetType, address proxy);
function __TransferExecutor_init_unchained(address transferProxy, address erc20TransferProxy) internal {
proxies[LibAsset.ERC20_ASSET_CLASS] = address(erc20TransferProxy);
proxies[LibAsset.ERC721_ASSET_CLASS] = address(transferProxy);
proxies[LibAsset.ERC1155_ASSET_CLASS] = address(transferProxy);
}
function setTransferProxy(bytes4 assetType, address proxy) external onlyOwner {
proxies[assetType] = proxy;
emit ProxyChange(assetType, proxy);
}
function transfer(
LibAsset.Asset memory asset,
address from,
address to,
address proxy
) internal override {
if (asset.assetType.assetClass == LibAsset.ERC721_ASSET_CLASS) {
(address token, uint tokenId) = abi.decode(asset.assetType.data, (address, uint256));
require(asset.value == 1, "erc721 value error");
if (from == address(this)){
IERC721Upgradeable(token).safeTransferFrom(address(this), to, tokenId);
} else {
INftTransferProxy(proxy).erc721safeTransferFrom(IERC721Upgradeable(token), from, to, tokenId);
}
} else if (asset.assetType.assetClass == LibAsset.ERC20_ASSET_CLASS) {
(address token) = abi.decode(asset.assetType.data, (address));
if (from == address(this)){
require(IERC20Upgradeable(token).transfer(to, asset.value), "erc20 transfer failed");
} else {
IERC20TransferProxy(proxy).erc20safeTransferFrom(IERC20Upgradeable(token), from, to, asset.value);
}
} else if (asset.assetType.assetClass == LibAsset.ERC1155_ASSET_CLASS) {
(address token, uint tokenId) = abi.decode(asset.assetType.data, (address, uint256));
if (from == address(this)){
IERC1155Upgradeable(token).safeTransferFrom(address(this), to, tokenId, asset.value, "");
} else {
INftTransferProxy(proxy).erc1155safeTransferFrom(IERC1155Upgradeable(token), from, to, tokenId, asset.value, "");
}
} else if (asset.assetType.assetClass == LibAsset.ETH_ASSET_CLASS) {
if (to != address(this)) {
to.transferEth(asset.value);
}
} else {
ITransferProxy(proxy).transfer(asset, from, to);
}
}
uint256[49] private __gap;
}
文件 71 的 71:TransferProxy.sol
pragma solidity >=0.6.9 <0.8.0;
import "@rarible/role-operator/contracts/OperatorRole.sol";
import "@rarible/exchange-interfaces/contracts/INftTransferProxy.sol";
contract TransferProxy is INftTransferProxy, Initializable, OperatorRole {
function __TransferProxy_init() external initializer {
__Ownable_init();
}
function erc721safeTransferFrom(IERC721Upgradeable token, address from, address to, uint256 tokenId) override external onlyOperator {
token.safeTransferFrom(from, to, tokenId);
}
function erc1155safeTransferFrom(IERC1155Upgradeable token, address from, address to, uint256 id, uint256 value, bytes calldata data) override external onlyOperator {
token.safeTransferFrom(from, to, id, value, data);
}
}
{
"compilationTarget": {
"@rarible/exchange-wrapper/contracts/RaribleExchangeWrapper.sol": "RaribleExchangeWrapper"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address[11]","name":"marketplaces","type":"address[11]"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address[]","name":"transferProxies","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"result","type":"bool"}],"name":"Execution","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Paused","type":"event"},{"inputs":[{"internalType":"address[]","name":"transferProxies","type":"address[]"}],"name":"approveWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blur","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum RaribleExchangeWrapper.Markets","name":"marketId","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct RaribleExchangeWrapper.PurchaseDetails[]","name":"purchaseDetails","type":"tuple[]"},{"internalType":"address","name":"feeRecipientFirst","type":"address"},{"internalType":"address","name":"feeRecipientSecond","type":"address"},{"internalType":"bool","name":"allowFail","type":"bool"}],"name":"bulkPurchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"exchangeV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"looksRare","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"looksRareV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seaPort_1_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seaPort_1_4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seaPort_1_5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seaPort_1_6","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum RaribleExchangeWrapper.Markets","name":"marketId","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct RaribleExchangeWrapper.PurchaseDetails","name":"purchaseDetails","type":"tuple"},{"internalType":"address","name":"feeRecipientFirst","type":"address"},{"internalType":"address","name":"feeRecipientSecond","type":"address"}],"name":"singlePurchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sudoswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wyvernExchange","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"x2y2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]