CFMMRouter.jl

Convex optimization for fun and profit. (Now in Julia!)
Popularity
312 Stars
Updated Last
4 Months Ago
Started In
December 2021

CFMMRouter

Dev Build Status codecov

Overview

This package contains a fast solver for the CFMM Routing problem. We partially decompose the problem to enable fast solutions when the number of CFMMs is large relative to the number of tokens. We describe our algorithm in detail in our paper, An Efficient Algorithm for Optimal Routing Through Constant Function Market Makers.

For more information, also check out the documentation.

Quick Start

First, add the package locally.

using Pkg; Pkg.add("CFMMRouter")

Make some swap pools.

using LinearAlgebra
using CFMMRouter

equal_pool = ProductTwoCoin([1e6, 1e6], 1, [1, 2])
unequal_small_pool = ProductTwoCoin([1e3, 2e3], 1, [1, 2])
prices = ones(2)

Build a Router & route.

router = Router(
    LinearNonnegative(prices),
    [equal_pool, unequal_small_pool],
    2,
)
route!(router)

Check out the results.

Ψ = 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. These tests were run on a MacBook Pro with a 2.3GHz 8-Core Intel i9 processor. Several performance improvements are possible. alt text

Citing

@article{diamandis2023efficient,
  title={An Efficient Algorithm for Optimal Routing Through Constant Function Market Makers},
  author={Diamandis, Theo and Resnick, Max and Chitra, Tarun and Angeris, Guillermo},
  journal={arXiv preprint arXiv:2302.04938},
  year={2023}
}

References

Used By Packages

No packages found.