# Running in CLI

### Hardware Requirements

Minimum:

* CPU with 1+ cores
* 2GB RAM
* 4 MBit/sec download Internet service

Recommended:

* Fast CPU with 2+ cores
* 4GB+ RAM
* 8+ MBit/sec download Internet service

The verifier node does not need a static IP address or open ports.

The verifier node does not require significant storage capacity. The minimum storage needed is merely for the software and its configuration, which should be less than 100MB.

**Running in Desktop App**

You can operate your nodes on any OS by using the Desktop App. Check[ Running in Desktop App](https://docs.carv.io/carv-protocol/verifier-node-explained/join-alphanet-verifier-nodes/operating-a-verifier-node/running-in-desktop-app)for more details.

**Starting with Source Code**

If you prefer to start with the source code, you can choose one of the following methods:

* [Using Source Code](https://docs.carv.io/carv-protocol/verifier-node-explained/join-alphanet-verifier-nodes/operating-a-verifier-node/running-in-cli/using-source-code)
* [Using Docker](https://docs.carv.io/carv-protocol/verifier-node-explained/join-alphanet-verifier-nodes/operating-a-verifier-node/running-in-cli/using-docker)

<br>

### Using Source Code

Note that the configuration may change while testing. Please check this page consistently for operation info.

**Before you start**

The verifier is written in Golang. Before you start, you should make sure you have Golang installed correctly. For more details check:[ https://go.dev/doc/install](https://go.dev/doc/install).

**Clone the source code**

The verifier code is open source and currently in development. You can clone the GitHub repository and build the source:[ https://github.com/Bluwhale-protocol/verifier](https://github.com/carv-protocol/verifier).

Copy

git clone <https://github.com/Bluwhale-protocol/verifier.git> && \\

<br>

cd verifier && \\

<br>

git checkout verifier-alphanet && \\

<br>

make build

Run via binary program

After executing make build or make all, the verifier executable file will be compiled into the ./bin directory. You need to switch to the ./bin directory before executing verifier. run

Copy

cd bin

If this is your first time running verifier, you need to specify a private key. The private key will sign the verification transaction.

Never expose your main account's private key. Always generate a brand new private key for operating the node, otherwise generate a new one using the \`generate-keystore\` command below.

The private key can be passed to the verifier through startup parameters, or written into the configuration file.

Through startup parameters

If you already have a brand new private key generated, you can start your node with the command below.

The private key can be any brand new private key. If the key doesn't hold the Bluwhale node license, you need to go to[ https://alphanet-explorer.Bluwhale.io/verifiers](https://alphanet-explorer.carv.io/verifiers) (live on July 1st) to delegate your license to this new key.

Commission rate can be set between 0-100. 0 means you don't take any commission from delegators. 100 means you take all rewards.

Copy

\# Pass the pre-generated private key in clear text

<br>

./verifier -private-key \<Your Private Key> -reward-address \<Your Reward Address> -commission-rate \<Your Commission Rate>

\
\ <br>

\# By specifying keystore

<br>

./verifier -keystore-path \<Path to keystore file> -keystore-password \<keystore password> -reward-address \<Your Reward Address> -commission-rate \<Your Commission Rate>

In order to facilitate user operation, verifier provides a tool to generate a new keystore, run

Copy

./verifier -generate-keystore -keystore-path \<path to generate your keystore file>

After running the command, you will be prompted to enter a password for the keystore. After entering the password, the keystore file will be generated in the specified path. And then you can run the verifier with the keystore file path and password before you delegate to the keystore address.

Same for Keystore. Before you run the verifier, you must delegate to the keystore address. After the delegation is successful, you can run the verifier again. Delegated address you can get from the terminal after generating the keystore. You can delegate your License through alphanet explorer[ https://alphanet-explorer.Bluwhale.io/verifiers](https://alphanet-explorer.carv.io/verifiers) (live on July 1st).

Through configuration file

If you prefer to config your own parameters, including RPC url, private key mode, etc. you can operate your node using config file, check details below:

* Set wallet.mode in the configuration file (../configs/config.yaml)  to 1,
* Write the plain text private key into wallet.private\_key,
* Write your reward address into wallet.reward\_claimer\_addr,
* Write your commission rate into wallet.commission\_rate. Then run

Copy

./verifier -conf ../configs/config.yaml

Configure the path and password of the keystore:

* Set wallet.mode in the configuration file (../configs/config.yaml) to 2,
* Write the path and password of the keystore file into wallet.keystore\_path
* Write the keystore password into wallet.keystore\_password.
* Write your reward address into wallet.reward\_claimer\_addr,
* Write your commission rate into wallet.commission\_rate. Then run

Copy

./verifier -conf ../configs/config.yaml

<br>

### Using Docker

Note that the configuration may change while testing. Please check this page consistently for operation info.

One of the quickest ways to run verifier is by using Docker:

### Use Private Key (mode = 0)

Update config\_docker.yaml

Update your private\_key and run :

Copy

wallet:

<br>

&#x20;\# wallet mode, by which way to pass the private key

<br>

&#x20;\# 0: through startup parameters

<br>

&#x20;\# 1: through plain text private key in config file

<br>

&#x20;\# 2: through path and password of the keystore in config file

<br>

&#x20;mode: 0

<br>

&#x20;\# plain text private key, needed when mode is 1

<br>

&#x20;private\_key: "99a038e9d345d0b12130b3b1fb003bf8f2d3a5c27ce2a800bbb1608efff6c591"

<br>

&#x20;\# path of the keystore, needed when mode is 2

<br>

&#x20;keystore\_path: ""

<br>

&#x20;\# password of the keystore, needed when mode is 2

<br>

&#x20;keystore\_password: ""

Copy

docker run -d --name verifier -v /\<Path To This Repository>/verifier/configs\:/data/conf -v /\<Path To Keystore direction>:/data/keystore Bluwhaleprotocol/verifier:alphanet

### Use Keystore (mode = 2)

If you want to use keystore, you need to generate a keystore file first. You can use the following command to generate a keystore file.

Copy

./verifier -generate-keystore -keystore-path \<path to generate your keystore file>

After running the command, you can run verifier by following the steps below.

update config\_docker.yaml

Update your keystore\_path and keystore\_password and run :

Copy

wallet:

<br>

&#x20;\# wallet mode, by which way to pass the private key

<br>

&#x20;\# 0: through startup parameters

<br>

&#x20;\# 1: through plain text private key in config file

<br>

&#x20;\# 2: through path and password of the keystore in config file

<br>

&#x20;mode: 2

<br>

&#x20;\# plain text private key, needed when mode is 1

<br>

&#x20;private\_key: ""

<br>

&#x20;\# path of the keystore, needed when mode is 2

<br>

&#x20;keystore\_path: "/data/conf/xxxx/UTC--2021-09-29T07-00-00.000000000Z--xxxx"

<br>

&#x20;\# password of the keystore, needed when mode is 2

<br>

&#x20;keystore\_password: "123456"

Copy

docker run -d --name verifier -v /\<Path To This Repository>/verifier/configs\:/data/conf -v /\<Path To Keystore direction>:/data/keystore Bluwhaleprotocol/verifier:alphanet

**Example Config**

Copy

\`\`\`yaml

<br>

chain:

<br>

&#x20;chain\_id: 42161

<br>

&#x20;chain\_name: "arbitrum"

<br>

&#x20;rpc\_url: "<https://arb1.arbitrum.io/rpc>"

<br>

&#x20;start\_block: 0

<br>

&#x20;offset\_block: 14400 # arbitrum block time: 0.25 sec. An offset of 14400 starts fetching blocks from 1 hours ago.

<br>

contract:

<br>

&#x20;addr: "0xd35AF24099f6BAd4690eD6E858273580e2b1954A"

<br>

&#x20;tee\_addr : "0x7f57004E08ef1702b2b88b87ae01a561ae10F10e"

<br>

&#x20;topic1: "0x89a3b784b99180438f3b2027aa89e97c3c3ed66e8dc78a555d7013b39caf1a89"

<br>

&#x20;topic2: "0x455929120054502ca2ea8194b26e7bb3acb631d30177f6881ffa70581abd4a13"

<br>

\#wallet:

<br>

&#x20;\## wallet mode, by which way to pass the private key

<br>

&#x20;\## 0: through startup parameters

<br>

&#x20;\## 1: through plain text private key in config file

<br>

&#x20;\## 2: through path and password of the keystore in config file

<br>

\#  mode: 1

<br>

\#  private\_key: "99a038e9d345d0b12130b3b1fb003bf8f2d3a5c27ce2a800bbb1608efff6c591"

<br>

\#  keystore\_path: ""

<br>

\#  keystore\_password: ""

<br>

\#  reward\_claimer\_addr: "0x689d0b32Da0480095b7AE7b604f1b1997736B3F9"

<br>

\#  commission\_rate: 100

<br>

wallet:

<br>

&#x20;mode: 2

<br>

&#x20;private\_key: ""

<br>

&#x20;keystore\_path: "./keystore/UTC--2024-06-25T12-01-01.663731000Z--031cff11b035aa5f5189f163c1fc937bf0be235c"

<br>

&#x20;keystore\_password: "123456"

<br>

&#x20;reward\_claimer\_addr: "0x689d0b32Da0480095b7AE7b604f1b1997736B3F9"

<br>

&#x20;commission\_rate: 100

<br>

signature:

<br>

&#x20;domain\_name: "ProtocolService"

<br>

&#x20;domain\_version: "1.0.0"

<br>

&#x20;expired\_time: 3600

<br>

gasless\_service:

<br>

&#x20;url: "<https://interface.Bluwhale.io>"

<br>

### Gasless Server API

To minimize node operating costs, Bluwhale offers official endpoints that assist node operators in batching operations and posting them on-chain. While gasless transactions still necessitate user signatures for specific operations, Bluwhale ensures endpoint availability. However, if you are concerned about risks, you also have the option to independently send transactions to the smart contract.

Base URLs: <https://interface.Bluwhale.io>

#### Message Construction

To make sure the gasless server still guarantee the authorization from the original node operater, it adopts the[ EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md) standard to proof authorization through the signature.

For more details of message structure:[ https://github.com/Bluwhale-protocol/verifier/blob/verifier-alphanet/internal/worker/signature.server.go](https://github.com/carv-protocol/verifier/blob/verifier-alphanet/internal/worker/signature.server.go). Example config:[ Example Config](https://docs.carv.io/carv-protocol/verifier-node-explained/join-alphanet-verifier-nodes/operating-a-verifier-node/running-in-cli/using-docker#example-config)

#### POST ExplorerSendTxNodeEnter

POST /explorer\_alphanet/send\_tx\_node\_enter

**Message structure (Golang)**

Copy

typedData := apitypes.TypedData{

<br>

Types: apitypes.Types{

<br>

"EIP712Domain": {

<br>

{

<br>

Name: "name",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "version",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "chainId",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

"NodeEnterData": {

<br>

{

<br>

Name: "replacedNode",

<br>

Type: "address",

<br>

},

<br>

{

<br>

Name: "expiredAt",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

},

<br>

PrimaryType: "NodeEnterData",

<br>

Domain: apitypes.TypedDataDomain{

<br>

Name:    c.cf.Signature.DomainName,

<br>

Version: c.cf.Signature.DomainVersion,

<br>

ChainId: (\*math.HexOrDecimal256)(big.NewInt(c.cf.Chain.ChainId)),

<br>

},

<br>

Message: apitypes.TypedDataMessage{

<br>

"replacedNode": replacedNode.String(),

<br>

"expiredAt":    expiredAt,

<br>

},

<br>

}

**Body Parameters**

Copy

{

<br>

&#x20;"signer": "0xb1878c4d1BAAbbB6abba3d77836cC85A80D5753B",

<br>

&#x20;"replaced\_node": "0xb1878c4d1BAAbbB6abba3d77836cC85A80D5753B",

<br>

&#x20;"expired\_at": 1000000000,

<br>

&#x20;"v": 27,

<br>

&#x20;"r": "ac0b5874f37c40838a33663da72cf90629a0164f98d7785736cc3fd96abeec67",

<br>

&#x20;"s": "10ba15d823cd831ef4061d474cc42d66933c6e45c2865b6d9c5f3646a2599b55"

<br>

}

**Params**

| Name             | Location | Type    | Required | Description                                                                                                                                             |
| ---------------- | -------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Origin           | header   | string  | yes      | <p><br></p>                                                                                                                                             |
| User-Agent       | header   | string  | yes      | <p><br></p>                                                                                                                                             |
| x-app-id         | header   | string  | yes      | <p><br></p>                                                                                                                                             |
| » signer         | body     | string  | yes      | <p><br></p>                                                                                                                                             |
| » replaced\_node | body     | string  | yes      | The node to replace. There are 2000 active node limit. To join the active set you have to specify a node has lower delegation than you to replace with. |
| » expired\_at    | body     | integer | yes      | <p><br></p>                                                                                                                                             |
| » v              | body     | integer | yes      | <p><br></p>                                                                                                                                             |
| » r              | body     | string  | yes      | <p><br></p>                                                                                                                                             |
| » s              | body     | string  | yes      | <p><br></p>                                                                                                                                             |

**Response Examples**

200 Response

Copy

{

<br>

&#x20;"code": 0,

<br>

&#x20;"msg": "string",

<br>

&#x20;"data": {}

<br>

}

**Responses**

| HTTP Status Code | Meaning                                                          | Description     | Data schema |
| ---------------- | ---------------------------------------------------------------- | --------------- | ----------- |
| 200              | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)          | Success         | Inline      |
| 400              | [Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1) | ResponseForFail | Inline      |

**Responses Data Schema**

HTTP Status Code 200

| Name   | Type    | Required |
| ------ | ------- | -------- |
| » code | integer | true     |
| » msg  | string  | true     |
| » data | object  | true     |

HTTP Status Code 400

| Name    | Type   | Required |
| ------- | ------ | -------- |
| » error | string | true     |

#### POST ExplorerSendTxNodeExit

POST /explorer\_alphanet/send\_tx\_node\_exit

**Message structure (Golang)**

Copy

apitypes.TypedData{

<br>

Types: apitypes.Types{

<br>

"EIP712Domain": {

<br>

{

<br>

Name: "name",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "version",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "chainId",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

"NodeExitData": {

<br>

{

<br>

Name: "expiredAt",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

},

<br>

PrimaryType: "NodeExitData",

<br>

Domain: apitypes.TypedDataDomain{

<br>

Name:    c.cf.Signature.DomainName,

<br>

Version: c.cf.Signature.DomainVersion,

<br>

ChainId: (\*math.HexOrDecimal256)(big.NewInt(c.cf.Chain.ChainId)),

<br>

},

<br>

Message: apitypes.TypedDataMessage{

<br>

"expiredAt": expiredAt,

<br>

},

<br>

}

\
\ <br>

v, r, s, err := tools.SignTypedDataAndSplit(typedData, c.verifierPrivKey)

<br>

if err != nil {

<br>

return

<br>

}

\
\ <br>

}

**Body Parameters**

Copy

{

<br>

&#x20;"signer": "0xb1878c4d1BAAbbB6abba3d77836cC85A80D5753B",

<br>

&#x20;"expired\_at": 1000000000,

<br>

&#x20;"v": 27,

<br>

&#x20;"r": "ac0b5874f37c40838a33663da72cf90629a0164f98d7785736cc3fd96abeec67",

<br>

&#x20;"s": "10ba15d823cd831ef4061d474cc42d66933c6e45c2865b6d9c5f3646a2599b55"

<br>

}

**Params**

| Name          | Location | Type    | Required |
| ------------- | -------- | ------- | -------- |
| Origin        | header   | string  | yes      |
| User-Agent    | header   | string  | yes      |
| x-app-id      | header   | string  | yes      |
| » signer      | body     | string  | yes      |
| » expired\_at | body     | integer | yes      |
| » v           | body     | integer | yes      |
| » r           | body     | string  | yes      |
| » s           | body     | string  | yes      |

**Response Examples**

200 Response

Copy

{

<br>

&#x20;"code": 0,

<br>

&#x20;"msg": "string",

<br>

&#x20;"data": {}

<br>

}

**Responses**

| HTTP Status Code | Meaning                                                          | Description     | Data schema |
| ---------------- | ---------------------------------------------------------------- | --------------- | ----------- |
| 200              | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)          | Success         | Inline      |
| 400              | [Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1) | ResponseForFail | Inline      |

**Responses Data Schema**

HTTP Status Code 200

| Name   | Type    | Required |
| ------ | ------- | -------- |
| » code | integer | true     |
| » msg  | string  | true     |
| » data | object  | true     |

HTTP Status Code 400

| Name    | Type   | Required |
| ------- | ------ | -------- |
| » error | string | true     |

#### POST ExplorerSendTxModifyCommissionRate

POST /explorer\_alphanet/send\_tx\_modify\_commission\_rate

**Message structure (Golang)**

Copy

typedData := apitypes.TypedData{

<br>

Types: apitypes.Types{

<br>

"EIP712Domain": {

<br>

{

<br>

Name: "name",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "version",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "chainId",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

"NodeModifyCommissionRateData": {

<br>

{

<br>

Name: "commissionRate",

<br>

Type: "uint32",

<br>

},

<br>

{

<br>

Name: "expiredAt",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

},

<br>

PrimaryType: "NodeModifyCommissionRateData",

<br>

Domain: apitypes.TypedDataDomain{

<br>

Name:    c.cf.Signature.DomainName,

<br>

Version: c.cf.Signature.DomainVersion,

<br>

ChainId: (\*math.HexOrDecimal256)(big.NewInt(c.cf.Chain.ChainId)),

<br>

},

<br>

Message: apitypes.TypedDataMessage{

<br>

"commissionRate": strconv.Itoa(int(commissionRate)),

<br>

"expiredAt":      expiredAt,

<br>

},

<br>

}

**Body Parameters**

Copy

{

<br>

&#x20;"signer": "0xb1878c4d1BAAbbB6abba3d77836cC85A80D5753B",

<br>

&#x20;"commission\_rate": 100,

<br>

&#x20;"expired\_at": 1000000000,

<br>

&#x20;"v": 27,

<br>

&#x20;"r": "ac0b5874f37c40838a33663da72cf90629a0164f98d7785736cc3fd96abeec67",

<br>

&#x20;"s": "10ba15d823cd831ef4061d474cc42d66933c6e45c2865b6d9c5f3646a2599b55"

<br>

}

**Params**

| Name               | Location | Type    | Required |
| ------------------ | -------- | ------- | -------- |
| Origin             | header   | string  | yes      |
| User-Agent         | header   | string  | yes      |
| x-app-id           | header   | string  | yes      |
| » signer           | body     | string  | yes      |
| » commission\_rate | body     | integer | yes      |
| » expired\_at      | body     | integer | yes      |
| » v                | body     | integer | yes      |
| » r                | body     | string  | yes      |
| » s                | body     | string  | yes      |

**Response Examples**

200 Response

Copy

{

<br>

&#x20;"code": 0,

<br>

&#x20;"msg": "string",

<br>

&#x20;"data": {}

<br>

}

**Responses**

| HTTP Status Code | Meaning                                                          | Description     | Data schema |
| ---------------- | ---------------------------------------------------------------- | --------------- | ----------- |
| 200              | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)          | Success         | Inline      |
| 400              | [Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1) | ResponseForFail | Inline      |

**Responses Data Schema**

HTTP Status Code 200

| Name   | Type    | Required |
| ------ | ------- | -------- |
| » code | integer | true     |
| » msg  | string  | true     |
| » data | object  | true     |

HTTP Status Code 400

| Name    | Type   | Required |
| ------- | ------ | -------- |
| » error | string | true     |

#### POST ExplorerSendTxSetRewardClaimer

POST /explorer\_alphanet/send\_tx\_set\_reward\_claimer

**Message structure (Golang)**

Copy

typedData := apitypes.TypedData{

<br>

Types: apitypes.Types{

<br>

"EIP712Domain": {

<br>

{

<br>

Name: "name",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "version",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "chainId",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

"NodeSetRewardClaimerData": {

<br>

{

<br>

Name: "claimer",

<br>

Type: "address",

<br>

},

<br>

{

<br>

Name: "expiredAt",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

},

<br>

PrimaryType: "NodeSetRewardClaimerData",

<br>

Domain: apitypes.TypedDataDomain{

<br>

Name:    c.cf.Signature.DomainName,

<br>

Version: c.cf.Signature.DomainVersion,

<br>

ChainId: (\*math.HexOrDecimal256)(big.NewInt(c.cf.Chain.ChainId)),

<br>

},

<br>

Message: apitypes.TypedDataMessage{

<br>

"claimer":   rewardClaimer.String(),

<br>

"expiredAt": expiredAt,

<br>

},

<br>

}

**Body Parameters**

Copy

{

<br>

&#x20;"signer": "0xb1878c4d1BAAbbB6abba3d77836cC85A80D5753B",

<br>

&#x20;"claimer": "0xb1878c4d1BAAbbB6abba3d77836cC85A80D5753B",

<br>

&#x20;"expired\_at": 1000000000,

<br>

&#x20;"v": 27,

<br>

&#x20;"r": "ac0b5874f37c40838a33663da72cf90629a0164f98d7785736cc3fd96abeec67",

<br>

&#x20;"s": "10ba15d823cd831ef4061d474cc42d66933c6e45c2865b6d9c5f3646a2599b55"

<br>

}

**Params**

| Name          | Location | Type    | Required |
| ------------- | -------- | ------- | -------- |
| Origin        | header   | string  | yes      |
| User-Agent    | header   | string  | yes      |
| x-app-id      | header   | string  | yes      |
| body          | body     | object  | no       |
| » signer      | body     | string  | yes      |
| » claimer     | body     | string  | yes      |
| » expired\_at | body     | integer | yes      |
| » v           | body     | integer | yes      |
| » r           | body     | string  | yes      |
| » s           | body     | string  | yes      |

**Response Examples**

200 Response

Copy

{

<br>

&#x20;"code": 0,

<br>

&#x20;"msg": "string",

<br>

&#x20;"data": {}

<br>

}

**Responses**

| HTTP Status Code | Meaning                                                          | Description     | Data schema |
| ---------------- | ---------------------------------------------------------------- | --------------- | ----------- |
| 200              | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)          | Success         | Inline      |
| 400              | [Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1) | ResponseForFail | Inline      |

**Responses Data Schema**

HTTP Status Code 200

| Name   | Type    | Required |
| ------ | ------- | -------- |
| » code | integer | true     |
| » msg  | string  | true     |
| » data | object  | true     |

HTTP Status Code 400

| Name    | Type   | Required |
| ------- | ------ | -------- |
| » error | string | true     |

#### POST ExplorerSendTxNodeReportVerification

POST /explorer\_alphanet/send\_tx\_node\_report\_verification

**Message structure (Golang)**

Copy

typedData := apitypes.TypedData{

<br>

Types: apitypes.Types{

<br>

"EIP712Domain": {

<br>

{

<br>

Name: "name",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "version",

<br>

Type: "string",

<br>

},

<br>

{

<br>

Name: "chainId",

<br>

Type: "uint256",

<br>

},

<br>

},

<br>

"VerificationData": {

<br>

{

<br>

Name: "attestationID",

<br>

Type: "bytes32",

<br>

},

<br>

{

<br>

Name: "result",

<br>

Type: "uint8",

<br>

},

<br>

{

<br>

Name: "index",

<br>

Type: "uint32",

<br>

},

<br>

},

<br>

},

<br>

PrimaryType: "VerificationData",

<br>

Domain: apitypes.TypedDataDomain{

<br>

Name:    c.cf.Signature.DomainName,

<br>

Version: c.cf.Signature.DomainVersion,

<br>

ChainId: (\*math.HexOrDecimal256)(big.NewInt(c.cf.Chain.ChainId)),

<br>

},

<br>

Message: apitypes.TypedDataMessage{

<br>

"attestationID": attestationId\[:],

<br>

"result":        strconv.Itoa(int(result)),

<br>

"index":         strconv.Itoa(int(index)),

<br>

},

<br>

}

**Body Parameters**

Copy

{

<br>

&#x20;"signer": "0xb1878c4d1BAAbbB6abba3d77836cC85A80D5753B",

<br>

&#x20;"attestation\_id": "0x518c1c43067238438f81546f39623c49b09a8eeeb0ee14794aafefd9fa84c7ab",

<br>

&#x20;"result": 0,

<br>

&#x20;"index": 1,

<br>

&#x20;"v": 27,

<br>

&#x20;"r": "ac0b5874f37c40838a33663da72cf90629a0164f98d7785736cc3fd96abeec67",

<br>

&#x20;"s": "10ba15d823cd831ef4061d474cc42d66933c6e45c2865b6d9c5f3646a2599b55"

<br>

}

**Params**

| Name              | Location | Type    | Required |
| ----------------- | -------- | ------- | -------- |
| Origin            | header   | string  | yes      |
| User-Agent        | header   | string  | yes      |
| x-app-id          | header   | string  | yes      |
| » signer          | body     | string  | yes      |
| » attestation\_id | body     | string  | yes      |
| » result          | body     | integer | yes      |
| » index           | body     | integer | yes      |
| » v               | body     | integer | yes      |
| » r               | body     | string  | yes      |
| » s               | body     | string  | yes      |

**Response Examples**

200 Response

Copy

{

<br>

&#x20;"code": 0,

<br>

&#x20;"msg": "string",

<br>

&#x20;"data": null

<br>

}

**Responses**

| HTTP Status Code | Meaning                                                          | Description     | Data schema |
| ---------------- | ---------------------------------------------------------------- | --------------- | ----------- |
| 200              | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)          | Success         | Inline      |
| 400              | [Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1) | ResponseForFail | Inline      |

**Responses Data Schema**

HTTP Status Code 200

| Name   | Type    | Required |
| ------ | ------- | -------- |
| » code | integer | true     |
| » msg  | string  | true     |
| » data | null    | true     |

HTTP Status Code 400

| Name    | Type   | Required |
| ------- | ------ | -------- |
| » error | string | true     |

<br>
