コントラクトAPI
 契約APIは以下の機能を提供します。
  - コントラクトリソースを登録、照会、変更する
- コントラクトをデプロイ、照会、変更し、コントラクトメソッドを実行する
前提条件: API認証トークンを取得する
 契約APIを呼び出すには、APIのヘッダーに認証トークンを追加する必要があります。これがAPI認証トークンを取得する方法です。
  - Hive コンソールにサインアップし、AppCenter > ゲームリスト > 新しいゲームを登録します。
- AppCenter > AppIDリスト > 新しいAppIDを登録して新しいAppIDを作成します。 - 新しいAppIDを登録: ウェブログインAppID
- 使用目的: ブロックチェーン
- 使用するAppID: “自動生成されたAppID”または“追加情報”付きの“自動生成されたAppID”を選択します。
 
- Hive コンソール > ブロックチェーン > API認証キーを検索し、ゲーム名を選択して検索し、IDとシークレットキーを取得します。
- auth-token APIのリクエストボディにIDとシークレットキーを挿入し、このAPIを呼び出します。
- APIレスポンスのdata.accessTokenとしてAPI認証キーを取得できます。
契約リソースを登録する
 契約のリソースを登録します。契約名(contractName)、契約の説明(contractDesc)、および契約がコンパイルされた後に生成されるバイトコードとABI/スキームを登録します。
  Note
  - 契約のリソースはブロックチェーンに記録されません。
- 契約はSolidityまたはRustで記述する必要があります。
  リクエストURL
  ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | string | Y | 
  | x-network | ブロックチェーンネットワーク | string | Y | 
  
 リクエストボディ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | from | コントラクトオーナーのアドレス | 文字列 | Y | 
  | contractName | コントラクト名 | 文字列 | Y | 
  | contractDesc | コントラクトの説明 | 文字列 | Y | 
  | contractAbi | コントラクトがコンパイルされたときに生成されるアプリケーションバイナリインターフェース。 | ファイル | Y | 
  | contractBytecode | コントラクトがコンパイルされたときに生成されるバイトコード | ファイル | Y | 
  
 レスポンス
    | フィールド名 | 説明 | タイプ | 
    | code | APIリクエスト結果コード、0: 成功 | 数字 | 
  | message | 結果メッセージ | 文字列 | 
  | data | APIレスポンスデータ | JSON | 
  | data.resourceId | 契約リソースID | 数字 | 
  
 リクエストサンプル
 curl -X 'POST' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20ydXMuYzJ4d2...' 
  -H 'Content-Type: multipart/form-data' 
  -F 'from=0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0' 
  -F 'contractName=Com2us Sample Token Contract' 
  -F 'contractDesc=Fungible Token Contract' 
  -F 'contractAbi=@erc20-capped.json;type=application/json' 
  -F 'contractBytecode=@erc20-capped.code'
応答サンプル
 // polygon
{
  "code": 0,
  "message": "success",
  "data": {
    "resourceId": 1
  }
}
// xpla
{
  "code": 0,
  "message": "success",
  "data": {
    "rawTx": "02f873830138810c8451f4d5c08451f4d5cf83018c0694572f47db51a98...",
    "resourceId": 1
  }
}
クエリ契約リソース情報
 登録された契約リソースの情報を返します。
 リクエストURL
  ヘッダー パラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | 文字列 | Y | 
  | x-network | ブロックチェーンネットワーク | 文字列 | Y | 
  
 クエリパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | resourceId | 契約リソースID | 文字列 | N | 
  
 応答
    | フィールド名 | 説明 | タイプ | 
    | code | APIリクエスト結果コード、0: 成功 | 数字 | 
  | message | 結果メッセージ | 文字列 | 
  | data | APIレスポンスデータ | json | 
  | data.resourceId | 契約リソースID | 数字 | 
  | data.network | ブロックチェーンネットワーク | 文字列 | 
  | data.tenantId | 契約リソースを登録した者のID | 文字列 | 
  | data.contractName | 契約名 | 文字列 | 
  | data.contractDesc | 契約の説明 | 文字列 | 
  | data.codeId | 契約コードID(XPLAブロックチェーンのみ) | 文字列 | 
  | data.updatedAt | 契約が登録された日付 | 文字列 | 
  | data.createdAt | 契約が修正された日付 | 文字列 | 
  
 リクエストサンプル
 curl -X 'GET' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource?resourceId=1' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb...'
応答サンプル
 {
  "code": 0,
  "message": "success",
  "data": [
    {
      "resourceId": 1,
      "network": "polygon",
      "tenantId": "com.com2us.c2xwallet.global.normal",
      "contractName": "Com2us Sample Token Contract",
      "contractDesc": "Fungible Token Contract",
      "codeId": null,
      "updatedAt": "2023-07-27T18:05:25.000Z",
      "createdAt": "2023-07-27T18:05:25.000Z"
    }
  ]
}
契約リソースを変更する
 登録された契約リソースを変更します。契約の説明(contractDesc)、バイトコード、またはABI/スキームを変更します。
 リクエストURL
  パスパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | resourceId | 契約リソースID | 文字列 | Y | 
  
 ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | 文字列 | Y | 
  | x-network | ブロックチェーンネットワーク | 文字列 | Y | 
  
 リクエストボディ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | from | コントラクトオーナーのアドレス | 文字列 | Y | 
  | contractDesc | コントラクトの説明 | 文字列 | N | 
  | codeId | これはコントラクトコードIDです(XPLAブロックチェーン専用)。XPLAブロックチェーンにコントラクトをデプロイするときに取得されます。 | 文字列 | N | 
  | contractAbi | コントラクトがコンパイルされると生成されるアプリケーションバイナリインターフェース。 | ファイル | N | 
  | contractBytecode | コントラクトがコンパイルされると生成されるバイトコード | ファイル | N | 
  
  Note
 XPLAブロックチェーンに契約デプロイのトランザクションを送信し、txHashを取得してXPLAエクスプローラーで検索すると、イベントログでcodeIdを見つけることができます。
   応答
    | フィールド名 | 説明 | タイプ | 
    | code | APIリクエスト結果コード、0: 成功 | 数字 | 
  | message | 結果メッセージ | 文字列 | 
  | data | APIレスポンスデータ | JSON | 
  | data.resourceId | 契約リソースID | 数字 | 
  
 リクエストサンプル
 curl -X 'PATCH' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource/1' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNv...' 
  -H 'Content-Type: multipart/form-data' 
  -F 'from=0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0' 
  -F 'contractDesc=Fungible Token Contract' 
  -F 'codeId=20' 
応答サンプル
 {
  "code": 0,
  "message": "success",
  "data": {
    "resourceId": 1
  }
}
コントラクトをデプロイ
 以前に登録された契約リソース(バイトコードとABI/スキーム)に基づいて新しい契約を展開できるトランザクションを作成します。このAPIは、すべてのタイプ(NFTやFT、すなわちファンジブルトークンを含む)の契約を展開できます。
 リクエストURL
  ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | string | Y | 
  | x-network | ブロックチェーンネットワーク | string | Y | 
  
 パスパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | resourceId | 契約リソースID | 文字列 | Y | 
  
 リクエストボディ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | from | コントラクトをデプロイするウォレットアドレス | 文字列 | Y | 
  | message | コントラクトをデプロイするために必要な初期設定情報 | JSON | Y | 
  | encoded | 戻されるトランザクションがエンコードされているかどうか *
 true: エンコードされた生トランザクション文字列(data.rawTx)を受け取ります。*
 false: デコードされたdata.rawTx(JSON)を受け取ります。 | ブール値 | N | 
  
 応答
    | フィールド名 | 説明 | 型 | 
    | code | APIリクエスト結果コード、0: 成功 | 数字 | 
  | message | 結果メッセージ | 文字列 | 
  | data | APIレスポンスデータ | JSON | 
  | data.rawTx | トランザクションデータ | 文字列またはJSON | 
  | data.instanceId | コントラクトインスタンスID | 数字 | 
  
 リクエストサンプル
 curl -X 'POST' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource/2' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb...' 
  -H 'Content-Type: application/json' 
  -d '{
  "from": "0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0",
  "message": {
    "name": "testft",
    "symbol": "tft",
    "decimals": 6,
    "initialSupply": "1000000000"
  },
  "encoded": true
}'
応答サンプル
 {
  "code": 0,
  "message": "success",
  "data": {
    "rawTx": "02f91c9c830138811a84513619a084513619b...",
    "instanceId": 1
  }
}
デプロイされた契約情報を取得
 ブロックチェーンに展開された契約情報を返します。
 リクエストURL
  ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | 文字列 | Y | 
  | x-network | ブロックチェーンネットワーク | 文字列 | Y | 
  
 クエリパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | instanceId | 契約インスタンスID | 文字列 | N | 
  
 応答
    | フィールド名 | 説明 | タイプ | 
    | code | APIリクエスト結果コード、0: 成功 | 数字 | 
  | message | 結果メッセージ | 文字列 | 
  | data | APIレスポンスデータ | 配列 | 
  | data.resourceId | 契約リソースID | 数字 | 
  | data.instanceId | 契約インスタンスID | 数字 | 
  | data.contractAddress | 契約アドレス | 文字列 | 
  | data.initMsg | 契約をデプロイする際の初期設定情報 | JSON | 
  | data.createdAt | 契約がブロックチェーンに記録された日付 | 文字列 | 
  | data.network | ブロックチェーンネットワーク情報 | 文字列 | 
  | data.tenantId | 契約デプロイヤーのID | 文字列 | 
  
 リクエストサンプル
 curl -X 'GET' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/instance?instanceId=1' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20yd...'
応答サンプル
 {
  "code": 0,
  "message": "success",
  "data": [
    {
      "resourceId": 2,
      "instanceId": 1,
      "contractAddress": null,
      "initMsg": {
        "name": "testft",
        "symbol": "tft",
        "decimals": 6,
        "initialSupply": "1000000000"
      },
      "createdAt": "2023-07-28T17:35:22.000Z",
      "network": "polygon",
      "tenantId": "com.com2us.c2xwallet.global.normal"
    }
  ]
}
コントラクトインスタンスアドレスを変更する
 デプロイされた契約アドレスを契約インスタンスID(instanceId)で更新します。
 リクエストURL
  パスパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | instanceId | 契約インスタンスID | 文字列 | Y | 
  
 ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | 文字列 | Y | 
  | x-network | ブロックチェーンネットワーク | 文字列 | Y | 
  
 クエリパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | contractAddress | コントラクトアドレス | 文字列 | Y | 
  
 応答
    | フィールド名 | 説明 | タイプ | 
    | コード | APIリクエスト結果コード、0: 成功 | 数字 | 
  | メッセージ | 結果メッセージ | 文字列 | 
  
 リクエストサンプル
 curl -X 'PATCH' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/instance/1?contractAddress=0x78ce8698bd69fc96d425a82ae6813f553a673e63' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJp...'
応答サンプル
 {
  "code": 0,
  "message": "success"
}
クエリ契約メソッドリスト
 契約リソースID(resourceId)による契約メソッドのリストを返します。
 リクエストURL
  パスパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | resourceId | 契約リソースID | 文字列 | Y | 
  
 ヘッダー パラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | 文字列 | Y | 
  | x-network | ブロックチェーンネットワーク | 文字列 | Y | 
  
 応答
    | フィールド名 | 説明 | タイプ | 
    | code | APIリクエスト結果コード、0: 成功 | number | 
  | message | 結果メッセージ | String | 
  | data | APIレスポンスデータ | array | 
  | data.methodName | コントラクトメソッド名 | string | 
  | data.type | コントラクトメソッドタイプ *
 execute: コントラクトにデータを挿入するか、コントラクト内の既存データを変更する*
 query: コントラクト情報を取得する | string | 
  
 リクエストサンプル
 curl -X 'GET' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource/1/methods' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20yd...'
応答サンプル
 {
  "code": 0,
  "message": "success",
  "data": [
    {
      "methodName": "allowance",
      "type": "query"
    },
    {
      "methodName": "totalSupply",
      "type": "query"
    },
    ...
  ]
}
契約メソッド情報を取得
 契約リソースID(resourceId)とメソッド名(method)を使用して契約メソッドを実行するために必要な関数シグネチャを返します。
 リクエストURL
  パスパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | resourceId | 契約リソースID | 文字列 | Y | 
  | method | 契約メソッド名 | 文字列 | Y | 
  
 ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | string | Y | 
  | x-network | ブロックチェーンネットワーク | string | Y | 
  
 応答
    | フィールド名 | 説明 | タイプ | 
    | code | APIリクエスト結果コード、0: 成功 | 数字 | 
  | message | 結果メッセージ | 文字列 | 
  | data | これは契約メソッドを実行するために必要なデータです(メソッド名とメソッドの入力パラメータ)。 | JSON | 
  
 リクエストサンプル
 curl -X 'GET' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource/2/method/balanceOf' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20...'
レスポンスサンプル
 {
  "code": 0,
  "message": "success",
  "data": {
    "balanceOf": {
      "account": "address"
    }
  }
}
コントラクトメソッドを実行する
 メソッドの名前とメソッドの入力パラメータ(message)を使用して契約メソッドを実行します。
 リクエストURL
  パスパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | instanceId | 契約インスタンスID | 文字列 | Y | 
  
 ヘッダーパラメータ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | Authorization | APIを呼び出すために必要な認証トークン | 文字列 | Y | 
  | x-network | ブロックチェーンネットワーク | 文字列 | Y | 
  
 リクエストボディ
    | フィールド名 | 説明 | タイプ | 必須 | 
    | from | コントラクトメソッドを実行するために要求するウォレットアドレス | 文字列 | Y | 
  | message | コントラクトメソッド名とメソッドの入力パラメータ | 文字列 | Y | 
  | encoded | 戻り値のトランザクションがエンコードされているかどうか *
 true: エンコードされた生トランザクション文字列(data.rawTx)を受け取る。*
 false: デコードされたdata.rawTx(JSON)を受け取る。 | ブール値 | N | 
  
 応答
    | フィールド名 | 説明 | タイプ | 
    | code | APIリクエスト結果コード、0: 成功 | 数値 | 
  | message | 結果メッセージ | 文字列 | 
  | data | コントラクトメソッド実行後に返される値 | JSON | 
  
 リクエストサンプル
 curl -X 'POST' 
  'https://sandbox-bc-api.qpyou.cn/core/v1/contract/instance/1/query' 
  -H 'accept: */*' 
  -H 'x-network: polygon' 
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb2...' 
  -H 'Content-Type: application/json' 
  -d '{
  "from": "0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0",
  "message": {
    "balanceOf": {
      "account": "0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0"
    }
  },
  "encoded": true
}'
一般的に、契約メソッドは2つのタイプに分けられます:クエリタイプと実行タイプです。クエリタイプメソッドはデータを単に照会し、実行タイプメソッドは契約に新しいデータを書き込むか、契約内の既存のデータを修正します。実行タイプは常に生のトランザクションを返し、クエリタイプとは異なります。
 応答サンプル: クエリタイプ
 {
  "code": 0,
  "message": "success",
  "data": "1000000000"
}
応答サンプル: 実行タイプ(encodedはtrue)
 {
  "code": 0,
  "message": "success",
  "data": {
    "rawTx": "02f8738301388181c2846fc23ac0846fc23ad882cdc49494853bdc9c6add50d7...",
  }
}
応答サンプル: 実行タイプ(encodedはfalse)
 {
  "code": 0,
  "message": "success",
  "data": {
    "rawTx": {
      "from": "0x9428e6eF51FEb2201676deEc11B7E36F7c1F0765",
      "to": "0x94853BdC9c6AdD50D7842D1A3117fab385457470",
      "data": "0xa9059cbb000000000000000000000000fbd488d1b00604d3b05124d80e35fea...",
      "nonce": 224,
      "chainId": 80001,
      "gas": 52676,
      "maxFeePerGas": 1575000048,
      "maxPriorityFeePerGas": 1575000000
    }
  }
}