/**
*Submitted for verification at Etherscan.io on 2021-11-03
*/
/**
*Submitted for verification at Etherscan.io on 2021-11-01
*/
// File: contracts/Proxy/IERC1538.sol
pragma solidity ^0.5.0;
/// @title ERC1538 Transparent Contract Standard
/// @dev Required interface
/// Note: the ERC-165 identifier for this interface is 0x61455567
interface IERC1538 {
/// @dev This emits when one or a set of functions are updated in a transparent contract.
/// The message string should give a short description of the change and why
/// the change was made.
event CommitMessage(string message);
/// @dev This emits for each function that is updated in a transparent contract.
/// functionId is the bytes4 of the keccak256 of the function signature.
/// oldDelegate is the delegate contract address of the old delegate contract if
/// the function is being replaced or removed.
/// oldDelegate is the zero value address(0) if a function is being added for the
/// first time.
/// newDelegate is the delegate contract address of the new delegate contract if
/// the function is being added for the first time or if the function is being
/// replaced.
/// newDelegate is the zero value address(0) if the function is being removed.
event FunctionUpdate(bytes4 indexed functionId, address indexed oldDelegate, address indexed newDelegate, string functionSignature);
/// @notice Updates functions in a transparent contract.
/// @dev If the value of _delegate is zero then the functions specified
/// in _functionSignatures are removed.
/// If the value of _delegate is a delegate contract address then the functions
/// specified in _functionSignatures will be delegated to that address.
/// @param _delegate The address of a delegate contract to delegate to or zero
/// to remove functions.
/// @param _functionSignatures A list of function signatures listed one after the other
/// @param _commitMessage A short description of the change and why it is made
/// This message is passed to the CommitMessage event.
function updateContract(address _delegate, string calldata _functionSignatures, string calldata _commitMessage) external;
}
// File: contracts/Proxy/ProxyBaseStorage.sol
pragma solidity ^0.5.0;
///////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @title ProxyBaseStorage
* @dev Defining base storage for the proxy contract.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////
contract ProxyBaseStorage {
//////////////////////////////////////////// VARS /////////////////////////////////////////////
// maps functions to the delegate contracts that execute the functions.
// funcId => delegate contract
mapping(bytes4 => address) public delegates;
// array of function signatures supported by the contract.
bytes[] public funcSignatures;
// maps each function signature to its position in the funcSignatures array.
// signature => index+1
mapping(bytes => uint256) internal funcSignatureToIndex;
// proxy address of itself, can be used for cross-delegate calls but also safety checking.
address proxy;
///////////////////////////////////////////////////////////////////////////////////////////////
}
// File: contracts/IERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function mint(address recipient, uint256 amount) external returns(bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function blindBox(address seller, string calldata tokenURI, bool flag, address to, string calldata ownerId) external returns (uint256);
function mintAliaForNonCrypto(uint256 price, address from) external returns (bool);
function nonCryptoNFTVault() external returns(address);
function mainPerecentage() external returns(uint256);
function authorPercentage() external returns(uint256);
function platformPerecentage() external returns(uint256);
function updateAliaBalance(string calldata stringId, uint256 amount) external returns(bool);
function getSellDetail(uint256 tokenId) external view returns (address, uint256, uint256, address, uint256, uint256, uint256);
function getNonCryptoWallet(string calldata ownerId) external view returns(uint256);
function getNonCryptoOwner(uint256 tokenId) external view returns(string memory);
function adminOwner(address _address) external view returns(bool);
function getAuthor(uint256 tokenIdFunction) external view returns (address);
function _royality(uint256 tokenId) external view returns (uint256);
function getrevenueAddressBlindBox(string calldata info) external view returns(address);
function getboxNameByToken(uint256 token) external view returns(string memory);
//Revenue share
function addNonCryptoAuthor(string calldata artistId, uint256 tokenId, bool _isArtist) external returns(bool);
function transferAliaArtist(address buyer, uint256 price, address nftVaultAddress, uint256 tokenId ) external returns(bool);
function checkArtistOwner(string calldata artistId, uint256 tokenId) external returns(bool);
function checkTokenAuthorIsArtist(uint256 tokenId) external returns(bool);
function withdraw(uint) external;
function deposit() payable external;
// function approve(address spender, uint256 rawAmount) external;
// BlindBox ref:https://noborderz.slack.com/archives/C0236PBG601/p1633942033011800?thread_ts=1633941154.010300&cid=C0236PBG601
function isSellable (string calldata name) external view returns(bool);
function tokenURI(uint256 tokenId) external view returns (string memory);
function ownerOf(uint256 tokenId) external view returns (address);
function burn (uint256 tokenId) external;
}
// File: contracts/INFT.sol
pragma solidity ^0.5.0;
// import "../openzeppelin-solidity/contracts/token/ERC721/IERC721Full.sol";
interface INFT {
function transferFromAdmin(address owner, address to, uint256 tokenId) external;
function mintWithTokenURI(address to, string calldata tokenURI) external returns (uint256);
function getAuthor(uint256 tokenIdFunction) external view returns (address);
function updateTokenURI(uint256 tokenIdT, string calldata uriT) external;
//
function mint(address to, string calldata tokenURI) external returns (uint256);
function transferOwnership(address newOwner) external;
function ownerOf(uint256 tokenId) external view returns(address);
function transferFrom(address owner, address to, uint256 tokenId) external;
}
// File: contracts/IFactory.sol
pragma solidity ^0.5.0;
contract IFactory {
function create(string calldata name_, string calldata symbol_, address owner_) external returns(address);
function getCollections(address owner_) external view returns(address [] memory);
}
// File: contracts/LPInterface.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface LPInterface {
/**
* @dev Returns the amount of tokens in existence.
*/
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}
// File: openzeppelin-solidity/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, "SafeMath: division by zero");
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0, "SafeMath: modulo by zero");
return a % b;
}
}
// File: contracts/Proxy/DexStorage.sol
pragma solidity ^0.5.0;
///////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @title DexStorage
* @dev Defining dex storage for the proxy contract.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////
contract DexStorage {
using SafeMath for uint256;
address x; // dummy variable, never set or use its value in any logic contracts. It keeps garbage value & append it with any value set on it.
IERC20 ALIA;
INFT XNFT;
IFactory factory;
IERC20 OldNFTDex;
IERC20 BUSD;
IERC20 BNB;
struct RDetails {
address _address;
uint256 percentage;
}
struct AuthorDetails {
address _address;
uint256 royalty;
string ownerId;
bool isSecondry;
}
// uint256[] public sellList; // this violates generlization as not tracking tokenIds agains nftContracts/collections but ignoring as not using it in logic anywhere (uncommented)
mapping (uint256 => mapping(address => AuthorDetails)) internal _tokenAuthors;
mapping (address => bool) public adminOwner;
address payable public platform;
address payable public authorVault;
uint256 internal platformPerecentage;
struct fixedSell {
// address nftContract; // adding to support multiple NFT contracts buy/sell
address seller;
uint256 price;
uint256 timestamp;
bool isDollar;
uint256 currencyType;
}
// stuct for auction
struct auctionSell {
address seller;
address nftContract;
address bidder;
uint256 minPrice;
uint256 startTime;
uint256 endTime;
uint256 bidAmount;
bool isDollar;
uint256 currencyType;
// address nftAddress;
}
// tokenId => nftContract => fixedSell
mapping (uint256 => mapping (address => fixedSell)) internal _saleTokens;
mapping(address => bool) public _supportNft;
// tokenId => nftContract => auctionSell
mapping(uint256 => mapping ( address => auctionSell)) internal _auctionTokens;
address payable public nonCryptoNFTVault;
// tokenId => nftContract => ownerId
mapping (uint256=> mapping (address => string)) internal _nonCryptoOwners;
struct balances{
uint256 bnb;
uint256 Alia;
uint256 BUSD;
}
mapping (string => balances) internal _nonCryptoWallet;
LPInterface LPAlia;
LPInterface LPBNB;
uint256 public adminDiscount;
address admin;
mapping (string => address) internal revenueAddressBlindBox;
mapping (uint256=>string) internal boxNameByToken;
bool public collectionConfig;
uint256 public countCopy;
mapping (uint256=> mapping( address => mapping(uint256 => bool))) _allowedCurrencies;
IERC20 token;
// struct offer {
// address _address;
// string ownerId;
// uint256 currencyType;
// uint256 price;
// }
// struct offers {
// uint256 count;
// mapping (uint256 => offer) _offer;
// }
// mapping(uint256 => mapping(address => offers)) _offers;
uint256[] allowedArray;
}
// File: openzeppelin-solidity/contracts/ownership/Ownable.sol
pragma solidity ^0.5.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be aplied to your functions to restrict their use to
* the owner.
*/
contract Ownable {
address internal _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Returns true if the caller is the current owner.
*/
function isOwner() public view returns (bool) {
return msg.sender == _owner;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* > Note: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: contracts/Proxy/DexProxy.sol
pragma solidity ^0.5.0;
///////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @title ProxyReceiver Contract
* @dev Handles forwarding calls to receiver delegates while offering transparency of updates.
* Follows ERC-1538 standard.
*
* NOTE: Not recommended for direct use in a production contract, as no security control.
* Provided as simple example only.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////
contract DexProxy is ProxyBaseStorage, DexStorage, IERC1538, Ownable {
constructor() public {
proxy = address(this);
//Adding ERC1538 updateContract function
bytes memory signature = "updateContract(address,string,string)";
bytes4 funcId = bytes4(keccak256(signature));
delegates[funcId] = proxy;
funcSignatures.push(signature);
funcSignatureToIndex[signature] = funcSignatures.length;
emit FunctionUpdate(funcId, address(0), proxy, string(signature));
emit CommitMessage("Added ERC1538 updateContract function at contract creation");
}
///////////////////////////////////////////////////////////////////////////////////////////////
function() external payable {
if (msg.sig == bytes4(0) && msg.value != uint(0)) { // skipping ethers/BNB received to delegate
return;
}
address delegate = delegates[msg.sig];
require(delegate != address(0), "Function does not exist.");
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize)
let result := delegatecall(gas, delegate, ptr, calldatasize, 0, 0)
let size := returndatasize
returndatacopy(ptr, 0, size)
switch result
case 0 {revert(ptr, size)}
default {return (ptr, size)}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
/// @notice Updates functions in a transparent contract.
/// @dev If the value of _delegate is zero then the functions specified
/// in _functionSignatures are removed.
/// If the value of _delegate is a delegate contract address then the functions
/// specified in _functionSignatures will be delegated to that address.
/// @param _delegate The address of a delegate contract to delegate to or zero
/// @param _functionSignatures A list of function signatures listed one after the other
/// @param _commitMessage A short description of the change and why it is made
/// This message is passed to the CommitMessage event.
function updateContract(address _delegate, string calldata _functionSignatures, string calldata _commitMessage) onlyOwner external {
// pos is first used to check the size of the delegate contract.
// After that pos is the current memory location of _functionSignatures.
// It is used to move through the characters of _functionSignatures
uint256 pos;
if(_delegate != address(0)) {
assembly {
pos := extcodesize(_delegate)
}
require(pos > 0, "_delegate address is not a contract and is not address(0)");
}
// creates a bytes version of _functionSignatures
bytes memory signatures = bytes(_functionSignatures);
// stores the position in memory where _functionSignatures ends.
uint256 signaturesEnd;
// stores the starting position of a function signature in _functionSignatures
uint256 start;
assembly {
pos := add(signatures,32)
start := pos
signaturesEnd := add(pos,mload(signatures))
}
// the function id of the current function signature
bytes4 funcId;
// the delegate address that is being replaced or address(0) if removing functions
address oldDelegate;
// the length of the current function signature in _functionSignatures
uint256 num;
// the current character in _functionSignatures
uint256 char;
// the position of the current function signature in the funcSignatures array
uint256 index;
// the last position in the funcSignatures array
uint256 lastIndex;
// parse the _functionSignatures string and handle each function
for (; pos < signaturesEnd; pos++) {
assembly {char := byte(0,mload(pos))}
// 0x29 == )
if (char == 0x29) {
pos++;
num = (pos - start);
start = pos;
assembly {
mstore(signatures,num)
}
funcId = bytes4(keccak256(signatures));
oldDelegate = delegates[funcId];
if(_delegate == address(0)) {
index = funcSignatureToIndex[signatures];
require(index != 0, "Function does not exist.");
index--;
lastIndex = funcSignatures.length - 1;
if (index != lastIndex) {
funcSignatures[index] = funcSignatures[lastIndex];
funcSignatureToIndex[funcSignatures[lastIndex]] = index + 1;
}
funcSignatures.length--;
delete funcSignatureToIndex[signatures];
delete delegates[funcId];
emit FunctionUpdate(funcId, oldDelegate, address(0), string(signatures));
}
else if (funcSignatureToIndex[signatures] == 0) {
require(oldDelegate == address(0), "FuncId clash.");
delegates[funcId] = _delegate;
funcSignatures.push(signatures);
funcSignatureToIndex[signatures] = funcSignatures.length;
emit FunctionUpdate(funcId, address(0), _delegate, string(signatures));
}
else if (delegates[funcId] != _delegate) {
delegates[funcId] = _delegate;
emit FunctionUpdate(funcId, oldDelegate, _delegate, string(signatures));
}
assembly {signatures := add(signatures,num)}
}
}
emit CommitMessage(_commitMessage);
}
///////////////////////////////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////////////////////////////
{
"compilationTarget": {
"DexProxy.sol": "DexProxy"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"_supportNft","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"funcSignatures","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"platform","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"countCopy","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_delegate","type":"address"},{"name":"_functionSignatures","type":"string"},{"name":"_commitMessage","type":"string"}],"name":"updateContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"collectionConfig","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nonCryptoNFTVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes4"}],"name":"delegates","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminDiscount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"adminOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"authorVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"message","type":"string"}],"name":"CommitMessage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"functionId","type":"bytes4"},{"indexed":true,"name":"oldDelegate","type":"address"},{"indexed":true,"name":"newDelegate","type":"address"},{"indexed":false,"name":"functionSignature","type":"string"}],"name":"FunctionUpdate","type":"event"}]