OPNX Exchange Review – Early Thoughts on Coinflex’s rebooted exchange

An OX Phoenix rising from ashes. Generated by Dalle.

OPNX (Open Exchange) is a newcomer to the cryptocurrency derivatives space, at least somewhat inspired by the collapse of FTX. A union of 2 ex billionaires and 1 former exchange CEO, OPNX has been extremely controversial, mostly due to the involvement of 3 arrows capital founders Su Zhu & Kyle Davies. In this article I will share some early experiences market making & trading on the nascent platform as well as my thoughts on the platform.

If you’d like to sign up, I will include my affiliate link (signing up with this link will help support the blog) which I have not yet posted anywhere on the internet, https://opnx.com/register?shareAccountId=P4UD4aMF

Conflicts Of Interest / Disclaimer Notice:

Adding “Market Maker @OPNX_Official” To my twitter bio has led to some confusion so this is a good place to clear this up. Other than in this blogpost I have not posted affiliate links anywhere, and have no other relationship, employment or sponsorship with Open Exchange (OPNX) or any related entities.

Any user can market make on OPNX, payouts are explained here: https://support.opnx.com/en/articles/7235394-market-maker-program. You can also email them if you’re interested in additional information, with all of that out of the way now lets get into it.

Prelude: CoinFLEX

While almost all of the controversy and media attention has been directed at Su & Kyle, they actually have limited involvement. OPNX is a successor to CoinFLEX with additional features such as claims trading.

CoinFLEX was a small crypto derivatives exchange featuring most notably the ability to ‘physically settle’ crypto futures. In practice physically settled means you can easily redeem your perp position for actual BTC or ETH, much like how a physical futures contract would lead to delivery of the actual commodity. The physical settlement feature combined with perpetual futures behaves almost identically to regular margin trading, but with the additional leverage and flexibility of futures (and no interest, just funding).

CoinFLEX heavily embraced the Bitcoin Cash (BCH, sometimes pejoratively referred to as bcash), and CEO Mark Lamb was good friends with Roger “Bitcoin Jesus” Ver. FLEX had deeply invested in building out the ecosystem, providing a bridge for many tokens to BCH & offering a flexUSD token, in some ways this analogous to what Alameda / FTX did for Solana. Unfortunately Roger turned out to be an unreliable partner.

Unknown to the public, Roger Ver was active in the crypto derivatives market, seemingly splashing endless cash attempting to long Bitcoin Cash. Leverage & personal beliefs are a terrible combination, you need timing edge in addition to a vision to make money trading financial derivatives, unfortunately for Roger it seems he just endlessly bet on BCH, hoping for the best. CoinFLEX had allowed Roger to have a non liquidating line of credit, similar to what Alameda had on FTX. Mark Lamb claimed Ver had always been good about paying back his debts, until he lost so much money the solvency of the exchange was in question and reneged on his debt.

As a side note, Roger also has a dispute with DCG who sold him options OTC that expired worthless. Roger Ver has claimed his reason for refusing to pay is that DCG lied about being insolvent and by being insolvent his trade was a heads you win tails I lose bet. Without the specifics of his agreement with DCG it would be hard to assess whether he stands a chance in court. Both CoinFLEX and DCG intend to pursue Ver in court over this matter.

CoinFLEX at the time listed a token called “rv”USD (allegedly standing for recovery value, not Roger Ver), and tried to fill the gap, ultimately my understanding is that they were unable and spent the next few months pursuing roger (litigation on that still pending).

My take on the issue is as follows, Roger Ver is clearly in the wrong, I don’t buy into his claims that FLEX owe him money, or anything of the sort. Even if you don’t trust Mark at all, Roger clearly got overleveraged in the derivatives market and lost a bunch of with DCG as well. I can also say that CoinFLEX clearly made a severe risk management mistake, almost on the level of FTX. Finally I’m not as optimistic as Mark on the odds of recovery, IMO it’s very likely that Roger is in a similar situation to what 3ac was, replacing Luna with BCH.

From the Ashes

In the aftermath of the FTX Collapse, Mark Lamb & the 3ac duo were off to the races launching a new project, initially called GTX, because “G comes after F”. The three moved to Dubai after their previous disasters and became friends, I don’t know exactly how or why, but all of the previous ‘villains’ returned to twitter after FTX blew up.

Zhu retweeted this post when he first came back to Twitter, Kyle also joined in discussing their initial suspicions of FTX. The duo went on to share their theories of how Alameda / FTX manipulated Luna to 0 and destroyed 3ac. Personally I don’t find this theory credible, given Luna was simply a rehash of the weimar reparation hyperinflation and guaranteed to fail, it is possible that Alameda pulled a George Soros and sent it to the grave.

Tokenized Bankruptcy Trading

In addition to launching a typical crypto / derivatives exchange the trio saw the potential for a new kind of trading in crypto, claims trading. I imagine this was partially inspired by all of the FTX 2.0 talk, and the success of BitFinex’s debt token. Many twitter threads about FTX suggested “restart the casino” and let users bet with their claims and that is exactly what OPNX claims to deliver, you can submit proof of a claim with any of their supported bankrupt companies (currently celsius and FTX) and use this as collateral for your trading on OPNX.

OPNX has adopted a similar cross collateral system to what FTX had, and for example your reOX (credited from your claims) can be used as collateral for the perpetual futures trading functionality. Something to note is that all claims are put in a pool, save for preference risk which they will claw back from you, other claims markets are more specific to the nature of your claim so you may want to shop around before selling on OPNX. I believe they are intending on launching the ability to buy claims as well in the future, which if you believe FTX recovery is looking to be closer to $1 than $0.3 may be appealing.

Personally as I don’t have any bankruptcy claims worth money I haven’t yet experimented with this section, nor do I know anyone who has. The main upside to selling your claim via OPNX or any distressed equity fund is that you can resume trading, a 70% drawdown is rough, but (especially if we’re talking about a large sum of money) gives you something to work with, 100% lockout for years is unworkable.

Market Making

Probably the most interesting aspect of the OPNX platform to non claim holders is their generous and widely available market making program I mentioned earlier. The program initially launched with a $5k stipend to makers meeting a set of requirements and a $50k pool pro rata based on volume. Unfortunately this approach was rife with abuse, with at least one user figuring out they could wash trade their way to a 98.5% share and get all the money.

The wash trading incident also lead to widespread allegations of faking volume, note the spikes and lack of volume consistency. Some of that volume could also be caused by market maker orders hitting eachother, common in a MM dominated marketplace, but many didn’t correlate with price volatility. To address the clear wash trading issue and provide a fair compensation structure for makers, OPNX changed the payment structure to be based solely on the size, uptime & spread of orders in various markets, meaning payment is entirely based on liquidity provided.

I was one of the first to take up this program and designed my own rust-based connector for OPNX, I will include some code snippets below as the documentation page I found a bit confusing in terms of generating a properly authenticated request.

OPNX API Authentication Samples

RUST:

//apart of a larger rust program, &self is a struct containing the following.
pub struct OPNXAuthenticated {
    base_url: String, //due to difficulties with the specific format, my code doesn't respect the base_url set here please note that if you are trying to use this code on the testnet.
    api_key: String,
    api_secret: String,
    
}
pub async fn send_authenticated_request(&self, verb : String, body: String, function: String) -> Result<Response, String> {
        let mut hash = HMAC::new(self.api_secret.as_bytes());
        let timestamp = Utc::now().format("%Y-%m-%dT%H:%M:%S").to_string();
        let path = self.base_url.clone();
        let rand : u32 = random();
        let nonce = rand.to_string();
        let mut msgString;
        if verb == "GET".to_string() {
        msgString = format!("{timestamp}\n{nonce}\n{verb}\napi.opnx.com\n{function}\n{body}");
        } else {
            msgString = format!("{timestamp}\n{nonce}\n{verb}\napi.opnx.com\n{function}\n{body}");
        }
        hash.update(msgString);
        let res = hash.finalize();
        let key = base64::encode(res);
        let client = Client::new();
        match verb.as_str() {
            "GET" => {
                let res = client.get(format!("{path}{function}"))
                .header("AccessKey", self.api_key.clone())
                .header("Timestamp".to_string(), timestamp)
                .header("Signature".to_string(), key)
                .header("Nonce".to_string(), nonce)
                .header("Content-Type".to_string(), "application/json".to_string()).send().await;
                Ok(res.unwrap())
            }
            "POST" => {
                let res = client.post(format!("{path}{function}"))
                .header("AccessKey", self.api_key.clone())
                .header("Timestamp".to_string(), timestamp)
                .header("Signature".to_string(), key)
                .header("Nonce".to_string(), nonce.to_string())
                .header("Content-Type".to_string(), "application/json".to_string()).body(body).send().await;
                Ok(res.unwrap())
                
            }
            "DELETE" => {
                let res = client.delete(format!("{path}{function}"))
                .header("AccessKey", self.api_key.clone())
                .header("Timestamp".to_string(), timestamp)
                .header("Signature".to_string(), key)
                .header("Nonce".to_string(), nonce.to_string())
                .header("Content-Type".to_string(), "application/json".to_string()).body(body).send().await;
                Ok(res.unwrap())

            }
            _ => {Err("VERB NOT RECOGNIZED".to_string())}
        }

While I don’t use python for any active trading I also built a python connector for analytics and tax reporting:

Here’s the code to send an authenticated request to the OPNX api using Python.

class OPNX:
    def __init__(self, API_KEY : str, API_SECRET : str):
        self.api_key = API_KEY
        self.api_secret = API_SECRET
        self.base_url = 'https://api.opnx.com'
    def __construct_auth_request(self, verb, function, body):
        #timestamp = datetime.datetime.now().replace(microsecond=0).isoformat()
        timestamp = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")
        nonce = str(random.randint(337, 999))
        msgString = '%s\n%s\n%s\napi.opnx.com\n%s\n%s'%(timestamp, nonce, verb, function, body )
        print(msgString)
        keybtes = self.api_secret.encode('utf-8')
        hash = hmac.HMAC(key=keybtes, digestmod='sha256')
        hash.update(msgString.encode('utf-8'))
        rawhash = hash.digest()
        print(rawhash)
        res = base64.b64encode(rawhash).decode('utf-8')

        if verb == "GET":
            if body == '':
                requesturl = '%s%s'%(self.base_url, function)
            else: 
                requesturl = '%s%s?%s'%(self.base_url,function,body)
            print(requesturl)
            headers = {'Content-Type': 'application/json','AccessKey': self.api_key, 'Timestamp': timestamp, 'Signature': res, 'Nonce': str(nonce)}
            req = requests.get(requesturl, headers=headers)
            print(req)
            return req

        #else if verb == "POST": 
        #not currently needed for our current project

Hopefully the above code is helpful for anyone wanting to take advantage of the market making program or just connect to the OPNX api for any reason. Please feel free to comment here or DM on twitter if you have specific concerns, I have a pretty good understanding of their API from building a market maker.

One other potential point of confusion worth noting. The OrderCreated channel does not fire back with an OrderCreated response, you can instead watch for the placeorder response which contains the ID you need to cancel the order or modify it (for a market making strategy). I would consider making & releasing an OPNX-RS library if there is sufficient interst.

Official OPNX API Docs: https://docs.opnx.com/ (good overall, personally I found the instructions for sending an authenticated request confusing, I’d recommend copying my code for that).

Can we Trust OPNX?

The final & arguably most controversial part of this is a question of character, can we trust the people behind this project, and this is the main question I get asked about the company, given I disclose trading on the platform on Twitter. I will re-quote a conversation I had with a journalist from Defiant news on the subject below. The simple answer is the same I would give for any other project, save for maybe Kraken, you shouldn’t trust any unregulated crypto exchange with money you can’t afford to lose, I think the people at OPNX are trying to build a serious lasting business, but nobody can be certain.

Journalist:

it’s just that Su and Kyle are behind it make people pretty skeptical

but they do have expertise with claims, I’ll say that

Me: Yeah, I mean they definitely have to prove themselves again. I appreciate the sense of humor they seem to have about the whole thing.

Journalist: Yeah they’re definitely pretty… audacious

Me: My general view on Zhu / Kyle is they got over confident and over leveraged wrt 3ac. I don’t know them closely but I think it was more that than anything like what SBF did

Journalist:

Yeah I don’t know the whole story

i know that Zhu actually believed the supercycle

Me: Neither do i. I think the idea of trying to create an anti ftx is interesting. * side note, what I mean here is rather than having an exchange dominated by an internal MM, opening the whole thing up and avoiding privilege access.

Journalist Question: Cool – would you say you trust Zhu, Kyle, and the folks behind Opnx

Me: To a reasonable extent. I’m not gonna put a huge chunk of my net worth on their, but as far as I can see they are acting in good faith.

I go on to explain the concept of market making which I don’t think is needed for this article, I’m not sure if I am ultimately quoted, but I felt those quotes made sense to reproduce here.

One final point I will make on the issue of trust is I think far too much attention regarding OPNX goes to Zhu & Kyle, who are no doubt involved in the project, but development wise Mark Lamb plays a much bigger role. Hopefully they can all learn from their mistakes of over leveraging and over trusting and avoid the privileged account mess that blew up FTX & CoinFLEX. I think the issue of trust needs to be compared to the other players in the space, especially in terms of smaller offshore operators, or the larger Binance which faces intense regulatory pressure.

Ultimately the decision of who to trust lies solely on the reader, my word of advice is to avoid relying on one unregulated offshore party be it Binance, or OPNX. Diversification is king in this semi-underground world.


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *