Skip to content

Commit

Permalink
Fill in the specification part of an ERC a bit
Browse files Browse the repository at this point in the history
  • Loading branch information
forshtat committed Aug 23, 2024
1 parent 8c2824f commit a3cce6f
Showing 1 changed file with 169 additions and 3 deletions.
172 changes: 169 additions & 3 deletions ERCS/erc-xxxx.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
eip:
title: Set of Wallet Capabilities for Account Abstraction Applications
description:
author:
description: A way for apps and Account Abstraction wallets to communicate more advanced parameters of Account Abstraction operations
author: Yoav Weiss (@yoavw), Alex Forshtat (@forshtat), Dror Tirosh (@drortirosh), Shahaf Nacson (@shahafn)
discussions-to:
status: Draft
type: Standards Track
Expand All @@ -13,17 +13,183 @@ requires: 5792, 7702

## Abstract

[EIP-5792](./eip-5792) defines a baseline JSON-RPC API for a communication between wallets and dapps.
With EIP-5792, apps and wallets can communicate about any advanced features using "capabilities" - extensions
to the base protocol that must be defined in separate documents.

This proposal defines a set of "capabilities" the wallets may want to implement in order to provide a
comprehensive support for Account Abstraction.

## Motivation

## Specification

### Shared configuration

All actions in Account Abstraction within the context of EIP-5792 must be done on a single chain and atomically.
This means all requests to the `wallet_sendCalls` methods MUST be done:

1. With the `atomicBatch` capability enabled
2. With the `chainId` set to the same value in all calls

### Static Paymaster Configuration Capability

Note that use of Paymasters managed by a "paymaster web service" is described in [ERC-7677](./eip-7677).

Identifier:

`staticPaymasterConfiguration`

Interface:

```typescript
type StaticPaymasterConfigurationCapabilityParams = Record<
`0x${string}`, // Chain ID
{
paymaster: string;
paymasterData: string;
paymasterValidationGasLimit: `0x${string}`;
paymasterPostOpGasLimit: `0x${string}`;
}
>;
```

### On-chain Query Paymaster Configuration Capability

Identifier:

`onChainQueryPaymasterConfiguration`

Interface:

```typescript
type OnChainQueryPaymasterConfigurationCapabilityParams = Record<
`0x${string}`, // Chain ID
{
target: `0x${string}`, // contract to query for Paymaster configuration
context: `0x${string}`, // hex-encoded byte array to pass to the configuration provider
}
>
```
We then define the following Solidity interface:
```solidity

struct PaymasterConfiguration {
address paymaster;
bytes paymasterData;
uint256 paymasterValidationGasLimit;
uint256 paymasterPostOpGasLimit;
}

interface IPaymasterConfigurationResolver {
function getPaymasterConfiguration(bytes operation, bytes context) external;
}

```

The wallet MUST perform an ABI-encoding of the entire `operation` object and make a view call
to the `getPaymasterConfiguration` function of the `target` address.

If the view call fails or returns an invalid data, the `wallet_sendCalls` method must fail and return with an error.

### Validity Time Range Capability

Identifier:

`validityTimeRange`

Interface:

```typescript
type ValidityTimeRangeCapabilityParams = Record<
`0x${string}`, // Chain ID
{
validAfter: `0x${string}`, // operation valid only after this timestamp, in seconds
validUntil: `0x${string}` // operation valid only before this timestamp, in seconds
}
>
```
The wallet must then verify the time range [`validAfter`..`validUntil`] is valid and present it to the
user in a human-readable way for confirmation as part of the transaction information.
### Multidimensional Nonce Capability
### Account Abstraction Gas Limit Override Capability
Identifier:
`multiDimensionalNonce`
Interface:
```typescript
type MultiDimensionalNonceCapabilityParams = Record<
`0x${string}`, // Chain ID
{
nonceKey: `0x${string}`,
nonceSequence: `0x${string}`
}
>
```
For Smart Contract Accounts that support multidimensional nonce values,
the wallet must specify these parameters during the actual on-chain execution of the batch.
### Account Abstraction Gas Parameters Override Capability
Identifier:
`accountAbstractionGasParamsOverride`
Interface:
```typescript
type AAGasParamsOverrideCapabilityParams = Record<
`0x${string}`, // Chain ID
{
preVerificationGas?: `0x${string}`,
verificationGasLimit?: `0x${string}`,
callGasLimit?: `0x${string}`,
paymasterVerificationGasLimit?: `0x${string}`,
paymasterPostOpGasLimit?: `0x${string}`,
maxFeePerGas?: `0x${string}`,
maxPriorityFeePerGas?: `0x${string}`
}
>
```
Notice that all fields in the `AAGasParamsOverrideCapabilityParams` are optional.
Only the values that callers want to override must be provided.
In case `paymasterVerificationGasLimit` or `paymasterPostOpGasLimit` are provided,
wallets should warn the users about this happening but use these values instead of
the ones generated by any other capability.
Wallets may choose to reject such configurations or request the user input in this case.
Such a combination of features is only expected to be used in development and is very risky to use in production.
### Set Externally Owned Account Code Capability
This capability is designed to use with [EIP-7702](./eip-7702) transactions.
Identifier:
`setCodeForEOA`
Interface:
```typescript
type SetCodeForEOACapabilityParams = Record<
`0x${string}`, // Chain ID
{
codeAddress: `0x${string}`, // implementation code address
}
>
```
Wallets should generate an EIP-7702 compatible transaction that sets a code of a `from` EOA address
to the code of `codeAddress` specified in the request.
## Rationale
## Reference Implementation
Expand Down

0 comments on commit a3cce6f

Please sign in to comment.