vault upgrades; fees; refactoring

This commit is contained in:
Tim
2024-06-17 02:39:12 -04:00
parent fd8f20c4d4
commit 104b798d4f
15 changed files with 260 additions and 86 deletions

View File

@@ -3,10 +3,10 @@ import {useStore} from "@/store/store";
import {socket} from "@/socket.js";
import {contractOrNull, vaultAddress} from "@/blockchain/contract.js";
import {SingletonCoroutine, uuid} from "@/misc.js";
import {vaultAbi} from "@/blockchain/abi.js";
import {factoryAbi, vaultAbi} from "@/blockchain/abi.js";
import {defineStore} from "pinia";
import {ref} from "vue";
import {metadataMap} from "@/version.js";
import {metadataMap, version} from "@/version.js";
export let provider = null
@@ -198,6 +198,7 @@ function discoverVaults(owner) {
const doDiscoverVaults = new SingletonCoroutine(_discoverVaults, 50, false)
async function _discoverVaults(owner) {
const result = []
const versions = []
const s = useStore()
if( !owner || !s.chainId || !s.account) {
s.vaults = []
@@ -205,38 +206,34 @@ async function _discoverVaults(owner) {
}
// todo multi-vault scan
// console.log('_discoverVaults',owner)
const num = 0
const addr = vaultAddress(s.factory, s.vaultInitCodeHash, owner, num)
// console.log(`vault ${num} at`, addr)
if( addr === null ) {
s.vaults = []
return
}
console.log('provider', 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
try {
version = await vault.version();
if( Number(version) === 1 ) {
console.log(`found vault ${num} at ${addr}`)
result.push(addr)
for (let num=0; num < 1; num++) {
const num = 0
const addr = vaultAddress(s.factory, s.vaultInitCodeHash, owner, num)
// console.log(`vault ${num} at`, addr)
if (addr === null) // no more vaults
break
console.log('provider', provider)
if (!provider) {
console.log('No provider')
return // do not change whatever was already found
}
const vault = new ethers.Contract(addr, vaultAbi, provider)
try {
const version = Number(await vault.version())
console.log(`found vault #${num} v${version} at ${addr}`)
result.push(addr)
versions.push(version)
} catch (e) {
if (e.value === '0x' && e.code === 'BAD_DATA' || e.revert === null && e.code === 'CALL_EXCEPTION')
console.log(`no vault ${num} at ${addr}`)
else
console.error(`discoverVaults failed`, e)
return // do not change what was already found todo is this correct?
}
else
console.error(`bad vault version ${version}`)
}
catch (e) {
if( e.value==='0x' && e.code==='BAD_DATA' || e.revert===null && e.code==='CALL_EXCEPTION' )
console.log(`no vault ${num} at ${addr}`)
else
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
s.vaults = result
s.vaultVersions = versions
if( useWalletStore().pendingOrders.length ) {
if (result.length)
flushOrders(result[0])
@@ -287,7 +284,6 @@ async function doEnsureVault(chainId, owner, num) {
socket.emit('ensureVault', chainId, owner, num)
}
}
// await sleep(5000) // prevent this process from running more than once every 5 seconds
const ensureVaultRoutine = new SingletonCoroutine(doEnsureVault, 100)
@@ -300,18 +296,27 @@ export const PendingOrderState = {
}
export async function pendOrder(order) {
export async function placementFee(vault, order) {
const v = new ethers.Contract(vault, vaultAbi, provider)
const [orderFee, gasFee] = await v.placementFee(order)
console.log('computed fees', orderFee, gasFee)
return [orderFee, gasFee]
}
export async function pendOrder(order, fee=null) {
const s = useStore()
const pend = {
id: uuid(),
chainId: s.chainId,
placementTime: Date.now()/1000,
fee: fee,
vault: s.vaults.length ? s.vaults[0] : null,
state: PendingOrderState.Submitted,
order
};
useWalletStore().pendingOrders.splice(0,0, pend)
console.log('pending order', pend.id, JSON.stringify(order))
console.log('pended order', pend.id, JSON.stringify(order))
ensureVault()
}
@@ -378,8 +383,12 @@ function pendOrderAsTransaction(pend) {
return null
}
}
if (pend.fee === null) {
const [orderFee, gasFee] = await placementFee(pend.vault, pend.order)
pend.fee = orderFee + gasFee
}
console.log('placing order', pend.id, pend.order)
const tx = await contract.placeDexorder(pend.order)
const tx = await contract.placeDexorder(pend.order, {value:pend.fee})
pend.tx = tx
pend.state = PendingOrderState.Sent
console.log(`order ${pend.id} sent transaction`, tx)
@@ -400,7 +409,7 @@ function pendOrderAsTransaction(pend) {
})
}
0
export function pendTransaction(sender, errHandler) {
const s = useStore()
s.transactionSenders.push([sender,errHandler])
@@ -462,3 +471,60 @@ function doSendTransaction(sender, signer, errHandler) {
}
})
}
export async function detectUpgrade() {
if (!provider) {
console.log('no provider!')
return 0
}
const s = useStore()
if (!s.vault) {
console.log('no vault logged in')
return 0
}
const info = version.chainInfo[s.chainId]
if (!info) {
console.log(`couldn't get chainInfo for ${s.chainId}`)
return 0
}
try {
console.log('factory', info.factory)
const factory = new ethers.Contract(info.factory, factoryAbi, provider)
const vault = new ethers.Contract(s.vault, vaultAbi, provider)
const vaultLogic = await vault.logic()
const latestLogic = await factory.logic()
// const [vaultLogic, latestLogic] = await Promise.all( vault.logic(), factory.logic() )
console.log('vaultLogic / latestLogic', vaultLogic, latestLogic)
if ( vaultLogic !== latestLogic ) {
s.upgrade = latestLogic
const logic = new ethers.Contract(latestLogic, vaultAbi, provider)
const version = await logic.version()
console.log(`found vault version ${version}`)
return version
}
}
catch (e) {
console.error('ignorable error while querying for an upgrade', e)
}
return 0
}
function upgradeSender(vault, logic) {
return async function (signer) {
const v = new ethers.Contract(vault, vaultAbi, signer)
v.upgrade(logic)
}
}
function upgradeError(e) {
console.error('error while upgrading vault', e)
}
export async function upgradeVault(vault, logic) {
pendTransaction(upgradeSender(vault, logic), upgradeError)
}