import { GetContractsParams, GetDeFiPoolsParams, GetUserSharesParams, IDeFiUserShare } from "../types";
export class ZircuitDeFiCollector implements IDeFiCollector {
public getContracts({ chainId }: GetContractsParams) {
if (chainId === 1) {
return [
{
chainId,
vault: "0x7a4EffD87C2f3C55CA251080b1343b605f327E3a",
address: "0xF047ab4c75cebf0eB9ed34Ae2c186f3611aEAfa6"
},
// ...
];
}
return [];
}
public getDeFiPools({ chainId }: GetDeFiPoolsParams) {
if (chainId === 1) {
return [
{
id: "pool-zircuit-rstETH",
chainId: 1,
name: "rstETH",
protocol: "Zircuit",
vault: "0x7a4EffD87C2f3C55CA251080b1343b605f327E3a",
protocol_address: "0xF047ab4c75cebf0eB9ed34Ae2c186f3611aEAfa6",
url: "https://stake.zircuit.com",
boost: 2,
}
// ...
];
}
return [];
}
public async getUserShares({
chainId,
contract, // ZtakingPool
fromBlock,
toBlock,
}: GetUserSharesParams) {
if (chainId !== 1) {
return [];
}
const userShares: IDeFiUserShare[] = [];
const vaults = ["0x7a4EffD87C2f3C55CA251080b1343b605f327E3a"];
const depositEvents = await getDepositEvents(contract);
const withdrawalEvents = await getWithdrawalEvents(contract);
// balance changes events
const events = [...depositEvents, ...withdrawalEvents].sort(
(a, b) => a.block - b.block
);
for (const event of events) {
// get user vaults balances at this block
const balances = await getMulticallBalance(
event.block,
event.user,
vaults
);
for (const balance of balances) {
userShares.push({
block: event.block,
user: event.user,
vault: balance.vault,
protocol_address: contract,
});
}
}
return userShares;
}
}