# transfer

Implementation of FA2 interface method, more info about FA2 transfer you can read in the link below.

{% embed url="<https://gitlab.com/tezos/tzip/-/blob/master/proposals/tzip-12/tzip-12.md#transfer>" %}
TZIP-12: FA2 - Multi-Asset Interface&#x20;
{% endembed %}

### Types

{% code title="yToken/fa2Types.ligo" %}

```pascaligo
type tokenId is nat

type transferDestination is [@layout:comb] record [
  to_                   : address;
  token_id              : tokenId;
  amount                : nat;
]

type transferParam is [@layout:comb] record [
  from_                 : address;
  txs                   : list(transferDestination);
]

type transferParams is list(transferParam)
```

{% endcode %}

<table><thead><tr><th width="179.33333333333331" align="center">Parameter</th><th align="center">Type</th><th>Description</th></tr></thead><tbody><tr><td align="center">from_</td><td align="center">address</td><td>account transfer tokens from</td></tr><tr><td align="center">amount</td><td align="center">nat</td><td>amount of tokens</td></tr><tr><td align="center">to_</td><td align="center">address</td><td>account transfer tokens to</td></tr><tr><td align="center">token_id</td><td align="center">nat</td><td>token identifier</td></tr></tbody></table>

### Usage

{% tabs %}
{% tab title="🌮 Taquito" %}

```typescript
const tokenId = 0; // or new BigNumber(0) or "0"
const alice = "tz1..."
const bob = "tz2..."
const yupana = await tezos.contract.at(yTokenAddress);
const operation = await yupana.methods.transfer([
        {
          from_: alice,
          txs: [
            { to_: bob, token_id: tokenId, amount: 0 },
            { to_: alice, token_id: tokenId, amount: 6_000 },
          ],
        },
      ]).send();
await operation.confirmation();
```

{% endtab %}

{% tab title="🐍   Pytezos" %}

```python
token_id = 0
alice = "tz1..."
bob = "tz2..."
yupana = ContractInterface.from_michelson(code) # or client.contract(contract_address)...
call = yupana.transfer([{ "from_" : alice,
        "txs" : [
            {
                "amount": 0,
                "to_": bob,
                "token_id": token_id
            },
            {
                "amount": 6_000,
                "to_": alice,
                "token_id": token_id
            }
        ]
    }])
opg = call.inject()

```

{% endtab %}
{% endtabs %}

### Errors

* `FA2_NOT_OPERATOR` - `sender` is not `operator` of `from_` account.
* `yToken/token-taken-as-collateral` - when user entered market ([entermarket](https://yupana-finance.gitbook.io/yupana-document-portal/developer-space/ytoken-contract-methods/lending-methods/entermarket "mention")) for this token.
* `FA2_TOKEN_UNDEFINED` - token identifier is not assigned to any known tokens.
* `FA2_INSUFFICIENT_BALANCE` - when transfer `amount` greater than account `from_` balance (also `underflow/srcBalance` make the same check but `underflow` is unreachable)
