# Assets

The Algorand Standard Asset (ASA) management functions include creating, opting in and transferring assets, which are fundamental to asset interaction in a blockchain environment.

## `AssetManager`

The `AssetManager` class provides functionality for managing Algorand Standard Assets (ASAs). It can be accessed through the `AlgorandClient` via `algorand.asset` or instantiated directly:

```
from algokit_utils import AssetManager, TransactionComposer

from algosdk.v2client import algod

asset_manager = AssetManager(

algod_client=algod_client,

new_group=lambda: TransactionComposer()

)
```

## Asset Information

The `AssetManager` provides two key data classes for asset information:

### `AssetInformation`

Contains details about an Algorand Standard Asset (ASA):

```
@dataclass

class AssetInformation:

asset_id: int  # The ID of the asset

creator: str   # Address of the creator account

total: int     # Total units created

decimals: int  # Number of decimal places

default_frozen: bool | None = None  # Whether asset is frozen by default

manager: str | None = None    # Optional manager address

reserve: str | None = None    # Optional reserve address

freeze: str | None = None     # Optional freeze address

clawback: str | None = None   # Optional clawback address

unit_name: str | None = None  # Optional unit name (e.g. ticker)

asset_name: str | None = None # Optional asset name

url: str | None = None        # Optional URL for more info

metadata_hash: bytes | None = None # Optional 32-byte metadata hash
```

### `AccountAssetInformation`

Contains information about an account’s holding of a particular asset:

```
@dataclass

class AccountAssetInformation:

asset_id: int   # The ID of the asset

balance: int    # Amount held by the account

frozen: bool    # Whether frozen for this account

round: int      # Round this info was retrieved at
```

## Bulk Operations

The `AssetManager` provides methods for bulk opt-in/opt-out operations:

### Bulk Opt-In

```
# Basic example

result = asset_manager.bulk_opt_in(

account="ACCOUNT_ADDRESS",

asset_ids=[12345, 67890]
)

# Advanced example with optional parameters

result = asset_manager.bulk_opt_in(

account="ACCOUNT_ADDRESS",

asset_ids=[12345, 67890],

signer=transaction_signer,

note=b"opt-in note",

lease=b"lease",

static_fee=AlgoAmount(1000),

extra_fee=AlgoAmount(500),

max_fee=AlgoAmount(2000),

validity_window=10,

send_params=SendParams(...)
)
```

### Bulk Opt-Out

```
# Basic example

result = asset_manager.bulk_opt_out(

account="ACCOUNT_ADDRESS",

asset_ids=[12345, 67890]
)

# Advanced example with optional parameters

result = asset_manager.bulk_opt_out(

account="ACCOUNT_ADDRESS",

asset_ids=[12345, 67890],

ensure_zero_balance=True,

signer=transaction_signer,

note=b"opt-out note",

lease=b"lease",

static_fee=AlgoAmount(1000),

extra_fee=AlgoAmount(500),

max_fee=AlgoAmount(2000),

validity_window=10,

send_params=SendParams(...)
)
```

The bulk operations return a list of `BulkAssetOptInOutResult` objects containing:

- `asset_id`: The ID of the asset opted into/out of
- `transaction_id`: The transaction ID of the opt-in/out

## Get Asset Information

### Getting Asset Parameters

You can get the current parameters of an asset from algod using `get_by_id()`:

```
asset_info = asset_manager.get_by_id(12345)
```

### Getting Account Holdings

You can get an account’s current holdings of an asset using `get_account_information()`:

```
address = "XBYLS2E6YI6XXL5BWCAMOA4GTWHXWENZMX5UHXMRNWWUQ7BXCY5WC5TEPA"

asset_id = 12345

account_info = asset_manager.get_account_information(address, asset_id)
```
