> ## Documentation Index
> Fetch the complete documentation index at: https://docs.therootnetwork.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Asset Register Transaction

> Transactions are made to the Asset Register using a messaging standard designed to be human readable and familiar to blockchain users using the Ethereum message standard.

## Asset Register Transaction Message

To make changes to the asset register you must make transactions using signed Ethereum messages. An Asset Register Transaction Message (ARTM) can be generated using the [ARTM SDK](https://www.npmjs.com/package/@futureverse/artm) and looks like this:

```bash
Asset Registry transaction

An update is being made to your inventory

Operations:

asset-link delete
- equipWith_asmBrain
- did:fv-asset:1:evm:0x6bca6de2dbdc4e0d41f7273011785ea16ba47182:1000
- did:fv-asset:1:evm:0x1ea66a857de297471bc12dd12d93853ff6617284:20
end

asset-link create
- equipWith_asmBrain
- did:fv-asset:1:evm:0x6bca6de2dbdc4e0d41f7273011785ea16ba47182:1000
- did:fv-asset:1:evm:0x1ea66a857de297471bc12dd12d93853ff6617284:21
end

asset-link create
- http://schema.futureverse.com/tnl#equipWith_gloves
- did:fv-asset:1:evm:0x6bca6de2dbdc4e0d41f7273011785ea16ba47182:1000
- did:fv-asset:1:root:0x1ea66a857de297471bc12dd12d93853ff6617284:21
end

delegate delete
- 0x6bca6de2dbdc4e0d41f7273011785ea16ba47182 (FPPass address - account 1)
- 0x6bca6de2dbdc4e0d41f7273011785ea16ba47183 (FPPass address - account 2)
end

ownership update
- did:fv-asset:1:evm:0x6bca6de2dbdc4e0d41f7273011785ea16ba47182:1000
- 0x6bca6de2dbdc4e0d41f7273011785ea16ba47182
end

asset-link create
- equipwith_hairStyle
- did:fv-asset:1:evm:0x6bca6de2dbdc4e0d41f7273011785ea16ba47182:1000
- did:fv-asset:off-chain:0x6bca6de2dbdc4e0d41f7273011785ea16ba47182:1234
end

Operations END

Address: 0x854A3E045Ac44a7f4A1726AdAC576029135DFdA7
Nonce:1
```

### ARTM Creation

#### React - useGetARTM

````tsx
import { useGetARTM } from '@futureverse/asset-registry-react'

const Page = () => {
  const { data: artm } = useGetARTM({
    address: signer.address,
    operations,
  })

  // use artm elsewhere in the component
}


The `artm` object is defined in  [ARTM SDK](https://www.npmjs.com/package/@futureverse/artm). Therefore, signing can be done manually and then sent to the Asset Register API using the [Asset Mutation](asset-register-transaction#asset-mutation-graphql-mutation), or it can be used with the [useAssetMutation](asset-register-transaction#react-useassetmutation) hook directly.

#### Library - ARTM SDK

Under the hood, the React library uses the [ARTM SDK](broken-reference). This library is specifically built to enable the creation, signing, and validation of ARTMs. Creating an ARTM message is described in detail on the [NPM page](https://www.npmjs.com/package/@futureverse/artm).

## Nonce

Like a traditional blockchain, the Asset Register uses nonces to prevent replay attacks. The nonce for a chain address can be queried using the Asset Register API as follows:

```graphql
query GetNonce($input: NonceInput!) {
  getNonceForChainAddress(input: $input)
}
````

```json
{
  "input": {
    "chainAddress": "0xc07Bdbf297Caa9488D194835298eE7037C861143"
  }
}
```

## Submitting Transactions

### React - useSubmitTransaction

```typescript
import { useAssetMutationMutation, useGetARTM } from '@futureverse/asset-registry-react'

const Page = () => {
  const { data: artm } = useGetARTM({
    address: signer.address,
    operations,
  })
  
  const { mutateAsync: submitTransactionAsync, data } = useSubmitTransaction()
  
  const submitARTM = async () => {
    // Sign transaction and set on the ARTM instance to validate signature
    const signature = await signer.signMessage(artm.getMessageToSign())
    artm.setSignature(signature)
    
    // Submit transaction to Asset Registry API
    submitTransactionAsync({
      input: {
          transaction: artm.message,
          signature: artm.signature
      }
    })
  }
  
  return (
    <button onClick={() => submitARTM()}>Submit ARTM</button>
  )
}

```

### GraphQL - Submit Transaction

```graphql
mutation SubmitTransaction($input: SubmitTransactionInput!) {
  submitTransaction(input: $input) {
    transactionHash
  }
}
```

````json
{
  "input": {
    "transaction": "Asset Registry transaction\n\nAn update is being made to your inventory\n\nOperations:\n\nasset-link create\n- equipWith_asmBrain\n- did:fv-asset:1:evm:0x6bca6de2dbdc4e0d41f7273011785ea16ba47182:1000\n- did:fv-asset:1:evm:0x1ea66a857de297471bc12dd12d93853ff6617284:21\nend\n\nOperations END\n\nAddress: 0x225b5333C2D8EC41F40D6463D44141786C2c4463\nNonce: 0",
    "signature": "0x282dbd15e2ef7091c8599ce1073e7c0f94cd7a02526b6bc43b84f01f190b457047b34e0d3bb63797872dffa106f33f914d5e6ff6d2e978f39944c6af6efec7691b"
  }
}

#### Example Response

```json
{
  "data": {
    "submitTransaction": {
      "transactionHash": "0x9aa26c9bfce628b160a43c155a12049c22c74276c28ca250df20df40f78baf1c"
    }
  }
}
````

## Viewing Transactions

<Tabs>
  <Tab title="React">
    ```typescript
    import { FC } from 'react'
    import { useGetTransaction } from '@futureverse/asset-registry-react'
    import { TransactionHash } from '@futureverse/asset-registry/types'

    type Props = {
      transactionHash: string
    }

    export const TransactionStatus: FC<Props> = ({ transactionHash }) => {
      const { transaction } = useGetTransaction(
        { transactionHash: transactionHash as TransactionHash },
        {
          refetchInterval: (data) => (data?.status === 'PENDING' ? 5000 : false),
        },
      )

      if (!transaction) return null
      return (
        <div>
          <h4>Transaction Status: </h4>
          <pre>{JSON.stringify(transaction, undefined, 2)}</pre>
        </div>
      )
    }
    ```
  </Tab>

  <Tab title="GraphQL">
    ### GraphQL - Transaction

    ```graphql
    query Transaction($transactionHash: TransactionHash!) {
      transaction(transactionHash: $transactionHash) {
        status
        id
        events {
          action 
          args
          type
        }
        transactionHash
      }
    }
    ```

    ```json
    {
      "transactionHash": "0xe28a8c0d45eb432093a96f73f70802c6dd7c5047a9a710817233f6b4f1b96615"
    }
    ```

    ```json
    {
      "data": {
        "transaction": {
          "status": "SUCCESS",
          "id": "VHJhbnNhY3Rpb246MHhlOThhOGMwZDQ1ZWI0MzIwOTNhOTZmNzNmNzA4MDJjNmRkN2M1MDQ3YTlhNzEwODE3MjMzZjZiNGYxYjk2NjE1",
          "events": [
            {
              "action": "create",
              "args": [
                "equipWith_gloves",
                "did:fv-asset:1:evm:0x59029213099dF720676bf0991a57e49518b00D72:1000",
                "did:fv-asset:1:evm:0x2308742aa28cc460522ff855d24a365f99deba7b:23"
              ],
              "type": "asset-link"
            }
          ],
          "transactionHash": "0xe28a8c0d45eb432093a96f73f70802c6dd7c5047a9a710817233f6b4f1b96615"
        }
      }
    }
    ```
  </Tab>
</Tabs>
