pragma solidity ^0.5.16; // Inheritance import "./Owned.sol"; import "./State.sol"; import "./interfaces/IExchangeState.sol"; // https://docs.oikos.cash/contracts/ExchangeState contract ExchangeState is Owned, State, IExchangeState { mapping(address => mapping(bytes32 => ExchangeEntry[])) public exchanges; uint public maxEntriesInQueue = 12; constructor(address _owner, address _associatedContract) public Owned(_owner) State(_associatedContract) {} /* ========== SETTERS ========== */ function setMaxEntriesInQueue(uint _maxEntriesInQueue) external onlyOwner { maxEntriesInQueue = _maxEntriesInQueue; } /* ========== MUTATIVE FUNCTIONS ========== */ function appendExchangeEntry( address account, bytes32 src, uint amount, bytes32 dest, uint amountReceived, uint exchangeFeeRate, uint timestamp, uint roundIdForSrc, uint roundIdForDest ) external onlyAssociatedContract { require(exchanges[account][dest].length < maxEntriesInQueue, "Max queue length reached"); exchanges[account][dest].push( ExchangeEntry({ src: src, amount: amount, dest: dest, amountReceived: amountReceived, exchangeFeeRate: exchangeFeeRate, timestamp: timestamp, roundIdForSrc: roundIdForSrc, roundIdForDest: roundIdForDest }) ); } function removeEntries(address account, bytes32 currencyKey) external onlyAssociatedContract { delete exchanges[account][currencyKey]; } /* ========== VIEWS ========== */ function getLengthOfEntries(address account, bytes32 currencyKey) external view returns (uint) { return exchanges[account][currencyKey].length; } function getEntryAt( address account, bytes32 currencyKey, uint index ) external view returns ( bytes32 src, uint amount, bytes32 dest, uint amountReceived, uint exchangeFeeRate, uint timestamp, uint roundIdForSrc, uint roundIdForDest ) { ExchangeEntry storage entry = exchanges[account][currencyKey][index]; return ( entry.src, entry.amount, entry.dest, entry.amountReceived, entry.exchangeFeeRate, entry.timestamp, entry.roundIdForSrc, entry.roundIdForDest ); } function getMaxTimestamp(address account, bytes32 currencyKey) external view returns (uint) { ExchangeEntry[] storage userEntries = exchanges[account][currencyKey]; uint timestamp = 0; for (uint i = 0; i < userEntries.length; i++) { if (userEntries[i].timestamp > timestamp) { timestamp = userEntries[i].timestamp; } } return timestamp; } }