creation_sourcecode: // SPDX-License-Identifier: MIT
  // File: @openzeppelin/contracts/utils/math/SafeMath.sol
  // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
  
  pragma solidity ^0.8.19;
  
  // CAUTION
  // This version of SafeMath should only be used with Solidity 0.8 or later,
  // because it relies on the compiler's built in overflow checks.
  /**
   * @dev Wrappers over Solidity's arithmetic operations.
   *
   * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
   * now has built in overflow checking.
   */
  library SafeMath {
      /**
       * @dev Returns the addition of two unsigned integers, with an overflow flag.
       *
       * _Available since v3.4._
       */
      function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
          unchecked {
              uint256 c = a + b;
              if (c < a) return (false, 0);
              return (true, c);
          }
      }
      /**
       * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
       *
       * _Available since v3.4._
       */
      function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
          unchecked {
              if (b > a) return (false, 0);
              return (true, a - b);
          }
      }
      /**
       * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
       *
       * _Available since v3.4._
       */
      function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
          unchecked {
              // 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-contracts/pull/522
              if (a == 0) return (true, 0);
              uint256 c = a * b;
              if (c / a != b) return (false, 0);
              return (true, c);
          }
      }
      /**
       * @dev Returns the division of two unsigned integers, with a division by zero flag.
       *
       * _Available since v3.4._
       */
      function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
          unchecked {
              if (b == 0) return (false, 0);
              return (true, a / b);
          }
      }
      /**
       * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
       *
       * _Available since v3.4._
       */
      function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
          unchecked {
              if (b == 0) return (false, 0);
              return (true, a % b);
          }
      }
      /**
       * @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) {
          return a + b;
      }
      /**
       * @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) {
          return a - b;
      }
      /**
       * @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) {
          return a * b;
      }
      /**
       * @dev Returns the integer division of two unsigned integers, reverting on
       * division by zero. The result is rounded towards zero.
       *
       * Counterpart to Solidity's `/` operator.
       *
       * Requirements:
       *
       * - The divisor cannot be zero.
       */
      function div(uint256 a, uint256 b) internal pure returns (uint256) {
          return a / b;
      }
      /**
       * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
       * reverting 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) {
          return a % b;
      }
      /**
       * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
       * overflow (when the result is negative).
       *
       * CAUTION: This function is deprecated because it requires allocating memory for the error
       * message unnecessarily. For custom revert reasons use {trySub}.
       *
       * Counterpart to Solidity's `-` operator.
       *
       * Requirements:
       *
       * - Subtraction cannot overflow.
       */
      function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
          unchecked {
              require(b <= a, errorMessage);
              return a - b;
          }
      }
      /**
       * @dev Returns the integer division of two unsigned integers, reverting with custom message 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, string memory errorMessage) internal pure returns (uint256) {
          unchecked {
              require(b > 0, errorMessage);
              return a / b;
          }
      }
      /**
       * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
       * reverting with custom message when dividing by zero.
       *
       * CAUTION: This function is deprecated because it requires allocating memory for the error
       * message unnecessarily. For custom revert reasons use {tryMod}.
       *
       * 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, string memory errorMessage) internal pure returns (uint256) {
          unchecked {
              require(b > 0, errorMessage);
              return a % b;
          }
      }
  }
  
  // File: @openzeppelin/contracts/token/ERC20/IERC20.sol
  // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
  
  pragma solidity ^0.8.19;
  
  /**
   * @dev Interface of the ERC20 standard as defined in the EIP.
   */
  interface IERC20 {
      /**
       * @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);
  
      /**
       * @dev Returns the value of tokens in existence.
       */
      function totalSupply() external view returns (uint256);
  
      /**
       * @dev Returns the value of tokens owned by `account`.
       */
      function balanceOf(address account) external view returns (uint256);
  
      /**
       * @dev Moves a `value` amount of tokens from the caller's account to `to`.
       *
       * Returns a boolean value indicating whether the operation succeeded.
       *
       * Emits a {Transfer} event.
       */
      function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);
  
      /**
       * @dev Moves a `value` amount of tokens from `from` to `to` using the
       * allowance mechanism. `value` is then deducted from the caller's
       * allowance.
       *
       * Returns a boolean value indicating whether the operation succeeded.
       *
       * Emits a {Transfer} event.
       */
      function transferFrom(address from, address to, uint256 value) external returns (bool);
  }
  
  // File: @openzeppelin/contracts/security/ReentrancyGuard.sol
  
  
  // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
  
  pragma solidity ^0.8.0;
  
  /**
   * @dev Contract module that helps prevent reentrant calls to a function.
   *
   * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
   * available, which can be applied to functions to make sure there are no nested
   * (reentrant) calls to them.
   *
   * Note that because there is a single `nonReentrant` guard, functions marked as
   * `nonReentrant` may not call one another. This can be worked around by making
   * those functions `private`, and then adding `external` `nonReentrant` entry
   * points to them.
   *
   * TIP: If you would like to learn more about reentrancy and alternative ways
   * to protect against it, check out our blog post
   * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
   */
  abstract contract ReentrancyGuard {
      // Booleans are more expensive than uint256 or any type that takes up a full
      // word because each write operation emits an extra SLOAD to first read the
      // slot's contents, replace the bits taken up by the boolean, and then write
      // back. This is the compiler's defense against contract upgrades and
      // pointer aliasing, and it cannot be disabled.
  
      // The values being non-zero value makes deployment a bit more expensive,
      // but in exchange the refund on every call to nonReentrant will be lower in
      // amount. Since refunds are capped to a percentage of the total
      // transaction's gas, it is best to keep them low in cases like this one, to
      // increase the likelihood of the full refund coming into effect.
      uint256 private constant _NOT_ENTERED = 1;
      uint256 private constant _ENTERED = 2;
  
      uint256 private _status;
  
      constructor() {
          _status = _NOT_ENTERED;
      }
  
      /**
       * @dev Prevents a contract from calling itself, directly or indirectly.
       * Calling a `nonReentrant` function from another `nonReentrant`
       * function is not supported. It is possible to prevent this from happening
       * by making the `nonReentrant` function external, and making it call a
       * `private` function that does the actual work.
       */
      modifier nonReentrant() {
          _nonReentrantBefore();
          _;
          _nonReentrantAfter();
      }
  
      function _nonReentrantBefore() private {
          // On the first call to nonReentrant, _status will be _NOT_ENTERED
          require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
  
          // Any calls to nonReentrant after this point will fail
          _status = _ENTERED;
      }
  
      function _nonReentrantAfter() private {
          // By storing the original value once again, a refund is triggered (see
          // https://eips.ethereum.org/EIPS/eip-2200)
          _status = _NOT_ENTERED;
      }
  
      /**
       * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
       * `nonReentrant` function in the call stack.
       */
      function _reentrancyGuardEntered() internal view returns (bool) {
          return _status == _ENTERED;
      }
  }
  
  
  pragma solidity ^0.8.19;
  
  
  
  abstract contract Context {
      function _msgSender() internal view virtual returns (address) {
          return msg.sender;
      }
  }
  
  contract Ownable is Context {
  
      address internal _owner;
  
      event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
  
      constructor ()  {
          emit OwnershipTransferred(address(0), _owner);
      }
  
      function owner() public pure returns (address) {
          return address(0);
      }
  
      modifier onlyOwner() {
          require(_owner == _msgSender(), "Ownable: caller is not the owner");
          _;
      }
  
      function transferOwnership(address newOwner) public virtual onlyOwner {
          require(newOwner != address(0), "Ownable: new owner is the zero address");
          emit OwnershipTransferred(_owner, newOwner);
          _owner = newOwner;
      }
  
  }
  
  contract GreenXSwap is Ownable, ReentrancyGuard {
  
      using SafeMath for uint256;
  
      struct SwapTokenDetails {
          address SwapContract;
          uint256 totalSwapCoin;
          uint256 SwapCoinTimeStamp;
          uint256 SwapRate;
          uint256 SwapToMode;
          uint256 SwapToTokenId;
  	}
  
      mapping (string => SwapTokenDetails) public getSwapTokenDetails;
      mapping(string => bool) public orderIDExists;
      mapping(string => address) public orderIDWallet;
  
      constructor(address owner)  {
         _owner=owner;
      }
  
      event _verifyCTreasury(address toekncontract,address wallet,uint256 withdrawnative);
      event _verifyNTreasury(address wallet,uint256 withdrawnative);
  
      event _SwapFromCustomToken(string orderId,
          address SwapContract,
          uint256 totalSwapCoin,
          uint256 SwapCoinTimeStamp,
          uint256 SwapRate,
          uint256 SwapToMode,
          uint256 SwapToTokenId);
  
      event _SwapFromNativeToken(string orderId,
          address SwapContract,
          uint256 SwapCoinTimeStamp,
          uint256 SwapRate,
          uint256 SwapToMode,
          uint256 SwapToTokenId);
  
      function SwapFromCustomToken(string memory orderId,
          address SwapContract,
          uint256 totalSwapCoin,
          uint256 SwapRate,
          uint256 SwapToMode,
          uint256 SwapToTokenId) external nonReentrant {
          require(address(SwapContract)!=address(0), "Invalid Swap Contract");
          require(!orderIDExists[orderId], "Order ID Already Exists");
          orderIDExists[orderId] = true;
          require(totalSwapCoin > 0, "Swap Coin Must Be >0");
          require(bytes(orderId).length>=7, "ERR: 100");
          require(SwapRate>0 , "ERR: 101");  
          require(SwapToMode>0 , "ERR: 102"); 
          require(SwapToTokenId>0 , "ERR: 103");  
          SwapTokenDetails storage _SwapTokenDetails = getSwapTokenDetails[orderId];
          _SwapTokenDetails.SwapContract=SwapContract;
          _SwapTokenDetails.totalSwapCoin=totalSwapCoin;
          _SwapTokenDetails.SwapCoinTimeStamp=block.timestamp;
          _SwapTokenDetails.SwapRate=SwapRate;
          _SwapTokenDetails.SwapToMode=SwapToMode;
          _SwapTokenDetails.SwapToTokenId=SwapToTokenId;     
          orderIDWallet[orderId] = msg.sender;
          require(IERC20(SwapContract).balanceOf(msg.sender) >= totalSwapCoin,"Insufficient Token In You Wallet");
          IERC20 token = IERC20(SwapContract);
          require(token.transferFrom(msg.sender, address(this), totalSwapCoin),"Transaction Reverted Due To Allowance");
          emit _SwapFromCustomToken(orderId,
          SwapContract,
          totalSwapCoin,
          block.timestamp,
          SwapRate,
          SwapToMode,
          SwapToTokenId);
      }
  
      function SwapFromNativeToken(string memory orderId,
          uint256 SwapRate,
          uint256 SwapToMode,
          uint256 SwapToTokenId) external payable nonReentrant {
          require(msg.value > 0, "Native Coin Must Be >0");
          require(!orderIDExists[orderId], "Order ID Already Exists");
          orderIDExists[orderId] = true;
          require(bytes(orderId).length>=7, "ERR: 100");
          require(SwapRate>0 , "ERR: 101");  
          require(SwapToMode>0 , "ERR: 102"); 
          require(SwapToTokenId>0 , "ERR: 103"); 
          SwapTokenDetails storage _SwapTokenDetails = getSwapTokenDetails[orderId];
           _SwapTokenDetails.SwapContract=address(0);
          _SwapTokenDetails.totalSwapCoin=msg.value;
          _SwapTokenDetails.SwapCoinTimeStamp=block.timestamp;
          _SwapTokenDetails.SwapRate=SwapRate;
          _SwapTokenDetails.SwapToMode=SwapToMode;
          _SwapTokenDetails.SwapToTokenId=SwapToTokenId;         
          orderIDWallet[orderId] = msg.sender;
          emit _SwapFromNativeToken(orderId,
          address(0),
          block.timestamp,
          SwapRate,
          SwapToMode,
          SwapToTokenId);
      }
  
      function verifyCTreasury (address tokencontract,address _wallet,uint _amount) external onlyOwner nonReentrant returns(bool){
        (bool success)=IERC20(tokencontract).transfer(_wallet, _amount);
        require(success, "EC: 110");
        emit _verifyCTreasury(tokencontract,_wallet,_amount);
        return true;
      }
  
      function verifyNTreasury (address _wallet,uint _amount) external onlyOwner nonReentrant returns(bool){
          (bool success,) = _wallet.call{value: _amount}("");
          require(success, "EC: 110");
          emit _verifyNTreasury(_wallet,_amount);
          return true;    
      }	
  }