{"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.7.6+commit.7338295f","compilerSettings":{"libraries":{},"optimizer":{"runs":200,"enabled":true}},"name":"CGOController","fullyQualifiedName":"CGOController.sol:CGOController"},"deployment":{"transactionHash":"0xbd560be7f6f3fa33dbdaace02aa1f58e42a085e0ca9d2e8aef4631ead24e41e1","blockNumber":"57395785","transactionIndex":"1","deployer":"0x49C2560FA8Bc2082affB4455308a506F96eDCEAb"},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"sources":{"CGOController.sol":{"content":"// Sources flattened with hardhat v2.11.2 https://hardhat.org\r\n\r\n// File contracts/interfaces/IERC20.sol\r\n\r\n// SPDX-License-Identifier: UNLICESNED\r\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\r\n\r\npragma solidity >=0.7.0 <0.8.0;\r\n\r\n/**\r\n * @dev Interface of the ERC20 standard as defined in the EIP.\r\n */\r\ninterface IERC20 {\r\n  /**\r\n   * @dev Emitted when `value` tokens are moved from one account (`from`) to\r\n   * another (`to`).\r\n   *\r\n   * Note that `value` may be zero.\r\n   */\r\n  event Transfer(address indexed from, address indexed to, uint256 value);\r\n\r\n  /**\r\n   * @dev Emitted when the allowance of a `spender` for an `owner` is set by\r\n   * a call to {approve}. `value` is the new allowance.\r\n   */\r\n  event Approval(address indexed owner, address indexed spender, uint256 value);\r\n\r\n  /**\r\n   * @dev Returns the amount of tokens in existence.\r\n   */\r\n  function totalSupply() external view returns (uint256);\r\n\r\n  function mint(address to, uint256 amount) external;\r\n\r\n  function burn(uint256 amount) external;\r\n\r\n  function blacklistUpdate(address user, bool value) external;\r\n\r\n  function transferOwnership(address newOwner) external;\r\n\r\n  /**\r\n   * @dev Returns the amount of tokens owned by `account`.\r\n   */\r\n  function balanceOf(address account) external view returns (uint256);\r\n\r\n  /**\r\n   * @dev Moves `amount` tokens from the caller's account to `to`.\r\n   *\r\n   * Returns a boolean value indicating whether the operation succeeded.\r\n   *\r\n   * Emits a {Transfer} event.\r\n   */\r\n  function transfer(address to, uint256 amount) external returns (bool);\r\n\r\n  /**\r\n   * @dev Returns the remaining number of tokens that `spender` will be\r\n   * allowed to spend on behalf of `owner` through {transferFrom}. This is\r\n   * zero by default.\r\n   *\r\n   * This value changes when {approve} or {transferFrom} are called.\r\n   */\r\n  function allowance(address owner, address spender)\r\n    external\r\n    view\r\n    returns (uint256);\r\n\r\n  /**\r\n   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\r\n   *\r\n   * Returns a boolean value indicating whether the operation succeeded.\r\n   *\r\n   * IMPORTANT: Beware that changing an allowance with this method brings the risk\r\n   * that someone may use both the old and the new allowance by unfortunate\r\n   * transaction ordering. One possible solution to mitigate this race\r\n   * condition is to first reduce the spender's allowance to 0 and set the\r\n   * desired value afterwards:\r\n   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\r\n   *\r\n   * Emits an {Approval} event.\r\n   */\r\n  function approve(address spender, uint256 amount) external returns (bool);\r\n\r\n  /**\r\n   * @dev Moves `amount` tokens from `from` to `to` using the\r\n   * allowance mechanism. `amount` is then deducted from the caller's\r\n   * allowance.\r\n   *\r\n   * Returns a boolean value indicating whether the operation succeeded.\r\n   *\r\n   * Emits a {Transfer} event.\r\n   */\r\n  function transferFrom(\r\n    address from,\r\n    address to,\r\n    uint256 amount\r\n  ) external returns (bool);\r\n}\r\n\r\n// File @openzeppelin/contracts/GSN/Context.sol@v3.2.0-solc-0.7\r\n\r\npragma solidity ^0.7.0;\r\n\r\n/*\r\n * @dev Provides information about the current execution context, including the\r\n * sender of the transaction and its data. While these are generally available\r\n * via msg.sender and msg.data, they should not be accessed in such a direct\r\n * manner, since when dealing with GSN meta-transactions the account sending and\r\n * paying for execution may not be the actual sender (as far as an application\r\n * is concerned).\r\n *\r\n * This contract is only required for intermediate, library-like contracts.\r\n */\r\nabstract contract Context {\r\n  function _msgSender() internal view virtual returns (address payable) {\r\n    return msg.sender;\r\n  }\r\n\r\n  function _msgData() internal view virtual returns (bytes memory) {\r\n    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\r\n    return msg.data;\r\n  }\r\n}\r\n\r\n// File @openzeppelin/contracts/access/Ownable.sol@v3.2.0-solc-0.7\r\n\r\npragma solidity ^0.7.0;\r\n\r\n/**\r\n * @dev Contract module which provides a basic access control mechanism, where\r\n * there is an account (an owner) that can be granted exclusive access to\r\n * specific functions.\r\n *\r\n * By default, the owner account will be the one that deploys the contract. This\r\n * can later be changed with {transferOwnership}.\r\n *\r\n * This module is used through inheritance. It will make available the modifier\r\n * `onlyOwner`, which can be applied to your functions to restrict their use to\r\n * the owner.\r\n */\r\ncontract Ownable is Context {\r\n  address private _owner;\r\n\r\n  event OwnershipTransferred(\r\n    address indexed previousOwner,\r\n    address indexed newOwner\r\n  );\r\n\r\n  /**\r\n   * @dev Initializes the contract setting the deployer as the initial owner.\r\n   */\r\n  constructor() {\r\n    address msgSender = _msgSender();\r\n    _owner = msgSender;\r\n    emit OwnershipTransferred(address(0), msgSender);\r\n  }\r\n\r\n  /**\r\n   * @dev Returns the address of the current owner.\r\n   */\r\n  function owner() public view returns (address) {\r\n    return _owner;\r\n  }\r\n\r\n  /**\r\n   * @dev Throws if called by any account other than the owner.\r\n   */\r\n  modifier onlyOwner() {\r\n    require(_owner == _msgSender(), \"Ownable: caller is not the owner\");\r\n    _;\r\n  }\r\n\r\n  /**\r\n   * @dev Leaves the contract without owner. It will not be possible to call\r\n   * `onlyOwner` functions anymore. Can only be called by the current owner.\r\n   *\r\n   * NOTE: Renouncing ownership will leave the contract without an owner,\r\n   * thereby removing any functionality that is only available to the owner.\r\n   */\r\n  function renounceOwnership() public virtual onlyOwner {\r\n    emit OwnershipTransferred(_owner, address(0));\r\n    _owner = address(0);\r\n  }\r\n\r\n  /**\r\n   * @dev Transfers ownership of the contract to a new account (`newOwner`).\r\n   * Can only be called by the current owner.\r\n   */\r\n  function transferOwnership(address newOwner) public virtual onlyOwner {\r\n    require(newOwner != address(0), \"Ownable: new owner is the zero address\");\r\n    emit OwnershipTransferred(_owner, newOwner);\r\n    _owner = newOwner;\r\n  }\r\n}\r\n\r\n// File contracts/CGOController.sol\r\n\r\npragma solidity >=0.7.0 <0.8.0;\r\n\r\n// For Remix Deployment\r\n// import \"https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0-solc-0.7/contracts/access/Ownable.sol\";\r\n\r\ncontract CGOController is Ownable {\r\n  address public tokenAddr; // CGO token address\r\n\r\n  address public initiatorAddr; // Initiator address\r\n\r\n  address public executorAddr; // Executor address\r\n\r\n  address public minterWalletAddr; // Minter wallet address\r\n\r\n  bool public isEditBarPaused = false; // Edit Bar status\r\n\r\n  // Transaction status for Bar [Not Exist, Mint Initiated, Mint Completed, Burn Initiated, Burn Completed]\r\n  enum txnStatus {\r\n    NOT_EXIST,\r\n    MINT_INITIATED,\r\n    MINT_COMPLETED,\r\n    BURN_INITIATED,\r\n    BURN_COMPLETED\r\n  }\r\n\r\n  // Store Bar Details\r\n  // BarNumber => WarrantNumber\r\n  mapping(string => string) public barNumWarrantNum;\r\n\r\n  // Store txn status for Bar\r\n  // BarNumber => WarrantNumber\r\n  mapping(string => mapping(string => txnStatus)) public txnStatusRecord;\r\n\r\n  // events\r\n  event BarMint(\r\n    address to,\r\n    uint256 amount,\r\n    string Bar_Number,\r\n    string Warrant_Number,\r\n    uint256 blockTimestamp\r\n  );\r\n\r\n  event BarBurn(\r\n    address burn_from,\r\n    uint256 amount,\r\n    string Bar_Number,\r\n    string Warrant_Number,\r\n    uint256 blockTimestamp\r\n  );\r\n\r\n  event WithdrawFunds(address to, uint256 amount, uint256 blockTimestamp);\r\n\r\n  event BarAdded(\r\n    string Bar_Number,\r\n    string Warrant_Number,\r\n    uint256 blockTimestamp\r\n  );\r\n\r\n  event EditBarStatusPaused(bool status);\r\n\r\n  event MintInitiated(\r\n    string Bar_Number,\r\n    string Warrant_Number,\r\n    txnStatus status,\r\n    uint256 blockTimestamp\r\n  );\r\n\r\n  event BurnInitiated(\r\n    string Bar_Number,\r\n    string Warrant_Number,\r\n    txnStatus status,\r\n    uint256 blockTimestamp\r\n  );\r\n\r\n  event MintCancelled(\r\n    string Bar_Number,\r\n    string Warrant_Number,\r\n    txnStatus status,\r\n    uint256 blockTimestamp\r\n  );\r\n\r\n  event BurnCancelled(\r\n    string Bar_Number,\r\n    string Warrant_Number,\r\n    txnStatus status,\r\n    uint256 blockTimestamp\r\n  );\r\n\r\n  // Set token address and initiator address on contract creation\r\n  constructor(address _tokenAddr) {\r\n    if (_tokenAddr == address(0)) {\r\n      revert(\"Invalid address\");\r\n    }\r\n    tokenAddr = _tokenAddr;\r\n    initiatorAddr = msg.sender;\r\n    executorAddr = msg.sender;\r\n    minterWalletAddr = msg.sender;\r\n  }\r\n\r\n  // Modifier - only Initiator\r\n  modifier onlyInitiator() {\r\n    if (msg.sender != initiatorAddr) {\r\n      revert(\"Only Initiator can call this function\");\r\n    }\r\n    _;\r\n  }\r\n\r\n  // Modifier - only Executor\r\n  modifier onlyExecutor() {\r\n    if (msg.sender != executorAddr) {\r\n      revert(\"Only Executor can call this function\");\r\n    }\r\n    _;\r\n  }\r\n\r\n  // set initiator address\r\n  function setInitiatorAddr(address _initiatorAddr) external onlyOwner {\r\n    if (_initiatorAddr == address(0)) {\r\n      revert(\"Invalid address\");\r\n    }\r\n    initiatorAddr = _initiatorAddr;\r\n  }\r\n\r\n  // set executor address\r\n  function setExecutorAddr(address _executorAddr) external onlyOwner {\r\n    if (_executorAddr == address(0)) {\r\n      revert(\"Invalid address\");\r\n    }\r\n    executorAddr = _executorAddr;\r\n  }\r\n\r\n  // set minter wallet address\r\n  function setMinterWalletAddr(address _minterWalletAddr) external onlyOwner {\r\n    if (_minterWalletAddr == address(0)) {\r\n      revert(\"Invalid address\");\r\n    }\r\n    minterWalletAddr = _minterWalletAddr;\r\n  }\r\n\r\n  // initiate mint with bar details (Bar_Number, Warrant_Number)\r\n  function initiateMint(string memory Bar_Number, string memory Warrant_Number)\r\n    external\r\n    onlyInitiator\r\n  {\r\n    // check for burn initiation OR complete request\r\n    if (\r\n      (txnStatusRecord[Bar_Number][Warrant_Number] ==\r\n        txnStatus.BURN_INITIATED) ||\r\n      (txnStatusRecord[Bar_Number][Warrant_Number] == txnStatus.BURN_COMPLETED)\r\n    ) {\r\n      revert(\"Burn request exist for this Bar\");\r\n    }\r\n    if (\r\n      keccak256(abi.encodePacked(barNumWarrantNum[Bar_Number])) ==\r\n      keccak256(abi.encodePacked(Warrant_Number))\r\n    ) {\r\n      revert(\"Bar already exist\");\r\n    }\r\n    // check inititation request\r\n    if (\r\n      txnStatusRecord[Bar_Number][Warrant_Number] == txnStatus.MINT_INITIATED\r\n    ) {\r\n      revert(\"Mint initiation request already exist\");\r\n    }\r\n\r\n    txnStatusRecord[Bar_Number][Warrant_Number] = txnStatus.MINT_INITIATED;\r\n    emit MintInitiated(\r\n      Bar_Number,\r\n      Warrant_Number,\r\n      txnStatus.MINT_INITIATED,\r\n      block.timestamp\r\n    );\r\n  }\r\n\r\n  // cancel Initiate mint request\r\n  function cancelInitiateMint(\r\n    string memory Bar_Number,\r\n    string memory Warrant_Number\r\n  ) external onlyExecutor {\r\n    // check for burn initiation OR complete request\r\n    if (\r\n      (txnStatusRecord[Bar_Number][Warrant_Number] ==\r\n        txnStatus.BURN_INITIATED) ||\r\n      (txnStatusRecord[Bar_Number][Warrant_Number] == txnStatus.BURN_COMPLETED)\r\n    ) {\r\n      revert(\"Burn request exist for this Bar\");\r\n    }\r\n    if (\r\n      keccak256(abi.encodePacked(barNumWarrantNum[Bar_Number])) ==\r\n      keccak256(abi.encodePacked(Warrant_Number))\r\n    ) {\r\n      revert(\"Bar already exist\");\r\n    }\r\n    // check inititation request\r\n    if (\r\n      txnStatusRecord[Bar_Number][Warrant_Number] != txnStatus.MINT_INITIATED\r\n    ) {\r\n      revert(\"Mint initiation request not exist\");\r\n    }\r\n\r\n    txnStatusRecord[Bar_Number][Warrant_Number] = txnStatus.NOT_EXIST;\r\n    emit MintCancelled(\r\n      Bar_Number,\r\n      Warrant_Number,\r\n      txnStatus.NOT_EXIST,\r\n      block.timestamp\r\n    );\r\n  }\r\n\r\n  // Execute mint with bar details (Bar_Number, Warrant_Number)\r\n  // Call mint function of CGO token contract using ERC20 interface\r\n  function mint(\r\n    address to,\r\n    uint256 amount,\r\n    string memory Bar_Number,\r\n    string memory Warrant_Number\r\n  ) external onlyExecutor {\r\n    // mint function call on CGO token contract\r\n    if (to != minterWalletAddr || to == address(0)) {\r\n      revert(\"Invalid Mint address\");\r\n    }\r\n    if (\r\n      keccak256(abi.encodePacked(barNumWarrantNum[Bar_Number])) ==\r\n      keccak256(abi.encodePacked(Warrant_Number))\r\n    ) {\r\n      revert(\"Bar already exist\");\r\n    }\r\n    if (\r\n      txnStatusRecord[Bar_Number][Warrant_Number] != txnStatus.MINT_INITIATED\r\n    ) {\r\n      revert(\"Mint initiation request not exist\");\r\n    }\r\n    if (amount != 1000) {\r\n      revert(\"Mint amount should be 1000\");\r\n    }\r\n    barNumWarrantNum[Bar_Number] = Warrant_Number;\r\n    txnStatusRecord[Bar_Number][Warrant_Number] = txnStatus.MINT_COMPLETED;\r\n    emit BarMint(\r\n      to,\r\n      amount * 1e18,\r\n      Bar_Number,\r\n      Warrant_Number,\r\n      block.timestamp\r\n    );\r\n    IERC20(tokenAddr).mint(to, amount * 1e18);\r\n  }\r\n\r\n  // initiate burn with bar details (Bar_Number, Warrant_Number)\r\n  function initiateBurn(string memory Bar_Number, string memory Warrant_Number)\r\n    external\r\n    onlyInitiator\r\n  {\r\n    // check inititation request\r\n    if (IERC20(tokenAddr).balanceOf(address(this)) < 1000 * 1e18) {\r\n      revert(\"Insufficient CGO Balance\");\r\n    }\r\n    if (\r\n      (txnStatusRecord[Bar_Number][Warrant_Number] ==\r\n        txnStatus.BURN_INITIATED) ||\r\n      (txnStatusRecord[Bar_Number][Warrant_Number] == txnStatus.BURN_COMPLETED)\r\n    ) {\r\n      revert(\"Burn request already exist\");\r\n    }\r\n    if (\r\n      keccak256(abi.encodePacked(barNumWarrantNum[Bar_Number])) !=\r\n      keccak256(abi.encodePacked(Warrant_Number))\r\n    ) {\r\n      revert(\"Incorrect Bar details\");\r\n    }\r\n    if (\r\n      txnStatusRecord[Bar_Number][Warrant_Number] != txnStatus.MINT_COMPLETED\r\n    ) {\r\n      revert(\"Mint request not exist\");\r\n    }\r\n    txnStatusRecord[Bar_Number][Warrant_Number] = txnStatus.BURN_INITIATED;\r\n    emit BurnInitiated(\r\n      Bar_Number,\r\n      Warrant_Number,\r\n      txnStatus.BURN_INITIATED,\r\n      block.timestamp\r\n    );\r\n  }\r\n\r\n  // cancel Initiate burn request\r\n  function cancelInitiateBurn(\r\n    string memory Bar_Number,\r\n    string memory Warrant_Number\r\n  ) external onlyExecutor {\r\n    // check inititation request\r\n    // if (IERC20(tokenAddr).balanceOf(address(this)) < 1000 * 1e18) {\r\n    //   revert(\"Insufficient CGO Balance\");\r\n    // }\r\n    if (\r\n      (txnStatusRecord[Bar_Number][Warrant_Number] !=\r\n        txnStatus.BURN_INITIATED) &&\r\n      (txnStatusRecord[Bar_Number][Warrant_Number] != txnStatus.BURN_COMPLETED)\r\n    ) {\r\n      revert(\"Burn request not exist\");\r\n    }\r\n    if (\r\n      keccak256(abi.encodePacked(barNumWarrantNum[Bar_Number])) !=\r\n      keccak256(abi.encodePacked(Warrant_Number))\r\n    ) {\r\n      revert(\"Incorrect Bar details\");\r\n    }\r\n    // if (\r\n    //   txnStatusRecord[Bar_Number][Warrant_Number] != txnStatus.MINT_COMPLETED\r\n    // ) {\r\n    //   revert(\"Mint request not exist\");\r\n    // }\r\n    txnStatusRecord[Bar_Number][Warrant_Number] = txnStatus.MINT_COMPLETED;\r\n    emit BurnCancelled(\r\n      Bar_Number,\r\n      Warrant_Number,\r\n      txnStatus.MINT_COMPLETED,\r\n      block.timestamp\r\n    );\r\n  }\r\n\r\n  // burn implementation with bar details (Bar_Number, Warrant_Number)\r\n  // Call burn function of CGO token contract using ERC20 interface\r\n  function burn(\r\n    uint256 amount,\r\n    string memory Bar_Number,\r\n    string memory Warrant_Number\r\n  ) external onlyExecutor {\r\n    if (\r\n      keccak256(abi.encodePacked(barNumWarrantNum[Bar_Number])) !=\r\n      keccak256(abi.encodePacked(Warrant_Number))\r\n    ) {\r\n      revert(\"Incorrect Bar details\");\r\n    }\r\n    if (\r\n      txnStatusRecord[Bar_Number][Warrant_Number] != txnStatus.BURN_INITIATED\r\n    ) {\r\n      revert(\"Burn initiation request not exist\");\r\n    }\r\n    if (amount != 1000) {\r\n      revert(\"Burn amount should be 1000\");\r\n    }\r\n    if (IERC20(tokenAddr).balanceOf(address(this)) < amount * 1e18) {\r\n      revert(\"Insufficient CGO Balance\");\r\n    }\r\n    // burn function call on CGO token contract\r\n    delete barNumWarrantNum[Bar_Number];\r\n    txnStatusRecord[Bar_Number][Warrant_Number] = txnStatus.BURN_COMPLETED;\r\n    emit BarBurn(\r\n      address(this),\r\n      amount * 1e18,\r\n      Bar_Number,\r\n      Warrant_Number,\r\n      block.timestamp\r\n    );\r\n    IERC20(tokenAddr).burn(amount * 1e18);\r\n  }\r\n\r\n  // Blacklist update function call on CGO token contract\r\n  function blacklistUpdate(address user, bool value)\r\n    external\r\n    virtual\r\n    onlyOwner\r\n  {\r\n    IERC20(tokenAddr).blacklistUpdate(user, value);\r\n  }\r\n\r\n  // Add Bar Details (Bar_Number, Warrant_Number) for existing tokens in market\r\n  // This function will be use for onboarding Existing Bars\r\n  // This function will be depreciated after onboarding all existing bars\r\n  function addBarNumWarrantNum(\r\n    string memory Bar_Number,\r\n    string memory Warrant_Number\r\n  ) external onlyOwner {\r\n    if (isEditBarPaused == true) {\r\n      revert(\"Manual Bar Insertion is restricted\");\r\n    }\r\n    if (\r\n      keccak256(abi.encodePacked(barNumWarrantNum[Bar_Number])) ==\r\n      keccak256(abi.encodePacked(Warrant_Number))\r\n    ) {\r\n      revert(\"Bar already exist\");\r\n    }\r\n    barNumWarrantNum[Bar_Number] = Warrant_Number;\r\n    txnStatusRecord[Bar_Number][Warrant_Number] = txnStatus.MINT_COMPLETED;\r\n    emit BarAdded(Bar_Number, Warrant_Number, block.timestamp);\r\n  }\r\n\r\n  // Remove Bar Details (Bar_Number, Warrant_Number) for existing tokens in market\r\n  // This function will be use for onboarding Existing Bars\r\n  // This function will be depreciated after onboarding all existing bars\r\n  function removeBarNumWarrantNum(\r\n    string memory Bar_Number,\r\n    string memory Warrant_Number\r\n  ) external onlyOwner {\r\n    if (isEditBarPaused == true) {\r\n      revert(\"Manual Bar Removal is restricted\");\r\n    }\r\n    if (\r\n      keccak256(abi.encodePacked(barNumWarrantNum[Bar_Number])) !=\r\n      keccak256(abi.encodePacked(Warrant_Number))\r\n    ) {\r\n      revert(\"Incorrect Bar details\");\r\n    }\r\n    delete barNumWarrantNum[Bar_Number];\r\n    delete txnStatusRecord[Bar_Number][Warrant_Number];\r\n  }\r\n\r\n  // Pause/Unpause Edit Bar functionality\r\n  // This function will be use for onboarding Existing Bars\r\n  // This function will be depreciated after onboarding all existing bars\r\n  function pauseEditBar(bool status) external onlyOwner {\r\n    isEditBarPaused = status;\r\n    emit EditBarStatusPaused(status);\r\n  }\r\n\r\n  // Withdraw CGO tokens from contract to owner address using ERC20 interface\r\n  function withdrawFunds(address to, uint256 amount) external onlyOwner {\r\n    emit WithdrawFunds(to, amount, block.timestamp);\r\n    IERC20(tokenAddr).transfer(to, amount);\r\n  }\r\n\r\n  // Transfer ownership of CGO token contract to new owner using ERC20 interface\r\n  function transferCgoOwnership(address newOwner) external onlyOwner {\r\n    IERC20(tokenAddr).transferOwnership(newOwner);\r\n  }\r\n}"}},"abi":[{"type":"constructor","inputs":[{"name":"_tokenAddr","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"BarAdded","type":"event","inputs":[{"name":"Bar_Number","type":"string","indexed":false,"internalType":"string"},{"name":"Warrant_Number","type":"string","indexed":false,"internalType":"string"},{"name":"blockTimestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BarBurn","type":"event","inputs":[{"name":"burn_from","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"Bar_Number","type":"string","indexed":false,"internalType":"string"},{"name":"Warrant_Number","type":"string","indexed":false,"internalType":"string"},{"name":"blockTimestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BarMint","type":"event","inputs":[{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"Bar_Number","type":"string","indexed":false,"internalType":"string"},{"name":"Warrant_Number","type":"string","indexed":false,"internalType":"string"},{"name":"blockTimestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BurnCancelled","type":"event","inputs":[{"name":"Bar_Number","type":"string","indexed":false,"internalType":"string"},{"name":"Warrant_Number","type":"string","indexed":false,"internalType":"string"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum CGOController.txnStatus"},{"name":"blockTimestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BurnInitiated","type":"event","inputs":[{"name":"Bar_Number","type":"string","indexed":false,"internalType":"string"},{"name":"Warrant_Number","type":"string","indexed":false,"internalType":"string"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum CGOController.txnStatus"},{"name":"blockTimestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"EditBarStatusPaused","type":"event","inputs":[{"name":"status","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"MintCancelled","type":"event","inputs":[{"name":"Bar_Number","type":"string","indexed":false,"internalType":"string"},{"name":"Warrant_Number","type":"string","indexed":false,"internalType":"string"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum CGOController.txnStatus"},{"name":"blockTimestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MintInitiated","type":"event","inputs":[{"name":"Bar_Number","type":"string","indexed":false,"internalType":"string"},{"name":"Warrant_Number","type":"string","indexed":false,"internalType":"string"},{"name":"status","type":"uint8","indexed":false,"internalType":"enum CGOController.txnStatus"},{"name":"blockTimestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"WithdrawFunds","type":"event","inputs":[{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"blockTimestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"addBarNumWarrantNum","type":"function","inputs":[{"name":"Bar_Number","type":"string","internalType":"string"},{"name":"Warrant_Number","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"barNumWarrantNum","type":"function","inputs":[{"name":"","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"blacklistUpdate","type":"function","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"value","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"burn","type":"function","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"Bar_Number","type":"string","internalType":"string"},{"name":"Warrant_Number","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"cancelInitiateBurn","type":"function","inputs":[{"name":"Bar_Number","type":"string","internalType":"string"},{"name":"Warrant_Number","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"cancelInitiateMint","type":"function","inputs":[{"name":"Bar_Number","type":"string","internalType":"string"},{"name":"Warrant_Number","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"executorAddr","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"initiateBurn","type":"function","inputs":[{"name":"Bar_Number","type":"string","internalType":"string"},{"name":"Warrant_Number","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"initiateMint","type":"function","inputs":[{"name":"Bar_Number","type":"string","internalType":"string"},{"name":"Warrant_Number","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"initiatorAddr","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isEditBarPaused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"Bar_Number","type":"string","internalType":"string"},{"name":"Warrant_Number","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"minterWalletAddr","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"pauseEditBar","type":"function","inputs":[{"name":"status","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"removeBarNumWarrantNum","type":"function","inputs":[{"name":"Bar_Number","type":"string","internalType":"string"},{"name":"Warrant_Number","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"renounceOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"setExecutorAddr","type":"function","inputs":[{"name":"_executorAddr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setInitiatorAddr","type":"function","inputs":[{"name":"_initiatorAddr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMinterWalletAddr","type":"function","inputs":[{"name":"_minterWalletAddr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"tokenAddr","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"transferCgoOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"txnStatusRecord","type":"function","inputs":[{"name":"","type":"string","internalType":"string"},{"name":"","type":"string","internalType":"string"}],"outputs":[{"name":"","type":"uint8","internalType":"enum CGOController.txnStatus"}],"stateMutability":"view"},{"name":"withdrawFunds","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"matchId":"32170496","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-06-13T14:20:49Z","match":"match","chainId":"50","address":"0x21F74FBF81D68291704805D085982000Babbf096"}