Skip to Content
SDKArchitecture

Architecture

The SDK is designed in three layers of abstraction:

Layer 1: Targets

This layer has diffing & patching functions on role configurations, operating on JSON objects matching the Role type of the subgraph schema.

Example:

{ address: "0x182B723a58739a9c974cFDB385ceaDb237453c28", clearance: Clearance.Function, functions: [ { selector: "0x84e9bd7e", condition: { paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { paramType: ParameterType.Static, operator: Operator.EqualTo, compValue: defaultAbiCoder.encode(["address"], ["0x4F2083f5fBede34C2714aFfb3105539775f7FE64"]), } ], }, } ] }

Functions implemented on this layer:

  • fetch current role configurations
  • compute contract calls required for patching an existing role configuration (targets and members) to a desired configuration
  • integrity checks, minimizations, and normalizations for conditions

Layer 2: Permissions

For authoring purposes it is useful to capture permissions in a slightly different structure: Rather than the list of targets with nested functions as exposed by the subgraph, permissions are defined by a flat array of entries that grant call right to an address or a specific function at an address.

This layer also provides condition helper functions for a more convenient way of expressing conditions.

Example:

{ targetAddress: '0x182B723a58739a9c974cFDB385ceaDb237453c28', signature: "claim_rewards(address)", condition: c.calldataMatches([c.avatar], ["address"]), }

Functions implemented on this layer:

  • support for condition authoring
  • joining permissions addressing the same function

Layer 3: Kits

On the highest layer of abstraction, users can generate kits for contracts they want to define permission for. A kit is a typed SDK tailored to a specific set of contracts that allows defining permissions on these in a convenient syntax and fully supported by the type system.

Users just provide the addresses of contracts. Powered by eth-sdk and TypeChain, ABIs will be automatically downloaded from Etherscan to generate type-safe functions for granting permissions.

Example:

allow.curve.stETH_ETH_gauge["claim_rewards(address)"](c.avatar);

Functions implemented on this layer:

  • type system support for conditions authoring
Last updated on