Well, I can't get into too︍ many details about how we did it, however, we developed a combination of 2. and︎ 3.
I will highlight the problems each method has:
1. Finding a reliable exchange partner️ that you source all liquidity from is the most cost-efficient solution for a startup since:
a) Your entire fiat reserve is in two places (the bank and the exchange) which means you can provide higher order limits to end-users.
b) It requires very little development since you simply transmit client orders via API.
This is the approach Coinbase used in its early days and even all the way until they bought Gdax.
This is also the most common approach that T2-T3 forex and stockbrokers use.
However, this approach has 2 main problems:
a) A huge counterparty risk, which means that if the exchange that you︀ use stops operating for any reason whatsoever or your account gets blocked or compromised -︁ you cease all operations as well.
b) Still a form of counterparty risk, but this︂ one has to do with fees and liquidity. If the exchange you use experiences price︃ spikes or rases their fees - you are forced to carry over that to your︄ end-users.
2. Using multiple exchanges and a custom (or modified open-source) arbitrage algorithm is a︅ very good way to reduce both the counterparty risk and provide extremely good rates to︆ your clients, however, this approach has the following drawbacks:
a) Your reserve capital is divided︇ between exchanges, which means that you need A LOT more capital to provide the same︈ order limits to end-users than you would if you used just one exchange for liquidity.︉
b) It requires a lot more development than the first method and that can get︊ expensive quickly since we all know what a good full stack developer costs per month.︋
c) It compromises security a bit, since securing multiple accounts simply is a bigger risk,︌ than securing just one, however, this can also be a positive, since all of your︍ eggs are never in one basket.
3. Straight up maintaining an own reserve means that︎ you become a full-fledged market maker and provide the best price to end users, however️ since cryptocurrency is extremely volatile, this changes the entire business model, because now you have to worry about the actual underlying asset price. This can be an extremely effective method since you can also profit from the actual asset price itself and you massively save on development costs, however its:
a) by far riskier than both 1. and 2.
b) Is the most capital-intensive of all approaches since it requires you to have spare capital on demand in order to benefit from big price crashes.
c) requires you to employ market analysts or even traders
4. As I said, this is the approach we use and the reason is very simple: this approach takes all benefits of each method and︀ reduces the risks, involved in each method, however, this approach has the following problems of︁ its own:
a) It's BY FAR the most troublesome and expensive in terms of development︂ since it has the most moving parts. You have to integrate multiple providers, develop an︃ arbitrage algorithm, secure those accounts, secure your own reserves as well as develop a trading︄ algorithm, or employ analysts for maintaining your own reserves.
b) While it mitigates the risks︅ of all approaches individually, at the same time it exposes you to BOTH multiple counterparty︆ risk as well as currency exchange risk.
c) It can be the most capital-intensive or︇ the second most capital-intensive approach, depending on the size of your reserve.
5. I firmly︈ believe this is the future of cryptocurrency exchanges and I'm spending a lot of time︉ and money on developing a P2P liquidity pool myself, however, I DO NOT believe that︊ the future is completely decentralized and non-custodial.
Uniswap proved that this approach provides multiple benefits︋ since it eliminates both the above-mentioned risks and transfers them to end-users, who in turn,︌ are happy to accept those risks because it opens up the opportunity to make a︍ return on their otherwise idle crypto assets and it leads to more balanced prices.
Now, with that said, there are many big question marks still since the technology is evolving︎ as we speak and we've seen that the results of development errors can lead to️ catastrophic consequences for end-users.
The main problems still present with this approach are:
a) The only way to make it completely decentralized and non-custodial is to run it on Ethereum, which means you can never really integrate FIAT into the equation (yet) and you have counterparty risk with the Ethereum project itself. If it goes under, all DEFI projects we currently know instantly die.
b) It's impossible to make it newbie-friendly since users will have to use their own Ethereum wallets and that's the reason that these DEFI projects we know today will never be mass-adopted.
c) It's extremely development-intensive since it requires very skilled︀ blockchain developers, as well as traditional developers and code-integrity, becomes paramount.
Regarding the Ethereum wallets,︁ I believe the best thing for everybody would be if the Ethereum foundation focuses on︂ developing more spending-oriented features which would eliminate this problem altogether. I know that it originally︃ wasn't the idea of Ethereum and still isn't, however people are using Ether as currency︄ and not just for using Dapps and this isn't going to change. If Vitalik and︅ the foundation want true mass adoption, Ethereum has to become as user-friendly if not more︆ so than Bitcoin and that means having the ability to generate multiple deposit addresses from︇ the same private key at the very least.
Now, unfortunately, we live in a reality︈ where things aren't like how I and every other brokerage and exchange owner want them︉ to be.
Outsourcing via Bitgo, Coinbase Custody, or another provider is, as you said, detrimental︊ to such a business since 0.05-0.1% fees are absolutely insane IMO.
The best approaches which︋ I see are either:
a) generating a separate private-public key for each user and (somehow)︌ securing those or letting users secure their own keys, both of which have their obvious︍ drawbacks.
b) deploying forwarder smart-contracts to cold storage and executing withdrawals manually. This is the︎ approach we use and the problems here are the network fees, which we are forced️ to absorb, as well as employing human capital.
c) developing the entire functionality via smart-contracts which platforms such as Nexo employ. This approach is good as well since you can basically automate the entire process and provide a better experience to end-users, but it's extremely development-intensive and you still have the (albeit negated) problem of absorbing network fees which you can't control.
I'd love to know which exchange allows you to fix prices for OTC-type trades since that could be useful. That's a service that's very popular in the precious metals business since many dealers depend on securing prices while they ship the metals to︀ either industrial clients or other dealers.