import {ethers} from "ethers"; import {vaultBalances, vaults} from './cache.js'; import {chainInfo} from "./chain.js"; import {sendVaultOrders} from "./order.js"; import {approveWallet} from "./approval.js"; import {sql} from "./db.js"; import {clientIP} from "./misc.js"; import TTLCache from "@isaacs/ttlcache"; export function vaultAddress(chainId, owner, num=0) { if (!chainInfo[chainId].factory) return null try { const salt = ethers.solidityPackedKeccak256(['address','uint8'],[owner,num]) const result = ethers.getCreate2Address(chainInfo[chainId].factory, salt, chainInfo[chainId].vaultInitCodeHash) // console.log('vaultAddress', chainId, owner, num, chainInfo[chainId].factory, chainInfo[chainId].vaultInitCodeHash, result) return result } catch (e) { console.error('Could not generate vault address',chainId,owner,num,e) return null } } async function emitBalances(socket, chainId, vault) { const balances = await vaultBalances.get(chainId, vault); socket.emit('vb', chainId, vault, balances !== null ? balances : '{}') return balances; } async function sendVaultInfo(socket, chainId, owner) { const found = [] for (let num = 0; ; num++) { const vault = vaultAddress(chainId, owner, num) if (vault !== null && await vaults.contains(chainId, vault)) { found.push(vault) const balances = await emitBalances(socket, chainId, vault); console.log('found vault', vault, balances) } else break } console.log('sending vaults', found) socket.emit('vaults', chainId, owner, found) for (const vault of found) sendVaultOrders(socket, chainId, vault) } export async function loginAddress(socket, chainId, address) { if( socket.user_room !== undefined) { socket.leave(socket.user_room) console.log('left user room', socket.user_room) } if( address ) { const approved = approveWallet(address) socket.emit('approvedWallet', approved) if( approved ) { socket.user_room = `${chainId}|${address}` socket.join(socket.user_room) console.log('joined user room', socket.user_room) await sendVaultInfo(socket, chainId, address) } } } const requestVaultCooldown = new TTLCache({ttl:5 * 1000, checkAgeOnGet: true}) export async function requestVault(socket, chainId, owner, num) { const key = [chainId, owner, num].join('|') if (requestVaultCooldown.has(key)) return requestVaultCooldown.set(key, true) const ipAddress = clientIP(socket) const time = new Date().toISOString(); const query = `insert into vaultcreationrequest (chain, owner, num, time, ipaddr) values (${chainId}, '${owner}', ${num}, '${time}', '${ipAddress}') ON CONFLICT DO NOTHING`; console.log('query:', query) await sql(query) }