default_kappa= 2 default_exit_tax = .02 #value function for a given state (R,S) def invariant(R,S,kappa=default_kappa): return (S**kappa)/R #given a value function (parameterized by kappa) #and an invariant coeficient V0 #return Supply S as a function of reserve R def reserve(S, V0, kappa=default_kappa): return (S**kappa)/V0 #given a value function (parameterized by kappa) #and an invariant coeficient V0 #return Supply S as a function of reserve R def supply(R, V0, kappa=default_kappa): return (V0*R)**(1/kappa) #given a value function (parameterized by kappa) #and an invariant coeficient V0 #return a spot price P as a function of reserve R def spot_price(R, V0, kappa=default_kappa): return kappa*R**((kappa-1)/kappa)/V0**(1/kappa) #for a given state (R,S) #given a value function (parameterized by kappa) #and an invariant coeficient V0 #deposit deltaR to Mint deltaS #with realized price deltaR/deltaS def mint(deltaR, R,S, V0, kappa=default_kappa): deltaS = (V0*(R+deltaR))**(1/kappa)-S realized_price = deltaR/deltaS return deltaS, realized_price #for a given state (R,S) #given a value function (parameterized by kappa) #and an invariant coeficient V0 #burn deltaS to Withdraw deltaR #with realized price deltaR/deltaS def withdraw(deltaS, R,S, V0, kappa=default_kappa): deltaR = R-((S-deltaS)**kappa)/V0 realized_price = deltaR/deltaS return deltaR, realized_price def withdraw_with_tax(deltaS, R,S, V0, exit_tax = default_exit_tax, kappa=default_kappa): deltaR = R-((S-deltaS)**kappa)/V0 quantity_taxed = exit_tax*deltaR quantity_recieved = (1-exit_tax)*deltaR realized_price = quantity_recieved/deltaS return quantity_recieved, quantity_taxed, realized_price