vault balance tracking
This commit is contained in:
25
cache.js
25
cache.js
@@ -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')
|
||||||
|
|||||||
4
main.js
4
main.js
@@ -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})
|
||||||
|
|||||||
40
vault.js
40
vault.js
@@ -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) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user