{"compiler":{"version":"0.7.0+commit.9e61f92b"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"blockIdx","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"publicDataHash","type":"bytes32"}],"name":"BlockSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":false,"internalType":"uint96","name":"amount","type":"uint96"}],"name":"DepositRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"exchangeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"bytes32","name":"genesisMerkleRoot","type":"bytes32"}],"name":"ExchangeCloned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint32","name":"accountID","type":"uint32"}],"name":"ForcedWithdrawalRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"takerFeeBips","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"makerFeeBips","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"previousTakerFeeBips","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"previousMakerFeeBips","type":"uint8"}],"name":"ProtocolFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Shutdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"TokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"bytes32","name":"transactionHash","type":"bytes32"}],"name":"TransactionApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"category","type":"uint8"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawalCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"category","type":"uint8"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawalFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"WithdrawalModeActivated","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"transactionHash","type":"bytes32"}],"name":"approveTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"bytes32[]","name":"transactionHashes","type":"bytes32[]"}],"name":"approveTransactions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnExchangeStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint32","name":"accountID","type":"uint32"}],"name":"forceWithdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAgentRegistry","outputs":[{"internalType":"contract IAgentRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getAmountWithdrawable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockHeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockIdx","type":"uint256"}],"name":"getBlockInfo","outputs":[{"components":[{"internalType":"uint32","name":"timestamp","type":"uint32"},{"internalType":"bytes28","name":"blockDataHash","type":"bytes28"}],"internalType":"struct ExchangeData.BlockInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConstants","outputs":[{"components":[{"internalType":"uint256","name":"SNARK_SCALAR_FIELD","type":"uint256"},{"internalType":"uint256","name":"MAX_OPEN_FORCED_REQUESTS","type":"uint256"},{"internalType":"uint256","name":"MAX_AGE_FORCED_REQUEST_UNTIL_WITHDRAW_MODE","type":"uint256"},{"internalType":"uint256","name":"TIMESTAMP_HALF_WINDOW_SIZE_IN_SECONDS","type":"uint256"},{"internalType":"uint256","name":"MAX_NUM_ACCOUNTS","type":"uint256"},{"internalType":"uint256","name":"MAX_NUM_TOKENS","type":"uint256"},{"internalType":"uint256","name":"MIN_AGE_PROTOCOL_FEES_UNTIL_UPDATED","type":"uint256"},{"internalType":"uint256","name":"MIN_TIME_IN_SHUTDOWN","type":"uint256"},{"internalType":"uint256","name":"TX_DATA_AVAILABILITY_SIZE","type":"uint256"},{"internalType":"uint256","name":"MAX_AGE_DEPOSIT_UNTIL_WITHDRAWABLE_UPPERBOUND","type":"uint256"}],"internalType":"struct ExchangeData.Constants","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getDepositContract","outputs":[{"internalType":"contract IDepositContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExchangeStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxAgeDepositUntilWithdrawable","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumAvailableForcedSlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getPendingDepositAmount","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getProtocolFeeLastWithdrawnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProtocolFeeValues","outputs":[{"internalType":"uint32","name":"syncedAt","type":"uint32"},{"internalType":"uint8","name":"takerFeeBips","type":"uint8"},{"internalType":"uint8","name":"makerFeeBips","type":"uint8"},{"internalType":"uint8","name":"previousTakerFeeBips","type":"uint8"},{"internalType":"uint8","name":"previousMakerFeeBips","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenID","type":"uint16"}],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTokenID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint32","name":"storageID","type":"uint32"}],"name":"getWithdrawalRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_loopring","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"bytes32","name":"_genesisMerkleRoot","type":"bytes32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"accountID","type":"uint32"},{"internalType":"address","name":"token","type":"address"}],"name":"isForcedWithdrawalPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInWithdrawalMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"transactionHash","type":"bytes32"}],"name":"isTransactionApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isUserOrAgent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"accountID","type":"uint32"},{"internalType":"address","name":"token","type":"address"}],"name":"isWithdrawnInWithdrawalMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loopringAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"accountID","type":"uint32"},{"internalType":"address","name":"token","type":"address"}],"name":"notifyForcedRequestTooOld","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"onchainTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refreshBlockVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"registerToken","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_agentRegistry","type":"address"}],"name":"setAgentRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_depositContract","type":"address"}],"name":"setDepositContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newValue","type":"uint32"}],"name":"setMaxAgeDepositUntilWithdrawable","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint32","name":"storageID","type":"uint32"},{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setWithdrawalRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shutdown","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"uint32","name":"maxAgeDepositUntilWithdrawable","type":"uint32"},{"internalType":"bytes32","name":"DOMAIN_SEPARATOR","type":"bytes32"},{"internalType":"contract ILoopringV3","name":"loopring","type":"address"},{"internalType":"contract IBlockVerifier","name":"blockVerifier","type":"address"},{"internalType":"contract IAgentRegistry","name":"agentRegistry","type":"address"},{"internalType":"contract IDepositContract","name":"depositContract","type":"address"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"numBlocks","type":"uint256"},{"internalType":"uint32","name":"numPendingForcedTransactions","type":"uint32"},{"components":[{"internalType":"uint32","name":"syncedAt","type":"uint32"},{"internalType":"uint8","name":"takerFeeBips","type":"uint8"},{"internalType":"uint8","name":"makerFeeBips","type":"uint8"},{"internalType":"uint8","name":"previousTakerFeeBips","type":"uint8"},{"internalType":"uint8","name":"previousMakerFeeBips","type":"uint8"}],"internalType":"struct ExchangeData.ProtocolFeeData","name":"protocolFeeData","type":"tuple"},{"internalType":"uint256","name":"shutdownModeStartTime","type":"uint256"},{"internalType":"uint256","name":"withdrawalModeStartTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"blockType","type":"uint8"},{"internalType":"uint16","name":"blockSize","type":"uint16"},{"internalType":"uint8","name":"blockVersion","type":"uint8"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[8]","name":"proof","type":"uint256[8]"},{"internalType":"bool","name":"storeBlockInfoOnchain","type":"bool"},{"components":[{"internalType":"uint256","name":"txIndex","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ExchangeData.AuxiliaryData[]","name":"auxiliaryData","type":"tuple[]"},{"internalType":"bytes","name":"offchainData","type":"bytes"}],"internalType":"struct ExchangeData.Block[]","name":"blocks","type":"tuple[]"}],"name":"submitBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawExchangeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawExchangeStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"withdrawFromApprovedWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"withdrawFromDepositRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"accountID","type":"uint32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"pubKeyX","type":"uint256"},{"internalType":"uint256","name":"pubKeyY","type":"uint256"},{"internalType":"uint32","name":"nonce","type":"uint32"},{"internalType":"uint256","name":"feeBipsAMM","type":"uint256"}],"internalType":"struct ExchangeData.AccountLeaf","name":"accountLeaf","type":"tuple"},{"components":[{"internalType":"uint16","name":"tokenID","type":"uint16"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"uint96","name":"weightAMM","type":"uint96"},{"internalType":"uint256","name":"storageRoot","type":"uint256"}],"internalType":"struct ExchangeData.BalanceLeaf","name":"balanceLeaf","type":"tuple"},{"internalType":"uint256[48]","name":"accountMerkleProof","type":"uint256[48]"},{"internalType":"uint256[24]","name":"balanceMerkleProof","type":"uint256[24]"}],"internalType":"struct ExchangeData.MerkleProof","name":"merkleProof","type":"tuple"}],"name":"withdrawFromMerkleTree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawProtocolFees","outputs":[],"stateMutability":"payable","type":"function"}],"devdoc":{"author":"Brecht Devos - <brecht@loopring.org>Daniel Wang  - <daniel@loopring.org>","details":"This contract supports upgradability proxy, therefore its constructor      must do NOTHING.","kind":"dev","methods":{"burnExchangeStake()":{"details":"Can by called by anyone to burn the stake of the exchange when certain      conditions are fulfilled.      Currently this will only burn the stake of the exchange if      the exchange is in withdrawal mode."},"claimOwnership()":{"details":"Allows the pendingOwner address to finalize the transfer."},"constructor":{"details":"The constructor must do NOTHING to support proxy."},"getAgentRegistry()":{"details":"Gets the agent registry contract used by the exchange.","returns":{"_0":"the agent registry contract"}},"getAmountWithdrawable(address,address)":{"details":"Gets the amount that can be withdrawn immediately with `withdrawFromApprovedWithdrawals`.","params":{"owner":"The address of the account the withdrawal was done for.","token":"The token address"},"returns":{"_0":"The amount withdrawable"}},"getBlockHeight()":{"details":"Gets the height of this exchange's virtual blockchain. The block height for a      new exchange is 1.","returns":{"_0":"The virtual blockchain height which is the index of the last block."}},"getBlockInfo(uint256)":{"details":"Gets some minimal info of a previously submitted block that's kept onchain.      A DEX can use this function to implement a payment receipt verification      contract with a challange-response scheme.","params":{"blockIdx":"The block index."}},"getConstants()":{"details":"Returns a list of constants used by the exchange.","returns":{"_0":"constants The list of constants."}},"getDepositContract()":{"details":"Gets the deposit contract used by the exchange.","returns":{"_0":"the deposit contract"}},"getDomainSeparator()":{"details":"Gets the domain separator used in this exchange."},"getExchangeStake()":{"details":"Gets the amount of LRC the owner has staked onchain for this exchange.      The stake will be burned if the exchange does not fulfill its duty by      processing user requests in time. Please note that order matching may potentially      performed by another party and is not part of the exchange's duty.","returns":{"_0":"The amount of LRC staked"}},"getMaxAgeDepositUntilWithdrawable()":{"details":"Returns the max time deposits have to wait before becoming withdrawable.","returns":{"_0":"The value."}},"getMerkleRoot()":{"details":"Gets the current Merkle root of this exchange's virtual blockchain.","returns":{"_0":"The current Merkle root."}},"getNumAvailableForcedSlots()":{"details":"Gets the number of available forced request slots.","returns":{"_0":"The number of available slots."}},"getPendingDepositAmount(address,address)":{"details":"Gets the amount of tokens that may be added to the owner's account.","params":{"owner":"The destination address for the amount deposited.","tokenAddress":"The address of the token, use `0x0` for Ether."},"returns":{"_0":"The amount of tokens pending."}},"getProtocolFeeLastWithdrawnTime(address)":{"details":"Gets the time the protocol fee for a token was last withdrawn.","params":{"tokenAddress":"The address of the token, use `0x0` for Ether."},"returns":{"_0":"The time the protocol fee was last withdrawn."}},"getProtocolFeeValues()":{"details":"Gets the protocol fees for this exchange.","returns":{"makerFeeBips":"The protocol maker fee","previousMakerFeeBips":"The previous protocol maker fee","previousTakerFeeBips":"The previous protocol taker fee","syncedAt":"The timestamp the protocol fees were last updated","takerFeeBips":"The protocol taker fee"}},"getTokenAddress(uint16)":{"details":"Returns the address of a registered token.","params":{"tokenID":"The token's ID in this exchanges."},"returns":{"_0":"tokenAddress The token's address"}},"getTokenID(address)":{"details":"Returns the id of a registered token.","params":{"tokenAddress":"The token's address"},"returns":{"_0":"tokenID The token's ID in this exchanges."}},"getWithdrawalRecipient(address,address,address,uint96,uint32)":{"details":"Gets the withdrawal recipient.","params":{"amount":"The amount of tokens that are going to be withdrawn.","from":"The address of the account that does the withdrawal.","storageID":"The storageID of the withdrawal request.","to":"The address to which 'amount' tokens were going to be withdrawn.","token":"The address of the token that is withdrawn ('0x0' for ETH)."}},"isForcedWithdrawalPending(uint32,address)":{"details":"Checks if a forced withdrawal is pending for an account balance.","params":{"accountID":"The accountID of the account to check.","token":"The token address"},"returns":{"_0":"True if a request is pending, false otherwise"}},"isInWithdrawalMode()":{"details":"Returns hether the exchange is in withdrawal mode.","returns":{"_0":"Returns true if the exchange is in withdrawal mode, else false."}},"isShutdown()":{"details":"Returns whether the exchange is shutdown.","returns":{"_0":"Returns true if the exchange is shutdown, else false."}},"isWithdrawnInWithdrawalMode(uint32,address)":{"details":"Checks if the balance for the account was withdrawn with `withdrawFromMerkleTree`.","params":{"accountID":"The accountID of the balance to check.","token":"The token address"},"returns":{"_0":"True if it was already withdrawn, false otherwise"}},"notifyForcedRequestTooOld(uint32,address)":{"details":"Notifies the exchange that the owner did not process a forced request.      If this is indeed the case, the exchange will enter withdrawal mode.      Can be called by anyone.","params":{"accountID":"The accountID the forced request was made for","token":"The token address of the the forced request"}},"onchainTransferFrom(address,address,address,uint256)":{"details":"Allows an agent to transfer ERC-20 tokens for a user using the allowance      the user has set for the exchange. This way the user only needs to approve a single exchange contract      for all exchange/agent features, which allows for a more seamless user experience.      This function can only be called by an agent.","params":{"amount":"The amount of tokens transferred.","from":"The address of the account that sends the tokens.","to":"The address to which 'amount' tokens are transferred.","token":"The address of the token to transfer (ETH is and cannot be suppported)."}},"refreshBlockVerifier()":{"details":"refresh the blockVerifier contract which maybe changed in loopringV3 contract."},"registerToken(address)":{"details":"Registers an ERC20 token for a token id. Note that different exchanges may have      different ids for the same ERC20 token.      Please note that 1 is reserved for Ether (ETH), 2 is reserved for Wrapped Ether (ETH),      and 3 is reserved for Loopring Token (LRC).      This function is only callable by the exchange owner.","params":{"tokenAddress":"The token's address"},"returns":{"_0":"tokenID The token's ID in this exchanges."}},"setMaxAgeDepositUntilWithdrawable(uint32)":{"details":"Sets the max time deposits have to wait before becoming withdrawable.","params":{"newValue":"The new value."},"returns":{"_0":"The old value."}},"setWithdrawalRecipient(address,address,address,uint96,uint32,address)":{"details":"Allows a withdrawal to be done to an adddresss that is different      than initialy specified in the withdrawal request. This can be used to      implement functionality like fast withdrawals.      This function can only be called by an agent.","params":{"amount":"The amount of tokens that are going to be withdrawn.","from":"The address of the account that does the withdrawal.","newRecipient":"The new recipient address of the withdrawal.","storageID":"The storageID of the withdrawal request.","to":"The address to which 'amount' tokens were going to be withdrawn.","token":"The address of the token that is withdrawn ('0x0' for ETH)."}},"shutdown()":{"details":"Shuts down the exchange.      Once the exchange is shutdown all onchain requests are permanently disabled.      When all requirements are fulfilled the exchange owner can withdraw      the exchange stake with withdrawStake.      Note that the exchange can still enter the withdrawal mode after this function      has been invoked successfully. To prevent entering the withdrawal mode before the      the echange stake can be withdrawn, all withdrawal requests still need to be handled      for at least MIN_TIME_IN_SHUTDOWN seconds.      Can only be called by the exchange owner.","returns":{"success":"True if the exchange is shutdown, else False"}},"submitBlocks((uint8,uint16,uint8,bytes,uint256[8],bool,(uint256,bytes)[],bytes)[])":{"details":"Sumbits new blocks to the rollup blockchain.      This function can only be called by the exchange operator.","params":{"blocks":"The blocks being submitted      - blockType: The type of the new block      - blockSize: The number of onchain or offchain requests/settlements        that have been processed in this block      - blockVersion: The circuit version to use for verifying the block      - storeBlockInfoOnchain: If the block info for this block needs to be stored on-chain      - data: The data for this block      - offchainData: Arbitrary data, mainly for off-chain data-availability, i.e.,        the multihash of the IPFS file that contains the block data."}},"transferOwnership(address)":{"details":"Allows the current owner to set the pendingOwner address.","params":{"newOwner":"The address to transfer ownership to."}},"withdrawExchangeStake(address)":{"details":"Withdraws the amount staked for this exchange.      This can only be done if the exchange has been correctly shutdown:      - The exchange owner has shutdown the exchange      - All deposit requests are processed      - All funds are returned to the users (merkle root is reset to initial state)      Can only be called by the exchange owner.","returns":{"_0":"amountLRC The amount of LRC withdrawn"}},"withdrawFromApprovedWithdrawals(address[],address[])":{"details":"Allows withdrawing funds after a withdrawal request (either onchain      or offchain) was submitted in a block by the operator.      Can be called by anyone. The withdrawn tokens will be sent to      the owner of the account they were withdrawn out.      Normally it is should not be needed for users to call this manually.      Funds from withdrawal requests will be sent to the account owner      immediately by the owner when the block is submitted.      The user will however need to call this manually if the transfer failed.      Tokens and owners must have the same size.","params":{"owners":"The addresses of the account the withdrawal was done for.","tokens":"The token addresses"}},"withdrawFromDepositRequest(address,address)":{"details":"Allows withdrawing funds deposited to the contract in a deposit request when      it was never processed by the owner within the maximum time allowed.      Can be called by anyone. The deposited tokens will be sent back to      the owner of the account they were deposited in.","params":{"owner":"The address of the account the withdrawal was done for.","token":"The token address"}},"withdrawFromMerkleTree(((uint32,address,uint256,uint256,uint32,uint256),(uint16,uint96,uint96,uint256),uint256[48],uint256[24]))":{"details":"Allows anyone to withdraw funds for a specified user using the balances stored      in the Merkle tree. The funds will be sent to the owner of the acount.      Can only be used in withdrawal mode (i.e. when the owner has stopped      committing blocks and is not able to commit any more blocks).      This will NOT modify the onchain merkle root! The merkle root stored      onchain will remain the same after the withdrawal. We store if the user      has withdrawn the balance in State.withdrawnInWithdrawMode.","params":{"merkleProof":"The Merkle inclusion proof"}}},"title":"An Implementation of IExchangeV3.","version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"ExchangeV3.sol":"ExchangeV3"},"evmVersion":"istanbul","libraries":{"ExchangeAdmins":"0x919551e7c778539f6238e3483358a2afbdaa83c9","ExchangeBlocks":"0xb01e1b1ee285c16429e750aca67546d5bcc797f3","ExchangeGenesis":"0xa2f3346c484ac1f55ef468fd2fe427b9730afb9f","ExchangeTokens":"0x432bcd4fade6e54f8b0773546af44bf7c90fa7f6","ExchangeWithdrawals":"0x4d6924ac10b840a17ac841b2e3d446c9e0d88d68"},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":999999},"remappings":[]},"sources":{"ExchangeV3.sol":{"keccak256":"0x849bad79f2542d16826313de4e6965f668c1948f002a55e1580effb078ebac7f","license":"Apache-2.0","urls":["bzz-raw://04b8ebf2d6801c8a0f6acf57ce10ae18903862c8d7edb1f4505753997150d170","dweb:/ipfs/QmWst7mnYgoA3ZNGKqthYqYjQnxivJyAwQGUZHpY1DYhQT"]}},"version":1}