> For the complete documentation index, see [llms.txt](https://tagomisystems.gitbook.io/tagomi-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tagomisystems.gitbook.io/tagomi-docs/cfav1forwarder.md).

# CFAv1Forwarder

The **CFAv1Forwarder** contract is a Tagomi forwarder that implements the Constant Flow Agreement (CFA) related functions. It is a contract specifically made immutable in order to facilitate the interaction with Money Streaming through the Constant Flow Agreement (CFA).

This contract is optimized for interaction that would happen from your client application. For more information on the best practices regarding this interaction, please refer to the Create, Update and Delete Flows or Manage Access Control and User Data.

### Contract Address[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#contract-address) <a href="#contract-address" id="contract-address"></a>

The `CFAv1Forwarder` contract address is the same on all networks:

```
0xcfA132E353cB4E398080B9700609bb008eceB125
```

### ABI[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#abi) <a href="#abi" id="abi"></a>

In order to interact with the `CFAv1Forwarder` contract, you can use the following ABI:

<details>

<summary>Click here to show <code>CFAv1Forwarder</code> ABI</summary>

</details>

### CFA\_FWD\_INVALID\_FLOW\_RATE[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#cfa_fwd_invalid_flow_rate) <a href="#cfa_fwd_invalid_flow_rate" id="cfa_fwd_invalid_flow_rate"></a>

```
error CFA_FWD_INVALID_FLOW_RATE()
```

### \_cfa[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#_cfa) <a href="#cfa" id="cfa"></a>

```
contract IConstantFlowAgreementV1 _cfa
```

### Fn constructor[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-constructor) <a href="#fn-constructor" id="fn-constructor"></a>

```
function constructor(
    contract ITagomi host
)
    public
```

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters)

| Name   | Type             | Description |
| ------ | ---------------- | ----------- |
| `host` | contract ITagomi |             |

### Fn setFlowrate[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-setflowrate) <a href="#fn-setflowrate" id="fn-setflowrate"></a>

#### setFlowrate() write

Try it out

```
function setFlowrate(address token, address receiver, int96 flowrate) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-1)

| Name       | Type                 | Description                                                             |
| ---------- | -------------------- | ----------------------------------------------------------------------- |
| `token`    | contract ISuperToken | Super token address                                                     |
| `receiver` | address              | The receiver of the flow                                                |
| `flowrate` | int96                | The wanted flowrate in wad/second. Only positive values are valid here. |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values)

| Name  | Type | Description |
| ----- | ---- | ----------- |
| `[0]` | bool | bool        |

Sets the given flowrate between msg.sender and a given receiver. If there's no pre-existing flow and `flowrate` non-zero, a new flow is created. If there's an existing flow and `flowrate` non-zero, the flowrate of that flow is updated. If there's an existing flow and `flowrate` zero, the flow is deleted. If the existing and given flowrate are equal, no action is taken. On creation of a flow, a "buffer" amount is automatically detracted from the sender account's available balance. If the sender account is solvent when the flow is deleted, this buffer is redeemed to it.

### Fn setFlowrateFrom[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-setflowratefrom) <a href="#fn-setflowratefrom" id="fn-setflowratefrom"></a>

#### setFlowrateFrom() write

Try it out

```
function setFlowrateFrom(
  address token, 
  address sender, 
  address receiver, 
  int96 flowrate
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-2)

| Name       | Type                 | Description                                                             |
| ---------- | -------------------- | ----------------------------------------------------------------------- |
| `token`    | contract ISuperToken | Super token address                                                     |
| `sender`   | address              | The sender of the flow                                                  |
| `receiver` | address              | The receiver of the flow                                                |
| `flowrate` | int96                | The wanted flowrate in wad/second. Only positive values are valid here. |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-1)

| Name  | Type | Description |
| ----- | ---- | ----------- |
| `[0]` | bool | bool        |

Like `setFlowrate`, but can be invoked by an account with flowOperator permissions on behalf of the sender account.

### Fn getFlowrate[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-getflowrate) <a href="#fn-getflowrate" id="fn-getflowrate"></a>

#### getFlowrate() read

Try it out

```
function getFlowrate(address token, address sender, address receiver) view returns (int96 flowrate)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

*Currently, only 0 or 1 flows can exist between 2 accounts. This may change in the future.*

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-3)

| Name       | Type                 | Description              |
| ---------- | -------------------- | ------------------------ |
| `token`    | contract ISuperToken | Super token address      |
| `sender`   | address              | The sender of the flow   |
| `receiver` | address              | The receiver of the flow |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-2)

| Name       | Type  | Description                                                                        |
| ---------- | ----- | ---------------------------------------------------------------------------------- |
| `flowrate` | int96 | The flowrate from the sender to the receiver account. Returns 0 if no flow exists. |

Get the flowrate of the flow between 2 accounts if exists.

### Fn getFlowInfo[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-getflowinfo) <a href="#fn-getflowinfo" id="fn-getflowinfo"></a>

#### getFlowInfo() read

Try it out

```
function getFlowInfo(address token, address sender, address receiver) view returns (
  uint256 lastUpdated, 
  int96 flowrate, 
  uint256 deposit, 
  uint256 owedDeposit
)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-4)

| Name       | Type                 | Description              |
| ---------- | -------------------- | ------------------------ |
| `token`    | contract ISuperToken | Super token address      |
| `sender`   | address              | The sender of the flow   |
| `receiver` | address              | The receiver of the flow |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-3)

| Name          | Type    | Description                                                              |
| ------------- | ------- | ------------------------------------------------------------------------ |
| `lastUpdated` | uint256 | Timestamp of last update (flowrate change) or zero if no flow exists     |
| `flowrate`    | int96   | Current flowrate of the flow or zero if no flow exists                   |
| `deposit`     | uint256 | Deposit amount locked as security buffer during the lifetime of the flow |
| `owedDeposit` | uint256 | Extra deposit amount borrowed to a SuperApp receiver by the flow sender  |

Get all available information about a flow (if exists). If only the flowrate is needed, consider using `getFlowrate` instead.

### Fn getBufferAmountByFlowrate[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-getbufferamountbyflowrate) <a href="#fn-getbufferamountbyflowrate" id="fn-getbufferamountbyflowrate"></a>

```
function getBufferAmountByFlowrate(
    contract ISuperToken token,
    int96 flowrate
)
    external
    returns (uint256 bufferAmount)
```

#### getBufferAmountByFlowrate() read

Try it out

```
function getBufferAmountByFlowrate(address token, int96 flowrate) view returns (uint256 bufferAmount)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-5)

| Name       | Type                 | Description                                            |
| ---------- | -------------------- | ------------------------------------------------------ |
| `token`    | contract ISuperToken | Super token address                                    |
| `flowrate` | int96                | The flowrate for which the buffer amount is calculated |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-4)

| Name           | Type    | Description                                             |
| -------------- | ------- | ------------------------------------------------------- |
| `bufferAmount` | uint256 | The buffer amount required for the given configuration. |

Get the buffer amount required for the given token and flowrate. This amount can vary based on the combination of token, flowrate and chain being queried. The result for a given set of parameters can change over time, because it depends on governance configurable protocol parameters. Changes of the required buffer amount affect only flows created or updated after the change.

### Fn getAccountFlowrate[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-getaccountflowrate) <a href="#fn-getaccountflowrate" id="fn-getaccountflowrate"></a>

#### getAccountFlowrate() read

Try it out

```
function getAccountFlowrate(address token, address account) view returns (int96 flowrate)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-6)

| Name      | Type                 | Description         |
| --------- | -------------------- | ------------------- |
| `token`   | contract ISuperToken | Super token address |
| `account` | address              | Account to query    |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-5)

| Name       | Type  | Description                                                                               |
| ---------- | ----- | ----------------------------------------------------------------------------------------- |
| `flowrate` | int96 | The net flowrate (aggregate incoming minus aggregate outgoing flowrate), can be negative. |

Get the net flowrate of an account.

### Fn getAccountFlowInfo[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-getaccountflowinfo) <a href="#fn-getaccountflowinfo" id="fn-getaccountflowinfo"></a>

#### getAccountFlowInfo() read

Try it out

```
function getAccountFlowInfo(address token, address account) view returns (
  uint256 lastUpdated, 
  int96 flowrate, 
  uint256 deposit, 
  uint256 owedDeposit
)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-7)

| Name      | Type                 | Description         |
| --------- | -------------------- | ------------------- |
| `token`   | contract ISuperToken | Super token address |
| `account` | address              | Account to query    |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-6)

| Name          | Type    | Description                                                                                |
| ------------- | ------- | ------------------------------------------------------------------------------------------ |
| `lastUpdated` | uint256 | Timestamp of last update of a flow to or from the account (flowrate change)                |
| `flowrate`    | int96   | Current net aggregate flowrate                                                             |
| `deposit`     | uint256 | Aggregate deposit amount currently locked as security buffer for outgoing flows            |
| `owedDeposit` | uint256 | Aggregate extra deposit amount currently borrowed to SuperApps receiving from this account |

Get aggregated flow information (if any exist) of an account. If only the net flowrate is needed, consider using `getAccountFlowrate` instead.

### Fn createFlow[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-createflow) <a href="#fn-createflow" id="fn-createflow"></a>

#### createFlow() write

Try it out

```
function createFlow(
  address token, 
  address sender, 
  address receiver, 
  int96 flowrate, 
  bytes userData
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-8)

| Name       | Type                 | Description                                                          |
| ---------- | -------------------- | -------------------------------------------------------------------- |
| `token`    | contract ISuperToken | Super token address                                                  |
| `sender`   | address              | Sender address of the flow                                           |
| `receiver` | address              | Receiver address of the flow                                         |
| `flowrate` | int96                | The flowrate in wad/second to be set initially                       |
| `userData` | bytes                | (optional) User data to be set. Should be set to zero if not needed. |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-7)

| Name  | Type | Description |
| ----- | ---- | ----------- |
| `[0]` | bool | bool        |

Low-level wrapper of createFlow/createFlowByOperator. If the address of msg.sender is not the same as the address of the `sender` argument, createFlowByOperator is used internally. In this case msg.sender needs to have permission to create flows on behalf of the given sender account with sufficient flowRateAllowance. Currently, only 1 flow can exist between 2 accounts, thus `createFlow` will fail if one already exists.

### Fn updateFlow[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-updateflow) <a href="#fn-updateflow" id="fn-updateflow"></a>

#### updateFlow() write

Try it out

```
function updateFlow(
  address token, 
  address sender, 
  address receiver, 
  int96 flowrate, 
  bytes userData
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-9)

| Name       | Type                 | Description                                                          |
| ---------- | -------------------- | -------------------------------------------------------------------- |
| `token`    | contract ISuperToken | Super token address                                                  |
| `sender`   | address              | Sender address of the flow                                           |
| `receiver` | address              | Receiver address of the flow                                         |
| `flowrate` | int96                | The flowrate in wad/second the flow should be updated to             |
| `userData` | bytes                | (optional) User data to be set. Should be set to zero if not needed. |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-8)

| Name  | Type | Description |
| ----- | ---- | ----------- |
| `[0]` | bool | bool        |

Low-level wrapper if updateFlow/updateFlowByOperator. If the address of msg.sender doesn't match the address of the `sender` argument, updateFlowByOperator is invoked. In this case msg.sender needs to have permission to update flows on behalf of the given sender account with sufficient flowRateAllowance.

### Fn deleteFlow[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-deleteflow) <a href="#fn-deleteflow" id="fn-deleteflow"></a>

#### deleteFlow() write

Try it out

```
function deleteFlow(
  address token, 
  address sender, 
  address receiver, 
  bytes userData
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-10)

| Name       | Type                 | Description                                                          |
| ---------- | -------------------- | -------------------------------------------------------------------- |
| `token`    | contract ISuperToken | Super token address                                                  |
| `sender`   | address              | Sender address of the flow                                           |
| `receiver` | address              | Receiver address of the flow                                         |
| `userData` | bytes                | (optional) User data to be set. Should be set to zero if not needed. |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-9)

| Name  | Type | Description |
| ----- | ---- | ----------- |
| `[0]` | bool | bool        |

Low-level wrapper of deleteFlow/deleteFlowByOperator. If msg.sender isn't the same as sender address, msg.sender needs to have permission to delete flows on behalf of the given sender account.

### Fn grantPermissions[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-grantpermissions) <a href="#fn-grantpermissions" id="fn-grantpermissions"></a>

#### grantPermissions() write

Try it out

```
function grantPermissions(address token, address flowOperator) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-11)

| Name           | Type                 | Description                              |
| -------------- | -------------------- | ---------------------------------------- |
| `token`        | contract ISuperToken | Super token address                      |
| `flowOperator` | address              | Account to which permissions are granted |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-10)

| Name  | Type | Description |
| ----- | ---- | ----------- |
| `[0]` | bool | bool        |

Grants a flowOperator permission to create/update/delete flows on behalf of msg.sender. In order to restrict what a flowOperator can or can't do, the flowOperator account should be a contract implementing the desired restrictions.

### Fn revokePermissions[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-revokepermissions) <a href="#fn-revokepermissions" id="fn-revokepermissions"></a>

#### revokePermissions() write

Try it out

```
function revokePermissions(address token, address flowOperator) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-12)

| Name           | Type                 | Description                                |
| -------------- | -------------------- | ------------------------------------------ |
| `token`        | contract ISuperToken | Super token address                        |
| `flowOperator` | address              | Account from which permissions are revoked |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-11)

| Name  | Type | Description |
| ----- | ---- | ----------- |
| `[0]` | bool | bool        |

Revokes all permissions previously granted to a flowOperator by msg.sender. Revocation doesn't undo or reset flows previously created/updated by the flowOperator. In order to be sure about the state of flows at the time of revocation, you need to check that state either in the same transaction or after this transaction.

### Fn updateFlowOperatorPermissions[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-updateflowoperatorpermissions) <a href="#fn-updateflowoperatorpermissions" id="fn-updateflowoperatorpermissions"></a>

#### updateFlowOperatorPermissions() write

Try it out

```
function updateFlowOperatorPermissions(
  address token, 
  address flowOperator, 
  uint8 permissions, 
  int96 flowrateAllowance
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-13)

| Name                | Type                 | Description                                                                              |
| ------------------- | -------------------- | ---------------------------------------------------------------------------------------- |
| `token`             | contract ISuperToken | Super token address                                                                      |
| `flowOperator`      | address              | Account for which permissions are set on behalf of msg.sender                            |
| `permissions`       | uint8                | Bitmask for create/update/delete permission flags. See library `FlowOperatorDefinitions` |
| `flowrateAllowance` | int96                | Max. flowrate in wad/second the operator can set for individual flows.                   |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-12)

| Name  | Type | Description |
| ----- | ---- | ----------- |
| `[0]` | bool | bool        |

Low-level wrapper of `IConstantFlowAgreementV1.updateFlowOperatorPermissions` flowrateAllowance does NOT restrict the net flowrate a flowOperator is able to set. In order to restrict that, flowOperator needs to be a contract implementing the wanted limitations.

### Fn getFlowOperatorPermissions[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-getflowoperatorpermissions) <a href="#fn-getflowoperatorpermissions" id="fn-getflowoperatorpermissions"></a>

#### getFlowOperatorPermissions() read

Try it out

```
function getFlowOperatorPermissions(address token, address sender, address flowOperator) view returns (uint8 permissions, int96 flowrateAllowance)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-14)

| Name           | Type                 | Description                                          |
| -------------- | -------------------- | ---------------------------------------------------- |
| `token`        | contract ISuperToken | Super token address                                  |
| `sender`       | address              | The account which (possiby) granted permissions      |
| `flowOperator` | address              | Account to which (possibly) permissions were granted |

**Return Values**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#return-values-13)

| Name                | Type  | Description                                                                           |
| ------------------- | ----- | ------------------------------------------------------------------------------------- |
| `permissions`       | uint8 | A bitmask of the permissions currently granted (or not) by `sender` to `flowOperator` |
| `flowrateAllowance` | int96 | Max. flowrate in wad/second the flowOperator can set for individual flows.            |

Get the currently set permissions granted to the given flowOperator by the given sender account.

### Fn \_setFlowrateFrom[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-_setflowratefrom) <a href="#fn-_setflowratefrom" id="fn-_setflowratefrom"></a>

#### setFlowrateFrom() write

Try it out

```
function setFlowrateFrom(
  address token, 
  address sender, 
  address receiver, 
  int96 flowrate
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-15)

| Name       | Type                 | Description |
| ---------- | -------------------- | ----------- |
| `token`    | contract ISuperToken |             |
| `sender`   | address              |             |
| `receiver` | address              |             |
| `flowrate` | int96                |             |

### Fn \_createFlow[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-_createflow) <a href="#fn-_createflow" id="fn-_createflow"></a>

#### createFlow() write

Try it out

```
function createFlow(
  address token, 
  address sender, 
  address receiver, 
  int96 flowrate, 
  bytes userData
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-16)

| Name       | Type                 | Description |
| ---------- | -------------------- | ----------- |
| `token`    | contract ISuperToken |             |
| `sender`   | address              |             |
| `receiver` | address              |             |
| `flowrate` | int96                |             |
| `userData` | bytes                |             |

### Fn \_updateFlow[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-_updateflow) <a href="#fn-_updateflow" id="fn-_updateflow"></a>

#### updateFlow() write

Try it out

```
function updateFlow(
  address token, 
  address sender, 
  address receiver, 
  int96 flowrate, 
  bytes userData
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-17)

| Name       | Type                 | Description |
| ---------- | -------------------- | ----------- |
| `token`    | contract ISuperToken |             |
| `sender`   | address              |             |
| `receiver` | address              |             |
| `flowrate` | int96                |             |
| `userData` | bytes                |             |

### Fn \_deleteFlow[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-_deleteflow) <a href="#fn-_deleteflow" id="fn-_deleteflow"></a>

#### deleteFlow() write

Try it out

```
function deleteFlow(
  address token, 
  address sender, 
  address receiver, 
  bytes userData
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-18)

| Name       | Type                 | Description |
| ---------- | -------------------- | ----------- |
| `token`    | contract ISuperToken |             |
| `sender`   | address              |             |
| `receiver` | address              |             |
| `userData` | bytes                |             |

### Fn \_updateFlowOperatorPermissions[​](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#fn-_updateflowoperatorpermissions) <a href="#fn-_updateflowoperatorpermissions" id="fn-_updateflowoperatorpermissions"></a>

#### updateFlowOperatorPermissions() write

Try it out

```
function updateFlowOperatorPermissions(
  address token, 
  address flowOperator, 
  uint8 permissions, 
  int96 flowrateAllowance
) nonpayable returns (bool)
```

[powered by](https://bonadocs.com/)[Learn more](https://bonadocs.com/)

**Parameters**[**​**](https://docs.superfluid.finance/docs/technical-reference/CFAv1Forwarder#parameters-19)

<br>

| Name                | Type                 | Description |
| ------------------- | -------------------- | ----------- |
| `token`             | contract ISuperToken |             |
| `flowOperator`      | address              |             |
| `permissions`       | uint8                |             |
| `flowrateAllowance` | int96                |             |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://tagomisystems.gitbook.io/tagomi-docs/cfav1forwarder.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `build a script that syncs our docs to a CMS` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
