Skip to content

Commit

Permalink
Config: Fix relayer and fee collector default values (#46)
Browse files Browse the repository at this point in the history
Co-authored-by: Facu Spagnuolo <[email protected]>
  • Loading branch information
PatricioHenderson and facuspagnuolo committed Jun 11, 2024
1 parent 3a5d6dd commit 26def92
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 37 deletions.
21 changes: 18 additions & 3 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type SmartVault @entity {

type RelayerConfig @entity {
id: ID!
relayer: Relayer!
smartVault: SmartVault!
feeCollector: String!
balance: BigInt!
Expand All @@ -37,8 +38,22 @@ type RelayerConfig @entity {
quotaUsed: BigInt!
}

type Relayer @entity {
id: ID!
feeCollector: String
executors: [String!]!
configs: [RelayerConfig!] @derivedFrom(field: "relayer")
}

type FeeController @entity {
id: ID!
feeCollector: String!
configs: [SmartVaultFee!] @derivedFrom(field: "feeController")
}

type SmartVaultFee @entity {
id: ID!
feeController: FeeController!
smartVault: SmartVault!
feeCollector: String!
feePercentage: BigInt!
Expand Down Expand Up @@ -106,7 +121,7 @@ type Task @entity {
taskConfig: TaskConfig @derivedFrom(field: "task")
}

type TaskConfig @entity{
type TaskConfig @entity {
id: ID!
task: Task!
nextBalanceConnector: String!
Expand Down Expand Up @@ -146,7 +161,7 @@ type GasLimits @entity {
txCostLimit: BigInt!
}

type TimeLock @entity{
type TimeLock @entity {
id: ID!
taskConfig: TaskConfig!
mode: TimeLockMode!
Expand Down Expand Up @@ -217,7 +232,7 @@ type CustomDestinationChain @entity {
destinationChain: BigInt!
}

type CustomMaxBridgeFee @entity {
type CustomMaxBridgeFee @entity {
id: ID!
taskConfig: TaskConfig!
token: ERC20!
Expand Down
2 changes: 2 additions & 0 deletions src/Authorizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { Permission, PermissionParam, Task } from '../types/schema'
import { Authorized, Authorizer as AuthorizerContract, Unauthorized } from '../types/templates/Authorizer/Authorizer'
import { getFunctionNameForSelector } from './permissions/index'

/* eslint-disable @typescript-eslint/no-non-null-assertion */

export function handleAuthorized(event: Authorized): void {
const permissionId = getPermissionId(event.address, event.params.who, event.params.where, event.params.what)
const existsPermission = Permission.load(permissionId) != null
Expand Down
41 changes: 24 additions & 17 deletions src/FeeController.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
import { Address, BigInt, log } from '@graphprotocol/graph-ts'
import { Address, BigInt } from '@graphprotocol/graph-ts'

import {
DefaultFeeCollectorSet,
FeeCollectorSet,
FeeController,
FeePercentageSet,
MaxFeePercentageSet,
} from '../types/FeeController/FeeController'
import { SmartVaultFee } from '../types/schema'
import { FeeController, SmartVaultFee } from '../types/schema'

export function handleFeeCollectorSet(event: FeeCollectorSet): void {
const smartVaultFee = loadOrCreateSmartVaultFee(event.params.smartVault.toHexString(), event.address)
let feeCollector = event.params.collector.toHexString()
feeCollector = event.params.collector.equals(Address.zero()) ? getDefaultFeeCollector(event.address) : feeCollector
const feeCollector = event.params.collector.toHexString()
smartVaultFee.feeCollector = feeCollector
smartVaultFee.save()
}

export function handleDefaultFeeCollectorSet(event: DefaultFeeCollectorSet): void {
const feeController = loadOrCreateFeeController(event.address)
feeController.feeCollector = event.params.collector.toHexString()
feeController.save()
}

export function handleFeePercentageSet(event: FeePercentageSet): void {
const smartVaultFee = loadOrCreateSmartVaultFee(event.params.smartVault.toHexString(), event.address)
smartVaultFee.feePercentage = event.params.pct
Expand All @@ -28,27 +33,29 @@ export function handleMaxFeePercentageSet(event: MaxFeePercentageSet): void {
smartVaultFee.save()
}

function getDefaultFeeCollector(address: Address): string {
const contract = FeeController.bind(address)
const feeControllerCall = contract.try_defaultFeeCollector()
if (!feeControllerCall.reverted) {
return feeControllerCall.value.toHexString()
}

log.warning('feeController() call reverted for {}', [address.toHexString()])
return 'Unknown'
}

export function loadOrCreateSmartVaultFee(smartVaultFeeId: string, address: Address): SmartVaultFee {
let smartVaultFee = SmartVaultFee.load(address.toHexString())

if (smartVaultFee == null) {
smartVaultFee = new SmartVaultFee(smartVaultFeeId)
smartVaultFee.feeController = loadOrCreateFeeController(address).id
smartVaultFee.smartVault = smartVaultFeeId
smartVaultFee.feeCollector = getDefaultFeeCollector(address)
smartVaultFee.feeCollector = Address.zero().toHexString()
smartVaultFee.feePercentage = BigInt.zero()
smartVaultFee.maxFeePercentage = BigInt.zero()
smartVaultFee.save()
}
return smartVaultFee
}

export function loadOrCreateFeeController(address: Address): FeeController {
let feeController = FeeController.load(address.toHexString())

if (feeController === null) {
feeController = new FeeController(address.toHexString())
feeController.feeCollector = Address.zero().toHexString()
feeController.save()
}

return feeController
}
54 changes: 37 additions & 17 deletions src/Relayer.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Address, BigInt, ethereum, log } from '@graphprotocol/graph-ts'

import {
DefaultCollectorSet,
Deposited,
ExecutorSet,
GasPaid,
QuotaPaid,
Relayer,
SmartVaultCollectorSet,
SmartVaultMaxQuotaSet,
TaskExecuted,
Expand All @@ -14,6 +15,7 @@ import {
Movement,
RelayedExecution,
RelayedTransaction,
Relayer,
RelayerConfig,
SmartVault,
SmartVaultCall,
Expand All @@ -29,6 +31,18 @@ export function handleDeposited(event: Deposited): void {
relayerConfig.save()
}

export function handleExecutorSet(event: ExecutorSet): void {
const relayer = loadOrCreateRelayer(event.address)
const executors = relayer.executors
const executor = event.params.executor.toHexString()
const index = executors.indexOf(executor)

if (event.params.allowed && index < 0) executors.push(executor)
else if (!event.params.allowed && index >= 0) executors.splice(index, 1)
relayer.executors = executors
relayer.save()
}

export function handleGasPaid(event: GasPaid): void {
const relayerConfig = loadOrCreateRelayerConfig(event.params.smartVault.toHexString(), event.address)
relayerConfig.balance = relayerConfig.balance.minus(event.params.amount.minus(event.params.quota))
Expand All @@ -55,12 +69,16 @@ export function handleQuotaPaid(event: QuotaPaid): void {

export function handleSmartVaultCollectorSet(event: SmartVaultCollectorSet): void {
const relayerConfig = loadOrCreateRelayerConfig(event.params.smartVault.toHexString(), event.address)
let feeCollector = event.params.collector.toHexString()
if (feeCollector == Address.zero().toHexString()) feeCollector = getDefaultFeeCollector(event.address)
relayerConfig.feeCollector = feeCollector
relayerConfig.feeCollector = event.params.collector.toHexString()
relayerConfig.save()
}

export function handleDefaultDefaultCollectorSet(event: DefaultCollectorSet): void {
const relayer = loadOrCreateRelayer(event.address)
relayer.feeCollector = event.params.collector.toHexString()
relayer.save()
}

export function handleSmartVaultMaxQuotaSet(event: SmartVaultMaxQuotaSet): void {
const relayerConfig = loadOrCreateRelayerConfig(event.params.smartVault.toHexString(), event.address)
relayerConfig.maxQuota = event.params.maxQuota
Expand Down Expand Up @@ -132,18 +150,6 @@ export function getSmartVault(address: Address): Address {
return Address.zero()
}

function getDefaultFeeCollector(address: Address): string {
const contract = Relayer.bind(address)
const feeCollectorCall = contract.try_defaultCollector()

if (!feeCollectorCall.reverted) {
return feeCollectorCall.value.toHexString()
}

log.warning('defaultCollector() call reverted for {}', [address.toHexString()])
return 'Unknown'
}

export function loadOrCreateRelayedTransaction(
environment: string,
smartVault: string,
Expand Down Expand Up @@ -176,8 +182,9 @@ export function loadOrCreateRelayerConfig(smartVaultId: string, relayer: Address

if (relayerConfig === null) {
relayerConfig = new RelayerConfig(smartVaultId)
relayerConfig.relayer = loadOrCreateRelayer(relayer).id
relayerConfig.smartVault = smartVaultId
relayerConfig.feeCollector = getDefaultFeeCollector(relayer)
relayerConfig.feeCollector = Address.zero().toHexString()
relayerConfig.balance = BigInt.zero()
relayerConfig.maxQuota = BigInt.zero()
relayerConfig.nativeToken = loadOrCreateNativeToken().id
Expand All @@ -187,3 +194,16 @@ export function loadOrCreateRelayerConfig(smartVaultId: string, relayer: Address

return relayerConfig
}

export function loadOrCreateRelayer(address: Address): Relayer {
let relayer = Relayer.load(address.toHexString())

if (relayer === null) {
relayer = new Relayer(address.toHexString())
relayer.feeCollector = Address.zero().toHexString()
relayer.executors = []
relayer.save()
}

return relayer
}
10 changes: 10 additions & 0 deletions subgraph.template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ dataSources:
handler: handleTaskExecuted
- event: Withdrawn(indexed address,uint256)
handler: handleWithdrawn
- event: DefaultCollectorSet(indexed address)
handler: handleDefaultDefaultCollectorSet
- event: ExecutorSet(indexed address,bool)
handler: handleExecutorSet
file: ./src/Relayer.ts
- kind: ethereum/contract
name: Relayer_2
Expand Down Expand Up @@ -135,6 +139,10 @@ dataSources:
handler: handleTaskExecuted
- event: Withdrawn(indexed address,uint256)
handler: handleWithdrawn
- event: DefaultCollectorSet(indexed address)
handler: handleDefaultDefaultCollectorSet
- event: ExecutorSet(indexed address,bool)
handler: handleExecutorSet
file: ./src/Relayer.ts
- kind: ethereum/contract
name: FeeController
Expand All @@ -153,6 +161,8 @@ dataSources:
- name: FeeController
file: ./node_modules/@mimic-fi/v3-fee-controller/artifacts/contracts/interfaces/IFeeController.sol/IFeeController.json
eventHandlers:
- event: DefaultFeeCollectorSet(indexed address)
handler: handleDefaultFeeCollectorSet
- event: FeeCollectorSet(indexed address,indexed address)
handler: handleFeeCollectorSet
- event: FeePercentageSet(indexed address,uint256)
Expand Down

0 comments on commit 26def92

Please sign in to comment.