> For the complete documentation index, see [llms.txt](https://docs.r.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.r.xyz/glider-ide/api/value/value/value.backward_df.md).

# Value.backward\_df()

Returns a list of all previous instructions/arguments of the current point in the data flow graph.

`backward_df() ->` [`APISet`](/glider-ide/api/iterables/apiset.md)`[`[`Point`](/glider-ide/api/point.md)`]`

The function works similarly to [Instruction.backward\_df()](/glider-ide/api/instruction/instruction.backward_df.md); the main difference is that in case of Instruction.backward\_df() the function will return backward dataflow point for every point in the Value, while Value.backward\_df() returns only those connected with the current Value.&#x20;

Like all other dataflow (DF) functions, it returns a list/set of Points, which can be instructions or "points" in the code, such as arguments, variables, etc.

## Query Example

Consider the following Solidity function:

```solidity
function _transfer(address sender,address recipient,uint256 amount) internal virtual {
    require(sender != address(0),"ERC20: transfer from the zero address");
    require(recipient != address(0),"ERC20: transfer to the zero address");
    
    _beforeTokenTransfer(sender,recipient,amount);
    
    uint256 senderBalance = _balances[sender];
    require(senderBalance >= amount,"ERC20: transfer amount exceeds balance");
    _balances[sender] = senderBalance - amount;
    _balances[recipient] += amount;
    
    emit Transfer(sender,recipient,amount);
}
```

In this function, we want to locate the first require statement and determine the origin of the sender variable:

```solidity
require(sender != address(0),"ERC20: transfer from the zero address");
```

To do this, we first query for the instruction containing the require statement and then query for sender.

Finally, we call backward\_df() to identify where sender originates.

```python
from glider import *


def query():
    instructions = (
      Functions()
      .with_name('_transfer')
      .instructions()
      .exec(1, 1)
    )

    for instruction in instructions:
        for component in instruction.get_components():
            print(component)

            print("Value: " + component.expression)
            for point in component.backward_df():
                print(point.source_code())

    return instructions
```

## Example Output

<figure><img src="https://2237101709-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDX4Ojc4j1ef51TUAtYOx%2Fuploads%2FlYHc13vctOjSr7JnHguO%2FScreenshot%202025-09-03%20at%202.57.18%E2%80%AFPM.png?alt=media&amp;token=861af4bd-36fe-438e-b089-645f48156ef5" alt=""><figcaption></figcaption></figure>
