automatic vault creation working

This commit is contained in:
Tim Olson
2023-10-06 19:45:22 -04:00
parent c05c9b9c16
commit 0f7d2b0b5a
5 changed files with 65 additions and 28 deletions

View File

@@ -1,50 +1,83 @@
import {ethers, keccak256} from "ethers";
import {ethers} from "ethers";
import {getAbi} from "./abi.js";
import {getSigner} from "./blockchain.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 deployerAbi = await getAbi('Factory');
const vaultAbi = await getAbi('Vault')
const factoryAbi = await getAbi('Factory')
export function vaultAddress(chainId, ownerAddress, num=0) {
const encoded = ethers.AbiCoder.defaultAbiCoder().encode(['address','uint8'], [ownerAddress,num])
const salt = ethers.keccak256(encoded)
return ethers.getCreate2Address(getDeployerAddress(chainId), salt, VAULT_INIT_CODE_HASH)
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) {
// todo send known tokens
if (await vaults.contains(chainId,address)) {
// todo send welcome with basic info and extra tokens
socket.send('welcome',{})
console.log('loginAddress', 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(chainId, owner, num) {
export async function ensureVault(socket, chainId, owner, num) {
console.log('ensureVault', owner, num)
const address = vaultAddress(chainId, owner, num)
if (!await vaults.contains(chainId,address))
await createVault(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) {
// todo create vault request for backend to pick up
const deployer = new ethers.Contract(factoryAddresses[chainId], deployerAbi, getSigner(chainId))
await deployer.deployVault(owner, num)
console.log('creating vault', owner, num)
const signer = getSigner(chainId);
const deployer = new ethers.Contract(chainInfo[chainId].factory, factoryAbi, signer)
console.log('got deployer')
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 watchVaultCreated(provider, db, event) {
console.log(`vault created`, event)
}
export async function watchErc20Transfer(provider, db, event) {
console.log('Transfer', event)
const [from, to, amount] = event.args