Holding data in minted ASA

Is it possible to create a single ASA where all minted tokens contain unique metadata, like Ethereum’s EIP-721? For example, I have created an asset called “Counter Token”:

def create_token():
    txn = transaction.AssetCreateTxn(
        ...
        unit_name=f"CT",
        asset_name=f"Counter Token",
        url=f"https://dummy.asset/CT",
    )
    signedTxn = txn.sign(account.getPrivateKey())

    client.send_transaction(signedTxn)

    response = waitForTransaction(client, signedTxn.get_txid())
    return response.assetIndex

When a consumer calls the contract, the global counter is increase and an asset is minted that contains the counter state at that time:

   add = Seq([
       scratchCount.store(App.globalGet(Bytes("Count"))),
       App.globalPut(Bytes("Count"), scratchCount.load() + Int(1)),
       # TODO: Mint CT ASA that contains scratchCount data
       # TODO: Transfer asset to caller
       Return(Int(1))
   ])
   handle_noop = Cond(
       [And(
           Global.group_size() == Int(1),
           Txn.application_args[0] == Bytes("Add")
       ), add],
   )

Yes, the ARC-3 is the main spec for metadata of fungible and non-fungible tokens.

Note that to create a simple ASA with metadata you don’t need to write a Smart Contract. This being said, if you want to add custom features to an ASA, different from the default ones (like: incrementing a counter whenever the event X related to the ASA happens), then you need to pair the ASA with a Smart Contract.