75 lines
2.6 KiB
JavaScript
75 lines
2.6 KiB
JavaScript
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";
|
|
|
|
|
|
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)
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function requestVault(socket, chainId, owner, num) {
|
|
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)
|
|
}
|
|
|