orderspec refactor for server and web

This commit is contained in:
Tim Olson
2023-12-07 18:37:11 -04:00
parent 545583586c
commit 83619ea248
12 changed files with 306 additions and 110 deletions

View File

@@ -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)
}

View File

@@ -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])

View File

@@ -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,
}
}

View File

@@ -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
}
}

View File

@@ -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 ) {