From 33aadd333edb381efdc19eec490482c8bf92d991 Mon Sep 17 00:00:00 2001 From: tim Date: Fri, 24 Oct 2025 01:17:40 -0400 Subject: [PATCH] pool_design.py --- research/pool_design.py | 67 ++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/research/pool_design.py b/research/pool_design.py index c470f80..22a01e2 100644 --- a/research/pool_design.py +++ b/research/pool_design.py @@ -8,6 +8,18 @@ import numpy as np log = logging.getLogger(__name__) +UNISWAP_GAS=115_000 +LMSR_GAS=119_000 +ETH_PRICE=4500 +UNISWAP_GAS_COST=UNISWAP_GAS*ETH_PRICE/1e9 +LMSR_GAS_COST=LMSR_GAS*ETH_PRICE/1e9 + +LMSR_FEE = 0.000010 + +print(f' LMSR gas: ${LMSR_GAS_COST:.2}') +print(f'Uniswap gas: ${UNISWAP_GAS_COST:.2}') + + def lmsr_swap_amount_out( balances, amount_in, @@ -127,36 +139,63 @@ def lmsr_swap_amount_out( return float(amount_out) -def main(): - balance0 = 1_000_000 # estimated from the production pool +def compare(): + kappa = 10 + balance0 = 10_000_000 # estimated from the production pool balances = [balance0, balance0] X = np.geomspace(1, 10_000_000, 100) - Y = [1 - - lmsr_swap_amount_out(balances, float(amount_in), 0, 1, 0.000010, 0.8) - / amount_in + Y = [max(0, 1 - + (lmsr_swap_amount_out(balances, float(amount_in), 0, 1, LMSR_FEE, kappa) - LMSR_GAS_COST) + / amount_in) for amount_in in X] - plt.plot(X / balance0, Y, label='LMSR') + plt.plot(X, Y, label=f'LMSR {kappa:.2f}') d = pd.read_csv('swap_results_block_23640998.csv') d.columns = ['block', 'price0', 'price1', 'in0', 'out0', 'in1', 'out1'] - uniswap_slippage = 1 - d.out0 / d.in0 / d.iloc[0].price0 - plt.plot(d.in0 / balance0, uniswap_slippage, label='CP') + uniswap_slippage0 = 1 - (d.out0 - UNISWAP_GAS_COST) / d.in0 / d.iloc[0].price0 + plt.plot(d.in0, uniswap_slippage0, label='CP0') + # uniswap_slippage1 = 1 - (d.out1 - UNISWAP_GAS_COST) / d.in1 / d.iloc[0].price1 + # plt.plot(d.in1, uniswap_slippage1, label='CP1') # Interpolate Uniswap slippage to match LMSR x-coordinates - interp_uniswap = np.interp(X / balance0, d.in0 / balance0, uniswap_slippage) + interp_uniswap = np.interp(X, d.in0, uniswap_slippage0) mask = Y < interp_uniswap - plt.fill_between(X / balance0, 0, 1, where=mask, alpha=0.2, color='green') + plt.fill_between(X, 0, 1, where=mask, alpha=0.2, color='green') plt.xscale('log') plt.yscale('log') - plt.gca().xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: '{:.2f}'.format(10000*x))) - plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.2f}%'.format(y))) - plt.xlabel('Input Amount (basis points of initial balance)') + plt.gca().xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: '{:g}'.format(x))) + plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.2%}'.format(y))) + plt.xlabel('Input Amount') plt.ylabel('Slippage') plt.title('Pool Slippages') plt.grid(True) plt.legend() plt.show() + +def plot_kappa(): + X = np.geomspace(1, 10_000_000, 100) + for kappa in np.geomspace(0.01, 100, 8): + balance0 = 1_000_000 # estimated from the production pool + balances = [balance0, balance0] + Y = [1 - + lmsr_swap_amount_out(balances, float(amount_in), 0, 1, 0.000010, kappa) + / amount_in + for amount_in in X] + plt.plot(X / balance0, Y, label=f'{kappa:f}') + plt.xscale('log') + plt.yscale('log') + plt.gca().xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: '{:.2f}'.format(10000*x))) + plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.2%}'.format(y))) + plt.xlabel('Input Amount (basis points of initial balance)') + plt.ylabel('Slippage') + plt.title('Pool Slippages by Kappa') + plt.grid(True) + plt.legend() + plt.show() + + if __name__ == '__main__': - main() + compare() + # plot_kappa()