# UnifiERC20.sol

**Primary Uses -** UnifiERC20.sol essentially ports the properties of BEP-20 tokens on to Unifi LP Tokens, or uTokens. An example of this in practice would be the 'approve' transaction.

## uTrade V2 UnifiERC20 Code / Interfaces

|                                             |                                                                                                                          |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| uTrade V2 UnifiERC20 (Solidity)             | [BscScan Verified Pair](https://bscscan.com/address/0x76AE2c33bcce5A45128eF2060C6280a452568396#code#F3#L1) (UNIFI / BNB) |
| uTrade V2 UnifiERC20 Interface as JSON      | Link Here                                                                                                                |
| uTrade V2 UnifiERC20 as Typescript          | Link Here                                                                                                                |
| Import statement codeblock (when available) |                                                                                                                          |

## uTrade V2 UnifiERC20 Contract Addresses

Each uTrade V2 Liquidity Pool uses the uTrade V2 ERC20 Interface in the contract. An example would be `0x76AE2c33bcce5A45128eF2060C6280a452568396` ([Link](https://bscscan.com/address/0x76AE2c33bcce5A45128eF2060C6280a452568396)) for the UNIFI / BNB pair.&#x20;

## Events

### Approval

```
event Approval(address indexed owner, address indexed spender, uint value);
```

The `Approval` event is emitted anytime an `approve` or `permit` function is called.

### Transfer

```
event Transfer(address indexed from, address indexed to, uint value);
```

The `Transfer` event is emitted anytime a transfer of LP tokens occurs, by the `transfer`, `transferFrom`, `mint`, or `burn` functions.

## Read-Only Functions

### name

```
function name() external pure returns (string memory);
```

The `name` function will return "Unifi LPs" for all liquidity pool contracts.

### symbol

```
function symbol() external pure returns (string memory);
```

The `symbol` function will return "Unifi-LP" for all liquidity pool contracts.

### decimals

```
function decimals() external pure returns (uint8);
```

The `decimals` function returns "18" as a uint8 value, which is the precision for each uToken on uTrade V2.

### totalSupply

```
function totalSupply() external view returns (uint);
```

The `totalSupply` function returns the total amount uTokens for a pair.

### balanceOf

```
function balanceOf(address owner) external view returns (uint);
```

The `balanceOf` function returns the balance of uTokens for the provided address.

### allowance

```
function allowance(address owner, address spender) external view returns (uint);
```

The `allowance` function returns the amount of tokens an address is approved to transfer when using the `transferFrom` function.

### DOMAIN\_SEPARATOR

```
function DOMAIN_SEPARATOR() external view returns (bytes32);
```

The `DOMAIN_SEPARATOR` function is used in the `permit` function, and is one of the components that allows transactions to get through without a prior approve transaction. Calling a read function returns the bytes32 data that is required for use in `permit` function.

### PERMIT\_TYPEHASH

```
function PERMIT_TYPEHASH() external view returns (bytes32);
```

The `PERMIT_TYPEHASH` function is used in the `permit` function, and is one of the components that allows transactions to get through without a prior approve transaction. Calling a read function returns the bytes32 data that is required for use in the `permit` function.

### nonces

```
function nonces(address owner) external view returns (uint);
```

The `nonces` function is used in the permit function. It returns the current nonce of the *address* provided.

## State-Changing Functions

### approve

```
function approve(address spender, uint value) external returns (bool);
```

The `approve` function sets a *value* for  the amount of LP tokens the *address* provided is allowed to transfer. Returns a boolean value and emits the `Approval` event.

### transfer

```
function transfer(address to, uint value) external returns (bool);
```

The `transfer` function lets an address send uTokens from one address to another, and returns a boolean value and emits a `Transfer` event.

### transferFrom

```
function transferFrom(address from, address to, uint value) external returns (bool);
```

The `transferFrom` function sends uTokens from one address to another. This requires the sending address to have approval to send uTokens. Returns a boolean value and emits a `Transfer`event.

### permit

```
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
```

The permit function allows a sender to use a signature in lieu of an approval transaction, and sets the allowance for an address to send.

#### Function Parameter Breakdown

| Parameter  | Type    | Description                                                                                                                                    |
| ---------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| *owner*    | address | The owner of the address.                                                                                                                      |
| *spender*  | address | The spender of the uTokens.                                                                                                                    |
| *value*    | uint    | The amount of uTokens to be transferred.                                                                                                       |
| *deadline* | uint    | The UNIX timestamp for which this transaction must be completed. If the transaction is mined after this deadline, the transaction will revert. |
| *v*        | uint8   | The v value of the permit. This is one of the three values that makes up the approval signature.                                               |
| *r*        | bytes32 | The r value of the permit. This is one of the three values that makes up the approval signature.                                               |
| *s*        | bytes32 | The s value of the permit. This is one of the three values that makes up the approval signature.                                               |

## Interface Code

```
interface IUnifiERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}
```


---

# Agent Instructions: 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 current page URL with the `ask` query parameter:

```
GET https://docs.unifiprotocol.com/utrade-v2/binance-smart-chain/unifierc20.sol.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
