Skip to content

Commit

Permalink
Merge branch 'main' into amie/spender-eoa
Browse files Browse the repository at this point in the history
  • Loading branch information
ilikesymmetry authored Nov 8, 2024
2 parents 63354ff + 53b6d5a commit a79727a
Show file tree
Hide file tree
Showing 4 changed files with 196 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Client resources

Recommended libraries for handling blockchain and wallet interactions. The example project in the [Quick Start](/guides/spend-permissions/quick-start.mdx) guide uses all three of these.

### Using Viem

[Viem](https://viem.sh/) is a TypeScript interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum.

- **[Getting Started with Viem](https://viem.sh/docs/getting-started.html)**

- **[Getting Started with Account Abstraction](https://viem.sh/account-abstraction#getting-started-with-account-abstraction)**
Viem provides support for account abstraction clients, including specific support for Coinbase Smart Wallet and paymasters.

### Using Wagmi

[Wagmi](https://wagmi.sh/) is a collection of React Hooks that facilitate development of blockchain frontends.

- **[Getting Started with Wagmi](https://wagmi.sh/react/getting-started)**
- **[coinbaseWallet](https://wagmi.sh/react/api/connectors/coinbaseWallet)**

### Using OnchainKit

[OnchainKit](https://onchainkit.xyz/) is a collection of React components and TypeScript utilities that help developers quickly build
onchain applications.
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# `SpendPermissionManager.sol` smart contract

The open-source contracts repository is [here](https://github.com/coinbase/spend-permissions).

### Structs

#### `SpendPermission`

Defines the complete parameters of a spend permission.

| Field | Type | Description |
| ----------- | --------- | ------------------------------------------------------------------------------------------ |
| `account` | `address` | Smart account this spend permission is valid for. |
| `spender` | `address` | Entity that can spend `account`'s tokens. |
| `token` | `address` | Token address (ERC-7528 native token address or ERC-20 contract). |
| `allowance` | `uint160` | Maximum allowed value to spend within each `period`. |
| `period` | `uint48` | Time duration for resetting used `allowance` on a recurring basis (seconds). |
| `start` | `uint48` | Timestamp this spend permission is valid starting at (unix seconds). |
| `end` | `uint48` | Timestamp this spend permission is valid until (unix seconds). |
| `salt` | `uint256` | An arbitrary salt to differentiate unique spend permissions with otherwise identical data. |
| `extraData` | `bytes` | Arbitrary data to include in the permission. |

#### `PeriodSpend`

Describes the cumulative spend for the current active period.

| Field | Type | Description |
| ------- | --------- | ---------------------------------------- |
| `start` | `uint48` | Start time of the period (unix seconds). |
| `end` | `uint48` | End time of the period (unix seconds). |
| `spend` | `uint160` | Accumulated spend amount for period. |

---

### Contract functions

#### `approve`

Approve a spend permission via a direct call from the `account`. Only callable by the `account` specified in the spend permission.

```solidity
function approve(SpendPermission calldata spendPermission) external;
```

---

#### `approveWithSignature`

Approve a spend permission via a signature from the `account` owner. Compatible with [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492) signatures for automatic account creation if needed.

```solidity
function approveWithSignature(SpendPermission calldata spendPermission, bytes calldata signature) external;
```

---

#### `spend`

Spend tokens using a spend permission, transferring them from the `account` to the `spender`. Only callable by the `spender` specified in the permission.

```solidity
function spend(SpendPermission memory spendPermission, uint160 value) external;
```

---

#### `revoke`

Revoke a spend permission, permanently disabling its use. Only callable by the `account` owner specified in the spend permission.

```solidity
function revoke(SpendPermission calldata spendPermission) external;
```

---

#### `getHash`

Generate a hash of a `SpendPermission` struct for signing, in accordance with [EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md).

```solidity
function getHash(SpendPermission memory spendPermission) public view returns (bytes32);
```

---

#### `isApproved`

Check if a spend permission is approved and not revoked, regardless of whether the current time is within the valid time range of the permission.

```solidity
function isApproved(SpendPermission memory spendPermission) public view returns (bool);
```

---

#### `getCurrentPeriod`

Retrieve the `start`, `end`, and accumulated `spend` for the current period of a spend permission.
Reverts if the current time is outside the valid time range of the permission, but does not validate whether the
spend permission has been approved or revoked.

```solidity
function getCurrentPeriod(SpendPermission memory spendPermission) public view returns (PeriodSpend memory);
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
## Coinbase Wallet API

### `wallet_fetchPermissions`

A utility API endpoint for recalling permissions previously granted for a specific user.
Excludes permissions that have expired or been revoked.

#### Schema

**Endpoint:** `https://chain-proxy.wallet.coinbase.com?targetName=base-sepolia`.

```typescript
type FetchPermissionsRequest = {
chainId: string; // hex, uint256
account: string; // address
spender: string; // address
pageOptions?: {
pageSize number; // number of items requested, defaults to 50
cursor string; // identifier for where the page should start
}
}

type FetchPermissionsResult = {
permissions: FetchPermissionsResultItem[];
pageDescription: {
pageSize number; // number of items returned
nextCursor string; // identifier for where the next page should start
}
}

type FetchPermissionsResultItem = {
createdAt: number; // UTC timestamp for when the permission was granted
permissionHash: string; // hex
signature: string; // hex
permission: {
account: string; // address
spender: string; // address
token: string; // address
allowance: string; // base 10 numeric string
period: number; // unix seconds
start: number; // unix seconds
end: number; // unix seconds
salt: string; // base 10 numeric string
extraData: string // hex
};
}
```
22 changes: 20 additions & 2 deletions vocs.config.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ export default defineConfig({
},
{
text: "Spend Permissions",
collapsed: true,
items: [
{
text: "Overview",
Expand All @@ -116,6 +117,23 @@ export default defineConfig({
text: "Quick Start",
link: "/guides/spend-permissions/quick-start",
},
{
text: "API Reference",
items: [
{
text: "SpendPermissionManager Contract",
link: "/guides/spend-permissions/api-reference/spendpermissionmanager",
},
{
text: "wallet_fetchPermissions",
link: "/guides/spend-permissions/api-reference/wallet-fetchpermissions",
},
{
text: "Client Resources",
link: "/guides/spend-permissions/api-reference/client-resources",
},
],
},
],
},
{
Expand Down Expand Up @@ -172,8 +190,8 @@ export default defineConfig({
link: "https://github.com/coinbase/smart-wallet",
},
{
text: "Smart Wallet Permissions",
link: "https://github.com/coinbase/smart-wallet-permissions",
text: "Spend Permissions",
link: "https://github.com/coinbase/spend-permissions",
},
{
text: "MagicSpend",
Expand Down

0 comments on commit a79727a

Please sign in to comment.