> ## Documentation Index
> Fetch the complete documentation index at: https://base-a060aa97-docs-sync-code-change-253bb15.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# IB20.transferFromWithMemo

> Transfers tokens on behalf of another address and emits a Memo event, with executor, sender, and receiver policy enforcement.

## Signature

```solidity IB20.sol theme={null}
function transferFromWithMemo(address from, address to, uint256 amount, bytes32 memo) external returns (bool);
```

| Field               | Value                                                   |
| ------------------- | ------------------------------------------------------- |
| Selector            | `0x929c2539`                                            |
| Canonical signature | `transferFromWithMemo(address,address,uint256,bytes32)` |

## Description

Same as `transferFrom`, plus emits `Memo` immediately after the standard `Transfer` event. A memo of `bytes32(0)` is permitted.

## Parameters

| Parameter | Description             |
| --------- | ----------------------- |
| `from`    | Source address.         |
| `to`      | Destination address.    |
| `amount`  | Amount to transfer.     |
| `memo`    | Off-chain memo payload. |

## Returns

Always `true` on success.

## Policy Interaction

`TRANSFER_EXECUTOR_POLICY` is checked against `msg.sender` on every call, including when `msg.sender == from`. Sender (`from`) and receiver (`to`) policies are also enforced. All three checks are bypassed during the factory bootstrap window; see `IB20Factory.createB20`.

<Warning>
  `TRANSFER_EXECUTOR_POLICY` now applies even when `msg.sender == from`. Tokens that have configured a restrictive executor policy will block holder-initiated transfers unless the holder is explicitly authorized as an executor.
</Warning>

## Revert Conditions

| Revert                                         | Condition                                              |
| ---------------------------------------------- | ------------------------------------------------------ |
| `ContractPaused(TRANSFER)`                     | The `TRANSFER` operation is paused.                    |
| `InvalidReceiver`                              | `to == address(0)`.                                    |
| `InvalidSender`                                | `from == address(0)`.                                  |
| `InsufficientAllowance`                        | The caller's allowance from `from` is below `amount`.  |
| `PolicyForbids(TRANSFER_EXECUTOR_POLICY, ...)` | `msg.sender` is not authorized by the executor policy. |
| `PolicyForbids(TRANSFER_SENDER_POLICY, ...)`   | `from` is not authorized by the sender policy.         |
| `PolicyForbids(TRANSFER_RECEIVER_POLICY, ...)` | `to` is not authorized by the receiver policy.         |
| `InsufficientBalance`                          | `from`'s balance is below `amount`.                    |

## Example

```solidity Usage Example theme={null}
IB20(target).transferFromWithMemo(from, to, amount, memo);
```
