vault upgrades; fees; refactoring
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user