vault balance tracking

This commit is contained in:
Tim Olson
2023-10-30 18:46:20 -04:00
parent 6631542434
commit 06b7a1d2b6
3 changed files with 40 additions and 29 deletions

View File

@@ -1,6 +1,9 @@
import {createClient} from "redis"; import {createClient} from "redis";
export const redis = createClient({url: process.env.DEXORDER_REDIS_URL || 'redis://localhost:6379'}) export const redis = createClient({
url: process.env.DEXORDER_REDIS_URL || 'redis://localhost:6379',
returnBuffers: false,
})
redis.on('error', (err) => console.log('Redis Client Error', err)); redis.on('error', (err) => console.log('Redis Client Error', err));
await redis.connect(); await redis.connect();
@@ -28,7 +31,8 @@ export class CacheDict {
} }
async get(chain, key) { async get(chain, key) {
return await redis.hGet(`${chain}|${this.series}`, key) const result = await redis.hGet(`${chain}|${this.series}`, key)
return result === null ? null : '' + result
} }
async contains(chain, key) { async contains(chain, key) {
@@ -37,6 +41,21 @@ export class CacheDict {
} }
export class CacheDictObject {
constructor(series) {
this.series = series
}
async get(chain, key) {
return await redis.json.get(`${chain}|${this.series}`, key)
}
async contains(chain, key) {
return await redis.json.get(`${chain}|${this.series}`, key) !== null
}
}
export class CacheObject { export class CacheObject {
constructor(series) { constructor(series) {
this.series = series this.series = series
@@ -57,5 +76,5 @@ async function latestBlock(chain) {
} }
export const vaults = new CacheDict('v') export const vaults = new CacheDict('v')
export const vaultTokens = new CacheDict('vt') export const vaultBalances = new CacheDict('vb')
export const prices = new CacheDict('p') export const prices = new CacheDict('p')

View File

@@ -14,8 +14,8 @@ io.on("connection", (socket) => {
lookupToken(chainId, address).then((result)=>callback(result)).catch(()=>callback(null)) lookupToken(chainId, address).then((result)=>callback(result)).catch(()=>callback(null))
}) })
socket.on('address', (chainId, address) => loginAddress(socket, chainId, address) ) socket.on('address', (chainId, address) => loginAddress(socket, chainId, address) )
socket.on('subPools', (chainId, addresses) => { for(const address of addresses) socket.join(`${chainId}|p|${address}`) } ) socket.on('subPools', (chainId, addresses) => { for(const address of addresses) socket.join(`${chainId}|${address}`) } )
socket.on('unsubPools', (chainId, addresses) => { for(const address of addresses) socket.leave(`${chainId}|p|${address}`) } ) socket.on('unsubPools', (chainId, addresses) => { for(const address of addresses) socket.leave(`${chainId}|${address}`) } )
socket.on('ensureVault', (chainId,owner,num) => ensureVault(socket, chainId, owner, num) ) socket.on('ensureVault', (chainId,owner,num) => ensureVault(socket, chainId, owner, num) )
socket.join('public') socket.join('public')
socket.emit('welcome', {chainInfo, vaultInitCodeHash:VAULT_INIT_CODE_HASH}) socket.emit('welcome', {chainInfo, vaultInitCodeHash:VAULT_INIT_CODE_HASH})

View File

@@ -1,7 +1,7 @@
import {ethers} from "ethers"; import {ethers} from "ethers";
import {getAbi} from "./abi.js"; import {getAbi} from "./abi.js";
import {getProvider, getSigner} from "./blockchain.js"; import {getProvider, getSigner} from "./blockchain.js";
import {vaults} from './cache.js'; import {vaultBalances, vaults} from './cache.js';
import {chainInfo, VAULT_INIT_CODE_HASH} from "./chain.js"; import {chainInfo, VAULT_INIT_CODE_HASH} from "./chain.js";
// Vault // Vault
@@ -27,6 +27,13 @@ export function vaultAddress(chainId, owner, num=0) {
} }
async function emitBalances(socket, chainId, vault) {
const balances = await vaultBalances.get(chainId, vault);
socket.emit('vb', vault, balances !== null ? balances : '{}')
return balances;
}
export async function loginAddress(socket, chainId, address) { export async function loginAddress(socket, chainId, address) {
if( socket.user_room !== undefined) if( socket.user_room !== undefined)
socket.leave(socket.user_room) socket.leave(socket.user_room)
@@ -36,11 +43,15 @@ export async function loginAddress(socket, chainId, address) {
else { else {
socket.user_room = `${chainId}|${address}` socket.user_room = `${chainId}|${address}`
socket.join(socket.user_room) socket.join(socket.user_room)
console.log('joined room', socket.user_room)
const found = [] const found = []
for( let num = 0; ; num++ ) { for( let num = 0; ; num++ ) {
const vault = vaultAddress(chainId, address, num) const vault = vaultAddress(chainId, address, num)
if(vault !== null && await vaults.contains(chainId, vault)) if(vault !== null && await vaults.contains(chainId, vault)) {
found.push(vault) found.push(vault)
const balances = await emitBalances(socket, chainId, vault);
console.log('found vault', vault, balances)
}
else else
break break
} }
@@ -58,8 +69,10 @@ export async function ensureVault(socket, chainId, owner, num) {
try { try {
const vault = await createVault(chainId, owner, num) const vault = await createVault(chainId, owner, num)
console.log(vault) console.log(vault)
if (vault !== null) if (vault !== null) {
socket.emit('vaults', [vault]) socket.emit('vaults', [vault])
await emitBalances(socket, chainId, vault)
}
else else
console.error('got null vault for chainId', chainId) console.error('got null vault for chainId', chainId)
} catch { } catch {
@@ -93,24 +106,3 @@ async function createVault(chainId, owner, num) {
} }
return addr return addr
} }
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) {
}
}
}