diff --git a/src/aludelFactory.ts b/src/aludelFactory.ts index dd773fd..5029285 100644 --- a/src/aludelFactory.ts +++ b/src/aludelFactory.ts @@ -1,8 +1,9 @@ -import { dataSource, log, store } from "@graphprotocol/graph-ts"; +import { BigInt, dataSource, log, store } from "@graphprotocol/graph-ts"; import { AludelFactory, ProgramAdded, ProgramDelisted, TemplateAdded, TemplateUpdated } from "../generated/AludelFactory/AludelFactory"; import { RewardProgram, Template } from "../generated/schema"; import { AludelV15Template } from "../generated/templates"; import { AludelV15 } from "../generated/templates/AludelV15Template/AludelV15"; +import { registerVaultFactory } from "./aludelv1.5"; import { getAludelId, getIdFromAddress } from "./utils"; export function handleProgramAdded(event: ProgramAdded): void { @@ -25,6 +26,7 @@ export function handleProgramAdded(event: ProgramAdded): void { } let aludel = AludelV15.bind(aludelAddress) + let owner = aludel.try_owner() if (owner.reverted) { log.error("handleInstanceAdded: failed get program's owner: {}", [aludelAddress.toHexString()]); @@ -37,7 +39,23 @@ export function handleProgramAdded(event: ProgramAdded): void { rewardProgram.startTime = data.value.startTime rewardProgram.name = data.value.name rewardProgram.save() - } + + let factoryLength = aludel.try_getVaultFactorySetLength() + if (factoryLength.reverted) { + log.error(": unable to get vault factory length in {}", [aludelAddress.toHexString()]); + return; + } + for (let index = 0; index < factoryLength.value.toI32(); index++) { + let factoryAddress = aludel.try_getVaultFactoryAtIndex(BigInt.fromI32(index)) + if (factoryAddress.reverted) { + log.error(": unable to get vault factory address at index {} in {}", [index.toString(), aludelAddress.toHexString()]); + return; + } + registerVaultFactory(factoryAddress.value, aludelAddress); + } + +} + // we need a remove instance / delist aludel event emitted export function handleProgramDelisted(event: ProgramDelisted): void { diff --git a/src/aludelv1.5.ts b/src/aludelv1.5.ts index 7ed4fc3..6d1bcd1 100644 --- a/src/aludelv1.5.ts +++ b/src/aludelv1.5.ts @@ -113,6 +113,29 @@ export function handleRewardClaimedLegacy(event: RewardClaimedLegacy): void { _handleRewardClaimed(event, aludel, tokenAddress, amount, crucibleAddress); } +export function registerVaultFactory(factoryAddress: Address, programAddress: Address): void { + let factoryId = getIdFromAddress(factoryAddress) + let programId = getIdFromAddress(programAddress) + + let program = RewardProgram.load(programId) + if (program == null) { + log.error('unable to load program {}', [programId]) + return + } + + let factory = VaultFactory.load(factoryId) + if (factory == null) { + factory = new VaultFactory(factoryId) + factory.save() + } + + let id = programId.concat('-').concat(factoryId) + let programFactory = new ProgramVaultFactory(id) + programFactory.rewardProgram = programId + programFactory.vaultFactory = factoryId + programFactory.save() + +} export function handleVaultFactoryRegistered(event: VaultFactoryRegistered): void { let factoryId = getIdFromAddress(event.params.factory) diff --git a/src/crucible.ts b/src/crucible.ts index fa9367a..f88fe0b 100644 --- a/src/crucible.ts +++ b/src/crucible.ts @@ -8,14 +8,31 @@ import { BigInt, store, } from "@graphprotocol/graph-ts"; -import { CrucibleEntity, ERC20Token, Leaderboard, Lock, Stake, Unstake } from "../generated/schema"; -import {getCrucibleId, getLockId, getStakeId, getTokenId, getUnstakeId} from "./utils"; +import { CrucibleEntity, ERC20Token, Leaderboard, Lock, RewardProgram, Stake, Unstake } from "../generated/schema"; +import {getAludelId, getCrucibleId, getLockId, getStakeId, getTokenId, getUnstakeId} from "./utils"; import { createERC20Token } from "./erc20Token"; +import { AludelV15Template } from "../generated/templates"; +import { AludelV15 } from "../generated/templates/AludelV15Template/AludelV15"; export function handleLocked(event: Locked): void { let crucibleId = getCrucibleId(event.address); let crucible = CrucibleEntity.load(crucibleId); + let aludelAddress = event.params.delegate + let maybeAludel = AludelV15.bind(aludelAddress) + // if this call reverts the delegate dont have a compatible abi with aludel. + let length = maybeAludel.try_getVaultFactorySetLength(); + if (length.reverted) { + log.warning('delegate is not an aludel: {}', [aludelAddress.toString()]) + } else { + let program = RewardProgram.load(getAludelId(aludelAddress)) + if (program == null) { + AludelV15Template.create(aludelAddress) + program = new RewardProgram(getAludelId(aludelAddress)) + program.save() + } + } + let delegate = event.params.delegate; let tokenAddress = event.params.token; diff --git a/subgraph.template.yaml b/subgraph.template.yaml index abfdf9a..bfd52f2 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -111,6 +111,9 @@ templates: file: ./abis/Crucible.json - name: ERC20 file: ./abis/ERC20.json + - name: AludelV15 + file: ./abis/AludelV15.json + eventHandlers: # event Locked(address delegate, address token, uint256 amount);