60 lines
2.1 KiB
JavaScript
60 lines
2.1 KiB
JavaScript
import {Exchange} from "@/blockchain/orderlib.js";
|
|
import {useOrderStore, useStore} from "@/store/store.js";
|
|
import {queryHelperContract} from "@/blockchain/contract.js";
|
|
import {SingletonCoroutine} from "@/misc.js";
|
|
import {provider} from "@/blockchain/wallet.js";
|
|
|
|
|
|
export async function findRoute(helper, chainId, tokenA, tokenB) {
|
|
console.log('getting raw routes', helper, tokenA.a, tokenB.a)
|
|
const rawRoutes = await helper.getRoutes(tokenA.a, tokenB.a)
|
|
// todo expose all available pools
|
|
console.log('raw routes', rawRoutes)
|
|
let result = null // we actually only find a single pool for now
|
|
for (let [exchange, fee, pool] of rawRoutes) {
|
|
exchange = Number(exchange)
|
|
fee = Number(fee)
|
|
if (!result || result.fee > fee) {
|
|
switch (exchange) {
|
|
case 0: // UniswapV2
|
|
throw Error('Uniswap V2 not yet supported')
|
|
case 1: // UniswapV3
|
|
const inverted = tokenA.a < tokenB.a;
|
|
const [token0, token1] = inverted ? [tokenA, tokenB] : [tokenB, tokenA]
|
|
result = {chainId, exchange: Exchange.UniswapV3, pool, fee, token0, token1, inverted}
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return result ? [result] : []
|
|
}
|
|
|
|
async function componentFindRoute() {
|
|
const s = useStore()
|
|
const os = useOrderStore()
|
|
const tokenA = os.tokenA
|
|
const tokenB = os.tokenB
|
|
os.routes = []
|
|
if (!tokenA || !tokenB)
|
|
return
|
|
console.log('finding route', s.chainId, tokenA, tokenB)
|
|
os.routesPending = true
|
|
try {
|
|
console.log('getting query helper')
|
|
const helper = await queryHelperContract(s.helper, provider)
|
|
if (!helper) {
|
|
console.log('no helper')
|
|
} else {
|
|
const result = await findRoute(helper, s.chainId, tokenA, tokenB)
|
|
console.log('found route', result)
|
|
os.routes = result
|
|
}
|
|
} catch (e) {
|
|
// console.log('ignoring routes exception', e)
|
|
} finally {
|
|
os.routesPending = false
|
|
}
|
|
}
|
|
|
|
export const routeFinder = new SingletonCoroutine(componentFindRoute, 10)
|