编译器
0.8.28+commit.7893614a
文件 1 的 14:Address.sol
pragma solidity ^0.8.20;
import {Errors} from "./Errors.sol";
library Address {
error AddressEmptyCode(address target);
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert Errors.InsufficientBalance(address(this).balance, amount);
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert Errors.FailedCall();
}
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
function _revert(bytes memory returndata) private pure {
if (returndata.length > 0) {
assembly ("memory-safe") {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert Errors.FailedCall();
}
}
}
文件 2 的 14:Errors.sol
pragma solidity ^0.8.20;
library Errors {
error InsufficientBalance(uint256 balance, uint256 needed);
error FailedCall();
error FailedDeployment();
error MissingPrecompile(address);
}
文件 3 的 14:GotiginDex.sol
pragma solidity 0.8.28;
import "./GotiginOwner.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
contract GotiginDex is ReentrancyGuard, GotiginOwner {
using Strings for uint256;
using SafeERC20 for IERC20;
enum BidState {
Requested,
Created,
Cancelled,
Processed
}
struct Order {
uint256 reqId;
uint256 paidId;
uint256 sellAmountGross;
uint256 sellCharges;
uint256 sellAmountNet;
uint256 buyAmountGross;
uint256 buyCharges;
uint256 buyAmountNet;
address seller;
address buyer;
IERC20 sellToken;
IERC20 buyToken;
BidState bidState;
}
struct RequestBid {
IERC20 sellToken;
IERC20 buyToken;
uint256 sellAmount;
uint256 buyAmount;
}
struct UserOrdersRequest {
uint256 startIndex;
uint256 numberOfOrders;
address userAddress;
bool onlyPaidOrders;
}
struct OrdersRequest {
uint256 startIndex;
uint256 numberOfOrders;
bool onlyPaidOrders;
}
struct OrdersResponse {
Order[] orders;
uint256 endedAtIndex;
uint256 totalOrdersCount;
}
struct TokenTrackInternal {
bool existInArr;
uint256 activeCount;
}
struct TokenTrack {
uint256 count;
IERC20 token;
}
struct TokenTracksRequest {
uint256 startIndex;
uint256 iterationCount;
bool allowInActive;
}
struct TokenTracksResponse {
TokenTrack[] tokenTracks;
uint256 endedAtIndex;
uint256 totalTokenCount;
}
struct HaltNewReqState {
bool isHalted;
string reason;
}
address private immutable _thisAddress;
mapping(uint256 reqId => Order) public allOrders;
mapping(uint256 paidId => uint256) public paidOrders;
mapping(address userAddress => uint256[]) private _userAllOrders;
mapping(address userAddress => uint256[]) private _userPaidOrders;
mapping(uint256 orderId => bool locked) private _orderLocks;
uint256 public orderIdCounter;
uint256 public paidOrderIdCounter;
mapping(address members => bool) public membersMap;
IERC20 public membershipToken;
uint256 public membershipAmount;
bool public isMembershipOpen;
uint256 public feesRateDenominator = 1e4;
uint256 public maxThresholdFees;
HaltNewReqState public haltNewReqState;
error InsufficientAllowance(IERC20 token, uint256 allowance, uint256 requiredAmount);
error InvalidAmountBid();
error IdenticalTokens();
error InvalidBid(uint256 reqId);
error BidIdsMismatch(uint256 reqId, uint256 paidId, uint256 foundReqId, uint256 foundPaidId);
error OrderIsCurrentlyLocked(uint256 orderId);
error OnlySellerAuthorized(uint256 orderId);
error MembershipIsCurrentlyClosed();
error YouAreAlreadyMember();
error TransferNativeCurrFailed(address recipient, uint256 amount);
error NewRequestHalted(string reason);
event BidRequestedSuccess(address indexed seller, uint256 indexed reqId, bool isNew, Order order);
event BidRequestedTokenSuccess(IERC20 indexed sellingToken, IERC20 indexed buyingToken, uint256 indexed reqId, bool isNew, Order order);
event BidCreatedSuccess(address indexed seller, uint256 indexed reqId, uint256 indexed paidId, Order order);
event BidCreatedTokenSuccess(IERC20 indexed sellingToken, IERC20 indexed buyingToken, uint256 indexed paidId, Order order);
event BidProcessedSuccess(address indexed seller, address indexed buyer, uint256 indexed paidId, Order order);
event BidProcessedTokenSuccess(IERC20 indexed sellingToken, IERC20 indexed buyingToken, uint256 indexed paidId, Order order);
event BidCancelledSuccess(address indexed seller, uint256 indexed reqId, uint256 indexed paidId, Order order);
event BidCancelledTokenSuccess(IERC20 indexed sellingToken, IERC20 indexed buyingToken, uint256 indexed paidId, Order order);
event MembershipUpdated(IERC20 indexed token, uint256 amount, bool isOpen);
event NewMembershipAdded(address indexed newMember, uint256 amount);
event TokenFeesCollected(address indexed owner, uint256 orderId, uint256 value);
event MembershipFeesCollected(address indexed owner, uint256 value);
event PaymentCollectedFromBuyer(address indexed buyer, IERC20 token, uint256 value, uint256 ordierId);
event PaymentCollectedFromSeller(address indexed seller, IERC20 token, uint256 value, uint256 ordierId);
event PaymentTransferredToBuyer(address indexed buyer, Order order);
event PaymentTransferredToSeller(address indexed seller, Order order);
event FeesRateDenominatorUpdated(uint256 indexed value);
event FeesRateMaxThresholdUpdated(uint256 indexed value);
event TransferNativeCurrSuccess(address indexed recipient, uint256 amount);
event HaltNewReqStateUpdated(bool indexed isHalted, string indexed reason);
constructor(address[] memory initialOwners) payable GotiginOwner(initialOwners){
_thisAddress = address(this);
}
modifier validateOrderRequest(RequestBid memory orderRequest) {
if (orderRequest.sellAmount == 0 || orderRequest.buyAmount == 0) {
revert InvalidAmountBid();
}
if (orderRequest.sellToken == orderRequest.buyToken) {
revert IdenticalTokens();
}
_;
}
modifier orderLockReentrancy(uint256 orderId) {
if (_orderLocks[orderId]) {
revert OrderIsCurrentlyLocked(orderId);
}
_orderLocks[orderId] = true;
_;
_orderLocks[orderId] = false;
}
function _validateBidState(Order memory order, uint256 reqId, BidState bidState, BidState bitStateAlt) internal pure {
bool isInvalid = reqId == 0 || order.reqId == 0 || order.reqId != reqId ||
(order.bidState != bidState && order.bidState != bitStateAlt);
if (isInvalid) {
revert InvalidBid(reqId);
}
}
function _validateReqPaidMatch(Order memory reqOrder, uint256 reqId, uint256 paidId) internal view {
uint256 foundReqId = paidOrders[paidId];
bool isInvalid = reqOrder.reqId != reqId || reqOrder.paidId != paidId ||
foundReqId != reqId;
if (isInvalid) {
revert BidIdsMismatch(reqId, paidId, reqOrder.reqId, reqOrder.paidId);
}
}
function _onlySellerAuthorized(uint256 orderId) private view {
Order storage order = allOrders[orderId];
if (order.seller != msg.sender) {
revert OnlySellerAuthorized(orderId);
}
}
function _isZeroAddressToken(IERC20 addrToCheck) private pure returns (bool addressIsZero) {
addressIsZero = address(addrToCheck) == address(0);
}
function _transferNativeCurr(address recipient, uint256 amount) private {
(bool success,) = payable(recipient).call{value: amount}("");
if (!success) {
revert TransferNativeCurrFailed(recipient, amount);
}
emit TransferNativeCurrSuccess(recipient, amount);
}
function getOrderBidStateLength() public pure returns (uint256 bidStateLength) {
bidStateLength = uint256(type(BidState).max) + 1;
}
function applyFeesRate(uint256 amount) public view returns (uint256 feesAmount) {
feesAmount = amount / feesRateDenominator;
uint256 _maxThresholdFees = maxThresholdFees;
if (feesAmount >= _maxThresholdFees && _maxThresholdFees != 0) {
feesAmount = _maxThresholdFees;
}
}
function updateFeesRate(uint256 amount) external payable onlyOwner {
if (feesRateDenominator != amount) {
feesRateDenominator = amount;
emit FeesRateDenominatorUpdated(amount);
}
}
function updateFeesRateThreshold(uint256 amount) external payable onlyOwner {
if (maxThresholdFees != amount) {
maxThresholdFees = amount;
emit FeesRateMaxThresholdUpdated(amount);
}
}
function requestBid(RequestBid memory orderRequest) external nonReentrant validateOrderRequest(orderRequest) returns (Order memory order){
HaltNewReqState storage haltState = haltNewReqState;
if (haltState.isHalted) {
revert NewRequestHalted(haltState.reason);
}
order.seller = msg.sender;
order.sellAmountGross = orderRequest.sellAmount;
order.sellCharges = applyFeesRate(orderRequest.sellAmount);
order.sellAmountNet = orderRequest.sellAmount - order.sellCharges;
order.buyCharges = applyFeesRate(orderRequest.buyAmount);
order.buyAmountGross = orderRequest.buyAmount + order.buyCharges;
order.buyAmountNet = orderRequest.buyAmount;
order.sellToken = orderRequest.sellToken;
order.buyToken = orderRequest.buyToken;
order.reqId = ++orderIdCounter;
order.bidState = BidState.Requested;
allOrders[order.reqId] = order;
_userAllOrders[msg.sender].push(order.reqId);
emit BidRequestedSuccess(order.seller, order.reqId, true, order);
emit BidRequestedTokenSuccess(order.sellToken, order.buyToken, order.reqId, true, order);
}
function modifyRequestedBid(RequestBid memory orderRequest, uint256 reqId) external nonReentrant validateOrderRequest(orderRequest) orderLockReentrancy(reqId) returns (Order memory order){
order = allOrders[reqId];
_validateBidState(order, reqId, BidState.Requested, BidState.Requested);
_onlySellerAuthorized(reqId);
order.sellAmountGross = orderRequest.sellAmount;
order.sellCharges = applyFeesRate(orderRequest.sellAmount);
order.sellAmountNet = orderRequest.sellAmount - order.sellCharges;
order.buyCharges = applyFeesRate(orderRequest.buyAmount);
order.buyAmountGross = orderRequest.buyAmount + order.buyCharges;
order.buyAmountNet = orderRequest.buyAmount;
order.sellToken = orderRequest.sellToken;
order.buyToken = orderRequest.buyToken;
allOrders[reqId] = order;
emit BidRequestedSuccess(order.seller, order.reqId, false, order);
emit BidRequestedTokenSuccess(order.sellToken, order.buyToken, order.reqId, false, order);
}
function placeBid(uint256 reqId) external payable nonReentrant orderLockReentrancy(reqId) returns (Order memory order){
order = allOrders[reqId];
_validateBidState(order, reqId, BidState.Requested, BidState.Requested);
_onlySellerAuthorized(reqId);
if (membersMap[msg.sender]) {
order.sellCharges = 0;
order.sellAmountNet = order.sellAmountGross;
}
bool isSellingTokenNativeCurr = _isZeroAddressToken(order.sellToken);
uint256 allowance = isSellingTokenNativeCurr ?
msg.value :
order.sellToken.allowance(msg.sender, _thisAddress);
if (!isSellingTokenNativeCurr && !(allowance >= order.sellAmountGross)) {
revert InsufficientAllowance(order.sellToken, msg.value, order.sellAmountGross);
} else if (allowance != order.sellAmountGross) {
revert InsufficientAllowance(order.sellToken, msg.value, order.sellAmountGross);
}
if (!isSellingTokenNativeCurr) {
order.sellToken.safeTransferFrom(msg.sender, _thisAddress, order.sellAmountGross);
}
emit PaymentCollectedFromSeller(msg.sender, order.sellToken, order.sellAmountGross, reqId);
if (order.sellCharges != 0) {
address firstOwner = _getFirstOwner();
isSellingTokenNativeCurr ?
_transferNativeCurr(firstOwner, order.sellCharges) :
order.sellToken.safeTransfer(firstOwner, order.sellCharges);
emit TokenFeesCollected(firstOwner, reqId, order.sellCharges);
}
order.bidState = BidState.Created;
uint256 paidId = ++paidOrderIdCounter;
order.paidId = paidId;
allOrders[reqId] = order;
paidOrders[paidId] = reqId;
_userPaidOrders[msg.sender].push(paidId);
emit BidCreatedSuccess(order.seller, reqId, paidId, order);
emit BidCreatedTokenSuccess(order.sellToken, order.buyToken, paidId, order);
}
function buyBid(uint256 reqId, uint256 paidId) external payable nonReentrant orderLockReentrancy(reqId) returns (Order memory order) {
order = allOrders[reqId];
_validateBidState(order, reqId, BidState.Created, BidState.Created);
_validateReqPaidMatch(order, reqId, paidId);
if (membersMap[msg.sender]) {
order.buyCharges = 0;
order.buyAmountNet = order.buyAmountGross;
}
bool isBuyingTokenNativeCurr = _isZeroAddressToken(order.buyToken);
uint256 allowance = isBuyingTokenNativeCurr ?
msg.value :
order.buyToken.allowance(msg.sender, _thisAddress);
if (!isBuyingTokenNativeCurr && !(allowance >= order.buyAmountGross)) {
revert InsufficientAllowance(order.buyToken, msg.value, order.buyAmountGross);
} else if (allowance != order.buyAmountGross) {
revert InsufficientAllowance(order.buyToken, msg.value, order.buyAmountGross);
}
order.buyer = msg.sender;
if (isBuyingTokenNativeCurr) {
_transferNativeCurr(order.seller, order.buyAmountNet);
order.sellToken.safeTransfer(order.buyer, order.sellAmountNet);
} else {
order.buyToken.safeTransferFrom(msg.sender, _thisAddress, order.buyAmountGross);
order.buyToken.safeTransfer(order.seller, order.buyAmountNet);
_isZeroAddressToken(order.sellToken) ?
_transferNativeCurr(order.buyer, order.sellAmountNet) :
order.sellToken.safeTransfer(order.buyer, order.sellAmountNet);
}
emit PaymentCollectedFromBuyer(msg.sender, order.buyToken, order.buyAmountGross, reqId);
if (order.buyCharges != 0) {
address firstOwner = _getFirstOwner();
isBuyingTokenNativeCurr ?
_transferNativeCurr(firstOwner, order.buyCharges) :
order.buyToken.safeTransfer(firstOwner, order.buyCharges);
emit TokenFeesCollected(firstOwner, reqId, order.buyCharges);
}
order.bidState = BidState.Processed;
allOrders[reqId] = order;
if (msg.sender != order.seller) {
_userAllOrders[msg.sender].push(reqId);
_userPaidOrders[msg.sender].push(paidId);
}
emit PaymentTransferredToBuyer(order.buyer, order);
emit PaymentTransferredToSeller(order.seller, order);
emit BidProcessedSuccess(order.seller, order.buyer, order.paidId, order);
emit BidProcessedTokenSuccess(order.sellToken, order.buyToken, order.paidId, order);
}
function cancelBid(uint256 reqId, uint256 paidId) external nonReentrant orderLockReentrancy(reqId) returns (Order memory order){
order = allOrders[reqId];
_validateBidState(order, reqId, BidState.Requested, BidState.Created);
_onlySellerAuthorized(reqId);
if (order.bidState == BidState.Requested) {
order.bidState = BidState.Cancelled;
allOrders[reqId] = order;
emit BidCancelledSuccess(order.seller, reqId, paidId, order);
emit BidCancelledTokenSuccess(order.sellToken, order.buyToken, paidId, order);
return order;
}
_validateReqPaidMatch(order, reqId, paidId);
_isZeroAddressToken(order.sellToken) ?
_transferNativeCurr(order.seller, order.sellAmountNet) :
order.sellToken.safeTransfer(order.seller, order.sellAmountNet);
order.bidState = BidState.Cancelled;
allOrders[order.reqId] = order;
emit BidCancelledSuccess(order.seller, reqId, paidId, order);
emit BidCancelledTokenSuccess(order.sellToken, order.buyToken, paidId, order);
}
function getUserOrders(UserOrdersRequest calldata userOrdersRequest) external view returns (OrdersResponse memory ordersResponse) {
bool onlyPaidOrders = userOrdersRequest.onlyPaidOrders;
uint256[] storage reqOrPaidIds = onlyPaidOrders ?
_userPaidOrders[userOrdersRequest.userAddress] :
_userAllOrders[userOrdersRequest.userAddress];
ordersResponse.totalOrdersCount = reqOrPaidIds.length;
if (ordersResponse.totalOrdersCount == 0) {
return ordersResponse;
}
if (userOrdersRequest.startIndex >= ordersResponse.totalOrdersCount) {
ordersResponse.endedAtIndex = ordersResponse.totalOrdersCount - 1;
return ordersResponse;
}
uint256 remainingSize = ordersResponse.totalOrdersCount - userOrdersRequest.startIndex;
uint256 size = userOrdersRequest.numberOfOrders < remainingSize ?
userOrdersRequest.numberOfOrders : remainingSize;
ordersResponse.orders = new Order[](size);
mapping(uint256 orderId => Order) storage cachedOrders = allOrders;
remainingSize = remainingSize - 1;
ordersResponse.endedAtIndex = userOrdersRequest.startIndex + size - 1;
unchecked {
if (onlyPaidOrders) {
mapping(uint256 paidId => uint256) storage paidCachedOrders = paidOrders;
for (uint256 i = 0; i < size; ++i) {
uint256 paidId = reqOrPaidIds[remainingSize - i];
uint256 orderId = paidCachedOrders[paidId];
ordersResponse.orders[i] = cachedOrders[orderId];
}
} else {
for (uint256 i = 0; i < size; ++i) {
ordersResponse.orders[i] = cachedOrders[reqOrPaidIds[remainingSize - i]];
}
}
}
}
function getOrders(OrdersRequest calldata ordersRequest) external view returns (OrdersResponse memory ordersResponse) {
uint256 iterationCount = ordersRequest.numberOfOrders;
bool onlyPaidOrders = ordersRequest.onlyPaidOrders;
ordersResponse.totalOrdersCount = onlyPaidOrders ? paidOrderIdCounter : orderIdCounter;
if (ordersResponse.totalOrdersCount == 0) {
return ordersResponse;
}
if (ordersRequest.startIndex >= ordersResponse.totalOrdersCount) {
ordersResponse.endedAtIndex = ordersResponse.totalOrdersCount - 1;
return ordersResponse;
}
uint256 remainingSize = ordersResponse.totalOrdersCount - ordersRequest.startIndex;
uint256 size = iterationCount < remainingSize ? iterationCount : remainingSize;
ordersResponse.orders = new Order[](size);
mapping(uint256 orderId => Order) storage cachedOrders = allOrders;
ordersResponse.endedAtIndex = ordersRequest.startIndex + size - 1;
unchecked {
if (onlyPaidOrders) {
mapping(uint256 paidId => uint256) storage paidCachedOrders = paidOrders;
for (uint256 i = 0; i < size; ++i) {
uint256 orderId = paidCachedOrders[remainingSize - i];
ordersResponse.orders[i] = cachedOrders[orderId];
}
} else {
for (uint256 i = 0; i < size; ++i) {
ordersResponse.orders[i] = cachedOrders[remainingSize - i];
}
}
}
}
function updateMembershipToken(IERC20 token, uint256 amount, bool membershipOpen) external payable nonReentrant onlyOwner {
bool membershipUpdated;
if (membershipAmount != amount) {
membershipAmount = amount;
membershipUpdated = true;
}
if (membershipToken != token) {
membershipToken = token;
membershipUpdated = true;
}
if (isMembershipOpen != membershipOpen) {
isMembershipOpen = membershipOpen;
membershipUpdated = true;
}
if (membershipUpdated) {
emit MembershipUpdated(token, amount, membershipOpen);
}
}
function updateReqHaltState(HaltNewReqState memory newHaltReqState) external payable nonReentrant onlyOwner {
haltNewReqState = newHaltReqState;
emit HaltNewReqStateUpdated(newHaltReqState.isHalted, newHaltReqState.reason);
}
function getPermanentMembership() external payable nonReentrant {
if (!isMembershipOpen) {
revert MembershipIsCurrentlyClosed();
}
bool isAlreadyMember = membersMap[msg.sender];
if (isAlreadyMember) {
revert YouAreAlreadyMember();
}
uint256 _membershipAmount = membershipAmount;
IERC20 _membershipToken = membershipToken;
bool isTokenNative = _isZeroAddressToken(_membershipToken);
uint256 allowance = isTokenNative ?
msg.value :
_membershipToken.allowance(msg.sender, _thisAddress);
if (!(allowance >= _membershipAmount)) {
revert InsufficientAllowance(_membershipToken, allowance, _membershipAmount);
}
address firstOwner = _getFirstOwner();
isTokenNative ?
_transferNativeCurr(firstOwner, _membershipAmount) :
_membershipToken.safeTransferFrom(msg.sender, firstOwner, _membershipAmount);
membersMap[msg.sender] = true;
emit MembershipFeesCollected(firstOwner, _membershipAmount);
emit NewMembershipAdded(msg.sender, _membershipAmount);
}
}
文件 4 的 14:GotiginOwner.sol
pragma solidity 0.8.28;
abstract contract GotiginOwner {
struct OwnerData {
bool isOwner;
uint256 priority;
}
mapping(address ownerAddress => OwnerData) private _ownerData;
address[] private _ownerArray;
error NotAuthorized();
error InvalidOwner();
error AtLeastOneOwnerRequired();
event OwnerRemoved(address indexed removedOwner);
constructor(address[] memory initialOwners) {
uint256 initialOwnersLength = initialOwners.length;
if (initialOwnersLength == 0) {
revert AtLeastOneOwnerRequired();
}
unchecked {
for (uint256 i = 0; i < initialOwnersLength; ++i) {
address ownerAddress = initialOwners[i];
if (ownerAddress == address(0)) {
revert InvalidOwner();
}
OwnerData storage ownerData = _ownerData[ownerAddress];
ownerData.isOwner = true;
ownerData.priority = i;
_ownerArray.push(ownerAddress);
}
}
}
modifier onlyOwner() virtual {
if (!_ownerData[msg.sender].isOwner) {
revert NotAuthorized();
}
_;
}
modifier higherPrivilegeOwner(address ownerToRemove) virtual {
if (!_ownerData[ownerToRemove].isOwner || !_ownerData[msg.sender].isOwner) {
revert InvalidOwner();
}
_;
}
function removeOwner(address ownerToRemove) external payable virtual onlyOwner higherPrivilegeOwner(ownerToRemove) {
OwnerData storage ownerToRemoveData = _ownerData[ownerToRemove];
uint256 callerPriority = _ownerData[msg.sender].priority;
uint256 ownerToRemovePriority = ownerToRemoveData.priority;
if (callerPriority <= ownerToRemovePriority) {
revert InvalidOwner();
}
ownerToRemoveData.isOwner = false;
ownerToRemoveData.priority = 0;
uint256 ownerArrayLength = _ownerArray.length;
address[] storage owners = _ownerArray;
bool ownerRemoved;
unchecked {
for (uint256 i = 0; i < ownerArrayLength; ++i) {
if (owners[i] == ownerToRemove) {
for (uint256 j = i; j < ownerArrayLength - 1; ++j) {
owners[j] = owners[j + 1];
}
owners.pop();
ownerRemoved = true;
break;
}
}
}
if (ownerRemoved) {
emit OwnerRemoved(ownerToRemove);
}
}
function _getFirstOwner() internal view virtual returns (address owner) {
owner = _ownerArray[0];
}
function isOwner(address account) public view virtual returns (bool) {
return _ownerData[account].isOwner;
}
function getOwnerCount() public view virtual returns (uint256) {
return _ownerArray.length;
}
function getOwnerPriority(address owner) public view virtual returns (uint256) {
return _ownerData[owner].priority;
}
}
文件 5 的 14:IERC1363.sol
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
interface IERC1363 is IERC20, IERC165 {
function transferAndCall(address to, uint256 value) external returns (bool);
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
function approveAndCall(address spender, uint256 value) external returns (bool);
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}
文件 6 的 14:IERC165.sol
pragma solidity ^0.8.20;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 7 的 14:IERC20.sol
pragma solidity ^0.8.20;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 8 的 14:Math.sol
pragma solidity ^0.8.20;
import {Panic} from "../Panic.sol";
import {SafeCast} from "./SafeCast.sol";
library Math {
enum Rounding {
Floor,
Ceil,
Trunc,
Expand
}
function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
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 success, uint256 result) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {
unchecked {
return b ^ ((a ^ b) * SafeCast.toUint(condition));
}
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return ternary(a > b, a, b);
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return ternary(a < b, a, b);
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a & b) + (a ^ b) / 2;
}
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
Panic.panic(Panic.DIVISION_BY_ZERO);
}
unchecked {
return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);
}
}
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
uint256 prod0 = x * y;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
if (denominator <= prod1) {
Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));
}
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (0 - denominator);
assembly {
denominator := div(denominator, twos)
prod0 := div(prod0, twos)
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inverse = (3 * denominator) ^ 2;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
result = prod0 * inverse;
return result;
}
}
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);
}
function invMod(uint256 a, uint256 n) internal pure returns (uint256) {
unchecked {
if (n == 0) return 0;
uint256 remainder = a % n;
uint256 gcd = n;
int256 x = 0;
int256 y = 1;
while (remainder != 0) {
uint256 quotient = gcd / remainder;
(gcd, remainder) = (
remainder,
gcd - remainder * quotient
);
(x, y) = (
y,
x - y * int256(quotient)
);
}
if (gcd != 1) return 0;
return ternary(x < 0, n - uint256(-x), uint256(x));
}
}
function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {
unchecked {
return Math.modExp(a, p - 2, p);
}
}
function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {
(bool success, uint256 result) = tryModExp(b, e, m);
if (!success) {
Panic.panic(Panic.DIVISION_BY_ZERO);
}
return result;
}
function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {
if (m == 0) return (false, 0);
assembly ("memory-safe") {
let ptr := mload(0x40)
mstore(ptr, 0x20)
mstore(add(ptr, 0x20), 0x20)
mstore(add(ptr, 0x40), 0x20)
mstore(add(ptr, 0x60), b)
mstore(add(ptr, 0x80), e)
mstore(add(ptr, 0xa0), m)
success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)
result := mload(0x00)
}
}
function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {
(bool success, bytes memory result) = tryModExp(b, e, m);
if (!success) {
Panic.panic(Panic.DIVISION_BY_ZERO);
}
return result;
}
function tryModExp(
bytes memory b,
bytes memory e,
bytes memory m
) internal view returns (bool success, bytes memory result) {
if (_zeroBytes(m)) return (false, new bytes(0));
uint256 mLen = m.length;
result = abi.encodePacked(b.length, e.length, mLen, b, e, m);
assembly ("memory-safe") {
let dataPtr := add(result, 0x20)
success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)
mstore(result, mLen)
mstore(0x40, add(dataPtr, mLen))
}
}
function _zeroBytes(bytes memory byteArray) private pure returns (bool) {
for (uint256 i = 0; i < byteArray.length; ++i) {
if (byteArray[i] != 0) {
return false;
}
}
return true;
}
function sqrt(uint256 a) internal pure returns (uint256) {
unchecked {
if (a <= 1) {
return a;
}
uint256 aa = a;
uint256 xn = 1;
if (aa >= (1 << 128)) {
aa >>= 128;
xn <<= 64;
}
if (aa >= (1 << 64)) {
aa >>= 64;
xn <<= 32;
}
if (aa >= (1 << 32)) {
aa >>= 32;
xn <<= 16;
}
if (aa >= (1 << 16)) {
aa >>= 16;
xn <<= 8;
}
if (aa >= (1 << 8)) {
aa >>= 8;
xn <<= 4;
}
if (aa >= (1 << 4)) {
aa >>= 4;
xn <<= 2;
}
if (aa >= (1 << 2)) {
xn <<= 1;
}
xn = (3 * xn) >> 1;
xn = (xn + a / xn) >> 1;
xn = (xn + a / xn) >> 1;
xn = (xn + a / xn) >> 1;
xn = (xn + a / xn) >> 1;
xn = (xn + a / xn) >> 1;
xn = (xn + a / xn) >> 1;
return xn - SafeCast.toUint(xn > a / xn);
}
}
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);
}
}
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
uint256 exp;
unchecked {
exp = 128 * SafeCast.toUint(value > (1 << 128) - 1);
value >>= exp;
result += exp;
exp = 64 * SafeCast.toUint(value > (1 << 64) - 1);
value >>= exp;
result += exp;
exp = 32 * SafeCast.toUint(value > (1 << 32) - 1);
value >>= exp;
result += exp;
exp = 16 * SafeCast.toUint(value > (1 << 16) - 1);
value >>= exp;
result += exp;
exp = 8 * SafeCast.toUint(value > (1 << 8) - 1);
value >>= exp;
result += exp;
exp = 4 * SafeCast.toUint(value > (1 << 4) - 1);
value >>= exp;
result += exp;
exp = 2 * SafeCast.toUint(value > (1 << 2) - 1);
value >>= exp;
result += exp;
result += SafeCast.toUint(value > 1);
}
return result;
}
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);
}
}
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);
}
}
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
uint256 isGt;
unchecked {
isGt = SafeCast.toUint(value > (1 << 128) - 1);
value >>= isGt * 128;
result += isGt * 16;
isGt = SafeCast.toUint(value > (1 << 64) - 1);
value >>= isGt * 64;
result += isGt * 8;
isGt = SafeCast.toUint(value > (1 << 32) - 1);
value >>= isGt * 32;
result += isGt * 4;
isGt = SafeCast.toUint(value > (1 << 16) - 1);
value >>= isGt * 16;
result += isGt * 2;
result += SafeCast.toUint(value > (1 << 8) - 1);
}
return result;
}
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);
}
}
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
文件 9 的 14:Panic.sol
pragma solidity ^0.8.20;
library Panic {
uint256 internal constant GENERIC = 0x00;
uint256 internal constant ASSERT = 0x01;
uint256 internal constant UNDER_OVERFLOW = 0x11;
uint256 internal constant DIVISION_BY_ZERO = 0x12;
uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;
uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;
uint256 internal constant EMPTY_ARRAY_POP = 0x31;
uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;
uint256 internal constant RESOURCE_ERROR = 0x41;
uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;
function panic(uint256 code) internal pure {
assembly ("memory-safe") {
mstore(0x00, 0x4e487b71)
mstore(0x20, code)
revert(0x1c, 0x24)
}
}
}
文件 10 的 14:ReentrancyGuard.sol
pragma solidity ^0.8.20;
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
_status = ENTERED;
}
function _nonReentrantAfter() private {
_status = NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
文件 11 的 14:SafeCast.sol
pragma solidity ^0.8.20;
library SafeCast {
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
error SafeCastOverflowedIntToUint(int256 value);
error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);
error SafeCastOverflowedUintToInt(uint256 value);
function toUint248(uint256 value) internal pure returns (uint248) {
if (value > type(uint248).max) {
revert SafeCastOverflowedUintDowncast(248, value);
}
return uint248(value);
}
function toUint240(uint256 value) internal pure returns (uint240) {
if (value > type(uint240).max) {
revert SafeCastOverflowedUintDowncast(240, value);
}
return uint240(value);
}
function toUint232(uint256 value) internal pure returns (uint232) {
if (value > type(uint232).max) {
revert SafeCastOverflowedUintDowncast(232, value);
}
return uint232(value);
}
function toUint224(uint256 value) internal pure returns (uint224) {
if (value > type(uint224).max) {
revert SafeCastOverflowedUintDowncast(224, value);
}
return uint224(value);
}
function toUint216(uint256 value) internal pure returns (uint216) {
if (value > type(uint216).max) {
revert SafeCastOverflowedUintDowncast(216, value);
}
return uint216(value);
}
function toUint208(uint256 value) internal pure returns (uint208) {
if (value > type(uint208).max) {
revert SafeCastOverflowedUintDowncast(208, value);
}
return uint208(value);
}
function toUint200(uint256 value) internal pure returns (uint200) {
if (value > type(uint200).max) {
revert SafeCastOverflowedUintDowncast(200, value);
}
return uint200(value);
}
function toUint192(uint256 value) internal pure returns (uint192) {
if (value > type(uint192).max) {
revert SafeCastOverflowedUintDowncast(192, value);
}
return uint192(value);
}
function toUint184(uint256 value) internal pure returns (uint184) {
if (value > type(uint184).max) {
revert SafeCastOverflowedUintDowncast(184, value);
}
return uint184(value);
}
function toUint176(uint256 value) internal pure returns (uint176) {
if (value > type(uint176).max) {
revert SafeCastOverflowedUintDowncast(176, value);
}
return uint176(value);
}
function toUint168(uint256 value) internal pure returns (uint168) {
if (value > type(uint168).max) {
revert SafeCastOverflowedUintDowncast(168, value);
}
return uint168(value);
}
function toUint160(uint256 value) internal pure returns (uint160) {
if (value > type(uint160).max) {
revert SafeCastOverflowedUintDowncast(160, value);
}
return uint160(value);
}
function toUint152(uint256 value) internal pure returns (uint152) {
if (value > type(uint152).max) {
revert SafeCastOverflowedUintDowncast(152, value);
}
return uint152(value);
}
function toUint144(uint256 value) internal pure returns (uint144) {
if (value > type(uint144).max) {
revert SafeCastOverflowedUintDowncast(144, value);
}
return uint144(value);
}
function toUint136(uint256 value) internal pure returns (uint136) {
if (value > type(uint136).max) {
revert SafeCastOverflowedUintDowncast(136, value);
}
return uint136(value);
}
function toUint128(uint256 value) internal pure returns (uint128) {
if (value > type(uint128).max) {
revert SafeCastOverflowedUintDowncast(128, value);
}
return uint128(value);
}
function toUint120(uint256 value) internal pure returns (uint120) {
if (value > type(uint120).max) {
revert SafeCastOverflowedUintDowncast(120, value);
}
return uint120(value);
}
function toUint112(uint256 value) internal pure returns (uint112) {
if (value > type(uint112).max) {
revert SafeCastOverflowedUintDowncast(112, value);
}
return uint112(value);
}
function toUint104(uint256 value) internal pure returns (uint104) {
if (value > type(uint104).max) {
revert SafeCastOverflowedUintDowncast(104, value);
}
return uint104(value);
}
function toUint96(uint256 value) internal pure returns (uint96) {
if (value > type(uint96).max) {
revert SafeCastOverflowedUintDowncast(96, value);
}
return uint96(value);
}
function toUint88(uint256 value) internal pure returns (uint88) {
if (value > type(uint88).max) {
revert SafeCastOverflowedUintDowncast(88, value);
}
return uint88(value);
}
function toUint80(uint256 value) internal pure returns (uint80) {
if (value > type(uint80).max) {
revert SafeCastOverflowedUintDowncast(80, value);
}
return uint80(value);
}
function toUint72(uint256 value) internal pure returns (uint72) {
if (value > type(uint72).max) {
revert SafeCastOverflowedUintDowncast(72, value);
}
return uint72(value);
}
function toUint64(uint256 value) internal pure returns (uint64) {
if (value > type(uint64).max) {
revert SafeCastOverflowedUintDowncast(64, value);
}
return uint64(value);
}
function toUint56(uint256 value) internal pure returns (uint56) {
if (value > type(uint56).max) {
revert SafeCastOverflowedUintDowncast(56, value);
}
return uint56(value);
}
function toUint48(uint256 value) internal pure returns (uint48) {
if (value > type(uint48).max) {
revert SafeCastOverflowedUintDowncast(48, value);
}
return uint48(value);
}
function toUint40(uint256 value) internal pure returns (uint40) {
if (value > type(uint40).max) {
revert SafeCastOverflowedUintDowncast(40, value);
}
return uint40(value);
}
function toUint32(uint256 value) internal pure returns (uint32) {
if (value > type(uint32).max) {
revert SafeCastOverflowedUintDowncast(32, value);
}
return uint32(value);
}
function toUint24(uint256 value) internal pure returns (uint24) {
if (value > type(uint24).max) {
revert SafeCastOverflowedUintDowncast(24, value);
}
return uint24(value);
}
function toUint16(uint256 value) internal pure returns (uint16) {
if (value > type(uint16).max) {
revert SafeCastOverflowedUintDowncast(16, value);
}
return uint16(value);
}
function toUint8(uint256 value) internal pure returns (uint8) {
if (value > type(uint8).max) {
revert SafeCastOverflowedUintDowncast(8, value);
}
return uint8(value);
}
function toUint256(int256 value) internal pure returns (uint256) {
if (value < 0) {
revert SafeCastOverflowedIntToUint(value);
}
return uint256(value);
}
function toInt248(int256 value) internal pure returns (int248 downcasted) {
downcasted = int248(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(248, value);
}
}
function toInt240(int256 value) internal pure returns (int240 downcasted) {
downcasted = int240(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(240, value);
}
}
function toInt232(int256 value) internal pure returns (int232 downcasted) {
downcasted = int232(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(232, value);
}
}
function toInt224(int256 value) internal pure returns (int224 downcasted) {
downcasted = int224(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(224, value);
}
}
function toInt216(int256 value) internal pure returns (int216 downcasted) {
downcasted = int216(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(216, value);
}
}
function toInt208(int256 value) internal pure returns (int208 downcasted) {
downcasted = int208(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(208, value);
}
}
function toInt200(int256 value) internal pure returns (int200 downcasted) {
downcasted = int200(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(200, value);
}
}
function toInt192(int256 value) internal pure returns (int192 downcasted) {
downcasted = int192(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(192, value);
}
}
function toInt184(int256 value) internal pure returns (int184 downcasted) {
downcasted = int184(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(184, value);
}
}
function toInt176(int256 value) internal pure returns (int176 downcasted) {
downcasted = int176(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(176, value);
}
}
function toInt168(int256 value) internal pure returns (int168 downcasted) {
downcasted = int168(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(168, value);
}
}
function toInt160(int256 value) internal pure returns (int160 downcasted) {
downcasted = int160(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(160, value);
}
}
function toInt152(int256 value) internal pure returns (int152 downcasted) {
downcasted = int152(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(152, value);
}
}
function toInt144(int256 value) internal pure returns (int144 downcasted) {
downcasted = int144(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(144, value);
}
}
function toInt136(int256 value) internal pure returns (int136 downcasted) {
downcasted = int136(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(136, value);
}
}
function toInt128(int256 value) internal pure returns (int128 downcasted) {
downcasted = int128(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(128, value);
}
}
function toInt120(int256 value) internal pure returns (int120 downcasted) {
downcasted = int120(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(120, value);
}
}
function toInt112(int256 value) internal pure returns (int112 downcasted) {
downcasted = int112(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(112, value);
}
}
function toInt104(int256 value) internal pure returns (int104 downcasted) {
downcasted = int104(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(104, value);
}
}
function toInt96(int256 value) internal pure returns (int96 downcasted) {
downcasted = int96(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(96, value);
}
}
function toInt88(int256 value) internal pure returns (int88 downcasted) {
downcasted = int88(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(88, value);
}
}
function toInt80(int256 value) internal pure returns (int80 downcasted) {
downcasted = int80(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(80, value);
}
}
function toInt72(int256 value) internal pure returns (int72 downcasted) {
downcasted = int72(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(72, value);
}
}
function toInt64(int256 value) internal pure returns (int64 downcasted) {
downcasted = int64(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(64, value);
}
}
function toInt56(int256 value) internal pure returns (int56 downcasted) {
downcasted = int56(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(56, value);
}
}
function toInt48(int256 value) internal pure returns (int48 downcasted) {
downcasted = int48(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(48, value);
}
}
function toInt40(int256 value) internal pure returns (int40 downcasted) {
downcasted = int40(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(40, value);
}
}
function toInt32(int256 value) internal pure returns (int32 downcasted) {
downcasted = int32(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(32, value);
}
}
function toInt24(int256 value) internal pure returns (int24 downcasted) {
downcasted = int24(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(24, value);
}
}
function toInt16(int256 value) internal pure returns (int16 downcasted) {
downcasted = int16(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(16, value);
}
}
function toInt8(int256 value) internal pure returns (int8 downcasted) {
downcasted = int8(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(8, value);
}
}
function toInt256(uint256 value) internal pure returns (int256) {
if (value > uint256(type(int256).max)) {
revert SafeCastOverflowedUintToInt(value);
}
return int256(value);
}
function toUint(bool b) internal pure returns (uint256 u) {
assembly ("memory-safe") {
u := iszero(iszero(b))
}
}
}
文件 12 的 14:SafeERC20.sol
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";
import {Address} from "../../../utils/Address.sol";
library SafeERC20 {
error SafeERC20FailedOperation(address token);
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
revert SafeERC20FailedOperation(address(token));
}
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}
文件 13 的 14:SignedMath.sol
pragma solidity ^0.8.20;
import {SafeCast} from "./SafeCast.sol";
library SignedMath {
function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {
unchecked {
return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));
}
}
function max(int256 a, int256 b) internal pure returns (int256) {
return ternary(a > b, a, b);
}
function min(int256 a, int256 b) internal pure returns (int256) {
return ternary(a < b, a, b);
}
function average(int256 a, int256 b) internal pure returns (int256) {
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
function abs(int256 n) internal pure returns (uint256) {
unchecked {
int256 mask = n >> 255;
return uint256((n + mask) ^ mask);
}
}
}
文件 14 的 14:Strings.sol
pragma solidity ^0.8.20;
import {Math} from "./math/Math.sol";
import {SignedMath} from "./math/SignedMath.sol";
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
error StringsInsufficientHexLength(uint256 value, uint256 length);
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
assembly ("memory-safe") {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
assembly ("memory-safe") {
mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
uint256 localValue = value;
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
return string(buffer);
}
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
}
function toChecksumHexString(address addr) internal pure returns (string memory) {
bytes memory buffer = bytes(toHexString(addr));
uint256 hashValue;
assembly ("memory-safe") {
hashValue := shr(96, keccak256(add(buffer, 0x22), 40))
}
for (uint256 i = 41; i > 1; --i) {
if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {
buffer[i] ^= 0x20;
}
hashValue >>= 4;
}
return string(buffer);
}
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}
{
"compilationTarget": {
"contracts/GotiginDex.sol": "GotiginDex"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 20000
},
"remappings": []
}
[{"inputs":[{"internalType":"address[]","name":"initialOwners","type":"address[]"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"AtLeastOneOwnerRequired","type":"error"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"foundReqId","type":"uint256"},{"internalType":"uint256","name":"foundPaidId","type":"uint256"}],"name":"BidIdsMismatch","type":"error"},{"inputs":[],"name":"IdenticalTokens","type":"error"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"requiredAmount","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InvalidAmountBid","type":"error"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"InvalidBid","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"MembershipIsCurrentlyClosed","type":"error"},{"inputs":[{"internalType":"string","name":"reason","type":"string"}],"name":"NewRequestHalted","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"OnlySellerAuthorized","type":"error"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"OrderIsCurrentlyLocked","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferNativeCurrFailed","type":"error"},{"inputs":[],"name":"YouAreAlreadyMember","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"uint256","name":"reqId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"paidId","type":"uint256"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"BidCancelledSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"sellingToken","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"buyingToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"paidId","type":"uint256"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"BidCancelledTokenSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"uint256","name":"reqId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"paidId","type":"uint256"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"BidCreatedSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"sellingToken","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"buyingToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"paidId","type":"uint256"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"BidCreatedTokenSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"paidId","type":"uint256"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"BidProcessedSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"sellingToken","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"buyingToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"paidId","type":"uint256"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"BidProcessedTokenSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"uint256","name":"reqId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isNew","type":"bool"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"BidRequestedSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"sellingToken","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"buyingToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"reqId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isNew","type":"bool"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"BidRequestedTokenSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"FeesRateDenominatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"FeesRateMaxThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"isHalted","type":"bool"},{"indexed":true,"internalType":"string","name":"reason","type":"string"}],"name":"HaltNewReqStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MembershipFeesCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isOpen","type":"bool"}],"name":"MembershipUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMember","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NewMembershipAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"removedOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ordierId","type":"uint256"}],"name":"PaymentCollectedFromBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ordierId","type":"uint256"}],"name":"PaymentCollectedFromSeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"PaymentTransferredToBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"indexed":false,"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"name":"PaymentTransferredToSeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenFeesCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferNativeCurrSuccess","type":"event"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"allOrders","outputs":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"applyFeesRate","outputs":[{"internalType":"uint256","name":"feesAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"}],"name":"buyBid","outputs":[{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"}],"name":"cancelBid","outputs":[{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesRateDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOrderBidStateLength","outputs":[{"internalType":"uint256","name":"bidStateLength","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"numberOfOrders","type":"uint256"},{"internalType":"bool","name":"onlyPaidOrders","type":"bool"}],"internalType":"struct GotiginDex.OrdersRequest","name":"ordersRequest","type":"tuple"}],"name":"getOrders","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"internalType":"struct GotiginDex.Order[]","name":"orders","type":"tuple[]"},{"internalType":"uint256","name":"endedAtIndex","type":"uint256"},{"internalType":"uint256","name":"totalOrdersCount","type":"uint256"}],"internalType":"struct GotiginDex.OrdersResponse","name":"ordersResponse","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getOwnerPriority","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPermanentMembership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"numberOfOrders","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bool","name":"onlyPaidOrders","type":"bool"}],"internalType":"struct GotiginDex.UserOrdersRequest","name":"userOrdersRequest","type":"tuple"}],"name":"getUserOrders","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"internalType":"struct GotiginDex.Order[]","name":"orders","type":"tuple[]"},{"internalType":"uint256","name":"endedAtIndex","type":"uint256"},{"internalType":"uint256","name":"totalOrdersCount","type":"uint256"}],"internalType":"struct GotiginDex.OrdersResponse","name":"ordersResponse","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"haltNewReqState","outputs":[{"internalType":"bool","name":"isHalted","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMembershipOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxThresholdFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"members","type":"address"}],"name":"membersMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"membershipAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"membershipToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"}],"internalType":"struct GotiginDex.RequestBid","name":"orderRequest","type":"tuple"},{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"modifyRequestedBid","outputs":[{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"orderIdCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paidOrderIdCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"paidId","type":"uint256"}],"name":"paidOrders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"placeBid","outputs":[{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"ownerToRemove","type":"address"}],"name":"removeOwner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"}],"internalType":"struct GotiginDex.RequestBid","name":"orderRequest","type":"tuple"}],"name":"requestBid","outputs":[{"components":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"uint256","name":"paidId","type":"uint256"},{"internalType":"uint256","name":"sellAmountGross","type":"uint256"},{"internalType":"uint256","name":"sellCharges","type":"uint256"},{"internalType":"uint256","name":"sellAmountNet","type":"uint256"},{"internalType":"uint256","name":"buyAmountGross","type":"uint256"},{"internalType":"uint256","name":"buyCharges","type":"uint256"},{"internalType":"uint256","name":"buyAmountNet","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"enum GotiginDex.BidState","name":"bidState","type":"uint8"}],"internalType":"struct GotiginDex.Order","name":"order","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateFeesRate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateFeesRateThreshold","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"membershipOpen","type":"bool"}],"name":"updateMembershipToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isHalted","type":"bool"},{"internalType":"string","name":"reason","type":"string"}],"internalType":"struct GotiginDex.HaltNewReqState","name":"newHaltReqState","type":"tuple"}],"name":"updateReqHaltState","outputs":[],"stateMutability":"payable","type":"function"}]