vault fixes; order total fill reactivity fix; provider fix

This commit is contained in:
Tim
2024-04-11 15:07:02 -04:00
parent 6d9cd4c748
commit b0daa446b3
8 changed files with 60 additions and 42 deletions

View File

@@ -117,7 +117,7 @@ export function isOpen(state) {
return state >= 1 && state < 3 return state >= 1 && state < 3
} }
export function parseOrderStatus(status) { export function parseOrderStatus(chainId, status) {
let [ let [
order, order,
fillFeeBP, fillFeeBP,
@@ -135,7 +135,7 @@ export function parseOrderStatus(status) {
trancheFilledIn = trancheFilledIn.map((f)=>BigInt(f)) trancheFilledIn = trancheFilledIn.map((f)=>BigInt(f))
trancheFilledOut = trancheFilledOut.map((f)=>BigInt(f)) trancheFilledOut = trancheFilledOut.map((f)=>BigInt(f))
return { return {
order, fillFeeBP, state, start, ocoGroup, filledIn, filledOut, trancheFilledIn, trancheFilledOut, chainId, order, fillFeeBP, state, start, ocoGroup, filledIn, filledOut, trancheFilledIn, trancheFilledOut,
} }
} }

View File

@@ -6,8 +6,7 @@ import {vaultAbi} from "@/blockchain/abi.js";
import {SingletonCoroutine, uuid} from "@/misc.js"; import {SingletonCoroutine, uuid} from "@/misc.js";
import {defineStore} from "pinia"; import {defineStore} from "pinia";
import {ref} from "vue"; import {ref} from "vue";
import {metadata, metadataMap} from "@/version.js"; import {metadataMap} from "@/version.js";
import {OrderState} from "@/blockchain/orderlib.js";
export const useWalletStore = defineStore('wallet', ()=>{ export const useWalletStore = defineStore('wallet', ()=>{
@@ -36,13 +35,16 @@ export function onChainChanged(chainId) {
const store = useStore() const store = useStore()
const ws = useWalletStore() const ws = useWalletStore()
if( chainId !== ws.chainId ) { if( chainId !== ws.chainId ) {
console.log('chain changed', chainId) console.log('wallet chain changed', chainId)
ws.chainId = chainId ws.chainId = chainId
if (chainId.toString() in metadataMap) { if (chainId.toString() in metadataMap) {
console.log('app chain changed', chainId) console.log('app chain changed', chainId)
store.chainId = chainId store.chainId = chainId
store.account = null store.account = null
} }
else {
console.log('app chain NOT changed')
}
} }
} }
@@ -124,7 +126,7 @@ const errorHandlingProxy = {
export async function connectProvider(chainId) { export async function connectProvider(chainId) {
console.log('connecting provider to chainId', chainId) console.log('connectProvider', chainId)
try { try {
return new ethers.BrowserProvider(window.ethereum, chainId) return new ethers.BrowserProvider(window.ethereum, chainId)
} }
@@ -143,6 +145,7 @@ export async function connectWallet(chainId) {
const p = await connectProvider(chainId) const p = await connectProvider(chainId)
if (p!==null) { if (p!==null) {
try { try {
console.log('getSigner')
return await p.getSigner(); return await p.getSigner();
} }
catch (e) { catch (e) {
@@ -195,7 +198,12 @@ async function _discoverVaults(owner) {
s.vaults = [] s.vaults = []
return return
} }
const vault = new ethers.Contract(addr, vaultAbi, s.provider) const provider = s.provider;
if (!provider) {
console.log('No provider')
return // do not change whatever was already found
}
const vault = new ethers.Contract(addr, vaultAbi, provider)
let version = -1 let version = -1
try { try {
version = await vault.version(); version = await vault.version();
@@ -211,6 +219,7 @@ async function _discoverVaults(owner) {
console.log(`no vault ${num} at ${addr}`) console.log(`no vault ${num} at ${addr}`)
else else
console.error(`discoverVaults failed`, e) console.error(`discoverVaults failed`, e)
return // do not change what was already found todo is this correct?
} }
if( s.account === owner ) { // double-check the account since it could have changed during our await if( s.account === owner ) { // double-check the account since it could have changed during our await
s.vaults = result s.vaults = result

View File

@@ -28,6 +28,8 @@ import Btn from "@/components/Btn.vue";
import {socket} from "@/socket.js"; import {socket} from "@/socket.js";
import {metadata} from "@/version.js"; import {metadata} from "@/version.js";
const DISABLED_DURATION = 60_000;
const props = defineProps({ const props = defineProps({
text: {default:'GIB!'}, text: {default:'GIB!'},
}) })
@@ -78,7 +80,7 @@ function gib() {
if (Object.keys(tokenAmounts).length>0) { if (Object.keys(tokenAmounts).length>0) {
disabled.value = true disabled.value = true
socket.emit('gib', s.chainId, s.account, s.vault, tokenAmounts ) socket.emit('gib', s.chainId, s.account, s.vault, tokenAmounts )
setTimeout(()=>disabled.value=false, 60_000) setTimeout(()=>disabled.value=false, DISABLED_DURATION)
} }
} }
} }

View File

@@ -14,20 +14,15 @@ let lastValue = props.touch
function pulse() { function pulse() {
if (props.touch === lastValue) return if (props.touch === lastValue) return
console.log(`value changed from ${lastValue} to ${props.touch}`)
lastValue = props.touch lastValue = props.touch
const e = element.value; const e = element.value;
console.log('element', e)
if (!e.classList.contains('pulse')) { if (!e.classList.contains('pulse')) {
// add class for the first time // add class for the first time
console.log('first pulse')
e.classList.add('pulse') e.classList.add('pulse')
} }
else { else {
// restart // restart
console.log('reset pulse')
e.getAnimations().forEach((a) => { e.getAnimations().forEach((a) => {
console.log('animation', a)
a.cancel(); a.cancel();
a.play(); a.play();
}) })

View File

@@ -4,29 +4,37 @@
item-selectable="selectable" :show-select="false" :show-expand="true"> item-selectable="selectable" :show-select="false" :show-expand="true">
<template v-slot:item.start="{ value }">{{ dateString(value) }}</template> <template v-slot:item.start="{ value }">{{ dateString(value) }}</template>
<template v-slot:item.input="{ item }"> <template v-slot:item.input="{ item }">
<suspense> <span v-if="item.order.amountIsInput">
<span v-if="item.order.amountIsInput"> <span v-if="item.state > OrderState.Signing">
<pulse :touch="item.filledIn"> <suspense>
<token-amount :addr="item.order.tokenIn" :amount="item.filledIn" :raw="true"/> <pulse :touch="item.filledIn">
</pulse> <token-amount :chain-id="item.chainId" :addr="item.order.tokenIn" :amount="item.filledIn" :raw="true"/>
</pulse>
</suspense>
/ /
<token-amount :addr="item.order.tokenIn" :amount="item.order.amount"/>
</span> </span>
</suspense> <suspense>
<token-amount :chain-id="item.chainId" :addr="item.order.tokenIn" :amount="item.order.amount"/>
</suspense>
</span>
<suspense> <suspense>
<token-symbol :addr="item.order.tokenIn" v-if="!item.order.amountIsInput"/> <token-symbol :addr="item.order.tokenIn" v-if="!item.order.amountIsInput"/>
</suspense> </suspense>
</template> </template>
<template v-slot:item.output="{ item }"> <template v-slot:item.output="{ item }">
<suspense> <span v-if="!item.order.amountIsInput">
<span v-if="!item.order.amountIsInput"> <span v-if="item.state > OrderState.Signing">
<pulse :touch="item.filledOut"> <suspense>
<token-amount :addr="item.order.tokenOut" :amount="item.filledOut" :raw="true"/> <pulse :touch="item.filledOut">
</pulse> <token-amount :chain-id="item.chainId" :addr="item.order.tokenOut" :amount="item.filledOut" :raw="true"/>
</pulse>
</suspense>
/ /
<token-amount :addr="item.order.tokenOut" :amount="item.order.amount"/>
</span> </span>
</suspense> <suspense>
<token-amount :chain-id="item.chainId" :addr="item.order.tokenOut" :amount="item.order.amount"/>
</suspense>
</span>
<suspense> <suspense>
<token-symbol :addr="item.order.tokenOut" v-if="item.order.amountIsInput"/> <token-symbol :addr="item.order.tokenOut" v-if="item.order.amountIsInput"/>
</suspense> </suspense>
@@ -94,14 +102,14 @@
<suspense> <suspense>
<span v-if="item.state > OrderState.Signing"> <span v-if="item.state > OrderState.Signing">
<pulse :touch="item.trancheFilled[i]"> <pulse :touch="item.trancheFilled[i]">
<token-amount :addr="item.amountToken" :amount="item.trancheFilled[i]" :raw="true"/> <token-amount :chain-id="item.chainId" :addr="item.amountToken" :amount="item.trancheFilled[i]" :raw="true"/>
</pulse> </pulse>
/ /
</span> </span>
</suspense> </suspense>
<suspense> <suspense>
<span> <span>
<token-amount :addr="item.amountToken" :amount="item.order.amount*BigInt(t.fraction)/65535n"/> <token-amount :chain-id="item.chainId" :addr="item.amountToken" :amount="item.order.amount*BigInt(t.fraction)/65535n"/>
</span> </span>
</suspense> </suspense>
</td> </td>
@@ -209,6 +217,7 @@ const orders = computed(()=>{
for (const pend of ws.pendingOrders) { for (const pend of ws.pendingOrders) {
console.log('pended order', pend) console.log('pended order', pend)
result.push({ result.push({
chainId: pend.chainId,
id: pend.id, id: pend.id,
start: pend.placementTime, start: pend.placementTime,
order: pend.order, order: pend.order,
@@ -222,19 +231,23 @@ const orders = computed(()=>{
const vault = vaultAddr.value; const vault = vaultAddr.value;
if( vault in s.orders ) { if( vault in s.orders ) {
for (const [index, status] of Object.entries(s.orders[vault]).reverse()) { for (const [index, status] of Object.entries(s.orders[vault]).reverse()) {
const st = {...status} // const st = {...status}
const o = {...st.order} // const o = {...st.order}
const st = status
const o = st.order
st.order = o st.order = o
console.log('order status', st) console.log('order status', st)
result.push(st) result.push(st)
st.id = `${vault}|${index}` st.id = `${vault}|${index}`
st.index = parseInt(index) st.index = parseInt(index)
/*
o.tranches = o.tranches.map((tranche)=>{ o.tranches = o.tranches.map((tranche)=>{
const t = {...tranche} const t = {...tranche}
// t.startTime = t.startTimeIsRelative ? intervalString(t.startTime) : dateString(t.startTime) // t.startTime = t.startTimeIsRelative ? intervalString(t.startTime) : dateString(t.startTime)
// t.endTime = t.endTimeIsRelative ? intervalString(t.endTime) : dateString(t.endTime) // t.endTime = t.endTimeIsRelative ? intervalString(t.endTime) : dateString(t.endTime)
return t return t
}) })
*/
const fmtX18 = {decimals: 18, width: 256, signed: false}; const fmtX18 = {decimals: 18, width: 256, signed: false};
st.filled = o.amountIsInput ? st.filledIn : st.filledOut st.filled = o.amountIsInput ? st.filledIn : st.filledOut
if(BigInt(st.filled) === 0n) if(BigInt(st.filled) === 0n)

View File

@@ -3,14 +3,12 @@
</template> </template>
<script setup> <script setup>
import {useStore} from "@/store/store";
import {getToken} from "@/blockchain/token.js"; import {getToken} from "@/blockchain/token.js";
import {FixedNumber} from "ethers"; import {FixedNumber} from "ethers";
import {computed} from "vue"; import {computed} from "vue";
const s = useStore() const props = defineProps(['chainId', 'addr', 'amount', 'raw'])
const props = defineProps(['addr', 'amount', 'raw']) const token = await getToken(props.chainId, props.addr)
const token = await getToken(s.chainId, props.addr)
const fmtAmount = computed(() => { const fmtAmount = computed(() => {
if( props.amount === null || props.amount === undefined ) if( props.amount === null || props.amount === undefined )
return '' return ''

View File

@@ -38,7 +38,7 @@ socket.on('vb', async (chainId, vault, balances) => {
socket.on('vaults', (chainId, owner, vaults)=>{ socket.on('vaults', (chainId, owner, vaults)=>{
const s = useStore() const s = useStore()
console.log('vaults', vaults) console.log('vaults', chainId, owner, vaults)
if( s.chainId !== chainId || s.account !== owner ) if( s.chainId !== chainId || s.account !== owner )
return return
if( vaults.length > s.vaults.length ) { if( vaults.length > s.vaults.length ) {
@@ -56,7 +56,7 @@ function handleOrderStatus(chainId, vault, orderIndex, status) {
if( s.chainId !== chainId ) if( s.chainId !== chainId )
return return
// message 'o' is a single order status // message 'o' is a single order status
const parsed = parseOrderStatus(status); const parsed = parseOrderStatus(chainId, status);
console.log('o', chainId, vault, orderIndex, status, parsed) console.log('o', chainId, vault, orderIndex, status, parsed)
if( !(vault in s.orders) ) if( !(vault in s.orders) )
s.orders[vault] = {} s.orders[vault] = {}
@@ -95,6 +95,6 @@ socket.on( 'of', (chainId, vault, orderIndex, filled)=>{
status.trancheFilledIn[i] = BigInt(filledIn) status.trancheFilledIn[i] = BigInt(filledIn)
status.trancheFilledOut[i] = BigInt(filledOut) status.trancheFilledOut[i] = BigInt(filledOut)
} }
s.orders[vault][orderIndex] = status // s.orders[vault][orderIndex] = status
console.log('applied fills', status) console.log('applied fills', status)
}) })

View File

@@ -63,14 +63,15 @@ export const useStore = defineStore('app', ()=> {
const chainId = computed({ const chainId = computed({
get() {return _chainId.value}, get() {return _chainId.value},
set(v) { set(v) {
console.log('setting chainid',_chainId.value, v) console.log('setting app chainid',_chainId.value, v)
if (_chainId.value!==v) { const changed = _chainId.value!==v;
if (changed) {
console.log('do set') console.log('do set')
_chainId.value = v _chainId.value = v
account.value = null account.value = null
} }
if (_chainId.value!==v || _provider.value === null) { if (changed || _provider.value === null) {
console.log('update provider') console.log('invalidating provider')
_provider.value = UNKNOWN_PROVIDER _provider.value = UNKNOWN_PROVIDER
} }
} }