contract GCCOracleReader is Ownable {

    address internal oracleAddr = address(0);
    GCCOracleInterface internal oracle = GCCOracleInterface(oracleAddr);

    function initialize(address sender) public initializer {
        Ownable.initialize(sender);
    }

    /**
     * @dev Sets the address of the oracle contract to use
     *
     * @return true if connection to the new oracle address was successful
     */
    function setOracleAddress(address _oracleAddress) public onlyOwner returns (bool) {
        oracleAddr = _oracleAddress;
        oracle = GCCOracleInterface(oracleAddr);
        return oracle.testConnection();
    }

    /**
     * @dev Returns the address of the boxing oracle being used
     */
    function getOracleAddress() public view returns (address) {
        return oracleAddr;
    }

    /**
     * @dev Tests that the boxing oracle is callable
     */
    function testOracleConnection() public view returns (bool) {
        return oracle.testConnection();
    }

    /**
     * @dev Returns length of added computation proofs
     */
    function getFilterLength() public view returns (uint256) {
        return oracle.getFilterLength();
    }

    /**
     * @dev Returns computation strategy by index.
     */
    function getFilter(uint256 index) public view returns (string memory, string memory, string memory, uint256) {
        return oracle.getFilter(index);
    }

    /**
     * @dev Returns newest computation strategy.
     */
    function nowFilter() public view returns (string memory, string memory, string memory, uint256) {
        return oracle.nowFilter();
    }

    /**
     * @dev Returns existing proof by given address and txid
     */
    function getProof(address addr, bytes32 txid) public view returns (address, bytes32, uint64) {
        return oracle.getProof(addr, txid);
    }

    /**
     * @dev Returns list of all proofs belonging to specified address
     */
    function getProofs(address addr) public view returns (address[] memory, bytes32[] memory, uint64[] memory) {
        return oracle.getProofs(addr);
    }

    /**
     * @dev Returns list of paged proofs belonging to specified address contrainted by cursor and limit
     */
    function getProofs(address addr, uint cursor, uint limit) public view returns (address[] memory, bytes32[] memory, uint64[] memory) {
        return oracle.getProofs(addr, cursor, limit);
    }
}
function getProofs(address addr) public view returns (address[] memory, bytes32[] memory, uint64[] memory) {
    return oracle.getProofs(addr);
}

/**
 * @dev Returns list of all proofs belonging to specified address
 */