price constraints working

This commit is contained in:
Tim Olson
2023-11-05 16:50:06 -04:00
parent b483974268
commit bec1b33d22
13 changed files with 195 additions and 67 deletions

View File

@@ -2,35 +2,40 @@ import {socket} from "@/socket.js";
import {useStore} from "@/store/store.js";
import {Exchange} from "@/blockchain/orderlib.js";
import {uniswapV3PoolAddress} from "@/blockchain/uniswap.js";
import {ethers, FixedNumber} from "ethers";
import {erc20Abi, uniswapV3PoolAbi} from "@/blockchain/abi.js";
import {ethers} from "ethers";
import {uniswapV3PoolAbi} from "@/blockchain/abi.js";
const subs = {} // key is route and value is a subscription counter
const subscriptionCounts = {} // key is route and value is a subscription counter
export function subPrices( routes ) {
if( !routes.length )
return
const subRoutes = []
let chainId = null
for( const route of routes ) {
if( !(route in subRoutes) || subRoutes[route] === 0 ) {
subRoutes[route] = 1
console.log('sub route', route, subscriptionCounts)
if( !(route in subscriptionCounts) || subscriptionCounts[route] === 0 ) {
subscriptionCounts[route] = 1
console.log('subscribing to pool', route.pool)
subRoutes.push(route)
}
else {
subRoutes[route]++
if( chainId !== null && route.chainId !== chainId )
throw Error('cannot mix chainIds in a subscription list')
chainId = route.chainId
subscriptionCounts[route]++
}
if( chainId !== null && route.chainId !== chainId )
throw Error('cannot mix chainIds in a subscription list')
chainId = route.chainId
}
if( subRoutes.length ) {
socket.emit('subPools', chainId, routes.map((r)=>r.address) )
socket.emit('subPools', chainId, routes.map((r)=>r.pool) )
// perform a local query if necessary
for( const route of subRoutes ) {
const s = useStore()
if( !(route.address in s.poolPrices) ) {
getPriceForRoute(route).then((price)=>s.poolPrices[route.address]=price)
console.log('route in prices?', route.pool in s.poolPrices, route.pool, s.poolPrices)
if( !(route.pool in s.poolPrices) ) {
console.log('querying initial route price', route.pool)
getPriceForRoute(route).then((price)=>s.poolPrices[route.pool]=price)
}
}
}
@@ -40,21 +45,22 @@ export function unsubPrices( routes ) {
let chainId = null
const unsubAddrs = []
for( const route of routes ) {
if( !(route in subs) ) {
console.log('unsub route', route, subscriptionCounts)
if( !(route in subscriptionCounts) ) {
console.error('unsubscribed to a nonexistent route', route)
}
else {
subs[route]--
if( subs[route] === 0 ) {
subscriptionCounts[route]--
if( subscriptionCounts[route] === 0 ) {
unsubAddrs.push(route.pool)
if( chainId !== null && route.chainId !== chainId )
throw Error('cannot mix chainIds in a subscription list')
console.log('unsubscribing from pool', route.pool)
chainId = route.chainId
}
else if( subs[route] < 0 ) {
else if( subscriptionCounts[route] < 0 ) {
console.error('unsubscribed to an already unsubbed route', route)
subs[route] = 0 // fix
subscriptionCounts[route] = 0 // fix
}
}
}
@@ -67,7 +73,8 @@ async function getPriceForRoute(route) {
console.log('route is',route)
if( route.exchange === Exchange.UniswapV3 ) {
const addr = uniswapV3PoolAddress(route.chainId, route.token0.address, route.token1.address, route.fee)
const provider = useStore().provider;
const store = useStore();
const provider = store.provider;
if( provider === null ) {
console.error('provider was null during getPriceForRoute')
return null
@@ -78,6 +85,8 @@ async function getPriceForRoute(route) {
const spn = Number(sqrtPrice)
const price = spn*spn/2**(96*2) * 10**(route.token0.decimals-route.token1.decimals)
console.log(`price for ${route.token0.symbol}/${route.token1.symbol}`,price)
store.poolPrices[addr] = price
return price
}
else
throw Error(`Unsupported exchange ${route.exchange}`)