# React

{% tabs %}
{% tab title="Parameter Types" %}

<pre class="language-javascript"><code class="lang-javascript"><strong>{
</strong>    transformId: Uint256, // The ID of the Reaction Transform you want to use
    quantity: Uint256, // The number of Reactions you'd like to send
    referrerAddress: Address, // The Address that should receive referrer cuts
    optionBits: Uint256, // Parameter version of the Reaction you're using
    takerNFTChainId: Uint256, // Chain ID of the NFT receiving the Reaction
    takerNFTAddress: Address, // Contract Address of the NFT receiving the Reaction
    takerNFTId: Uint256, // Token ID of the NFT receiving the Reaction
    curatorVaultOverride: Address, // Override used for alternate Curator Vaults
    ipfsMetadataHash: String // Additional metadata to be saved with Reaction
}
</code></pre>

{% endtab %}

{% tab title="ReactionVault" %}

## Reaction Vault Contract Addresses

```
// Polygon Mainnet
0xE5BA5c73378BC8Da94738CB04490680ae3eab88C

// Polygon Mumbai
0xA374674F97885BD378059708e97f7117CB74683d
```

## Reaction Vault Contract ABI

```typescript
Reaction Vault ABI
{
  address: "0xA374674F97885BD378059708e97f7117CB74683d", // Mumbai Address
  abi:[{
    name: 'react',
    stateMutability: 'payable',
    type: 'function',
    inputs: [
      {
        internalType: 'uint256',
        name: 'transformId',
        type: 'uint256',
      },
      {
        internalType: 'uint256',
        name: 'quantity',
        type: 'uint256',
      },
      {
        internalType: 'address',
        name: 'referrer',
        type: 'address',
      },
      {
        internalType: 'uint256',
        name: 'optionBits',
        type: 'uint256',
      },
      {
        internalType: 'uint256',
        name: 'takerNftChainId',
        type: 'uint256',
      },
      {
        internalType: 'address',
        name: 'takerNftAddress',
        type: 'address',
      },
      {
        internalType: 'uint256',
        name: 'takerNftId',
        type: 'uint256',
      },
      {
        internalType: 'address',
        name: 'curatorVaultOverride',
        type: 'address',
      },
      {
        internalType: 'string',
        name: 'ipfsMetadataHash',
        type: 'string',
      },
    ],
    outputs: []
  }]
}
```

{% endtab %}

{% tab title="Example" %}

## Send a Reaction with `ethers.js` and `ipfs-http-client`

{% hint style="info" %}
See **ReactionVault** tab for contract definitions
{% endhint %}

### \[Optional] Save Reaction Metadata to IPFS

If you'd like to include a Comment or Tags with your Reaction, you'll need to save that information to IPFS first.  If you just want to send a Reaction you can skip this step.

{% code overflow="wrap" %}

```typescript
import { client } from 'ipfs-http-client'

interface IReactionMetadata {
    comment?: String;
    tags?: String[];
}

// Instantiate a new IPFS Client -- we use an IPFS node hosted by theGraph
const client = create(new URL('https://api.thegraph.com/ipfs/api/v0/'));

// Create a metadata blob to store comments and/or tags.
const reactionMetadata: IReactionMetadata = {
    comment: "My first comment using the RARA! Social Curation Protocol",
    tags: ["rara", "social", "curation"]
}

// Save reaction metadata on IPFS to generate an ipfsCID.  Keep this ipfsCID handy as we'll use it in the next step.
const { ipfsCID } = await client.add(JSON.stringify(reactionMetadata));
```

{% endcode %}

### Send a Reaction and Reaction Metadata to an NFT

To send a Reaction to an NFT, use the `react` function of the `ReactionVault`.  All parameters are required (see the Parameters section for more details).

```typescript
import { Contract, constants } from 'ethers'

// Select an NFT to receive the reaction
const TakerNFT = {
    chainId: 80001,
    contractAddress: 0x2953399124f0cbb46d2cbacd8a89cf0599974963,
    tokenId: 107136376226630408484522358727913128313617592685310283300071728450490266025985
}

// Instantiate a Reaction Vault contract and attach a signer 
const ReactionVault = new Contract(
    reactionVault.address, 
    reactionVault.abi,
    signer
);

// Call the React function with required parameters 
const transaction = await ReactionVault.react(
    102265098525112739997130475423667270810501597805004267158805479941320194430532, //transformId,
    1, //quantity
    constants.AddressZero, // referrerAddress
    constants.Zero, // optionBits
    TakerNFT.chainId, // takerNFT Chain ID
    TakerNFT.contractAddress, // takerNFT Contract Address
    TakerNFT.tokenId, // takerNFT ID
    constants.AddressZero, // curatorVaultOverride
    ipfsCID // "QmV3wpfESJdZTaY262rZMqGSmH8cV9ThDDxRaKDm1ZmoWs"
);

// await completion of React function call
const receipt = await transaction.wait()
```

{% endtab %}
{% endtabs %}

## Parameters

{% hint style="info" %}
All parameters are required
{% endhint %}

#### transformId

The ID of the reaction to be used. Only [registered](/protocol-features/register.md) reactions can be used.

#### quantity

The number of reactions to be sent. If value is sent, the reaction quantity must equal the `value / reactionPrice`

#### referrerAddress

The address of the referring party. If value is sent, the referrer will be rewarded with `value * saleReferrerBasisPoints`.  Use `addressZero` if no `referrerAddress` is set.

#### optionBits

This parameter can be used to create different versions of the reaction NFT. Use `0` if `optionBits` are not set.

#### takerNFTChainId

Chain ID of the NFT receiving reactions

#### takerNFTContractAddress

Contract Address of the NFT receiving reactions

#### takerNFTTokenId

Token ID of the NFT receiving reactions

#### curatorVaultOverride

This parameter allows for multiple Curator Vaults. Use `addressZero` if `curatorVaultOverride` is not set.

#### IPFSMetadataHash

This parameter can be used to embed additional data about the user interaction.  Use `maxInt256` if `ipfsMetadataHash` is not set.

## Source Code

View the protocol on [Github](https://github.com/rara-social/rara-protocol/blob/088d1105a0b6667beb82f943e4109e9a3c8eba76/contracts/Reactions/ReactionVault.sol#L575).


---

# 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.rara.social/protocol-features/react.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.
