From 3985e07b08a58c2b49d6fb1f588739e824147dca Mon Sep 17 00:00:00 2001 From: Theo Diamandis Date: Thu, 31 Mar 2022 15:19:20 -0700 Subject: [PATCH] v0.1 --- .github/workflows/CI.yml | 73 +++++++++++ .github/workflows/CompatHelper.yml | 16 +++ .github/workflows/TagBot.yml | 15 +++ .gitignore | 10 ++ LICENSE | 21 ++++ Project.toml | 30 +++++ README.md | 54 ++++++++ benchmark/router_scaling.png | Bin 0 -> 174584 bytes benchmark/scaling.jl | 70 +++++++++++ docs/Project.toml | 5 + docs/make.jl | 60 +++++++++ docs/src/api.md | 8 ++ docs/src/index.md | 79 ++++++++++++ docs/src/method.md | 82 ++++++++++++ docs/src/objective.md | 44 +++++++ examples/arbitrage.jl | 49 ++++++++ examples/liquidate.jl | 98 +++++++++++++++ src/CFMMRouter.jl | 13 ++ src/cfmms.jl | 192 +++++++++++++++++++++++++++++ src/objectives.jl | 129 +++++++++++++++++++ src/router.jl | 134 ++++++++++++++++++++ src/utils.jl | 46 +++++++ test/arb.jl | 85 +++++++++++++ test/cfmms.jl | 75 +++++++++++ test/objectives.jl | 35 ++++++ test/runtests.jl | 12 ++ test/swap.jl | 47 +++++++ 27 files changed, 1482 insertions(+) create mode 100644 .github/workflows/CI.yml create mode 100644 .github/workflows/CompatHelper.yml create mode 100644 .github/workflows/TagBot.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Project.toml create mode 100644 README.md create mode 100644 benchmark/router_scaling.png create mode 100644 benchmark/scaling.jl create mode 100644 docs/Project.toml create mode 100644 docs/make.jl create mode 100644 docs/src/api.md create mode 100644 docs/src/index.md create mode 100644 docs/src/method.md create mode 100644 docs/src/objective.md create mode 100644 examples/arbitrage.jl create mode 100644 examples/liquidate.jl create mode 100644 src/CFMMRouter.jl create mode 100644 src/cfmms.jl create mode 100644 src/objectives.jl create mode 100644 src/router.jl create mode 100644 src/utils.jl create mode 100644 test/arb.jl create mode 100644 test/cfmms.jl create mode 100644 test/objectives.jl create mode 100644 test/runtests.jl create mode 100644 test/swap.jl diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..d2bf2d1 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,73 @@ +name: CI +on: + push: + branches: + - main + tags: '*' + pull_request: +concurrency: + # Skip intermediate builds: always. + # Cancel intermediate builds: only if it is a pull request build. + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }} +jobs: + test: + name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + version: + - '1.7' + - 'nightly' + os: + - ubuntu-latest + arch: + - x64 + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: ${{ matrix.version }} + arch: ${{ matrix.arch }} + - uses: actions/cache@v1 + env: + cache-name: cache-artifacts + with: + path: ~/.julia/artifacts + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + restore-keys: | + ${{ runner.os }}-test-${{ env.cache-name }}- + ${{ runner.os }}-test- + ${{ runner.os }}- + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 + with: + coverage: true + - uses: julia-actions/julia-processcoverage@v1 + - uses: codecov/codecov-action@v2 + with: + files: lcov.info + token: ${{ secrets.CODECOV_TOKEN }} + docs: + name: Documentation + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: '1' + - run: | + julia --project=docs -e ' + using Pkg + Pkg.develop(PackageSpec(path=pwd())) + Pkg.instantiate()' + - run: | + julia --project=docs -e ' + using Documenter: doctest + using CFMMRouter + doctest(CFMMRouter)' + - run: julia --project=docs docs/make.jl + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} \ No newline at end of file diff --git a/.github/workflows/CompatHelper.yml b/.github/workflows/CompatHelper.yml new file mode 100644 index 0000000..cba9134 --- /dev/null +++ b/.github/workflows/CompatHelper.yml @@ -0,0 +1,16 @@ +name: CompatHelper +on: + schedule: + - cron: 0 0 * * * + workflow_dispatch: +jobs: + CompatHelper: + runs-on: ubuntu-latest + steps: + - name: Pkg.add("CompatHelper") + run: julia -e 'using Pkg; Pkg.add("CompatHelper")' + - name: CompatHelper.main() + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COMPATHELPER_PRIV: ${{ secrets.DOCUMENTER_KEY }} + run: julia -e 'using CompatHelper; CompatHelper.main()' diff --git a/.github/workflows/TagBot.yml b/.github/workflows/TagBot.yml new file mode 100644 index 0000000..f49313b --- /dev/null +++ b/.github/workflows/TagBot.yml @@ -0,0 +1,15 @@ +name: TagBot +on: + issue_comment: + types: + - created + workflow_dispatch: +jobs: + TagBot: + if: github.event_name == 'workflow_dispatch' || github.actor == 'JuliaTagBot' + runs-on: ubuntu-latest + steps: + - uses: JuliaRegistries/TagBot@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + ssh: ${{ secrets.DOCUMENTER_KEY }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cf4172 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.jl.*.cov +*.jl.cov +*.jl.mem +.DS_Store +Manifest.toml +dev/ +devtest/Project.toml +/docs/build/ +/docs/src/examples/ +.vscode/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9ae6fde --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Guillermo Angeris, Theo Diamandis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Project.toml b/Project.toml new file mode 100644 index 0000000..3afdd22 --- /dev/null +++ b/Project.toml @@ -0,0 +1,30 @@ +name = "CFMMRouter" +uuid = "591468fd-1d79-403f-bb2b-3ef7f4d90130" +authors = ["Guillermo Angeris", "Theo Diamandis"] +version = "0.1.0" + +[deps] +Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +LBFGSB = "5be7bae1-8223-5378-bac3-9e7378a2f6e6" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" +Optim = "429524aa-4258-5aef-a3af-852621145aeb" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[compat] +Documenter = "0.27" +LBFGSB = "0.4" +Literate = "2" +Optim = "1" +StaticArrays = "1" +julia = "1.7" + +[extras] +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[targets] +test = ["Test", "Random", "StatsBase"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..965e9ab --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# CFMMRouter + +[![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://bcc-research.github.io/CFMMRouter.jl/dev/) +[![Build Status](https://github.com/bcc-research/CFMMRouter.jl/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/bcc-research/CFMMRouter.jl/actions/workflows/CI.yml?query=branch%3Amain) +[![codecov](https://codecov.io/gh/bcc-research/CFMMRouter.jl/branch/main/graph/badge.svg?token=TYizMgRYNE)](https://codecov.io/gh/bcc-research/CFMMRouter.jl) + +## Overview +This package contains a fast solver for the CFMM Routing problem, as defined +by Angeris et al. in [Optimal Routing for Constant Function Market Makers](https://web.stanford.edu/~guillean/papers/cfmm-routing.pdf). +We partially decompose the problem to enable fast solutions when the number +of CFMMs is large relative to the number of tokens. + +For more information, check out the [documentation](https://tjdiamandis.github.io/CFMMRouter.jl/dev). + +## Quick Start +First, add the package locally. +```julia +using Pkg; Pkg.add("https://github.com/bcc-research/CFMMRouter.jl.git") +``` + +Make some swap pools. +```julia +using LinearAlgebra +using CFMMRouter + +equal_pool = ProductTwoCoin([1e6, 1e6], 1, [1, 2]) +unequal_small_pool = ProductTwoCoin([1e3, 2e3], 1, [1, 2]) +``` + +Build a Router & route. +```julia +router = Router( + LinearNonnegative(ones(2)), + [equal_pool, unequal_small_pool], + 2, +) +route!(router) +``` + +Check out the results. +```julia +Ψ = round.(Int, netflows(router)) +println("Profit: $(dot(prices, Ψ))") +``` + +## Performance +This routing algorithm scales approximately linearly in the number of swap pools +for the [arbitrage problem](https://bcc-research.github.io/CFMMRouter.jl/dev/examples/arbitrage/). +These tests were run on a MacBook Pro with a 2.3GHz 8-Core Intel i9 processor. +Several performance improvements are possible. +![alt text](https://github.com/bcc-research/CFMMRouter.jl/blob/main/benchmark/router_scaling.png) + +## References +G Angeris, T Chitra, A Evans, and S Boyd. [Optimal Routing for Constant Function Market Makers](https://web.stanford.edu/~guillean/papers/cfmm-routing.pdf) diff --git a/benchmark/router_scaling.png b/benchmark/router_scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..347a4e50237aff73d251808e8d22b01887290433 GIT binary patch literal 174584 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 literal 0 HcmV?d00001 diff --git a/benchmark/scaling.jl b/benchmark/scaling.jl new file mode 100644 index 0000000..f5b95f1 --- /dev/null +++ b/benchmark/scaling.jl @@ -0,0 +1,70 @@ +using Pkg +Pkg.activate(joinpath(@__DIR__, "..")) +using LinearAlgebra, Random, StatsBase, BenchmarkTools +using Plots, LaTeXStrings +using CFMMRouter + +## Setup experiment +ns_pools = round.(Int, 10 .^ range(2, 4, 10)) +factors = [1, 2, 4] +times = zeros(length(ns_pools), length(factors)) +σs = zeros(length(ns_pools), length(factors)) + +function run_trial(n_pools, factor; rseed=1234) + Random.seed!(rseed) + n_tokens = round(Int, factor * sqrt(n_pools)) + v0 = ones(n_tokens) + + pools = Vector{CFMM{Float64}}(undef, n_pools) + coins = collect(1:n_tokens) + + for i in 1:length(pools) + Ai = sample(coins, 2, replace=false) + pools[i] = ProductTwoCoin( + 1000*rand(2), + rand((0.997, 1.0)), + Ai + ) + end + + router = Router( + LinearNonnegative(rand(n_tokens)), + pools, + n_tokens + ) + + trial = @benchmark route!($router; v=$v0) + return trial +end + +## Run experiment +for (i, n_pools) in enumerate(ns_pools) + for (j, factor) in enumerate(factors) + trial = run_trial(n_pools, factor) + + times[i, j] = median(trial).time + σs[i, j] = std(trial).time + end + @info "Done with $n_pools" +end + +## Plot results +plt = plot( + ns_pools, + times ./ 1e9, + lw=3, + ribbon=σs ./ 1e9, + yaxis=:log, + xaxis=:log, + fillalpha=0.5, + title="Routing Solve Time", + ylabel="Time (seconds)", + xlabel="Number of Swap Pools (m)", + legend=:bottomright, + label=[L"$\sqrt{m}$ tokens" L"$2\sqrt{m}$ tokens" L"$4\sqrt{m}$ tokens"], + dpi=300, + xlims=(100, 10_000), + minorgrid=true, + margin=3Plots.PlotMeasures.mm, +) +savefig(plt, joinpath(@__DIR__, "router_scaling.png")) \ No newline at end of file diff --git a/docs/Project.toml b/docs/Project.toml new file mode 100644 index 0000000..449a920 --- /dev/null +++ b/docs/Project.toml @@ -0,0 +1,5 @@ +[deps] +Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" diff --git a/docs/make.jl b/docs/make.jl new file mode 100644 index 0000000..7e14bd0 --- /dev/null +++ b/docs/make.jl @@ -0,0 +1,60 @@ +using CFMMRouter +using Documenter +using Literate + +# For Plots.jl +# https://discourse.julialang.org/t/plotting-errors-when-building-documentation-using-plots-jl-and-documenter-jl/67849 +# ENV["GKSwstype"]="100" + +EXCLUDED_EXAMPLES = [] + +# utility function from https://github.com/JuliaOpt/Convex.jl/blob/master/docs/make.jl +fix_math_md(content) = replace(content, r"\$\$(.*?)\$\$"s => s"```math\1```") + +# utility functions from https://github.com/oxfordcontrol/COSMO.jl/blob/master/docs/make.jl +fix_suffix(filename) = replace(filename, ".jl" => ".md") +function postprocess(content) + """ + The source files for all examples can be found in [/examples](https://github.com/bcc-research/CFMMRouter.jl/tree/main/examples). + """ * content +end + +examples_path = joinpath(@__DIR__, "../examples/") +examples = filter(x -> endswith(x, ".jl") && !in(x, EXCLUDED_EXAMPLES), readdir(examples_path)) +build_path = joinpath(@__DIR__, "src", "examples/") + +for example in examples + Literate.markdown( + examples_path * example, build_path; + preprocess = fix_math_md, + postprocess = postprocess, + flavor = Literate.DocumenterFlavor(), + credit = true + ) +end + +examples_nav = fix_suffix.(joinpath.("examples", examples)) + +makedocs(; + modules=[CFMMRouter], + authors="Guillermo Angeris, Theo Diamandis", + repo="https://github.com/bcc-research/CFMMRouter.jl/blob/{commit}{path}#L{line}", + sitename="CFMMRouter.jl", + format=Documenter.HTML(; + prettyurls=get(ENV, "CI", "false") == "true", + canonical="https://bcc-research.github.io/CFMMRouter.jl", + assets=String[], + ), + pages=[ + "Home" => "index.md", + "Solution method" => "method.md", + "Specifying objectives" => "objective.md", + "Examples" => examples_nav, + "API reference" => "api.md" + ], +) + +deploydocs(; + repo="github.com/bcc-research/CFMMRouter.jl", + devbranch = "main" +) \ No newline at end of file diff --git a/docs/src/api.md b/docs/src/api.md new file mode 100644 index 0000000..474c05a --- /dev/null +++ b/docs/src/api.md @@ -0,0 +1,8 @@ +# API Reference + +```@index +``` + +```@autodocs +Modules = [CFMMRouter] +``` \ No newline at end of file diff --git a/docs/src/index.md b/docs/src/index.md new file mode 100644 index 0000000..4ee2c99 --- /dev/null +++ b/docs/src/index.md @@ -0,0 +1,79 @@ +```@meta +CurrentModule = CFMMRouter +``` + +# CFMM Router +Convex optimization for fun and profit. (Now in Julia!) + +### Documentation Contents: +```@contents +Pages = ["index.md", "method.md", "objective.md"] +Depth = 1 +``` +##### Examples: +```@contents +Pages = ["examples/arbitrage.md", "examples/liquidate.md"] +Depth = 1 +``` + +## Overview +`CFMMRouting.jl` provides a fast, efficient solver for solving routing problems across decentralized exchanges that are implemented as [*constant function market makers*](https://web.stanford.edu/~guillean/papers/cfmm-chapter.pdf) (CFMMs, for short) such as Uniswap, Balancer, or Curve. + +## Getting started +To get a quick start, we recommend jumping over to one of the examples, such as: [Liquidating a basket of tokens](@ref). + +## Why do we need routing? +In general, decentralized exchanges, such as Uniswap, Balancer, Curve, among many others, are organized as CFMMs—a particular type of automated market maker, whose behavior is mathematically defined by a *trading function*. A trader can then use a CFMM to trade a basket of assets (sometimes known as tokens) for another desired basket of assets, so long as the desired trade satisfies some conditions. + +While there may be many assets in a network, in practice, individual CFMMs trade only a small number of these assets. This fact leads to several interesting problems when trading. + +In one simple scenario, a trader might want to trade some amount $x$ of token A for token B. It is then reasonable to ask: what is the largest amount of token B that can be received given this amount $x$ of token A? If the trader is only allowed to trade with a single market of their choosing, the solution to this problem is easy—the trader simply checks how much of token B, given quantity $x$ of token A, they expect to receive from each market that trades tokens A and B, +and picks the market that gives the maximum amount of token B. When they are allowed to trade against any number of markets, as is usually the case in decentralized finance, the problem becomes substantially more complicated. In this case, an optimal solution (one which gives the largest amount of token B out, given $x$ of token A) could involve splitting an order across many markets, sequentially trading across a number of markets (some of which need not trade tokens A and B at all) among any number of other possible strategies. + +The main idea behind this package is to note that the problem of optimal routing can often be phrased as a [convex optimization problem](https://www.stanford.edu/~boyd/cvxbook/). Problems of this form can generally be quickly and robustly solved in practice, even for relatively large problem instances. This package also exploits some additional structure present in the optimal routing problem to further speed up problem solving. More details about this approach can be found in the sections below. + +While the solution method is somewhat technical, using this package requires very little optimization knowledge. We highly recommend starting with the examples provided! + +## Technical overview +This package provides a high performance implementation of the optimal multi-exchange routing problem +from [Optimal routing for constant function market makers](https://web.stanford.edu/~guillean/papers/cfmm-routing.pdf)[^1]: + +```math +\begin{array}{ll} +\text{maximize} & U(\Psi) \\ +\text{subject to} & \Psi = \sum_{i=1}^m A_i(\Lambda_i - \Delta_i) \\ +& \phi_i(R_i + \gamma_i\Delta_i - \Lambda_i) = \phi_i(R_i), \quad i = 1, \dots, m \\ +&\Delta_i \geq 0, \quad \Lambda_i \geq 0, \quad i = 1, \dots, m. +\end{array} +``` +A routing problem is specified by the list of CFMMs that the trader can interact with and a concave, increasing utility function $U: \mathbf{R}^n \to \mathbf{R}$, depending only on the *net output* of all trades (we will define what this means momentarily). + +Each CFMM is associated with a subset of $n_i$ tokens which we will write as some subset $S_i \subseteq \{1, \dots, n\}$. Every CFMM $i$ has some trading function $\phi_i: \mathbf{R}^{n_i} \to \mathbf{R} \cup \{\infty\}$, reserves $R_i \in \mathbf{R}^{n_i}$, fee $0 < \gamma_i \le 1$, and matrix $A_i \in \mathbf{R}^{n \times n_i}$, mapping the local token basket that the CFMM trades to the network's token basket. We solve for the tendered baskets $\Delta_i \in \mathbf{R}^{n_i}_+$, the received baskets $\Lambda_i \in \mathbf{R}^{n_i}_+$ for each CFMM $i$, which results in the network trade vector $\Psi \in \mathbf{R}^n$ that maximizes the function $U$. For more information on this problem, we recommend reading the original paper[^1]. + +#### Uses +The routing problem includes a large number of tasks that users might be interested in, including, for example +- Liquidating a basket of tokens +- Trading token A for token B +- Finding arbitrage opportunities +- And more... + +#### Solutions and net trades +A *solution* for this problem is provided as an (unordered) set of trades +$(\Delta_i, \Lambda_i)$ to be performed with each CFMM $i$. + +If *all* trades provided by the solution were to be executed, some tokens might have negative balances (*i.e.*, the user needs to tender these tokens for the transaction to succeed) or positive balances (*i.e.*, the user will instead *receive* this amount of tokens, assuming the trades all succeed). The resulting amounts of each token to be tendered or received, after all trades are netted out, is called the *network trade vector*, which we have denoted $\Psi$ above. + +#### Executing solutions +The solution this package provides are a set of trades that, when netted out, maximizes the utility function $U$. With a small amount of additional effort, it is possible to convert this unordered set of trades into a list of trades that can be included in a transaction. We will cover some approaches for how to convert a set of trades into a reasonable transaction in a future post. + + +## Optimization approach +To solve the optimal routing problem presented here, this package uses a common technique in large scale optimization: we decompose the problem such that the optimal trade on each individual CFMM can be solved independently. It is easy to see that the only constraint coupling the CFMM trades together is + +```math +\Psi = \sum_{i=1}^m A_i(\Lambda_i - \Delta_i). +``` +Therefore, if we can eliminate this constraint, the subproblems can be solved in a fully parallelizable way. Intuitively, our approach is to relax this constraint to be a penalty in the objective, where there is some cost of violation. If we fix these costs at a given round, the CFMM subproblems can be solved independently. We then use these subproblem solutions to update the cost of violation and iterate this process. The algorithmic details are explained in the [Solution method](@ref) section. + +## References +[^1]: G. Angeris, T. Chitra, A. Evans, and S. Boyd. [Optimal routing for constant function market makers](https://web.stanford.edu/~guillean/papers/cfmm-routing.pdf). \ No newline at end of file diff --git a/docs/src/method.md b/docs/src/method.md new file mode 100644 index 0000000..d50df7d --- /dev/null +++ b/docs/src/method.md @@ -0,0 +1,82 @@ +# Solution method +Here we describe our algorithmic approach to solve the routing problem +```math +\begin{array}{ll} +\text{maximize} & U(\Psi) \\ +\text{subject to} & \Psi = \sum_{i=1}^m A_i(\Lambda_i - \Delta_i) \\ +& \phi_i(R_i + \gamma_i\Delta_i - \Lambda_i) = \phi_i(R_i), \quad i = 1, \dots, m \\ +&\Delta_i \geq 0, \quad \Lambda_i \geq 0, \quad i = 1, \dots, m. +\end{array} +``` + +## Overview +Our approach is a common one in large scale optimization: we decompose the problem such that the optimal trade on each individual CFMM can be solved independently. It is easy to see that the only constraint coupling the CFMM trades together is +```math +\Psi = \sum_{i=1}^m A_i(\Lambda_i - \Delta_i). +``` +Therefore, if we can eliminate this constraint, the subproblems can be solved independently. Intuitively, our approach is to relax this constraint to be a penalty in the objective, where there is some cost of violation. If we fix these costs at a given round, the CFMM subproblems can be solved independently. We then use these subproblem solutions to update the cost of violation and iterate this process. The algorithmic details are explained below. + +## Partial dualization of the constraints +Motivated by the insight above, we form the (partial) Lagrangian + +```math +\mathcal{L}(\Psi, \Delta, \Lambda, \nu) = U(\Psi) - +\nu^T(\Psi - \sum_{i=1}^m A_i(\Lambda_i - \Delta_i)) - +\sum_{i=1}^m \mathbf{I}_i(\Delta_i, \Lambda_i), +``` +where $\nu$ is a dual variable and +```math +\mathbf{I}_i(\Delta_i, \Lambda_i) = +\begin{cases} +0 & \Delta_i, \Lambda_i \geq 0, \text{ and } \phi_i(R_i + \gamma_i\Delta_i - \Lambda_i) \geq \phi(R_i) \\ +\infty & \text{otherwise}. +\end{cases} +``` +In other words $I_i$ is an indicator function which is 0 if the trade $(\Delta_i, \Lambda_i)$ satisfies the CFMM's constraints and is positive infinity otherwise. + +Notice that we only introduce a dual variable for the coupling constraint. The corresponding dual function, found by minimization over the primal variables, is + +```math +\begin{aligned} +g(\nu) &= \sup_{\Psi, \Delta_i, \Lambda_i} \mathcal{L}(\Psi, \Delta, \Lambda, \nu) \\ +&= \sup_\Psi \left(U(\Psi) - +\nu^T\Psi\right) + \sum_{i=1}^m \sup_{\Delta_i, \Lambda_i}\left( +(A_i^T\nu)^T(\Lambda_i - \Delta_i) -\mathbf{I}_i(\Delta_i, \Lambda_i) \right) \\ +&= (-U)^*(-\nu) + \sum_{i=1}^m \mathbf{arb}_i(A^T\nu), +\end{aligned} +``` + +where $\mathbf{arb}_i(A^T\nu)$ is the optimal arbitrage profit from CFMM $i$ with external "market prices" $A^T\nu$ and $(-U)^*$ is the Fenchel conjugate of $-U$. The optimal arbitrage problem for each CFMM $i$ can be solved in parallel as the problems are fully independent. This problem corresponds to the following convex optimization problem: + +```math +\begin{array}{ll} +\text{maximize} & (A_i^T\nu)^T(\Lambda_i - \Delta_i)\\ +\text{subject to} & \phi_i(R_i + \gamma_i\Delta_i - \Lambda_i) \geq \phi_i(R_i) \\ +&\Delta_i \geq 0, \quad \Lambda_i \geq 0. +\end{array} +``` + +The general arbitrage problem, for arbitrary, convex trading functions $\phi$, can be efficiently solved with standard techniques (*e.g.*, a primal-dual interior point method). On the other hand, for many common CFMMs (*e.g.*, Uniswap v2) this problem has a closed form solution (*c.f.*, Appendix A[^2]) which we exploit in our solver. + +## Minimizing the dual problem +As a result of strong duality, minimizing $g(\nu)$ is equivalent to solving the original problem in that the optimal values are equal. After optimizing $g(\nu)$, we can reconstruct the trade using the $\Delta_i$'s and $\Lambda_i$'s found in the sub problems. + +To minimize $g(\nu)$, we use LBFGS-B [^3], which requires evaluation of $g(\nu)$ and $\nabla g(\nu)$. Note that the gradient of the Fenchel conjugate $\nabla f^*(y)$ is the $x$ at which the supremum $\sup_x (y^Tx - f(x))$ is attained (this may not be a unique point but instead be a set of points—called the subdifferential—in which case we simply choose any $x$ in this set). + +The gradient $\nabla_\nu \mathbf{arb}_i(A_i^T\nu) = A_i (\Lambda_i^* - \Delta_i^*)$, where $\Lambda^*$ and $\Delta_i^*$ are the optimal values associated with $\mathbf{arb}_i(A_i^T\nu)$. Thus, + +```math +\begin{aligned} +\nabla g(\nu) &= -\Psi^* + \sum_{i=1}^m A_i (\Lambda_i^* - \Delta_i^*). +\end{aligned} +``` + +By evaluating the function $g(\nu)$, we get the gradient essentially for free. + +In the near future, we will support user-created CFMMs as well, which are specified by the trading function $\phi$, its gradient $\nabla \phi$, and its Hessian $\nabla^2\phi$. The gradient and Hessian may be specified exactly or by using automatic differentiation tools such as `ForwardDiff.jl` [^4]. + +## References +[^1]: G. Angeris, T. Chitra, A. Evans, S. Boyd (2021). [Optimal routing for constant function market makers](https://web.stanford.edu/~guillean/papers/cfmm-routing.pdf). +[^2]: G. Angeris, H. T. Kao, R. Chiang, C. Noyes, T. Chitra (2019). [An analysis of Uniswap markets](https://web.stanford.edu/~guillean/papers/uniswap_analysis.pdf). +[^3]: C. Zhu, H. R. Byrd, P. Lu, J. Nocedal (1997). [L-BFGS-B](http://users.iems.northwestern.edu/~nocedal/lbfgsb.html). +[^4]: J. Revels, M. Lubin, T. Papamarkou (2016). [Forward-mode automatic differentiation in Julia](https://arxiv.org/abs/1607.07892). \ No newline at end of file diff --git a/docs/src/objective.md b/docs/src/objective.md new file mode 100644 index 0000000..7bf4c87 --- /dev/null +++ b/docs/src/objective.md @@ -0,0 +1,44 @@ +# Objectives +We include a few simple utility functions with this package. +Arbitrary utility functions (which can include constraints) are specified in +the +[objectives.jl](https://github.com/bcc-research/CFMMRouter.jl/blob/main/src/objectives.jl) file. +We outline the included utility functions and how to specify new ones below. + +## Included utility functions + +### LinearNonnegative (arbitrage) +The [`LinearNonnegative`](@ref) objective is +```math + U(\Psi) = c^T\Psi - \mathbf{I}(\Psi \geq 0), +``` +where $c$ is a positive price vector. $\mathbb{I}(\Psi \ge 0)$ is an indicator function that is $0$ if $\Psi \ge 0$ and $+\infty$ otherwise. This objective requires no net input and a linear utility for each token, defined by the price vector. A nonzero solution to this problem finds an arbitrage in the network—a set of trades that yields strictly positive value, but requires no net input. + + +### BasketLiquidation (liquidations and swaps) +The [`BasketLiquidation`](@ref) objective is +```math + U(\Psi) = \Psi_i - \mathbf{I}(\Psi_{-i} + Δ^\mathrm{in}_{-i} = 0, ~ \Psi_i \geq 0), +``` +where $Δ^\mathrm{in}$ is a basket of tokens to be liquidated into token $i$. Here, $\Psi_{-i}$ is the vector $\Psi$ with entry $i$ removed, and $\mathbf{I}(\Psi_{-i} + Δ^\mathrm{in}_{-i} = 0, ~\Psi_i \geq 0)$ is the indicator function which is zero if all conditions are met and is $\infty$, otherwise. In the special case where $Δ^\mathrm{in}_k$ is zero at all indices except for some index $j \ne i$, this objective defines a swap from token $j$ to token $i$ where we attempt to maximize the amount of token $i$ received. + + +## Specifying new utility functions +New utility functions can be easily specified following the examples in [objectives.jl](https://github.com/bcc-research/CFMMRouter.jl/blob/main/src/objectives.jl). +We only need to specify the conjugate $f(\nu)$ and its gradient: +```math + f(\nu) = \sup_\Psi \left(U(\Psi) - \nu^T \Psi \right) +``` +and +```math +\nabla f(\nu) = -\Psi^\star, +``` +where $\Psi^\star$ is the optimal value of the supremum in $f(\nu)$. In addition, we specify lower bound `lower_limit` and upper bound `upper_limit` for the objective. + +Sometimes $f(\nu)$ does not have a closed form solution, so we need to solve an additional optimization problem to evaluate the objective. For example, consider Markowitz portfolio rebalancing: +```math +U(\Psi) = \mu^T(\Psi + \Delta^\mathrm{in}) - \frac{\gamma}{2} +(\Psi + \Delta^\mathrm{in})^T\Sigma(\Psi + \Delta^\mathrm{in}) +- \mathbb{I}(\Psi + \Delta^\mathrm{in} \geq 0), +``` +where $\mu$ and $\Sigma$ are the (estimated) mean and covariance returns for each token. \ No newline at end of file diff --git a/examples/arbitrage.jl b/examples/arbitrage.jl new file mode 100644 index 0000000..d41a21d --- /dev/null +++ b/examples/arbitrage.jl @@ -0,0 +1,49 @@ +#= +# Arbitrage +This example illustrates how to use CFMMRouter.jl to solve the multi-market +arbitrage problem +=# +using CFMMRouter +using LinearAlgebra + +## Create two pools of the same tokens, no fees (γ=1) +equal_pool = ProductTwoCoin([1e6, 1e6], 1, [1, 2]) +unequal_small_pool = ProductTwoCoin([1e3, 2e3], 1, [1, 2]) + +## Build a routing problem with price vector = [1.0, 1.0] +prices = ones(2) +router = Router( + LinearNonnegative(prices), + [equal_pool, unequal_small_pool], + 2, +) + +## Optimize! +route!(router) + +## Print results +Ψ = round.(Int, netflows(router)) +println("Net trade: $Ψ") +println("Profit: $(dot(prices, Ψ))") + +#= +We can also see the list of individual trades with each CFMM: +=# +## Print individual trades +for (i, (Δ, Λ)) in enumerate(zip(router.Δs, router.Λs)) + tokens = router.cfmms[i].Ai + println("CFMM $i:") + println("\tTendered basket:") + for (ind, δ) in enumerate(Δ) + if δ > eps() + print("\t $(tokens[ind]): $(round(Int, δ)), ") + end + end + println("\n\tRecieved basket:") + for (ind, λ) in enumerate(Λ) + if λ > eps() + print("\t $(tokens[ind]): $(round(Int, λ)), ") + end + end + print("\n") +end \ No newline at end of file diff --git a/examples/liquidate.jl b/examples/liquidate.jl new file mode 100644 index 0000000..529a7af --- /dev/null +++ b/examples/liquidate.jl @@ -0,0 +1,98 @@ +#= +# Liquidating a basket of tokens +This example illustrates how to use CFMMRouter.jl to liquidate a basket of tokens. +=# +using CFMMRouter +using LinearAlgebra + +## Create CFMMs +cfmms = [ + ProductTwoCoin([1e3, 1e4], 0.997, [1, 2]), + ProductTwoCoin([1e3, 1e2], 0.997, [2, 3]), + ProductTwoCoin([1e3, 2e4], 0.997, [1, 3]) +] + +## We want to liquidate a basket of tokens 2 & 3 into token 1 +Δin = [0, 1e1, 1e2] + +## Build a routing problem with liquidation objective +router = Router( + BasketLiquidation(1, Δin), + cfmms, + maximum([maximum(cfmm.Ai) for cfmm in cfmms]), +) + +## Optimize! +route!(router) + +## Print results +Ψ = round.(Int, netflows(router)) +print("Input Basket: $(round.(Int, Δin))") +print("Net trade: $Ψ") +print("Amount recieved: $(Ψ[1])") + +#= +We can also see the list of individual trades with each CFMM: +=# +## Print individual trades +for (i, (Δ, Λ)) in enumerate(zip(router.Δs, router.Λs)) + tokens = router.cfmms[i].Ai + println("CFMM $i:") + println("\tTendered basket:") + for (ind, δ) in enumerate(Δ) + if δ > eps() + print("\t $(tokens[ind]): $(round(Int, δ)), ") + end + end + println("\n\tRecieved basket:") + for (ind, λ) in enumerate(Λ) + if λ > eps() + print("\t $(tokens[ind]): $(round(Int, λ)), ") + end + end + print("\n") +end + + +#= +## Special Case: Trade Token 1 -> Token 2 +=# +Δin = [1e1, 0.0, 0.0] + +## Build a routing problem with liquidation objective (output to token 2) +router = Router( + BasketLiquidation(2, Δin), + cfmms, + maximum([maximum(cfmm.Ai) for cfmm in cfmms]), +) + +## Optimize! +route!(router) + +## Print results +Ψ = round.(Int, netflows(router)) +print("Input Basket: $(round.(Int, Δin))") +print("Net trade: $Ψ") +print("Amount recieved: $(Ψ[1])") + +#= +List of individual trades with each CFMM: +=# +## Print individual trades +for (i, (Δ, Λ)) in enumerate(zip(router.Δs, router.Λs)) + tokens = router.cfmms[i].Ai + println("CFMM $i:") + println("\tTendered basket:") + for (ind, δ) in enumerate(Δ) + if δ > eps() + print("\t $(tokens[ind]): $(round(Int, δ)), ") + end + end + println("\n\tRecieved basket:") + for (ind, λ) in enumerate(Λ) + if λ > eps() + print("\t $(tokens[ind]): $(round(Int, λ)), ") + end + end + print("\n") +end \ No newline at end of file diff --git a/src/CFMMRouter.jl b/src/CFMMRouter.jl new file mode 100644 index 0000000..b808608 --- /dev/null +++ b/src/CFMMRouter.jl @@ -0,0 +1,13 @@ +module CFMMRouter + +using Documenter +using LinearAlgebra, SparseArrays, StaticArrays +using LBFGSB +using Printf + +include("utils.jl") +include("cfmms.jl") +include("objectives.jl") +include("router.jl") + +end diff --git a/src/cfmms.jl b/src/cfmms.jl new file mode 100644 index 0000000..f7ee216 --- /dev/null +++ b/src/cfmms.jl @@ -0,0 +1,192 @@ +export CFMM, ProductTwoCoin, GeometricMeanTwoCoin +export find_arb! + +abstract type CFMM{T} end + +@def add_generic_fields begin + R::Vector{T} + γ::T + Ai::Vector{Int} # idx vector: jth coin in CFMM is Ai[j] +end + +@def add_two_coin_fields begin + R::Vector{T} + γ::T + Ai::Vector{Int} +end + +Base.length(c::CFMM) = length(c.Ai) + +# This def is for the docstring +@doc raw""" + find_arb!(Δ, Λ, cfmm, v) + +Solves the arbitrage problem for `cfmm` given price vector `v`, +```math +\begin{array}{ll} +\text{minimize} & \nu^T(\Lambda - \Delta) \\ +\text{subject to} & \varphi(R + \gamma\Delta - \Lambda) = \varphi(R) \\ +& \Delta, \Lambda \geq 0. +\end{array} +``` +Overwrites the variables `Δ` and `Λ`. +""" +function find_arb! end + +@doc raw""" + ϕ(c::CFMM) + +Computes the trading function for CFMM `c`. +""" +function ϕ end + +@doc raw""" + ∇ϕ!(x, c::CFMM) + +Computes the gradient of the trading function for CFMM `c`. +The result is stored in `x`. +""" +function ∇ϕ! end + + +# ------------------------------------------------------------------------------ +# | CFMM Definitions | +# ------------------------------------------------------------------------------ +# Each CFMM needs to implement its find_arb! function +struct Product{T} <: CFMM{T} + @add_generic_fields +end + +struct GeometricMean{T} <: CFMM{T} + @add_generic_fields + w::Vector{T} +end + +struct Curve{T} <: CFMM{T} + @add_generic_fields + α::T + β::T +end + +# Two coin specific cases +function two_coin_check_cast(R, γ, idx) + length(R) != 2 && throw(ArgumentError("length of R must be 2 for *TwoCoin constructors")) + length(idx) != 2 && throw(ArgumentError("length of idx must be 2 for *TwoCoin constructors")) + + T = eltype(R) + + if T <: Integer + T = Float64 + end + + γ_T = convert(T, γ) + idx_uint = convert.(UInt, idx) + + return γ_T, idx_uint, T +end + +@doc raw""" + ProductTwoCoin(R, γ, idx) + +Creates a two coin product CFMM with coins `idx[1]` and `idx[2]`, reserves `R`, +and fee `γ`. Specifically, the invariant is +```math +\varphi(R) = R_1R_2. +``` +""" +struct ProductTwoCoin{T} <: CFMM{T} + @add_two_coin_fields + function ProductTwoCoin(R, γ, idx) + γ_T, idx_uint, T = two_coin_check_cast(R, γ, idx) + return new{T}( + MVector{2, T}(R), + γ_T, + MVector{2, UInt}(idx_uint) + ) + end +end + +function ϕ(cfmm::ProductTwoCoin; R=nothing) + R = isnothing(R) ? cfmm.R : R + return R[1] * R[2] +end +function ∇ϕ!(R⁺, cfmm::ProductTwoCoin; R=nothing) + R = isnothing(R) ? cfmm.R : R + R⁺[1] = R[2] + R⁺[2] = R[1] + return nothing +end + +# See App. A of "An Analysis of Uniswap Markets" +@inline prod_arb_δ(m, r, k, γ) = max(sqrt(γ*m*k) - r, 0)/γ +@inline prod_arb_λ(m, r, k, γ) = max(r - sqrt(k/(m*γ)), 0) + +# Solves the maximum arbitrage problem for the two-coin constant product case. +# Assumes that v > 0 and γ > 0. +function find_arb!(Δ::VT, Λ::VT, cfmm::ProductTwoCoin{T}, v::VT) where {T, VT <: AbstractVector{T}} + R, γ = cfmm.R, cfmm.γ + k = R[1]*R[2] + + Δ[1] = prod_arb_δ(v[2]/v[1], R[1], k, γ) + Δ[2] = prod_arb_δ(v[1]/v[2], R[2], k, γ) + + Λ[1] = prod_arb_λ(v[1]/v[2], R[1], k, γ) + Λ[2] = prod_arb_λ(v[2]/v[1], R[2], k, γ) + return nothing +end + +@doc raw""" + GeometricMeanTwoCoin(R, γ, idx, w) + +Creates a two coin geometric mean CFMM with coins `idx[1]` and `idx[2]`, +reserves `R`, fee `γ`, and weights `w` such that `w[1] + w[2] == 1.0`. +Specifically, the invariant is +```math +\varphi(R) = R_1^{w_1}R_2^{w_2}. +``` +""" +struct GeometricMeanTwoCoin{T} <: CFMM{T} + @add_two_coin_fields + w::SVector{2, T} + function GeometricMeanTwoCoin(R, w, γ, idx) + γ_T, idx_uint, T = two_coin_check_cast(R, γ, idx) + + return new{T}( + MVector{2, T}(R), + γ_T, + MVector{2, UInt}(idx_uint), + SVector{2, T}(w), + ) + end +end + +function ϕ(cfmm::GeometricMeanTwoCoin; R=nothing) + R = isnothing(R) ? cfmm.R : R + w = cfmm.w + return R[1]^w[1] * R[2]^w[2] +end +function ∇ϕ!(R⁺, cfmm::GeometricMeanTwoCoin; R=nothing) + R = isnothing(R) ? cfmm.R : R + w = cfmm.w + R⁺[1] = w[1] * (R[2]/R[1])^w[2] + R⁺[2] = w[2] * (R[1]/R[2])^w[1] + return nothing +end + +@inline geom_arb_δ(m, r1, r2, η, γ) = max((γ*m*η*r1*r2^η)^(1/(η+1)) - r2, 0)/γ +@inline geom_arb_λ(m, r1, r2, η, γ) = max(r1 - ((r2*r1^(1/η))/(η*γ*m))^(η/(1+η)), 0) + +# Solves the maximum arbitrage problem for the two-coin geometric mean case. +# Assumes that v > 0 and w > 0. +function find_arb!(Δ::VT, Λ::VT, cfmm::GeometricMeanTwoCoin{T}, v::VT) where {T, VT <: AbstractVector{T}} + R, γ, w = cfmm.R, cfmm.γ, cfmm.w + + η = w[1]/w[2] + + Δ[1] = geom_arb_δ(v[2]/v[1], R[2], R[1], η, γ) + Δ[2] = geom_arb_δ(v[1]/v[2], R[1], R[2], 1/η, γ) + + Λ[1] = geom_arb_λ(v[1]/v[2], R[1], R[2], 1/η, γ) + Λ[2] = geom_arb_λ(v[2]/v[1], R[2], R[1], η, γ) + return nothing +end \ No newline at end of file diff --git a/src/objectives.jl b/src/objectives.jl new file mode 100644 index 0000000..c107440 --- /dev/null +++ b/src/objectives.jl @@ -0,0 +1,129 @@ +export Objective, LinearNonnegative, BasketLiquidation + +abstract type Objective end + + +@doc raw""" + f(obj::Objective, v) + +Evaluates the conjugate of the utility function of `objective` at `v`. +Specifically, +```math + f(\nu) = \sup_\Psi \left(U(\Psi) - \nu^T \Psi \right). +``` +""" +function f end + +@doc raw""" + grad!(g, obj::Objective, v) + +Computes the gradient of [`f(obj, v)`](@ref) at v. +""" +function grad! end + +@doc raw""" + lower_limit(obj) + +Componentwise lower bound on argument `v` for objective [`f`](@ref). +Returns a vector with length `length(v)` (number of tokens). +""" +function lower_limit end + +@doc raw""" + upper_limit(obj) + +Componentwise lower bound on argument `v` for objective [`f`](@ref). +Returns a vector with length `length(v)` (number of tokens). +""" +function upper_limit end + +# ----- Objective definitions below + +@doc raw""" + LinearNonnegative(c) + +Linear objective for the routing problem, +```math + U(\Psi) = c^T\Psi - \mathbf{I}(\Psi \geq 0), +``` +where `c` is a positive price vector. +""" +struct LinearNonnegative{T} <: Objective + c::AbstractVector{T} + function LinearNonnegative(c::Vector{T}) where {T <: AbstractFloat} + all(c .> 0) || throw(ArgumentError("all elements must be strictly positive")) + return new{T}( + c, + ) + end +end +LinearNonnegative(c::Vector{T}) where {T <: Real} = LinearNonnegative(Float64.(c)) + +function f(obj::LinearNonnegative{T}, v) where {T} + if all(obj.c .<= v) + return zero(T) + end + return convert(T, Inf) +end + +function grad!(g, obj::LinearNonnegative{T}, v) where {T} + if all(obj.c .<= v) + g .= zero(T) + else + g .= convert(T, Inf) + end + return nothing +end + +@inline lower_limit(o::LinearNonnegative{T}) where {T} = o.c .+ 1e-8 +@inline upper_limit(o::LinearNonnegative{T}) where {T} = convert(T, Inf) .+ zero(o.c) + + + +@doc raw""" + BasketLiquidation(i, Δin) + +Liquidation objective for the routing problem, +```math + \Psi_i - \mathbf{I}(\Psi_{-i} + Δ^\mathrm{in}_{-i} = 0, ~ \Psi_i \geq 0), +``` +where `i` is the desired output token and `Δin` is the basket of tokens to be liquidated. +""" +struct BasketLiquidation{T} <: Objective + i::Int + Δin::Vector{T} + + function BasketLiquidation(i::Integer, Δin::Vector{T}) where {T <: AbstractFloat} + !(i > 0 && i < length(Δin)) && throw(ArgumentError("Invalid index i")) + return new{T}( + i, + Δin, + ) + end +end +BasketLiquidation(i::Integer, Δin::Vector{T}) where {T <: Real} = BasketLiquidation(i, Float64.(Δin)) + +function f(obj::BasketLiquidation{T}, v) where {T} + if v[obj.i] >= 1.0 + return sum(i->(i == obj.i ? 0.0 : obj.Δin[i]*v[i]), 1:length(v)) + end + return convert(T, Inf) +end + +function grad!(g, obj::BasketLiquidation{T}, v) where {T} + if v[obj.i] >= 1.0 + g .= obj.Δin + g[obj.i] = zero(T) + else + g .= convert(T, Inf) + end + return nothing +end + +@inline function lower_limit(o::BasketLiquidation{T}) where {T} + ret = Vector{T}(undef, length(o.Δin)) + fill!(ret, eps()) + ret[o.i] = one(T) + eps() + return ret +end +@inline upper_limit(o::BasketLiquidation{T}) where {T} = convert(T, Inf) .+ zero(o.Δin) \ No newline at end of file diff --git a/src/router.jl b/src/router.jl new file mode 100644 index 0000000..1fa4524 --- /dev/null +++ b/src/router.jl @@ -0,0 +1,134 @@ +export Router, route! +export netflows!, netflows, update_reserves! + +struct Router{O, T} + objective::O + cfmms::Vector{CFMM{T}} + Δs::Vector{AbstractVector{T}} + Λs::Vector{AbstractVector{T}} + v::Vector{T} +end + +""" + Router(objective, cfmms, n_tokens) + +Constructs a router that finds a set of trades `(router.Δs, router.Λs)` through `cfmms` +which maximizes `objective`. The number of tokens `n_tokens` must be specified. +""" +function Router(objective::O, cfmms::Vector{C}, n_tokens) where {T, O <: Objective, C <: CFMM{T}} + V = Vector{T} + VT = Vector{Vector{typeof(objective).parameters[1]}} + Δs = VT() + Λs = VT() + + for c in cfmms + push!(Δs, zero(c.R)) + push!(Λs, zero(c.R)) + end + + return Router{O, T}( + objective, + cfmms, + Δs, + Λs, + zeros(T, n_tokens) + ) +end +Router(objective, n_tokens) = Router(objective, Vector{CFMM{Float64}}(), n_tokens) + +function find_arb!(r::Router, v) + Threads.@threads for i in 1:length(r.Δs) + find_arb!(r.Δs[i], r.Λs[i], r.cfmms[i], v[r.cfmms[i].Ai]) + end +end + +@doc raw""" + route!(r::Router) + +Solves the routing problem, +```math +\begin{array}{ll} +\text{maximize} & U(\Psi) \\ +\text{subject to} & \Psi = \sum_{i=1}^m A_i(\Lambda_i - \Delta_i) \\ +& \phi_i(R_i + \gamma_i\Delta_i - \Lambda_i) \geq \phi_i(R_i), \quad i = 1, \dots, m \\ +&\Delta_i \geq 0, \quad \Lambda_i \geq 0, \quad i = 1, \dots, m. +\end{array} +``` +Overwrites `r.Δs` and `r.Λs`. +""" +function route!(r::R; v=nothing, verbose=false, m=5) where {R <: Router} + # Optimizer set up + optimizer = L_BFGS_B(length(r.v), 17) + if isnothing(v) + r.v .= ones(length(r.v)) / length(r.v) # We should use the initial marginal price here + else + r.v .= v + end + + bounds = zeros(3, length(r.v)) + bounds[1, :] .= 2 + bounds[2, :] .= lower_limit(r.objective) + bounds[3, :] .= upper_limit(r.objective) + + # Objective function + function fn(v) + if !all(v .== r.v) + find_arb!(r, v) + r.v .= v + end + + acc = 0.0 + + for (Δ, Λ, c) in zip(r.Δs, r.Λs, r.cfmms) + acc += @views dot(Λ, v[c.Ai]) - dot(Δ, v[c.Ai]) + end + + return f(r.objective, v) + acc + end + + # Derivative of objective function + function g!(G, v) + G .= 0 + + if !all(v .== r.v) + find_arb!(r, v) + r.v .= v + end + grad!(G, r.objective, v) + + for (Δ, Λ, c) in zip(r.Δs, r.Λs, r.cfmms) + @views G[c.Ai] .+= Λ .- Δ + end + + end + + find_arb!(r, r.v) + _, v = optimizer(fn, g!, r.v, bounds, m=m, factr=1e1, pgtol=1e-5, iprint=verbose ? 1 : -1, maxfun=15000, maxiter=15000) + r.v .= v + find_arb!(r, v) +end + +# ----- Convenience functions +function netflows!(ψ, r::Router) + fill!(ψ, 0) + + for (Δ, Λ, c) in zip(r.Δs, r.Λs, r.cfmms) + ψ[c.Ai] += Λ - Δ + end + + return nothing +end + +function netflows(r::Router) + ψ = zero(r.v) + netflows!(ψ, r) + return ψ +end + +function update_reserves!(r::Router) + for (Δ, Λ, c) in zip(r.Δs, r.Λs, r.cfmms) + c.R .+= Δ - Λ + end + + return nothing +end \ No newline at end of file diff --git a/src/utils.jl b/src/utils.jl new file mode 100644 index 0000000..9981e00 --- /dev/null +++ b/src/utils.jl @@ -0,0 +1,46 @@ +# Credit: Chris Rackauckas +macro def(name, definition) + return quote + macro $(esc(name))() + esc($(Expr(:quote, definition))) + end + end +end + +# Adapted from +# https://github.com/ZIB-IOL/FrankWolfe.jl/blob/master/src/fw_algorithms.jl +function print_header(data) + @printf( + "\n─────────────────────────────────────────────────────────────────────────────────────────────────\n" + ) + @printf( + "%13s %14s %14s %14s %14s %14s\n", + data[1], + data[2], + data[3], + data[4], + data[5], + data[6] + ) + @printf( + "─────────────────────────────────────────────────────────────────────────────────────────────────\n" + ) +end + +function print_footer() + @printf( + "─────────────────────────────────────────────────────────────────────────────────────────────────\n\n" + ) +end + +function print_iter_func(data) + @printf( + "%13s %14e %14e %14e %14.3e %13.3f\n", + data[1], + Float64(data[2]), + Float64(data[3]), + Float64(data[4]), + data[5], + data[6] + ) +end \ No newline at end of file diff --git a/test/arb.jl b/test/arb.jl new file mode 100644 index 0000000..c201b1e --- /dev/null +++ b/test/arb.jl @@ -0,0 +1,85 @@ +cosangle(u, v) = dot(u, v)/(norm(u)*norm(v)) + +TOL = 1e-4 + +function check_primal_feasibility(r::Router; arb=true) + all_flows = zero(r.v) + + for (Δ, Λ, c) in zip(r.Δs, r.Λs, r.cfmms) + @test all(Δ .>= -TOL) + @test all(Λ .>= -TOL) + @test CFMMRouter.ϕ(c, R=c.R + c.γ*Δ - Λ) >= CFMMRouter.ϕ(c) - sqrt(eps()) + + all_flows[c.Ai] .+= Λ - Δ + end + + @test all(all_flows .== netflows(r)) + + if arb + @test all(all_flows .>= -TOL) + else + @test sum(all_flows .>= -TOL) == 1 + end +end + +function check_dual_feasibility(r::Router) + @test all(r.v .>= CFMMRouter.lower_limit(r.objective) .- TOL) + @test all(r.v .<= CFMMRouter.upper_limit(r.objective) .+ TOL) +end + +function check_opt_conditions_no_fee!(r::Router) + update_reserves!(r) + + for c in r.cfmms + p = zero(c.R) + CFMMRouter.∇ϕ!(p, c) + @test cosangle(p, r.v[c.Ai]) ≈ 1.0 + end +end + +@testset "arbitrage markets" begin + @testset "simple case" begin + equal_pool = ProductTwoCoin([100, 100], 1, [1, 2]) + unequal_small_pool = ProductTwoCoin([1, 2], 1, [1, 2]) + + router = Router( + LinearNonnegative(ones(2)), + [equal_pool, unequal_small_pool], + 2, + ) + append!(router.cfmms, [equal_pool, unequal_small_pool]) + + route!(router) + + check_primal_feasibility(router) + check_dual_feasibility(router) + check_opt_conditions_no_fee!(router) + end + + @testset "random markets, no fee" begin + pools = Vector{CFMM{Float64}}(undef, 100) + Random.seed!(1234) + coins = collect(1:10) + + for i in 1:100 + Ai = sample(coins, 2, replace=false) + pools[i] = ProductTwoCoin( + 1000*rand(2), + 1.0, + Ai + ) + end + + router = Router( + LinearNonnegative(rand(10)), + pools, + 10 + ) + + route!(router) + + check_primal_feasibility(router) + check_dual_feasibility(router) + check_opt_conditions_no_fee!(router) + end +end \ No newline at end of file diff --git a/test/cfmms.jl b/test/cfmms.jl new file mode 100644 index 0000000..9b18b12 --- /dev/null +++ b/test/cfmms.jl @@ -0,0 +1,75 @@ +init_opt_cache(R) = (R⁺=similar(R), ∇ϕR = similar(R)) + +function optimality_conditions_met(c, Δ, Λ, cfmm; cache=nothing) + R, γ = cfmm.R, cfmm.γ + if isnothing(cache) + cache = init_opt_cache(R) + end + R⁺ = cache.R⁺ + ∇ϕR = cache.∇ϕR + n = length(c) + + # Primal feasibility + R⁺ = R + γ * Δ - Λ + pfeas = all(Δ .≥ 0) && all(Λ .≥ 0) + ϕR = CR.ϕ(cfmm) + ϕR⁺ = CR.ϕ(cfmm; R=R⁺) + CR.∇ϕ!(∇ϕR, cfmm; R=R⁺) + cfmm_sat = ≈(ϕR, ϕR⁺) && ϕR⁺ ≥ ϕR - sqrt(eps()) + + opt = maximum(i -> γ * ∇ϕR[i] / c[i], 1:n) ≤ minimum(i -> ∇ϕR[i] / c[i], 1:n) + sqrt(eps()) + return pfeas && cfmm_sat && opt +end +@testset "CFMMs" begin +@testset "arbitrage checks: two coins" begin + Δ = MVector{2, Float64}(undef) + Λ = MVector{2, Float64}(undef) + + n = 3 + Random.seed!(1234) + γs = [rand() for i in 1:n] + Rs = [rand(2)*10 for i in 1:n] + νs = [@MVector rand(2) for i in 1:n] + cache = init_opt_cache(Rs[1]) + + @testset "product" begin + equal_pool = ProductTwoCoin([1, 1], 1, [1, 2]) + + # No arb in the fee-less case + v = MVector(1.0, 1.0) + find_arb!(Δ, Λ, equal_pool, v) + @test iszero(Δ) && iszero(Λ) + + v .*= 2 + find_arb!(Δ, Λ, equal_pool, v) + @test iszero(Δ) && iszero(Λ) + + # Easy arb in the fee-less case + v[2] = 1 + find_arb!(Δ, Λ, equal_pool, v) + @test Δ[1] ≈ 0 && Δ[2] ≈ sqrt(2) - 1 + @test Λ[1] ≈ 1 - sqrt(1/2) && Λ[2] ≈ 0 + + # No-arb in the fee case + @test length(ProductTwoCoin([1, 1], .9, [1, 2])) == 2 + @test_throws ArgumentError ProductTwoCoin([1, 1], .9, [1]) + + for R in Rs, γ in γs, ν in νs + cfmm = ProductTwoCoin(R, γ, [1, 2]) + find_arb!(Δ, Λ, cfmm, ν) + @test optimality_conditions_met(ν, Δ, Λ, cfmm; cache=cache) + end + + end + + @testset "geo mean" begin + ws = [(w1=rand(); [w1; 1-w1]) for _ in 1:n] + for R in Rs, γ in γs, ν in νs, w in ws + cfmm = GeometricMeanTwoCoin(R, w, γ, [1, 2]) + find_arb!(Δ, Λ, cfmm, ν) + @test optimality_conditions_met(ν, Δ, Λ, cfmm; cache=cache) + end + end +end + +end \ No newline at end of file diff --git a/test/objectives.jl b/test/objectives.jl new file mode 100644 index 0000000..b447d88 --- /dev/null +++ b/test/objectives.jl @@ -0,0 +1,35 @@ +@testset "Objectives" begin + +@testset "LinearNonnegative" begin + @test_throws ArgumentError LinearNonnegative(-ones(2)) + int_obj = LinearNonnegative([1, 1]) + @test int_obj.c isa Vector{Float64} + obj = LinearNonnegative(ones(2)) + + @test iszero(CR.f(obj, 2*ones(2))) + @test isinf(CR.f(obj, 0.5*ones(2))) + + x = ones(2) + CR.grad!(x, obj, 2*ones(2)) + @test iszero(x) + CR.grad!(x, obj, 0.5*ones(2)) + @test all(isinf.(x)) +end + +@testset "BasketLiquidation" begin + @test_throws ArgumentError BasketLiquidation(0, [0.0, 1.0]) + obj = BasketLiquidation(1, [0, 1]) + @test obj.Δin isa Vector{Float64} + + @test CR.f(obj, [2, 3]) == 3 + @test isinf(CR.f(obj, 0.5*ones(2))) + + x = ones(2) + CR.grad!(x, obj, 2*ones(2)) + @test iszero(x - [0, 1]) + CR.grad!(x, obj, 0.5*ones(2)) + @test all(isinf.(x)) + +end + +end \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl new file mode 100644 index 0000000..14587f1 --- /dev/null +++ b/test/runtests.jl @@ -0,0 +1,12 @@ +using CFMMRouter +using Test + +using LinearAlgebra, Random +using StatsBase +using StaticArrays +const CR = CFMMRouter + +include("objectives.jl") +include("cfmms.jl") +include("arb.jl") +include("swap.jl") \ No newline at end of file diff --git a/test/swap.jl b/test/swap.jl new file mode 100644 index 0000000..7e9b63d --- /dev/null +++ b/test/swap.jl @@ -0,0 +1,47 @@ +@testset "swap markets" begin + @testset "simple case" begin + equal_pool = ProductTwoCoin([100, 100], 1, [1, 2]) + unequal_small_pool = ProductTwoCoin([1, 2], 1, [1, 2]) + Δin = [5.0, 0.0] + + router = Router( + BasketLiquidation(1, Δin), + [equal_pool, unequal_small_pool], + 2, + ) + + route!(router) + + check_primal_feasibility(router) + check_dual_feasibility(router) + check_opt_conditions_no_fee!(router) + end + + @testset "random markets, no fee" begin + pools = Vector{CFMM{Float64}}(undef, 100) + Random.seed!(1234) + coins = collect(1:10) + + for i in 1:100 + Ai = sample(coins, 2, replace=false) + pools[i] = ProductTwoCoin( + 1000*rand(2), + 1.0, + Ai + ) + end + + Δin = vcat([0.0], 100*rand(9)) + router = Router( + BasketLiquidation(1, Δin), + pools, + 10 + ) + + route!(router) + + check_primal_feasibility(router; arb=false) + check_dual_feasibility(router) + check_opt_conditions_no_fee!(router) + end +end \ No newline at end of file