import {ethers} from "ethers"; import {getAbi} from "./abi.js"; import {getProvider, getSigner} from "./blockchain.js"; import {vaults} from './cache.js'; import {chainInfo, VAULT_INIT_CODE_HASH} from "./misc.js"; // Vault // address owner // balances { tokenAddress: amount } // recentOrders [] const vaultAbi = await getAbi('Vault') const factoryAbi = await getAbi('Factory') export function vaultAddress(chainId, owner, num=0) { const salt = ethers.solidityPackedKeccak256(['address','uint8'],[owner,num]) const result = ethers.getCreate2Address(chainInfo[chainId].factory, salt, VAULT_INIT_CODE_HASH) // console.log('vaultAddress', chainId, owner, num, chainInfo[chainId].factory, salt, VAULT_INIT_CODE_HASH, result) return result } export async function loginAddress(socket, chainId, address) { if( socket.user_room !== undefined) socket.leave(socket.user_room) socket.user_room = `${chainId}|${address}` socket.join(socket.user_room) const found = [] for( let num = 0; ; num++ ) { const vault = vaultAddress(chainId, address, num) if(await vaults.contains(chainId, vault)) found.push(vault) else break } socket.emit('vaults', found) } export async function ensureVault(socket, chainId, owner, num) { const address = vaultAddress(chainId, owner, num) if (!await vaults.contains(chainId,address)) { try { await createVault(chainId, owner, num) await loginAddress(socket, chainId, owner) } catch { } } else console.log('ensureVault', owner, 'exists:', address) } async function createVault(chainId, owner, num) { const signer = getSigner(chainId); const deployer = new ethers.Contract(chainInfo[chainId].factory, factoryAbi, signer) try { const tx = await deployer.deployVault(owner, num) // console.log(`deploying vault for ${owner} #${num} with tx ${tx.hash}`) } catch (e) { const addr = vaultAddress(chainId, owner, num) const vault = new ethers.Contract(addr, vaultAbi, getProvider(chainId)) try { const ver = await vault.version() // console.log(`vault already deployed at ${addr} with version ${ver}`) } catch (e2) { console.error('could not deploy vault:',e) } } } export async function watchErc20Transfer(provider, db, event) { console.log('Transfer', event) const [from, to, amount] = event.args let vault = vaults[from] let delta = 0 if (vault !== undefined) delta = -amount else { vault = vaults[to] if (vault !== undefined) delta = amount } if (vault) { let oldBalance = vault.balances[event.address] if (oldBalance === undefined) { } } }