# Register

{% hint style="info" %}
L1 registrations use the RootRegistrar ABI, L2 registrations use the MakerRegistar ABI
{% endhint %}

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

```
{
    nftContractAddress: Address, // The Address of the NFT you want to Register
    nftId: Uint256, // Token ID of the NFT you want to Register
    creatorAddress: Address, // The Address receiving a cut of Maker rewards
    creatorSaleBasisPoints: Uint256 // The basis points set aside for the Maker
    optionBits: Uint256, // Parameter version of the Reaction you're using
    ipfsMetadataHash: String // Additional metadata saved with registration
}
```

{% endtab %}

{% tab title="MakerRegistrar ABI" %}

## Maker Registrar Contract Addresses

```
// Polygon Mainnet
0x47CD3266FA94E40613B37a88D98196325Cd28412

// Polygon Mumbai
0x06493B0362b3892EEc7C63023e8bC0C0c64646eb
```

## Maker Registrar Contract ABI

```typescript
Maker Registrar Contract ABI
{
  address: "0x06493B0362b3892EEc7C63023e8bC0C0c64646eb", // Mumbai Address
  abi:[{
    name: 'registerNft',
    stateMutability: 'nonpayable',
    type: 'function',
    inputs: [{
        internalType: 'address',
        name: 'nftContractAddress',
        type: 'address',
      },
      {
        internalType: 'uint256',
        name: 'nftId',
        type: 'uint256',
      },
      {
        internalType: 'address',
        name: 'creatorAddress',
        type: 'address',
      },
      {
        internalType: 'uint256',
        name: 'creatorSaleBasisPoints',
        type: 'uint256',
      },
      {
        internalType: 'uint256',
        name: 'optionBits',
        type: 'uint256',
      },
      {
        internalType: 'string',
        name: 'ipfsMetadataHash',
        type: 'string',
      },
    ],
    outputs: [],
  }]
}
```

{% endtab %}

{% tab title="RootRegistrar ABI" %}

## Root Registrar Contract Addresses

```
// Ethereum Mainnet
0x2665Aa3846EC61e6D28A0d9F76b70047719F3664

// Goerli Mumbai
0x33066F8848967a16FC27bc1b2f347c9345Ed8b33
```

## Root Registrar Contract ABI

```typescript
Root Registrar Contract ABI
{
  address: "0x33066F8848967a16FC27bc1b2f347c9345Ed8b33", // Goerli Address
  abi:[{
    name: 'registerNft',
    stateMutability: 'nonpayable',
    type: 'function',
    inputs: [
      {
        internalType: 'address',
        name: 'nftContractAddress',
        type: 'address',
      },
      {
        internalType: 'uint256',
        name: 'nftId',
        type: 'uint256',
      },
      {
        internalType: 'address',
        name: 'creatorAddress',
        type: 'address',
      },
      {
        internalType: 'uint256',
        name: 'creatorSaleBasisPoints',
        type: 'uint256',
      },
      {
        internalType: 'uint256',
        name: 'optionBits',
        type: 'uint256',
      },
      {
        internalType: 'string',
        name: 'ipfsMetadataHash',
        type: 'string',
      },
    ],
    outputs: [],
  }]
}
```

{% endtab %}

{% tab title="Example" %}

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

{% hint style="info" %}
See **MakerRegistar ABI** or **RootRegistrar ABI** tab for contract definitions
{% endhint %}

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

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

{% code overflow="wrap" %}

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

interface IRegistrationMetadata {
    name?: 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 registrationMetadata: IRegistrationMetadata = {
    name: "My Cool Reaction",
    tags: ["rara", "social", "curation"]
}

// Save registration 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(registrationMetadata));
```

{% endcode %}

### Register an NFT for use as a Reaction

To register a Reaction for use in the protocol, you'll use the `registerNft` function of either the `RootRegistrar` (a bridge for L1 NFTs) or the `MakerRegistrar` (for L2 NFTs).  All parameters are required (see the Parameters section for more details).

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

// Select an NFT to register as a reaction
const NFT = {
    contractAddress: 0x2953399124f0cbb46d2cbacd8a89cf0599974963,
    tokenId: 107136376226630408484522358727913128313617592685310283300071728450490266025985
}

// Instantiate the MakerRegistrar contract and attach a signer 
const MakerRegistrar = new Contract(
    makerRegistar.address, 
    makerRegistar.abi,
    signer
);

// Call the registerNft function with required parameters 
const transaction = await MakerRegistar.registerNft(
    NFT.contractAddress, // Contract Address of the NFT to register
    NFT.tokenId, // Token ID of the NFT to register
    constants.AddressZero, // creatorAddress
    constants.Zero, // creatorSaleBasisPoints
    constants.Zero, // optionBits
    ipfsCID // "QmUgmdW3N8tgh5hZXna4p7sHxqTAhvf7CZhguoLhE7NsgV"
);

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

This example uses the `MakerRegistrar` to register an L2 NFT.  If you'd like to register an L1 NFT, simply switch out the `MakerRegistrar` for the `RootRegistrar`.
{% endtab %}
{% endtabs %}

## Parameters

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

#### nftContractAddress

Contract Address of the NFT receiving reactions

#### nftTokenId

Token ID of the NFT receiving reactions

#### creatorAddress

The address of the creator of this NFT. If a `creatorAddress` is set, they will receive a portion of the Maker Rewards generated each time this Reaction is spent based on the following `creatorSaleBasisPoints` parameter.  Use `addressZero` to leave the `creatorAddress` parameter unset.

#### creatorSaleBasisPoints

Basis points allocated to the creator as a portion of the MakerRewards generated during a reaction sale.  Use `0` if no basis points should be allocated to the creator.

#### optionBits

This parameter can be used to create different versions of the reaction NFT. Use `0` if `optionBits` are 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/Maker/MakerRegistrar.sol#L80).


---

# 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/register.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.
