diff --git a/README.md b/README.md index 5da30e4..c57d7cf 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,65 @@ -# 链相关的 GraphQL API +# 说明 + +该项目包含 2 部分功能, 链上事件爬取和链上数据查询接口(GraphQL 和普通接口) + +# 一. 链上数据查询 ## 1. 验证地址是否是指定 NFT 的 holder > 供 galxe.com 的任务系统使用 + +``` +endpoint: https://chianquery.cebggame.com/graphql + +网页访问: https://chianquery.cebggame.com/graphiql +``` + +## 2. 普通接口 + +### 1. 检查用户是否有已 claim NFT + +1. Method: POST|GET +2. URI: /chain/query_info +3. HOST: https://chianquery.cebggame.com + +> 参数, body(json, x-www-form-urlencoded) 或 querystring 都可 + +| 字段 | 说明 | +| --------- | --------------------- | +| \*address | 用户钱包地址 | +| contract | ClaimFactory 合约地址 | + +3. Response: JSON + +```json +{ + "errcode": 1, // 此字段只有在出错时才会有 + "errmsg": "error", // 此字段只有在出错时才会有 + "id": 0 +} +``` + +# 二. 链上事件爬取 + +## 说明 + +NFT 和 FT 的`Transfer`事件分布记录在 src/models/FtTransfer.ts 和 src/models/NftTransfer.ts 中 +NFT 事件记录后, 更新 NftHolder 表, 该表记录最新的 Nft 持有情况 +其他事件记录在 src/models/UniversalEvent.ts 中 + +## 配置 + +需要爬取的事件在 src/config/events.json 中配置 + +```js +;[ + { + address: '0x3F13F83E6363D97d0353cAAfACA08B05D9BF3637', // 合约地址 + chain: 42161, // 链 id + event: 'Transfer', // 事件名 + abi: 'ERC721', // 合约使用的abi, 在src/abis中定义, 这里取文件名 + fromBlock: 105016690, // 开始块高 + eventProcesser: 'NftTransferEvent', // 事件处理器 + }, +] +``` diff --git a/src/controllers/chain.controllers.ts b/src/controllers/chain.controllers.ts index d9162e8..4f3070d 100644 --- a/src/controllers/chain.controllers.ts +++ b/src/controllers/chain.controllers.ts @@ -1,47 +1,15 @@ import BaseController from 'common/base.controller' import { role, router } from 'decorators/router' -import { ChainTask, ChainTaskClass } from 'models/ChainTask' -import { RequestTask } from 'models/RequestTask' -import { ChainQueue } from 'queue/chain.queue' -import { DocumentType } from '@typegoose/typegoose' import { BlockChain } from 'chain/BlockChain' import { ZError } from 'common/ZError' import { RedisClient } from 'redis/RedisClient' class ChainController extends BaseController { - // @role('anon') - // @router('post /chain/req') - // async addChainRequest(req, res) { - // // data是一个数组!! - // const { data, source, cb, taskId, force, max } = req.params - // console.log(`income chain request:: taskId: ${taskId}, source: ${source}, cb: ${cb}`) - // console.log(JSON.stringify(data)) - // let maxTryCount = max !== undefined ? parseInt(max) : parseInt(process.env.CHAIN_MAX_TRY) - // let chainTask: DocumentType = await ChainTask.insertOrUpdate( - // { taskId }, - // { source, taskData: data, cb }, - // ) - - // if ((!chainTask.newRecord && force) || chainTask.newRecord) { - // for (let sub of data) { - // let subType = sub.type - // let subTask = new RequestTask({ - // taskId, - // chainTaskId: chainTask.id, - // taskType: subType, - // reqData: sub, - // maxTryCount, - // }) - // await subTask.save() - // chainTask.tasks.pushOnce(subTask.id) - // new ChainQueue().addTaskToQueue(subTask) - // } - // } - // chainTask.newRecord = false - // await chainTask.save() - // return chainTask.toJson() - // } - + /** + * 活动用的接口, 检查用户是否有已claim NFT + * 如果有,返回tokenId + * 否则, 返回0 + */ @role('anon') @router('post /chain/query_info') @router('get /chain/query_info')