Skip to content

Commit

Permalink
schema: implement authorizer handlers
Browse files Browse the repository at this point in the history
  • Loading branch information
facuspagnuolo committed Aug 12, 2023
1 parent 0f046e1 commit abf57f5
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 0 deletions.
17 changes: 17 additions & 0 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,23 @@ type Authorizer @entity {
name: String!
implementation: Implementation!
environment: Environment!
permissions: [Permission!] @derivedFrom(field: "authorizer")
}

type Permission @entity {
id: ID!
authorizer: Authorizer!
who: String!
where: String!
what: String!
params: [PermissionParam!] @derivedFrom(field: "permission")
}

type PermissionParam @entity {
id: ID!
permission: Permission!
op: String!
value: String!
}

type PriceOracle @entity {
Expand Down
68 changes: 68 additions & 0 deletions src/Authorizer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { Address, Bytes, crypto, log, store } from '@graphprotocol/graph-ts'

import { Permission, PermissionParam } from '../types/schema'
import { Authorized, Unauthorized, Authorizer as AuthorizerContract } from '../types/templates/Authorizer/Authorizer'

export function handleAuthorized(event: Authorized): void {
let permissionId = getPermissionId(event.address, event.params.who, event.params.where, event.params.what)
let permission = new Permission(permissionId)
permission.authorizer = event.address.toHexString()
permission.who = event.params.who.toHexString()
permission.where = event.params.where.toHexString()
permission.what = event.params.what.toHexString()
permission.save()

let authorizerContract = AuthorizerContract.bind(event.address)
let getPermissionParamsCall = authorizerContract.try_getPermissionParams(
event.params.who,
event.params.where,
event.params.what
)

if (getPermissionParamsCall.reverted) {
log.warning('getPermissionParams() call reverted for authorizer {}', [event.address.toHexString()])
return
}

let params = getPermissionParamsCall.value
for (let i: i32 = 0; i < params.length; i++) {
let paramId = permissionId + '/param/' + i.toString()
let param = new PermissionParam(paramId)
param.op = parseOp(params[i].op)
param.value = params[i].value.toHexString()
param.save()
}
}

export function handleUnauthorized(event: Unauthorized): void {
let permissionId = getPermissionId(event.address, event.params.who, event.params.where, event.params.what)
let permission = Permission.load(permissionId)

if (permission != null) {
let params = permission.params.load()
for (let i: i32 = 0; i < params.length; i++) store.remove('PermissionParam', params[i].id)
store.remove('Permission', permissionId)
}
}

function parseOp(op: i32): string {
if (op == 0) return 'NONE'
if (op == 1) return 'EQ'
if (op == 2) return 'NEQ'
if (op == 3) return 'GT'
if (op == 4) return 'LT'
if (op == 5) return 'GTE'
if (op == 6) return 'LTE'
return 'Unknown'
}

function getPermissionId(authorizer: Address, who: Address, where: Address, what: Bytes): string {
return crypto.keccak256(
Bytes.fromHexString(
authorizer.toHexString() +
who.toHexString().slice(2) +
where.toHexString().slice(2) +
what.toHexString().slice(2),
),
).toHexString()
}
5 changes: 5 additions & 0 deletions subgraph.template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ templates:
abis:
- name: Authorizer
file: ./node_modules/@mimic-fi/v3-authorizer/artifacts/contracts/interfaces/IAuthorizer.sol/IAuthorizer.json
eventHandlers:
- event: Authorized(indexed address,indexed address,indexed bytes4,(uint8,uint248)[])
handler: handleAuthorized
- event: Unauthorized(indexed address,indexed address,indexed bytes4)
handler: handleUnauthorized
file: ./src/Authorizer.ts
- kind: ethereum/contract
name: SmartVault
Expand Down

0 comments on commit abf57f5

Please sign in to comment.