From 83619ea248e8bf5a2b665a454ff0577dbbdbc0c6 Mon Sep 17 00:00:00 2001 From: Tim Olson <> Date: Thu, 7 Dec 2023 18:37:11 -0400 Subject: [PATCH] orderspec refactor for server and web --- src/blockchain/common.js | 4 +- src/blockchain/contract.js | 2 +- src/blockchain/orderlib.js | 87 ++++++++++++++-- src/blockchain/token.js | 71 ++++++++----- src/blockchain/wallet.js | 3 + src/components/Orders.vue | 176 ++++++++++++++++++++++----------- src/components/TokenAmount.vue | 27 +++++ src/components/TokenRow.vue | 1 - src/components/Vault.vue | 2 - src/misc.js | 18 ++++ src/socket.js | 8 +- src/store/store.js | 17 ++-- 12 files changed, 306 insertions(+), 110 deletions(-) create mode 100644 src/components/TokenAmount.vue diff --git a/src/blockchain/common.js b/src/blockchain/common.js index f66ae7a..6ff620f 100644 --- a/src/blockchain/common.js +++ b/src/blockchain/common.js @@ -1,5 +1,5 @@ export function applyFills( orderStatus, filled ) { - // console.log('apply fills', orderStatus, filled) + console.log('apply fills', orderStatus, filled) orderStatus[4] = filled[0][0] orderStatus[5] = filled[0][1] for( const i in filled[1] ) { @@ -7,7 +7,7 @@ export function applyFills( orderStatus, filled ) { orderStatus[6][i] = filledIn orderStatus[7][i] = filledOut } - // console.log('applied fills', orderStatus) + console.log('applied fills', orderStatus) } diff --git a/src/blockchain/contract.js b/src/blockchain/contract.js index f9c8239..c2f9356 100644 --- a/src/blockchain/contract.js +++ b/src/blockchain/contract.js @@ -5,7 +5,7 @@ import {useStore} from "@/store/store.js"; export function vaultAddress( owner, num=0) { const s = useStore() - // console.log('vaultAddress', owner, s.factory, s.vaultInitCodeHash) + console.log('vaultAddress', owner, s.factory, s.vaultInitCodeHash) if( !owner ) return null const salt = ethers.solidityPackedKeccak256(['address','uint8'],[owner,num]) diff --git a/src/blockchain/orderlib.js b/src/blockchain/orderlib.js index c61d991..0773b4e 100644 --- a/src/blockchain/orderlib.js +++ b/src/blockchain/orderlib.js @@ -86,16 +86,91 @@ export function newTranche({ } } -// enum Exchange { -// UniswapV2, -// UniswapV3 -// } export const Exchange = { UniswapV2: 0, UniswapV3: 1, } -export function sqrtX96(value) { - return BigInt(Math.round(Math.sqrt(value * 2 ** (96*2)))) +export const OrderState = { + Signing: -1, + Unknown: 0, + Open: 1, + Canceled: 2, + Filled: 3, + Expired: 4, + Underfunded: 5, } +export function parseOrderStatus(status) { + let [ + order, + state, + start, + ocoGroup, + filledIn, + filledOut, + trancheFilledIn, + trancheFilledOut, + ] = status + order = parseOrder(order) + filledIn = BigInt(filledIn) + filledOut = BigInt(filledOut) + trancheFilledIn = trancheFilledIn.map((f)=>BigInt(f)) + trancheFilledOut = trancheFilledOut.map((f)=>BigInt(f)) + return { + order, state, start, ocoGroup, filledIn, filledOut, trancheFilledIn, trancheFilledOut, + } +} + + +export function parseOrder(order) { + let [ + tokenIn, + tokenOut, + route, + amount, + minFillAmount, + amountIsInput, + outputDirectlyToOwner, + chainOrder, + tranches, + ] = order + route = parseRoute(route) + amount = BigInt(amount) + minFillAmount = BigInt(minFillAmount) + tranches = tranches.map(parseTranche) + return { + tokenIn, tokenOut, route, amount, minFillAmount, amountIsInput, outputDirectlyToOwner, chainOrder, tranches + } +} + +export function parseRoute(route) { + let [exchange, fee] = route + return {exchange, fee} // todo enum? +} + +export function parseTranche(tranche) { + let [ + fraction, + startTimeIsRelative, + endTimeIsRelative, + minIsBarrier, + maxIsBarrier, + marketOrder, + _reserved5, + _reserved6, + _reserved7, + _reserved8, + _reserved16, + startTime, + endTime, + minIntercept, + minSlope, + maxIntercept, + maxSlope, + ] = tranche + return { + fraction, startTimeIsRelative, endTimeIsRelative, minIsBarrier, maxIsBarrier, marketOrder, + startTime, endTime, minIntercept, minSlope, maxIntercept, maxSlope, + } +} diff --git a/src/blockchain/token.js b/src/blockchain/token.js index 28accd3..852f194 100644 --- a/src/blockchain/token.js +++ b/src/blockchain/token.js @@ -6,6 +6,10 @@ import {ethers} from "ethers"; // synchronous version may return null but will trigger a lookup export function token(addr) { + if( !addr ) { + // console.log('ignoring call to token', addr) + return null + } const s = useStore() if( !(addr in s.tokens) ) { getToken(addr) @@ -23,35 +27,48 @@ export async function getToken(addr) { return s.tokens[addr] } + +const _inFlightLookups = {} + export async function addExtraToken(addr) { - const prom = new Promise((resolve) => { - const s = useStore() - const chainId = s.chainId - console.log('querying token', addr) - socket.emit('lookupToken', chainId, addr, (info) => { - console.log('server token info', info) - if (info !== null) { - s.addToken(chainId, info) - resolve(info) - } - else { - if( s.provider===null ) { - console.log('warning: token lookup cancelled due to null provider', addr) - resolve(null) - return - } - const token = new ethers.Contract(addr, erc20Abi, s.provider) - Promise.all( [token.symbol(), token.decimals()] ).then((symbol,decimals)=>{ - info = { - address: addr, - symbol: symbol, - decimals: decimals, - } + if( !addr ) { + console.log('ignoring call to add extra token', addr) + return + } + if( !_inFlightLookups[addr] ) { + _inFlightLookups[addr] = true + const prom = new Promise((resolve) => { + const s = useStore() + const chainId = s.chainId + console.log('querying token', addr) + socket.emit('lookupToken', chainId, addr, (info) => { + console.log('server token info', addr, info) + if (info !== null) { s.addToken(chainId, info) resolve(info) - }) - } + } + else { + if( s.provider===null ) { + console.log('warning: token lookup cancelled due to null provider', addr) + resolve(null) + } + else { + const token = new ethers.Contract(addr, erc20Abi, s.provider) + Promise.all( [token.symbol(), token.decimals()] ).then((symbol,decimals)=>{ + info = { + address: addr, + symbol: symbol, + decimals: decimals, + } + s.addToken(chainId, info) + resolve(info) + }) + } + } + }) }) - }) - return await prom + const result = await prom + delete _inFlightLookups[addr] + return result + } } diff --git a/src/blockchain/wallet.js b/src/blockchain/wallet.js index bffe88d..b4ac249 100644 --- a/src/blockchain/wallet.js +++ b/src/blockchain/wallet.js @@ -96,6 +96,7 @@ let pendingOrders = [] function discoverVaults(owner) { const s = useStore() + console.log('discoverVaults', owner) if( owner === null ) s.vaults = [] else @@ -112,6 +113,7 @@ function discoverVaults(owner) { } async function _discoverVaults(owner) { + console.log('_discoverVaults',owner) const result = [] // todo multi-vault scan const num = 0 @@ -174,6 +176,7 @@ export async function pendOrder(order) { export async function cancelOrder(vault, orderIndex) { + console.log('cancel order', vault, orderIndex) pendTransaction(async (signer)=> { const contract = contractOrNull(vault, vaultAbi, signer) if( contract === null ) { diff --git a/src/components/Orders.vue b/src/components/Orders.vue index e7b5ddf..da0ab0a 100644 --- a/src/components/Orders.vue +++ b/src/components/Orders.vue @@ -2,11 +2,9 @@ - # - Buy - Sell - Pair - Amount + Date + Input + Output Remaining Filled Avg Price @@ -15,33 +13,32 @@ - - {{parseInt(index)+1}} - {{tokenSymbol(inTokenAddr)}} - {{tokenSymbol(outTokenAddr)}} - Buy {{tokenSymbol(inTokenAddr)}}
Sell {{tokenSymbol(outTokenAddr)}} - {{tokenAmount(amountTokenAddr, amount)}} - {{tokenAmount(amountTokenAddr, amount-filled)}} - {{tokenAmount(amountTokenAddr, filled)}} - - {{pairPrice(inTokenAddr, outTokenAddr, vaultAddr, index, avgPrice)}} - + {{st.start}} + + + + + + {{pairPrice(st.order.tokenIn, st.order.tokenOut, vaultAddr, st.index, st.avg)}} + - {{pair(inTokenAddr, outTokenAddr, vaultAddr,index)}} + @click="inverted[[vaultAddr,st.index]] = !inverted[[vaultAddr,st.index]]"> + {{pair(st.order.tokenIn, st.order.tokenOut, vaultAddr, st.index)}} - Signing - Open - Cancel - - Canceled - Completed - Expired + Signing + Open + Cancel + + Canceled + Completed + Expired + Underfunded - Cancel + Cancel @@ -51,10 +48,13 @@ + + diff --git a/src/components/TokenRow.vue b/src/components/TokenRow.vue index 1ab16a2..c585127 100644 --- a/src/components/TokenRow.vue +++ b/src/components/TokenRow.vue @@ -36,7 +36,6 @@ const fixed = computed(() => FixedNumber.fromValue(props.amount, token.decimals, decimals: token.decimals })) const imageSrc = computed(() => token.image) -const withdrawing = ref(false)