diff --git a/schema.graphql b/schema.graphql index 8d7f374..2de44db 100644 --- a/schema.graphql +++ b/schema.graphql @@ -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! diff --git a/scripts/build.sh b/scripts/build.sh index 9da2580..5c794a7 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -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 @@ -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 ###### ################################################################# @@ -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 diff --git a/src/FeeController.ts b/src/FeeController.ts new file mode 100644 index 0000000..439435a --- /dev/null +++ b/src/FeeController.ts @@ -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 +} diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 88e0635..24647ca 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -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