diff --git a/src/blockchain/contract.js b/src/blockchain/contract.js index a16a02a..083f514 100644 --- a/src/blockchain/contract.js +++ b/src/blockchain/contract.js @@ -36,9 +36,7 @@ export async function poolContract(addr) { return contractOrNull(addr, uniswapV3PoolAbi, s.provider) } -export async function vaultContract(num, signer) { - const s = useStore() - if( num >= s.vaults.length ) - return null - return contractOrNull(s.vaults[num], vaultAbi, signer) +export async function vaultContract(owner, num, provider) { + const addr = vaultAddress(owner, num) + return new ethers.Contract(addr, vaultAbi, provider) } diff --git a/src/blockchain/wallet.js b/src/blockchain/wallet.js index a934cbe..67fa663 100644 --- a/src/blockchain/wallet.js +++ b/src/blockchain/wallet.js @@ -1,7 +1,7 @@ import {ethers} from "ethers"; import {setProvider, useStore} from "@/store/store"; import {socket} from "@/socket.js"; -import {contractOrNull} from "@/blockchain/contract.js"; +import {contractOrNull, vaultAddress} from "@/blockchain/contract.js"; import {vaultAbi} from "@/blockchain/abi.js"; @@ -29,6 +29,14 @@ function changeAccounts(accounts) { else { const store = useStore() store.account = accounts[0].address + if( pendingOrders.length ) { + if( store.vault ) + flushOrders() + else + ensureVault() + } + else + discoverVaults() flushTransactions() socket.emit('address', store.chainId, accounts[0].address) } @@ -86,7 +94,39 @@ export async function connectWallet() { await s.provider.getSigner() } -const pendingOrders = [] +let pendingOrders = [] + + +function discoverVaults() { + const s = useStore() + const owner = s.account + _discoverVaults(owner).then((result)=>{ + if( s.account === owner ) { // double-check the account since it could have changed during our await + s.vaults = result + if( result.length && pendingOrders.length ) + flushOrders(result[0]) + } + }) +} + +async function _discoverVaults(owner) { + const result = [] + // todo multi-vault scan + const addr = vaultAddress(owner, 0) + const s = useStore() + const vault = new ethers.Contract(addr, vaultAbi, s.provider) + let version = -1 + try { + version = await vault.version(); + if( version === 1 ) + result.push(addr) + else + console.error(`bad vault version ${version}`) + } + catch (e) { + } + return result +} export function ensureVault() { @@ -120,6 +160,8 @@ export async function pendOrder(order) { export function flushOrders(vault) { for( const order of pendingOrders ) pendOrderAsTransaction(vault, order) + pendingOrders = [] + flushTransactions() } diff --git a/src/components/Faucet.vue b/src/components/Faucet.vue index 026b61c..b60e7bb 100644 --- a/src/components/Faucet.vue +++ b/src/components/Faucet.vue @@ -1,7 +1,7 @@