interface BaseExchangeableTokenInterface {

    // Sender interface must have:
    // mapping(address => uint) private exchangedWith;
    // mapping(address => uint) private exchangedBy;

    // Receiver interface must have:
    // mapping(address => uint) private exchangesReceived;

    /// @dev Fired if token exchange complete
    event Exchange(address _from, address _targetContract, uint _amount);

    /// @dev Fired if token exchange and spent complete
    event ExchangeSpent(address _from, address _targetContract, address _to, uint _amount);

    // Sender interface
    function exchangeToken(address _targetContract, uint _amount) external returns (bool success, uint creditedAmount);

    function exchangeAndSpend(address _targetContract, uint _amount, address _to) external returns (bool success);

    function __exchangerCallback(address _targetContract, address _exchanger, uint _amount) external returns (bool success);

    // Receiver interface
    function __targetExchangeCallback(uint _amount) external returns (bool success);

    function __targetExchangeAndSpendCallback(address _to, uint _amount) external returns (bool success);
}
function exchangeToken(address _targetContract, uint _amount) external returns (bool success, uint creditedAmount);

// Sender interface