Skip to content

Commit

Permalink
Fee Controller: Track smart vault fee model (#16)
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 Sep 20, 2023
1 parent e68a092 commit d16b873
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 0 deletions.
9 changes: 9 additions & 0 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,20 @@ type SmartVault @entity {
authorizer: Authorizer!
priceOracle: PriceOracle!
paused: Boolean!
smartVaultFee: SmartVaultFee @derivedFrom(field: "smartVault")
tasks: [Task!] @derivedFrom(field: "smartVault")
movements: [Movement!] @derivedFrom(field: "smartVault")
transactions: [Transaction!] @derivedFrom(field: "smartVault")
}

type SmartVaultFee @entity {
id: ID!
smartVault: SmartVault!
feeCollector: String!
feePercentage: BigInt!
maxFeePercentage: BigInt!
}

type Authorizer @entity {
id: ID!
name: String!
Expand Down
21 changes: 21 additions & 0 deletions scripts/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,48 +7,56 @@ set -o errexit
registry_arbitrum=0x1675BF3F75046aCd131caD845eb8FF3Bed49a643
deployer_arbitrum=0x849B7B1102B0dcf6eC10f98b81C8D1c38f7cbf24
relayer_arbitrum=0xD7252C026c3cA28D73B4DeeF62FE6ADe86eC17A9
feeController_arbitrum=0x88586bfc840b99680c8cc753a36b51999608b1f6
block_arbitrum=117042327

# Avalanche
registry_avalanche=0x0000000000000000000000000000000000000000
deployer_avalanche=0x0000000000000000000000000000000000000000
relayer_avalanche=0x0000000000000000000000000000000000000000
feeController_avalanche=0x0000000000000000000000000000000000000000
block_avalanche=0

# BSC
registry_bsc=0x0000000000000000000000000000000000000000
deployer_bsc=0x0000000000000000000000000000000000000000
relayer_bsc=0x0000000000000000000000000000000000000000
feeController_bsc=0x0000000000000000000000000000000000000000
block_bsc=0

# Fantom
registry_fantom=0x0000000000000000000000000000000000000000
deployer_fantom=0x0000000000000000000000000000000000000000
relayer_fantom=0x0000000000000000000000000000000000000000
feeController_fantom=0x0000000000000000000000000000000000000000
block_fantom=0

# Gnosis
registry_gnosis=0x0000000000000000000000000000000000000000
deployer_gnosis=0x0000000000000000000000000000000000000000
relayer_gnosis=0x0000000000000000000000000000000000000000
feeController_gnosis=0x0000000000000000000000000000000000000000
block_gnosis=0

# Mainnet
registry_mainnet=0x0000000000000000000000000000000000000000
deployer_mainnet=0x0000000000000000000000000000000000000000
relayer_mainnet=0x0000000000000000000000000000000000000000
feeController_mainnet=0x0000000000000000000000000000000000000000
block_mainnet=0

# Optimism
registry_optimism=0x0000000000000000000000000000000000000000
deployer_optimism=0x0000000000000000000000000000000000000000
relayer_optimism=0x0000000000000000000000000000000000000000
feeController_optimism=0x0000000000000000000000000000000000000000
block_optimism=0

# Polygon
registry_polygon=0x0000000000000000000000000000000000000000
deployer_polygon=0x0000000000000000000000000000000000000000
relayer_polygon=0x0000000000000000000000000000000000000000
feeController_poligon=0x0000000000000000000000000000000000000000
block_polygon=0

# Validate network
Expand Down Expand Up @@ -114,6 +122,18 @@ if [[ -z $RELAYER_ADDRESS ]]; then
exit 1
fi

# Load feeController address
if [[ -z $FEE_CONTROLLER_ADDRESS ]]; then
FEE_CONTROLLER_ADDRESS_VAR=feeController_$NETWORK
FEE_CONTROLLER_ADDRESS=${!FEE_CONTROLLER_ADDRESS_VAR}
fi

# Validate relayer address
if [[ -z $FEE_CONTROLLER_ADDRESS ]]; then
echo 'Please make sure a Fee Controller address is provided'
exit 1
fi

#################################################################
##### FINALIZE ######
#################################################################
Expand All @@ -131,6 +151,7 @@ sed -i -e "s/{{network}}/${ENV}/g" subgraph.yaml
sed -i -e "s/{{registryAddress}}/${REGISTRY_ADDRESS}/g" subgraph.yaml
sed -i -e "s/{{deployerAddress}}/${DEPLOYER_ADDRESS}/g" subgraph.yaml
sed -i -e "s/{{relayerAddress}}/${RELAYER_ADDRESS}/g" subgraph.yaml
sed -i -e "s/{{feeControllerAddress}}/${FEE_CONTROLLER_ADDRESS}/g" subgraph.yaml
sed -i -e "s/{{blockNumber}}/${BLOCK_NUMBER}/g" subgraph.yaml
rm -f subgraph.yaml-e

Expand Down
54 changes: 54 additions & 0 deletions src/FeeController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { Address, BigInt, log } from '@graphprotocol/graph-ts'

import {
FeeCollectorSet,
FeeController,
FeePercentageSet,
MaxFeePercentageSet,
} from '../types/FeeController/FeeController'
import { 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()) ? feeCollector : getDefaultFeeCollector(event.address)
smartVaultFee.feeCollector = feeCollector
smartVaultFee.save()
}

export function handleFeePercentageSet(event: FeePercentageSet): void {
const smartVaultFee = loadOrCreateSmartVaultFee(event.params.smartVault.toHexString(), event.address)
smartVaultFee.maxFeePercentage = event.params.pct
smartVaultFee.save()
}

export function handleMaxFeePercentageSet(event: MaxFeePercentageSet): void {
const smartVaultFee = loadOrCreateSmartVaultFee(event.params.smartVault.toHexString(), event.address)
smartVaultFee.maxFeePercentage = event.params.maxPct
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.smartVault = smartVaultFeeId
smartVaultFee.feeCollector = getDefaultFeeCollector(address)
smartVaultFee.feePercentage = BigInt.zero()
smartVaultFee.maxFeePercentage = BigInt.zero()
smartVaultFee.save()
}
return smartVaultFee
}
24 changes: 24 additions & 0 deletions subgraph.template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,30 @@ dataSources:
- event: TaskExecuted(indexed address,indexed address,bytes,bool,bytes,uint256,uint256)
handler: handleTaskExecuted
file: ./src/Relayer.ts
- kind: ethereum/contract
name: FeeController
network: {{network}}
source:
address: '{{feeControllerAddress}}'
abi: FeeController
startBlock: {{blockNumber}}
mapping:
kind: ethereum/events
apiVersion: 0.0.7
language: wasm/assemblyscript
entities:
- FeeController
abis:
- name: FeeController
file: ./node_modules/@mimic-fi/v3-fee-controller/artifacts/contracts/interfaces/IFeeController.sol/IFeeController.json
eventHandlers:
- event: FeeCollectorSet(indexed address,indexed address)
handler: handleFeeCollectorSet
- event: FeePercentageSet(indexed address,uint256)
handler: handleFeePercentageSet
- event: MaxFeePercentageSet(indexed address,uint256)
handler: handleMaxFeePercentageSet
file: ./src/FeeController.ts
templates:
- kind: ethereum/contract
name: Authorizer
Expand Down

0 comments on commit d16b873

Please sign in to comment.