From 203c1292ff48793acad17ebfe99cc82f2654706d Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi <95nikass@gmail.com> Date: Wed, 12 Apr 2023 15:03:06 +0530 Subject: [PATCH] Add watcher in `eth_call` mode for LinearStarRelease contract (#7) * Create watcher in eth_call mode for Linear Star Release contract * Update readme about unhandled queries --------- Co-authored-by: Dhruv Srivastava --- .../linear-star-release-watcher/.eslintignore | 2 + .../.eslintrc.json | 28 + .../linear-star-release-watcher/README.md | 210 ++ .../environments/local.toml | 66 + .../linear-star-release-watcher/package.json | 73 + .../src/artifacts/LinearStarRelease.json | 331 +++ .../src/cli/checkpoint-cmds/create.ts | 34 + .../src/cli/checkpoint.ts | 39 + .../src/cli/export-state.ts | 28 + .../src/cli/import-state.ts | 29 + .../src/cli/index-block.ts | 28 + .../src/cli/inspect-cid.ts | 28 + .../src/cli/reset-cmds/job-queue.ts | 22 + .../src/cli/reset-cmds/state.ts | 24 + .../src/cli/reset-cmds/watcher.ts | 27 + .../src/cli/reset.ts | 24 + .../src/cli/watch-contract.ts | 28 + .../linear-star-release-watcher/src/client.ts | 559 +++++ .../src/database.ts | 1233 ++++++++++ .../src/entity/BalanceOf.ts | 31 + .../src/entity/BlockProgress.ts | 48 + .../src/entity/CanEscapeTo.ts | 33 + .../src/entity/CanManage.ts | 33 + .../src/entity/CanSpawnAs.ts | 33 + .../src/entity/CanTransfer.ts | 33 + .../src/entity/CanVoteAs.ts | 33 + .../src/entity/Contract.ts | 24 + .../src/entity/Event.ts | 38 + .../src/entity/Exists.ts | 31 + .../src/entity/FindClaim.ts | 36 + .../src/entity/GetApproved.ts | 31 + .../src/entity/GetContinuityNumber.ts | 30 + .../src/entity/GetDocumentProposalCount.ts | 28 + .../src/entity/GetEscapeRequest.ts | 30 + .../src/entity/GetEscapeRequestsCount.ts | 31 + .../src/entity/GetKeyRevisionNumber.ts | 30 + .../src/entity/GetManagementProxy.ts | 30 + .../src/entity/GetManagerForCount.ts | 31 + .../src/entity/GetOwnedPointAtIndex.ts | 34 + .../src/entity/GetOwnedPointCount.ts | 31 + .../src/entity/GetOwner.ts | 30 + .../src/entity/GetSpawnCount.ts | 30 + .../src/entity/GetSpawnLimit.ts | 34 + .../src/entity/GetSpawnProxy.ts | 30 + .../src/entity/GetSpawningForCount.ts | 31 + .../src/entity/GetSponsor.ts | 30 + .../src/entity/GetSponsoringCount.ts | 31 + .../src/entity/GetTransferProxy.ts | 30 + .../src/entity/GetTransferringForCount.ts | 31 + .../src/entity/GetUpgradeProposalCount.ts | 28 + .../src/entity/GetVotingForCount.ts | 31 + .../src/entity/GetVotingProxy.ts | 30 + .../src/entity/HasBeenLinked.ts | 30 + .../src/entity/HasSponsor.ts | 30 + .../src/entity/HasVotedOnDocumentPoll.ts | 33 + .../src/entity/HasVotedOnUpgradePoll.ts | 33 + .../src/entity/IsActive.ts | 30 + .../src/entity/IsApprovedForAll.ts | 33 + .../src/entity/IsEscaping.ts | 30 + .../src/entity/IsLive.ts | 30 + .../src/entity/IsManagementProxy.ts | 33 + .../src/entity/IsOperator.ts | 33 + .../src/entity/IsOwner.ts | 33 + .../src/entity/IsRequestingEscapeTo.ts | 33 + .../src/entity/IsSpawnProxy.ts | 33 + .../src/entity/IsSponsor.ts | 33 + .../src/entity/IsTransferProxy.ts | 33 + .../src/entity/IsVotingProxy.ts | 33 + .../src/entity/Name.ts | 27 + .../src/entity/OwnerOf.ts | 31 + .../src/entity/State.ts | 31 + .../src/entity/StateSyncStatus.ts | 17 + .../src/entity/SupportsInterface.ts | 30 + .../src/entity/Symbol.ts | 27 + .../src/entity/SyncStatus.ts | 36 + .../src/entity/TokenByIndex.ts | 31 + .../src/entity/TokenOfOwnerByIndex.ts | 34 + .../src/entity/TokenURI.ts | 31 + .../src/entity/TotalSupply.ts | 28 + .../src/entity/VerifyBalance.ts | 30 + .../src/entity/WithdrawLimit.ts | 30 + .../linear-star-release-watcher/src/fill.ts | 33 + .../src/gql/index.ts | 3 + .../src/gql/mutations/index.ts | 4 + .../src/gql/mutations/watchContract.gql | 3 + .../src/gql/queries/balanceOf.gql | 8 + .../src/gql/queries/canEscapeTo.gql | 8 + .../src/gql/queries/canManage.gql | 8 + .../src/gql/queries/canSpawnAs.gql | 8 + .../src/gql/queries/canTransfer.gql | 8 + .../src/gql/queries/canVoteAs.gql | 8 + .../src/gql/queries/events.gql | 31 + .../src/gql/queries/eventsInRange.gql | 31 + .../src/gql/queries/exists.gql | 8 + .../src/gql/queries/findClaim.gql | 8 + .../src/gql/queries/getApproved.gql | 8 + .../src/gql/queries/getContinuityNumber.gql | 8 + .../gql/queries/getDocumentProposalCount.gql | 8 + .../src/gql/queries/getEscapeRequest.gql | 8 + .../gql/queries/getEscapeRequestsCount.gql | 8 + .../src/gql/queries/getKeyRevisionNumber.gql | 8 + .../src/gql/queries/getManagementProxy.gql | 8 + .../src/gql/queries/getManagerForCount.gql | 8 + .../src/gql/queries/getOwnedPointAtIndex.gql | 8 + .../src/gql/queries/getOwnedPointCount.gql | 8 + .../src/gql/queries/getOwner.gql | 8 + .../src/gql/queries/getSpawnCount.gql | 8 + .../src/gql/queries/getSpawnLimit.gql | 8 + .../src/gql/queries/getSpawnProxy.gql | 8 + .../src/gql/queries/getSpawningForCount.gql | 8 + .../src/gql/queries/getSponsor.gql | 8 + .../src/gql/queries/getSponsoringCount.gql | 8 + .../src/gql/queries/getState.gql | 15 + .../src/gql/queries/getStateByCID.gql | 15 + .../src/gql/queries/getSyncStatus.gql | 8 + .../src/gql/queries/getTransferProxy.gql | 8 + .../gql/queries/getTransferringForCount.gql | 8 + .../gql/queries/getUpgradeProposalCount.gql | 8 + .../src/gql/queries/getVotingForCount.gql | 8 + .../src/gql/queries/getVotingProxy.gql | 8 + .../src/gql/queries/hasBeenLinked.gql | 8 + .../src/gql/queries/hasSponsor.gql | 8 + .../gql/queries/hasVotedOnDocumentPoll.gql | 8 + .../src/gql/queries/hasVotedOnUpgradePoll.gql | 8 + .../src/gql/queries/index.ts | 64 + .../src/gql/queries/isActive.gql | 8 + .../src/gql/queries/isApprovedForAll.gql | 8 + .../src/gql/queries/isEscaping.gql | 8 + .../src/gql/queries/isLive.gql | 8 + .../src/gql/queries/isManagementProxy.gql | 8 + .../src/gql/queries/isOperator.gql | 8 + .../src/gql/queries/isOwner.gql | 8 + .../src/gql/queries/isRequestingEscapeTo.gql | 8 + .../src/gql/queries/isSpawnProxy.gql | 8 + .../src/gql/queries/isSponsor.gql | 8 + .../src/gql/queries/isTransferProxy.gql | 8 + .../src/gql/queries/isVotingProxy.gql | 8 + .../src/gql/queries/name.gql | 8 + .../src/gql/queries/ownerOf.gql | 8 + .../src/gql/queries/supportsInterface.gql | 8 + .../src/gql/queries/symbol.gql | 8 + .../src/gql/queries/tokenByIndex.gql | 8 + .../src/gql/queries/tokenOfOwnerByIndex.gql | 8 + .../src/gql/queries/tokenURI.gql | 8 + .../src/gql/queries/totalSupply.gql | 8 + .../src/gql/queries/verifyBalance.gql | 8 + .../src/gql/queries/withdrawLimit.gql | 8 + .../src/gql/subscriptions/index.ts | 4 + .../src/gql/subscriptions/onEvent.gql | 31 + .../linear-star-release-watcher/src/hooks.ts | 80 + .../src/indexer.ts | 2084 +++++++++++++++++ .../src/job-runner.ts | 37 + .../src/resolvers.ts | 1025 ++++++++ .../src/schema.gql | 158 ++ .../linear-star-release-watcher/src/server.ts | 33 + .../linear-star-release-watcher/src/types.ts | 3 + .../linear-star-release-watcher/tsconfig.json | 74 + 157 files changed, 8938 insertions(+) create mode 100644 packages/linear-star-release-watcher/.eslintignore create mode 100644 packages/linear-star-release-watcher/.eslintrc.json create mode 100644 packages/linear-star-release-watcher/README.md create mode 100644 packages/linear-star-release-watcher/environments/local.toml create mode 100644 packages/linear-star-release-watcher/package.json create mode 100644 packages/linear-star-release-watcher/src/artifacts/LinearStarRelease.json create mode 100644 packages/linear-star-release-watcher/src/cli/checkpoint-cmds/create.ts create mode 100644 packages/linear-star-release-watcher/src/cli/checkpoint.ts create mode 100644 packages/linear-star-release-watcher/src/cli/export-state.ts create mode 100644 packages/linear-star-release-watcher/src/cli/import-state.ts create mode 100644 packages/linear-star-release-watcher/src/cli/index-block.ts create mode 100644 packages/linear-star-release-watcher/src/cli/inspect-cid.ts create mode 100644 packages/linear-star-release-watcher/src/cli/reset-cmds/job-queue.ts create mode 100644 packages/linear-star-release-watcher/src/cli/reset-cmds/state.ts create mode 100644 packages/linear-star-release-watcher/src/cli/reset-cmds/watcher.ts create mode 100644 packages/linear-star-release-watcher/src/cli/reset.ts create mode 100644 packages/linear-star-release-watcher/src/cli/watch-contract.ts create mode 100644 packages/linear-star-release-watcher/src/client.ts create mode 100644 packages/linear-star-release-watcher/src/database.ts create mode 100644 packages/linear-star-release-watcher/src/entity/BalanceOf.ts create mode 100644 packages/linear-star-release-watcher/src/entity/BlockProgress.ts create mode 100644 packages/linear-star-release-watcher/src/entity/CanEscapeTo.ts create mode 100644 packages/linear-star-release-watcher/src/entity/CanManage.ts create mode 100644 packages/linear-star-release-watcher/src/entity/CanSpawnAs.ts create mode 100644 packages/linear-star-release-watcher/src/entity/CanTransfer.ts create mode 100644 packages/linear-star-release-watcher/src/entity/CanVoteAs.ts create mode 100644 packages/linear-star-release-watcher/src/entity/Contract.ts create mode 100644 packages/linear-star-release-watcher/src/entity/Event.ts create mode 100644 packages/linear-star-release-watcher/src/entity/Exists.ts create mode 100644 packages/linear-star-release-watcher/src/entity/FindClaim.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetApproved.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetContinuityNumber.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetDocumentProposalCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetEscapeRequest.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetEscapeRequestsCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetKeyRevisionNumber.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetManagementProxy.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetManagerForCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetOwnedPointAtIndex.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetOwnedPointCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetOwner.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetSpawnCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetSpawnLimit.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetSpawnProxy.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetSpawningForCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetSponsor.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetSponsoringCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetTransferProxy.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetTransferringForCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetUpgradeProposalCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetVotingForCount.ts create mode 100644 packages/linear-star-release-watcher/src/entity/GetVotingProxy.ts create mode 100644 packages/linear-star-release-watcher/src/entity/HasBeenLinked.ts create mode 100644 packages/linear-star-release-watcher/src/entity/HasSponsor.ts create mode 100644 packages/linear-star-release-watcher/src/entity/HasVotedOnDocumentPoll.ts create mode 100644 packages/linear-star-release-watcher/src/entity/HasVotedOnUpgradePoll.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsActive.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsApprovedForAll.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsEscaping.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsLive.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsManagementProxy.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsOperator.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsOwner.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsRequestingEscapeTo.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsSpawnProxy.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsSponsor.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsTransferProxy.ts create mode 100644 packages/linear-star-release-watcher/src/entity/IsVotingProxy.ts create mode 100644 packages/linear-star-release-watcher/src/entity/Name.ts create mode 100644 packages/linear-star-release-watcher/src/entity/OwnerOf.ts create mode 100644 packages/linear-star-release-watcher/src/entity/State.ts create mode 100644 packages/linear-star-release-watcher/src/entity/StateSyncStatus.ts create mode 100644 packages/linear-star-release-watcher/src/entity/SupportsInterface.ts create mode 100644 packages/linear-star-release-watcher/src/entity/Symbol.ts create mode 100644 packages/linear-star-release-watcher/src/entity/SyncStatus.ts create mode 100644 packages/linear-star-release-watcher/src/entity/TokenByIndex.ts create mode 100644 packages/linear-star-release-watcher/src/entity/TokenOfOwnerByIndex.ts create mode 100644 packages/linear-star-release-watcher/src/entity/TokenURI.ts create mode 100644 packages/linear-star-release-watcher/src/entity/TotalSupply.ts create mode 100644 packages/linear-star-release-watcher/src/entity/VerifyBalance.ts create mode 100644 packages/linear-star-release-watcher/src/entity/WithdrawLimit.ts create mode 100644 packages/linear-star-release-watcher/src/fill.ts create mode 100644 packages/linear-star-release-watcher/src/gql/index.ts create mode 100644 packages/linear-star-release-watcher/src/gql/mutations/index.ts create mode 100644 packages/linear-star-release-watcher/src/gql/mutations/watchContract.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/balanceOf.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/canEscapeTo.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/canManage.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/canSpawnAs.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/canTransfer.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/canVoteAs.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/events.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/eventsInRange.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/exists.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/findClaim.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getApproved.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getContinuityNumber.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getDocumentProposalCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getEscapeRequest.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getEscapeRequestsCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getKeyRevisionNumber.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getManagementProxy.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getManagerForCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getOwnedPointAtIndex.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getOwnedPointCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getOwner.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getSpawnCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getSpawnLimit.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getSpawnProxy.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getSpawningForCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getSponsor.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getSponsoringCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getState.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getStateByCID.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getSyncStatus.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getTransferProxy.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getTransferringForCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getUpgradeProposalCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getVotingForCount.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/getVotingProxy.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/hasBeenLinked.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/hasSponsor.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/hasVotedOnDocumentPoll.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/hasVotedOnUpgradePoll.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/index.ts create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isActive.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isApprovedForAll.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isEscaping.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isLive.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isManagementProxy.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isOperator.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isOwner.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isRequestingEscapeTo.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isSpawnProxy.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isSponsor.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isTransferProxy.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/isVotingProxy.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/name.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/ownerOf.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/supportsInterface.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/symbol.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/tokenByIndex.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/tokenOfOwnerByIndex.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/tokenURI.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/totalSupply.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/verifyBalance.gql create mode 100644 packages/linear-star-release-watcher/src/gql/queries/withdrawLimit.gql create mode 100644 packages/linear-star-release-watcher/src/gql/subscriptions/index.ts create mode 100644 packages/linear-star-release-watcher/src/gql/subscriptions/onEvent.gql create mode 100644 packages/linear-star-release-watcher/src/hooks.ts create mode 100644 packages/linear-star-release-watcher/src/indexer.ts create mode 100644 packages/linear-star-release-watcher/src/job-runner.ts create mode 100644 packages/linear-star-release-watcher/src/resolvers.ts create mode 100644 packages/linear-star-release-watcher/src/schema.gql create mode 100644 packages/linear-star-release-watcher/src/server.ts create mode 100644 packages/linear-star-release-watcher/src/types.ts create mode 100644 packages/linear-star-release-watcher/tsconfig.json diff --git a/packages/linear-star-release-watcher/.eslintignore b/packages/linear-star-release-watcher/.eslintignore new file mode 100644 index 0000000..55cb522 --- /dev/null +++ b/packages/linear-star-release-watcher/.eslintignore @@ -0,0 +1,2 @@ +# Don't lint build output. +dist diff --git a/packages/linear-star-release-watcher/.eslintrc.json b/packages/linear-star-release-watcher/.eslintrc.json new file mode 100644 index 0000000..a2b842c --- /dev/null +++ b/packages/linear-star-release-watcher/.eslintrc.json @@ -0,0 +1,28 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "semistandard", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "indent": ["error", 2, { "SwitchCase": 1 }], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": [ + "warn", + { + "allowArgumentsExplicitlyTypedAsAny": true + } + ] + } +} diff --git a/packages/linear-star-release-watcher/README.md b/packages/linear-star-release-watcher/README.md new file mode 100644 index 0000000..72d7251 --- /dev/null +++ b/packages/linear-star-release-watcher/README.md @@ -0,0 +1,210 @@ +# linear-star-release-watcher + +## Currently unsupported queries + +The watcher was generated in `eth_call` mode and does not support the following queries in its current state: + +* `getRemainingStars(address _participant) returns (uint16[] stars)` + +## Setup + +* Run the following command to install required packages: + + ```bash + yarn + ``` + +* Create a postgres12 database for the watcher: + + ```bash + sudo su - postgres + createdb linear-star-release-watcher + ``` + +* If the watcher is an `active` watcher: + + Create database for the job queue and enable the `pgcrypto` extension on them (https://github.com/timgit/pg-boss/blob/master/docs/usage.md#intro): + + ``` + createdb linear-star-release-watcher-job-queue + ``` + + ``` + postgres@tesla:~$ psql -U postgres -h localhost linear-star-release-watcher-job-queue + Password for user postgres: + psql (12.7 (Ubuntu 12.7-1.pgdg18.04+1)) + SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) + Type "help" for help. + + linear-star-release-watcher-job-queue=# CREATE EXTENSION pgcrypto; + CREATE EXTENSION + linear-star-release-watcher-job-queue=# exit + ``` + +* In the [config file](./environments/local.toml): + + * Update the database connection settings. + + * Update the `upstream` config and provide the `ipld-eth-server` GQL API endpoint. + + * Update the `server` config with state checkpoint settings. + +## Customize + +* Indexing on an event: + + * Edit the custom hook function `handleEvent` (triggered on an event) in [hooks.ts](./src/hooks.ts) to perform corresponding indexing using the `Indexer` object. + + * While using the indexer storage methods for indexing, pass `diff` as true if default state is desired to be generated using the state variables being indexed. + +* Generating state: + + * Edit the custom hook function `createInitialState` (triggered if the watcher passes the start block, checkpoint: `true`) in [hooks.ts](./src/hooks.ts) to save an initial `State` using the `Indexer` object. + + * Edit the custom hook function `createStateDiff` (triggered on a block) in [hooks.ts](./src/hooks.ts) to save the state in a `diff` `State` using the `Indexer` object. The default state (if exists) is updated. + + * Edit the custom hook function `createStateCheckpoint` (triggered just before default and CLI checkpoint) in [hooks.ts](./src/hooks.ts) to save the state in a `checkpoint` `State` using the `Indexer` object. + +### GQL Caching + +To enable GQL requests caching: + +* Update the `server.gqlCache` config with required settings. + +* In the GQL [schema file](./src/schema.gql), use the `cacheControl` directive to apply cache hints at schema level. + + * Eg. Set `inheritMaxAge` to true for non-scalar fields of a type. + +* In the GQL [resolvers file](./src/resolvers.ts), uncomment the `setGQLCacheHints()` calls in resolvers for required queries. + +## Run + +* If the watcher is a `lazy` watcher: + + * Run the server: + + ```bash + yarn server + ``` + + GQL console: http://localhost:3009/graphql + +* If the watcher is an `active` watcher: + + * Run the job-runner: + + ```bash + yarn job-runner + ``` + + * Run the server: + + ```bash + yarn server + ``` + + GQL console: http://localhost:3009/graphql + + * To watch a contract: + + ```bash + yarn watch:contract --address --kind --checkpoint --starting-block [block-number] + ``` + + * `address`: Address or identifier of the contract to be watched. + * `kind`: Kind of the contract. + * `checkpoint`: Turn checkpointing on (`true` | `false`). + * `starting-block`: Starting block for the contract (default: `1`). + + Examples: + + Watch a contract with its address and checkpointing on: + + ```bash + yarn watch:contract --address 0x1F78641644feB8b64642e833cE4AFE93DD6e7833 --kind ERC20 --checkpoint true + ``` + + Watch a contract with its identifier and checkpointing on: + + ```bash + yarn watch:contract --address MyProtocol --kind protocol --checkpoint true + ``` + + * To fill a block range: + + ```bash + yarn fill --start-block --end-block + ``` + + * `start-block`: Block number to start filling from. + * `end-block`: Block number till which to fill. + + * To create a checkpoint for a contract: + + ```bash + yarn checkpoint create --address --block-hash [block-hash] + ``` + + * `address`: Address or identifier of the contract for which to create a checkpoint. + * `block-hash`: Hash of a block (in the pruned region) at which to create the checkpoint (default: latest canonical block hash). + + * To reset the watcher to a previous block number: + + * Reset watcher: + + ```bash + yarn reset watcher --block-number + ``` + + * Reset job-queue: + + ```bash + yarn reset job-queue + ``` + + * Reset state: + + ```bash + yarn reset state --block-number + ``` + + * `block-number`: Block number to which to reset the watcher. + + * To export and import the watcher state: + + * In source watcher, export watcher state: + + ```bash + yarn export-state --export-file [export-file-path] --block-number [snapshot-block-height] + ``` + + * `export-file`: Path of file to which to export the watcher data. + * `block-number`: Block height at which to take snapshot for export. + + * In target watcher, run job-runner: + + ```bash + yarn job-runner + ``` + + * Import watcher state: + + ```bash + yarn import-state --import-file + ``` + + * `import-file`: Path of file from which to import the watcher data. + + * Run server: + + ```bash + yarn server + ``` + + * To inspect a CID: + + ```bash + yarn inspect-cid --cid + ``` + + * `cid`: CID to be inspected. diff --git a/packages/linear-star-release-watcher/environments/local.toml b/packages/linear-star-release-watcher/environments/local.toml new file mode 100644 index 0000000..c5553f7 --- /dev/null +++ b/packages/linear-star-release-watcher/environments/local.toml @@ -0,0 +1,66 @@ +[server] + host = "127.0.0.1" + port = 3009 + kind = "lazy" + + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 2000 + + # Enable state creation + # CAUTION: Disable only if state creation is not desired or can be filled subsequently + enableState = true + + # Boolean to filter logs by contract. + filterLogs = false + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = 1000 + + # GQL cache settings + [server.gqlCache] + enabled = true + + # Max in-memory cache size (in bytes) (default 8 MB) + # maxCacheSize + + # GQL cache-control max-age settings (in seconds) + maxAge = 15 + +[metrics] + host = "127.0.0.1" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "localhost" + port = 5432 + database = "linear-star-release-watcher" + username = "postgres" + password = "postgres" + synchronize = true + logging = false + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://127.0.0.1:8082/graphql" + rpcProviderEndpoint = "http://127.0.0.1:8081" + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://postgres:postgres@localhost/linear-star-release-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 + blockDelayInMilliSecs = 2000 + prefetchBlocksInMem = true + prefetchBlockCount = 10 diff --git a/packages/linear-star-release-watcher/package.json b/packages/linear-star-release-watcher/package.json new file mode 100644 index 0000000..f8a2f56 --- /dev/null +++ b/packages/linear-star-release-watcher/package.json @@ -0,0 +1,73 @@ +{ + "name": "@cerc-io/linear-star-release-watcher", + "version": "0.1.0", + "description": "linear-star-release-watcher", + "private": true, + "main": "dist/index.js", + "scripts": { + "lint": "eslint .", + "build": "yarn clean && tsc && yarn copy-assets", + "clean": "rm -rf ./dist", + "copy-assets": "copyfiles -u 1 src/**/*.gql dist/", + "server": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true node --enable-source-maps dist/server.js", + "server:dev": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true ts-node src/server.ts", + "job-runner": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true node --enable-source-maps dist/job-runner.js", + "job-runner:dev": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true ts-node src/job-runner.ts", + "watch:contract": "DEBUG=vulcanize:* ts-node src/cli/watch-contract.ts", + "fill": "DEBUG=vulcanize:* ts-node src/fill.ts", + "reset": "DEBUG=vulcanize:* ts-node src/cli/reset.ts", + "checkpoint": "DEBUG=vulcanize:* node --enable-source-maps dist/cli/checkpoint.js", + "checkpoint:dev": "DEBUG=vulcanize:* ts-node src/cli/checkpoint.ts", + "export-state": "DEBUG=vulcanize:* node --enable-source-maps dist/cli/export-state.js", + "export-state:dev": "DEBUG=vulcanize:* ts-node src/cli/export-state.ts", + "import-state": "DEBUG=vulcanize:* node --enable-source-maps dist/cli/import-state.js", + "import-state:dev": "DEBUG=vulcanize:* ts-node src/cli/import-state.ts", + "inspect-cid": "DEBUG=vulcanize:* ts-node src/cli/inspect-cid.ts", + "index-block": "DEBUG=vulcanize:* ts-node src/cli/index-block.ts" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/cerc-io/watcher-ts.git" + }, + "author": "", + "license": "AGPL-3.0", + "bugs": { + "url": "https://github.com/cerc-io/watcher-ts/issues" + }, + "homepage": "https://github.com/cerc-io/watcher-ts#readme", + "dependencies": { + "@apollo/client": "^3.3.19", + "@ethersproject/providers": "^5.4.4", + "@cerc-io/cli": "^0.2.34", + "@cerc-io/ipld-eth-client": "^0.2.34", + "@cerc-io/solidity-mapper": "^0.2.34", + "@cerc-io/util": "^0.2.34", + "apollo-type-bigint": "^0.1.3", + "debug": "^4.3.1", + "ethers": "^5.4.4", + "graphql": "^15.5.0", + "json-bigint": "^1.0.0", + "reflect-metadata": "^0.1.13", + "typeorm": "^0.2.32", + "yargs": "^17.0.1", + "decimal.js": "^10.3.1" + }, + "devDependencies": { + "@ethersproject/abi": "^5.3.0", + "@types/yargs": "^17.0.0", + "@types/debug": "^4.1.5", + "@types/json-bigint": "^1.0.1", + "@typescript-eslint/eslint-plugin": "^5.47.1", + "@typescript-eslint/parser": "^5.47.1", + "eslint": "^8.35.0", + "eslint-config-semistandard": "^15.0.1", + "eslint-config-standard": "^16.0.3", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-standard": "^5.0.0", + "ts-node": "^10.2.1", + "typescript": "^5.0.2", + "copyfiles": "^2.4.1" + } +} diff --git a/packages/linear-star-release-watcher/src/artifacts/LinearStarRelease.json b/packages/linear-star-release-watcher/src/artifacts/LinearStarRelease.json new file mode 100644 index 0000000..c780e6e --- /dev/null +++ b/packages/linear-star-release-watcher/src/artifacts/LinearStarRelease.json @@ -0,0 +1,331 @@ +{ + "abi": [ + { + "constant": false, + "inputs": [], + "name": "startReleasing", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_participant", + "type": "address" + } + ], + "name": "getRemainingStars", + "outputs": [ + { + "name": "stars", + "type": "uint16[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_participant", + "type": "address" + }, + { + "name": "_to", + "type": "address" + } + ], + "name": "withdrawOverdue", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_participant", + "type": "address" + } + ], + "name": "verifyBalance", + "outputs": [ + { + "name": "correct", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "start", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + } + ], + "name": "transferBatch", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_participant", + "type": "address" + }, + { + "name": "_windup", + "type": "uint256" + }, + { + "name": "_amount", + "type": "uint16" + }, + { + "name": "_rate", + "type": "uint16" + }, + { + "name": "_rateUnit", + "type": "uint256" + } + ], + "name": "register", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "azimuth", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "batches", + "outputs": [ + { + "name": "windup", + "type": "uint256" + }, + { + "name": "rateUnit", + "type": "uint256" + }, + { + "name": "withdrawn", + "type": "uint16" + }, + { + "name": "rate", + "type": "uint16" + }, + { + "name": "amount", + "type": "uint16" + }, + { + "name": "approvedTransferTo", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + } + ], + "name": "approveBatchTransfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_participant", + "type": "address" + }, + { + "name": "_star", + "type": "uint16" + } + ], + "name": "deposit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_participant", + "type": "address" + } + ], + "name": "withdrawLimit", + "outputs": [ + { + "name": "limit", + "type": "uint16" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "_azimuth", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "previousOwner", + "type": "address" + } + ], + "name": "OwnershipRenounced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + } + ] +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/cli/checkpoint-cmds/create.ts b/packages/linear-star-release-watcher/src/cli/checkpoint-cmds/create.ts new file mode 100644 index 0000000..b7d343a --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/checkpoint-cmds/create.ts @@ -0,0 +1,34 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { CreateCheckpointCmd } from '@cerc-io/cli'; + +import { Database } from '../../database'; +import { Indexer } from '../../indexer'; + +export const command = 'create'; + +export const desc = 'Create checkpoint'; + +export const builder = { + address: { + type: 'string', + require: true, + demandOption: true, + describe: 'Contract address to create the checkpoint for.' + }, + blockHash: { + type: 'string', + describe: 'Blockhash at which to create the checkpoint.' + } +}; + +export const handler = async (argv: any): Promise => { + const createCheckpointCmd = new CreateCheckpointCmd(); + await createCheckpointCmd.init(argv, Database); + + await createCheckpointCmd.initIndexer(Indexer); + + await createCheckpointCmd.exec(); +}; diff --git a/packages/linear-star-release-watcher/src/cli/checkpoint.ts b/packages/linear-star-release-watcher/src/cli/checkpoint.ts new file mode 100644 index 0000000..d05ad8a --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/checkpoint.ts @@ -0,0 +1,39 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import yargs from 'yargs'; +import 'reflect-metadata'; +import debug from 'debug'; + +import { DEFAULT_CONFIG_PATH } from '@cerc-io/util'; + +import { hideBin } from 'yargs/helpers'; + +const log = debug('vulcanize:checkpoint'); + +const main = async () => { + return yargs(hideBin(process.argv)) + .parserConfiguration({ + 'parse-numbers': false + }).options({ + configFile: { + alias: 'f', + type: 'string', + require: true, + demandOption: true, + describe: 'configuration file path (toml)', + default: DEFAULT_CONFIG_PATH + } + }) + .commandDir('checkpoint-cmds', { extensions: ['ts', 'js'], exclude: /([a-zA-Z0-9\s_\\.\-:])+(.d.ts)$/ }) + .demandCommand(1) + .help() + .argv; +}; + +main().then(() => { + process.exit(); +}).catch(err => { + log(err); +}); diff --git a/packages/linear-star-release-watcher/src/cli/export-state.ts b/packages/linear-star-release-watcher/src/cli/export-state.ts new file mode 100644 index 0000000..6af4a60 --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/export-state.ts @@ -0,0 +1,28 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { ExportStateCmd } from '@cerc-io/cli'; + +import { Database } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:export-state'); + +const main = async (): Promise => { + const exportStateCmd = new ExportStateCmd(); + await exportStateCmd.init(Database); + + await exportStateCmd.initIndexer(Indexer); + + await exportStateCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/packages/linear-star-release-watcher/src/cli/import-state.ts b/packages/linear-star-release-watcher/src/cli/import-state.ts new file mode 100644 index 0000000..fcc4802 --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/import-state.ts @@ -0,0 +1,29 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { ImportStateCmd } from '@cerc-io/cli'; + +import { Database } from '../database'; +import { Indexer } from '../indexer'; +import { State } from '../entity/State'; + +const log = debug('vulcanize:import-state'); + +export const main = async (): Promise => { + const importStateCmd = new ImportStateCmd(); + await importStateCmd.init(Database); + + await importStateCmd.initIndexer(Indexer); + + await importStateCmd.exec(State); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/packages/linear-star-release-watcher/src/cli/index-block.ts b/packages/linear-star-release-watcher/src/cli/index-block.ts new file mode 100644 index 0000000..587c1cc --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/index-block.ts @@ -0,0 +1,28 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { IndexBlockCmd } from '@cerc-io/cli'; + +import { Database } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:index-block'); + +const main = async (): Promise => { + const indexBlockCmd = new IndexBlockCmd(); + await indexBlockCmd.init(Database); + + await indexBlockCmd.initIndexer(Indexer); + + await indexBlockCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/packages/linear-star-release-watcher/src/cli/inspect-cid.ts b/packages/linear-star-release-watcher/src/cli/inspect-cid.ts new file mode 100644 index 0000000..3e93d1c --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/inspect-cid.ts @@ -0,0 +1,28 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { InspectCIDCmd } from '@cerc-io/cli'; + +import { Database } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:inspect-cid'); + +const main = async (): Promise => { + const inspectCIDCmd = new InspectCIDCmd(); + await inspectCIDCmd.init(Database); + + await inspectCIDCmd.initIndexer(Indexer); + + await inspectCIDCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/packages/linear-star-release-watcher/src/cli/reset-cmds/job-queue.ts b/packages/linear-star-release-watcher/src/cli/reset-cmds/job-queue.ts new file mode 100644 index 0000000..c33cbfd --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/reset-cmds/job-queue.ts @@ -0,0 +1,22 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import debug from 'debug'; + +import { getConfig, resetJobs, Config } from '@cerc-io/util'; + +const log = debug('vulcanize:reset-job-queue'); + +export const command = 'job-queue'; + +export const desc = 'Reset job queue'; + +export const builder = {}; + +export const handler = async (argv: any): Promise => { + const config: Config = await getConfig(argv.configFile); + await resetJobs(config); + + log('Job queue reset successfully'); +}; diff --git a/packages/linear-star-release-watcher/src/cli/reset-cmds/state.ts b/packages/linear-star-release-watcher/src/cli/reset-cmds/state.ts new file mode 100644 index 0000000..33211d6 --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/reset-cmds/state.ts @@ -0,0 +1,24 @@ +// +// Copyright 2022 Vulcanize, Inc. +// + +import { ResetStateCmd } from '@cerc-io/cli'; + +import { Database } from '../../database'; + +export const command = 'state'; + +export const desc = 'Reset State to a given block number'; + +export const builder = { + blockNumber: { + type: 'number' + } +}; + +export const handler = async (argv: any): Promise => { + const resetStateCmd = new ResetStateCmd(); + await resetStateCmd.init(argv, Database); + + await resetStateCmd.exec(); +}; diff --git a/packages/linear-star-release-watcher/src/cli/reset-cmds/watcher.ts b/packages/linear-star-release-watcher/src/cli/reset-cmds/watcher.ts new file mode 100644 index 0000000..8e825d1 --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/reset-cmds/watcher.ts @@ -0,0 +1,27 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { ResetWatcherCmd } from '@cerc-io/cli'; + +import { Database } from '../../database'; +import { Indexer } from '../../indexer'; + +export const command = 'watcher'; + +export const desc = 'Reset watcher to a block number'; + +export const builder = { + blockNumber: { + type: 'number' + } +}; + +export const handler = async (argv: any): Promise => { + const resetWatcherCmd = new ResetWatcherCmd(); + await resetWatcherCmd.init(argv, Database); + + await resetWatcherCmd.initIndexer(Indexer); + + await resetWatcherCmd.exec(); +}; diff --git a/packages/linear-star-release-watcher/src/cli/reset.ts b/packages/linear-star-release-watcher/src/cli/reset.ts new file mode 100644 index 0000000..95648c8 --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/reset.ts @@ -0,0 +1,24 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { getResetYargs } from '@cerc-io/util'; + +const log = debug('vulcanize:reset'); + +const main = async () => { + return getResetYargs() + .commandDir('reset-cmds', { extensions: ['ts', 'js'], exclude: /([a-zA-Z0-9\s_\\.\-:])+(.d.ts)$/ }) + .demandCommand(1) + .help() + .argv; +}; + +main().then(() => { + process.exit(); +}).catch(err => { + log(err); +}); diff --git a/packages/linear-star-release-watcher/src/cli/watch-contract.ts b/packages/linear-star-release-watcher/src/cli/watch-contract.ts new file mode 100644 index 0000000..200a9e9 --- /dev/null +++ b/packages/linear-star-release-watcher/src/cli/watch-contract.ts @@ -0,0 +1,28 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { WatchContractCmd } from '@cerc-io/cli'; + +import { Database } from '../database'; +import { Indexer } from '../indexer'; + +const log = debug('vulcanize:watch-contract'); + +const main = async (): Promise => { + const watchContractCmd = new WatchContractCmd(); + await watchContractCmd.init(Database); + + await watchContractCmd.initIndexer(Indexer); + + await watchContractCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(0); +}); diff --git a/packages/linear-star-release-watcher/src/client.ts b/packages/linear-star-release-watcher/src/client.ts new file mode 100644 index 0000000..aee1e6c --- /dev/null +++ b/packages/linear-star-release-watcher/src/client.ts @@ -0,0 +1,559 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { gql } from '@apollo/client/core'; +import { GraphQLClient, GraphQLConfig } from '@cerc-io/ipld-eth-client'; + +import { queries, mutations, subscriptions } from './gql'; + +export class Client { + _config: GraphQLConfig; + _client: GraphQLClient; + + constructor (config: GraphQLConfig) { + this._config = config; + + this._client = new GraphQLClient(config); + } + + async getIsActive (blockHash: string, contractAddress: string, _point: number): Promise { + const { isActive } = await this._client.query( + gql(queries.isActive), + { blockHash, contractAddress, _point } + ); + + return isActive; + } + + async getGetKeyRevisionNumber (blockHash: string, contractAddress: string, _point: number): Promise { + const { getKeyRevisionNumber } = await this._client.query( + gql(queries.getKeyRevisionNumber), + { blockHash, contractAddress, _point } + ); + + return getKeyRevisionNumber; + } + + async getHasBeenLinked (blockHash: string, contractAddress: string, _point: number): Promise { + const { hasBeenLinked } = await this._client.query( + gql(queries.hasBeenLinked), + { blockHash, contractAddress, _point } + ); + + return hasBeenLinked; + } + + async getIsLive (blockHash: string, contractAddress: string, _point: number): Promise { + const { isLive } = await this._client.query( + gql(queries.isLive), + { blockHash, contractAddress, _point } + ); + + return isLive; + } + + async getGetContinuityNumber (blockHash: string, contractAddress: string, _point: number): Promise { + const { getContinuityNumber } = await this._client.query( + gql(queries.getContinuityNumber), + { blockHash, contractAddress, _point } + ); + + return getContinuityNumber; + } + + async getGetSpawnCount (blockHash: string, contractAddress: string, _point: number): Promise { + const { getSpawnCount } = await this._client.query( + gql(queries.getSpawnCount), + { blockHash, contractAddress, _point } + ); + + return getSpawnCount; + } + + async getHasSponsor (blockHash: string, contractAddress: string, _point: number): Promise { + const { hasSponsor } = await this._client.query( + gql(queries.hasSponsor), + { blockHash, contractAddress, _point } + ); + + return hasSponsor; + } + + async getGetSponsor (blockHash: string, contractAddress: string, _point: number): Promise { + const { getSponsor } = await this._client.query( + gql(queries.getSponsor), + { blockHash, contractAddress, _point } + ); + + return getSponsor; + } + + async getIsSponsor (blockHash: string, contractAddress: string, _point: number, _sponsor: number): Promise { + const { isSponsor } = await this._client.query( + gql(queries.isSponsor), + { blockHash, contractAddress, _point, _sponsor } + ); + + return isSponsor; + } + + async getGetSponsoringCount (blockHash: string, contractAddress: string, _sponsor: number): Promise { + const { getSponsoringCount } = await this._client.query( + gql(queries.getSponsoringCount), + { blockHash, contractAddress, _sponsor } + ); + + return getSponsoringCount; + } + + async getIsEscaping (blockHash: string, contractAddress: string, _point: number): Promise { + const { isEscaping } = await this._client.query( + gql(queries.isEscaping), + { blockHash, contractAddress, _point } + ); + + return isEscaping; + } + + async getGetEscapeRequest (blockHash: string, contractAddress: string, _point: number): Promise { + const { getEscapeRequest } = await this._client.query( + gql(queries.getEscapeRequest), + { blockHash, contractAddress, _point } + ); + + return getEscapeRequest; + } + + async getIsRequestingEscapeTo (blockHash: string, contractAddress: string, _point: number, _sponsor: number): Promise { + const { isRequestingEscapeTo } = await this._client.query( + gql(queries.isRequestingEscapeTo), + { blockHash, contractAddress, _point, _sponsor } + ); + + return isRequestingEscapeTo; + } + + async getGetEscapeRequestsCount (blockHash: string, contractAddress: string, _sponsor: number): Promise { + const { getEscapeRequestsCount } = await this._client.query( + gql(queries.getEscapeRequestsCount), + { blockHash, contractAddress, _sponsor } + ); + + return getEscapeRequestsCount; + } + + async getGetOwner (blockHash: string, contractAddress: string, _point: number): Promise { + const { getOwner } = await this._client.query( + gql(queries.getOwner), + { blockHash, contractAddress, _point } + ); + + return getOwner; + } + + async getIsOwner (blockHash: string, contractAddress: string, _point: number, _address: string): Promise { + const { isOwner } = await this._client.query( + gql(queries.isOwner), + { blockHash, contractAddress, _point, _address } + ); + + return isOwner; + } + + async getGetOwnedPointCount (blockHash: string, contractAddress: string, _whose: string): Promise { + const { getOwnedPointCount } = await this._client.query( + gql(queries.getOwnedPointCount), + { blockHash, contractAddress, _whose } + ); + + return getOwnedPointCount; + } + + async getGetOwnedPointAtIndex (blockHash: string, contractAddress: string, _whose: string, _index: bigint): Promise { + const { getOwnedPointAtIndex } = await this._client.query( + gql(queries.getOwnedPointAtIndex), + { blockHash, contractAddress, _whose, _index } + ); + + return getOwnedPointAtIndex; + } + + async getGetManagementProxy (blockHash: string, contractAddress: string, _point: number): Promise { + const { getManagementProxy } = await this._client.query( + gql(queries.getManagementProxy), + { blockHash, contractAddress, _point } + ); + + return getManagementProxy; + } + + async getIsManagementProxy (blockHash: string, contractAddress: string, _point: number, _proxy: string): Promise { + const { isManagementProxy } = await this._client.query( + gql(queries.isManagementProxy), + { blockHash, contractAddress, _point, _proxy } + ); + + return isManagementProxy; + } + + async getCanManage (blockHash: string, contractAddress: string, _point: number, _who: string): Promise { + const { canManage } = await this._client.query( + gql(queries.canManage), + { blockHash, contractAddress, _point, _who } + ); + + return canManage; + } + + async getGetManagerForCount (blockHash: string, contractAddress: string, _proxy: string): Promise { + const { getManagerForCount } = await this._client.query( + gql(queries.getManagerForCount), + { blockHash, contractAddress, _proxy } + ); + + return getManagerForCount; + } + + async getGetSpawnProxy (blockHash: string, contractAddress: string, _point: number): Promise { + const { getSpawnProxy } = await this._client.query( + gql(queries.getSpawnProxy), + { blockHash, contractAddress, _point } + ); + + return getSpawnProxy; + } + + async getIsSpawnProxy (blockHash: string, contractAddress: string, _point: number, _proxy: string): Promise { + const { isSpawnProxy } = await this._client.query( + gql(queries.isSpawnProxy), + { blockHash, contractAddress, _point, _proxy } + ); + + return isSpawnProxy; + } + + async getCanSpawnAs (blockHash: string, contractAddress: string, _point: number, _who: string): Promise { + const { canSpawnAs } = await this._client.query( + gql(queries.canSpawnAs), + { blockHash, contractAddress, _point, _who } + ); + + return canSpawnAs; + } + + async getGetSpawningForCount (blockHash: string, contractAddress: string, _proxy: string): Promise { + const { getSpawningForCount } = await this._client.query( + gql(queries.getSpawningForCount), + { blockHash, contractAddress, _proxy } + ); + + return getSpawningForCount; + } + + async getGetVotingProxy (blockHash: string, contractAddress: string, _point: number): Promise { + const { getVotingProxy } = await this._client.query( + gql(queries.getVotingProxy), + { blockHash, contractAddress, _point } + ); + + return getVotingProxy; + } + + async getIsVotingProxy (blockHash: string, contractAddress: string, _point: number, _proxy: string): Promise { + const { isVotingProxy } = await this._client.query( + gql(queries.isVotingProxy), + { blockHash, contractAddress, _point, _proxy } + ); + + return isVotingProxy; + } + + async getCanVoteAs (blockHash: string, contractAddress: string, _point: number, _who: string): Promise { + const { canVoteAs } = await this._client.query( + gql(queries.canVoteAs), + { blockHash, contractAddress, _point, _who } + ); + + return canVoteAs; + } + + async getGetVotingForCount (blockHash: string, contractAddress: string, _proxy: string): Promise { + const { getVotingForCount } = await this._client.query( + gql(queries.getVotingForCount), + { blockHash, contractAddress, _proxy } + ); + + return getVotingForCount; + } + + async getGetTransferProxy (blockHash: string, contractAddress: string, _point: number): Promise { + const { getTransferProxy } = await this._client.query( + gql(queries.getTransferProxy), + { blockHash, contractAddress, _point } + ); + + return getTransferProxy; + } + + async getIsTransferProxy (blockHash: string, contractAddress: string, _point: number, _proxy: string): Promise { + const { isTransferProxy } = await this._client.query( + gql(queries.isTransferProxy), + { blockHash, contractAddress, _point, _proxy } + ); + + return isTransferProxy; + } + + async getCanTransfer (blockHash: string, contractAddress: string, _point: number, _who: string): Promise { + const { canTransfer } = await this._client.query( + gql(queries.canTransfer), + { blockHash, contractAddress, _point, _who } + ); + + return canTransfer; + } + + async getGetTransferringForCount (blockHash: string, contractAddress: string, _proxy: string): Promise { + const { getTransferringForCount } = await this._client.query( + gql(queries.getTransferringForCount), + { blockHash, contractAddress, _proxy } + ); + + return getTransferringForCount; + } + + async getIsOperator (blockHash: string, contractAddress: string, _owner: string, _operator: string): Promise { + const { isOperator } = await this._client.query( + gql(queries.isOperator), + { blockHash, contractAddress, _owner, _operator } + ); + + return isOperator; + } + + async getGetUpgradeProposalCount (blockHash: string, contractAddress: string): Promise { + const { getUpgradeProposalCount } = await this._client.query( + gql(queries.getUpgradeProposalCount), + { blockHash, contractAddress } + ); + + return getUpgradeProposalCount; + } + + async getGetDocumentProposalCount (blockHash: string, contractAddress: string): Promise { + const { getDocumentProposalCount } = await this._client.query( + gql(queries.getDocumentProposalCount), + { blockHash, contractAddress } + ); + + return getDocumentProposalCount; + } + + async getHasVotedOnUpgradePoll (blockHash: string, contractAddress: string, _galaxy: number, _proposal: string): Promise { + const { hasVotedOnUpgradePoll } = await this._client.query( + gql(queries.hasVotedOnUpgradePoll), + { blockHash, contractAddress, _galaxy, _proposal } + ); + + return hasVotedOnUpgradePoll; + } + + async getHasVotedOnDocumentPoll (blockHash: string, contractAddress: string, _galaxy: number, _proposal: string): Promise { + const { hasVotedOnDocumentPoll } = await this._client.query( + gql(queries.hasVotedOnDocumentPoll), + { blockHash, contractAddress, _galaxy, _proposal } + ); + + return hasVotedOnDocumentPoll; + } + + async getFindClaim (blockHash: string, contractAddress: string, _whose: number, _protocol: string, _claim: string): Promise { + const { findClaim } = await this._client.query( + gql(queries.findClaim), + { blockHash, contractAddress, _whose, _protocol, _claim } + ); + + return findClaim; + } + + async getSupportsInterface (blockHash: string, contractAddress: string, _interfaceId: string): Promise { + const { supportsInterface } = await this._client.query( + gql(queries.supportsInterface), + { blockHash, contractAddress, _interfaceId } + ); + + return supportsInterface; + } + + async getBalanceOf (blockHash: string, contractAddress: string, _owner: string): Promise { + const { balanceOf } = await this._client.query( + gql(queries.balanceOf), + { blockHash, contractAddress, _owner } + ); + + return balanceOf; + } + + async getOwnerOf (blockHash: string, contractAddress: string, _tokenId: bigint): Promise { + const { ownerOf } = await this._client.query( + gql(queries.ownerOf), + { blockHash, contractAddress, _tokenId } + ); + + return ownerOf; + } + + async getExists (blockHash: string, contractAddress: string, _tokenId: bigint): Promise { + const { exists } = await this._client.query( + gql(queries.exists), + { blockHash, contractAddress, _tokenId } + ); + + return exists; + } + + async getGetApproved (blockHash: string, contractAddress: string, _tokenId: bigint): Promise { + const { getApproved } = await this._client.query( + gql(queries.getApproved), + { blockHash, contractAddress, _tokenId } + ); + + return getApproved; + } + + async getIsApprovedForAll (blockHash: string, contractAddress: string, _owner: string, _operator: string): Promise { + const { isApprovedForAll } = await this._client.query( + gql(queries.isApprovedForAll), + { blockHash, contractAddress, _owner, _operator } + ); + + return isApprovedForAll; + } + + async getTotalSupply (blockHash: string, contractAddress: string): Promise { + const { totalSupply } = await this._client.query( + gql(queries.totalSupply), + { blockHash, contractAddress } + ); + + return totalSupply; + } + + async getTokenOfOwnerByIndex (blockHash: string, contractAddress: string, _owner: string, _index: bigint): Promise { + const { tokenOfOwnerByIndex } = await this._client.query( + gql(queries.tokenOfOwnerByIndex), + { blockHash, contractAddress, _owner, _index } + ); + + return tokenOfOwnerByIndex; + } + + async getTokenByIndex (blockHash: string, contractAddress: string, _index: bigint): Promise { + const { tokenByIndex } = await this._client.query( + gql(queries.tokenByIndex), + { blockHash, contractAddress, _index } + ); + + return tokenByIndex; + } + + async getName (blockHash: string, contractAddress: string): Promise { + const { name } = await this._client.query( + gql(queries.name), + { blockHash, contractAddress } + ); + + return name; + } + + async getSymbol (blockHash: string, contractAddress: string): Promise { + const { symbol } = await this._client.query( + gql(queries.symbol), + { blockHash, contractAddress } + ); + + return symbol; + } + + async getTokenURI (blockHash: string, contractAddress: string, _tokenId: bigint): Promise { + const { tokenURI } = await this._client.query( + gql(queries.tokenURI), + { blockHash, contractAddress, _tokenId } + ); + + return tokenURI; + } + + async getGetSpawnLimit (blockHash: string, contractAddress: string, _point: number, _time: bigint): Promise { + const { getSpawnLimit } = await this._client.query( + gql(queries.getSpawnLimit), + { blockHash, contractAddress, _point, _time } + ); + + return getSpawnLimit; + } + + async getCanEscapeTo (blockHash: string, contractAddress: string, _point: number, _sponsor: number): Promise { + const { canEscapeTo } = await this._client.query( + gql(queries.canEscapeTo), + { blockHash, contractAddress, _point, _sponsor } + ); + + return canEscapeTo; + } + + async getWithdrawLimit (blockHash: string, contractAddress: string, _participant: string): Promise { + const { withdrawLimit } = await this._client.query( + gql(queries.withdrawLimit), + { blockHash, contractAddress, _participant } + ); + + return withdrawLimit; + } + + async getVerifyBalance (blockHash: string, contractAddress: string, _participant: string): Promise { + const { verifyBalance } = await this._client.query( + gql(queries.verifyBalance), + { blockHash, contractAddress, _participant } + ); + + return verifyBalance; + } + + async getEvents (blockHash: string, contractAddress: string, name: string): Promise { + const { events } = await this._client.query( + gql(queries.events), + { blockHash, contractAddress, name } + ); + + return events; + } + + async getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise { + const { eventsInRange } = await this._client.query( + gql(queries.eventsInRange), + { fromBlockNumber, toBlockNumber } + ); + + return eventsInRange; + } + + async watchContract (contractAddress: string, startingBlock?: number): Promise { + const { watchContract } = await this._client.mutate( + gql(mutations.watchContract), + { contractAddress, startingBlock } + ); + + return watchContract; + } + + async watchEvents (onNext: (value: any) => void): Promise { + return this._client.subscribe( + gql(subscriptions.onEvent), + ({ data }) => { + onNext(data.onEvent); + } + ); + } +} diff --git a/packages/linear-star-release-watcher/src/database.ts b/packages/linear-star-release-watcher/src/database.ts new file mode 100644 index 0000000..7206b64 --- /dev/null +++ b/packages/linear-star-release-watcher/src/database.ts @@ -0,0 +1,1233 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import assert from 'assert'; +import { Connection, ConnectionOptions, DeepPartial, FindConditions, QueryRunner, FindManyOptions, EntityTarget } from 'typeorm'; +import path from 'path'; + +import { + Database as BaseDatabase, + DatabaseInterface, + QueryOptions, + StateKind, + Where +} from '@cerc-io/util'; + +import { Contract } from './entity/Contract'; +import { Event } from './entity/Event'; +import { SyncStatus } from './entity/SyncStatus'; +import { StateSyncStatus } from './entity/StateSyncStatus'; +import { BlockProgress } from './entity/BlockProgress'; +import { State } from './entity/State'; +import { IsActive } from './entity/IsActive'; +import { GetKeyRevisionNumber } from './entity/GetKeyRevisionNumber'; +import { HasBeenLinked } from './entity/HasBeenLinked'; +import { IsLive } from './entity/IsLive'; +import { GetContinuityNumber } from './entity/GetContinuityNumber'; +import { GetSpawnCount } from './entity/GetSpawnCount'; +import { HasSponsor } from './entity/HasSponsor'; +import { GetSponsor } from './entity/GetSponsor'; +import { IsSponsor } from './entity/IsSponsor'; +import { GetSponsoringCount } from './entity/GetSponsoringCount'; +import { IsEscaping } from './entity/IsEscaping'; +import { GetEscapeRequest } from './entity/GetEscapeRequest'; +import { IsRequestingEscapeTo } from './entity/IsRequestingEscapeTo'; +import { GetEscapeRequestsCount } from './entity/GetEscapeRequestsCount'; +import { GetOwner } from './entity/GetOwner'; +import { IsOwner } from './entity/IsOwner'; +import { GetOwnedPointCount } from './entity/GetOwnedPointCount'; +import { GetOwnedPointAtIndex } from './entity/GetOwnedPointAtIndex'; +import { GetManagementProxy } from './entity/GetManagementProxy'; +import { IsManagementProxy } from './entity/IsManagementProxy'; +import { CanManage } from './entity/CanManage'; +import { GetManagerForCount } from './entity/GetManagerForCount'; +import { GetSpawnProxy } from './entity/GetSpawnProxy'; +import { IsSpawnProxy } from './entity/IsSpawnProxy'; +import { CanSpawnAs } from './entity/CanSpawnAs'; +import { GetSpawningForCount } from './entity/GetSpawningForCount'; +import { GetVotingProxy } from './entity/GetVotingProxy'; +import { IsVotingProxy } from './entity/IsVotingProxy'; +import { CanVoteAs } from './entity/CanVoteAs'; +import { GetVotingForCount } from './entity/GetVotingForCount'; +import { GetTransferProxy } from './entity/GetTransferProxy'; +import { IsTransferProxy } from './entity/IsTransferProxy'; +import { CanTransfer } from './entity/CanTransfer'; +import { GetTransferringForCount } from './entity/GetTransferringForCount'; +import { IsOperator } from './entity/IsOperator'; +import { GetUpgradeProposalCount } from './entity/GetUpgradeProposalCount'; +import { GetDocumentProposalCount } from './entity/GetDocumentProposalCount'; +import { HasVotedOnUpgradePoll } from './entity/HasVotedOnUpgradePoll'; +import { HasVotedOnDocumentPoll } from './entity/HasVotedOnDocumentPoll'; +import { FindClaim } from './entity/FindClaim'; +import { SupportsInterface } from './entity/SupportsInterface'; +import { BalanceOf } from './entity/BalanceOf'; +import { OwnerOf } from './entity/OwnerOf'; +import { Exists } from './entity/Exists'; +import { GetApproved } from './entity/GetApproved'; +import { IsApprovedForAll } from './entity/IsApprovedForAll'; +import { TotalSupply } from './entity/TotalSupply'; +import { TokenOfOwnerByIndex } from './entity/TokenOfOwnerByIndex'; +import { TokenByIndex } from './entity/TokenByIndex'; +import { Name } from './entity/Name'; +import { Symbol } from './entity/Symbol'; +import { TokenURI } from './entity/TokenURI'; +import { GetSpawnLimit } from './entity/GetSpawnLimit'; +import { CanEscapeTo } from './entity/CanEscapeTo'; +import { WithdrawLimit } from './entity/WithdrawLimit'; +import { VerifyBalance } from './entity/VerifyBalance'; + +export const ENTITIES = [IsActive, GetKeyRevisionNumber, HasBeenLinked, IsLive, GetContinuityNumber, GetSpawnCount, HasSponsor, GetSponsor, IsSponsor, GetSponsoringCount, IsEscaping, GetEscapeRequest, IsRequestingEscapeTo, GetEscapeRequestsCount, GetOwner, IsOwner, GetOwnedPointCount, GetOwnedPointAtIndex, GetManagementProxy, IsManagementProxy, CanManage, GetManagerForCount, GetSpawnProxy, IsSpawnProxy, CanSpawnAs, GetSpawningForCount, GetVotingProxy, IsVotingProxy, CanVoteAs, GetVotingForCount, GetTransferProxy, IsTransferProxy, CanTransfer, GetTransferringForCount, IsOperator, GetUpgradeProposalCount, GetDocumentProposalCount, HasVotedOnUpgradePoll, HasVotedOnDocumentPoll, FindClaim, SupportsInterface, BalanceOf, OwnerOf, Exists, GetApproved, IsApprovedForAll, TotalSupply, TokenOfOwnerByIndex, TokenByIndex, Name, Symbol, TokenURI, GetSpawnLimit, CanEscapeTo, WithdrawLimit, VerifyBalance]; + +export class Database implements DatabaseInterface { + _config: ConnectionOptions; + _conn!: Connection; + _baseDatabase: BaseDatabase; + _propColMaps: { [key: string]: Map; }; + + constructor (config: ConnectionOptions) { + assert(config); + + this._config = { + ...config, + entities: [path.join(__dirname, 'entity/*')] + }; + + this._baseDatabase = new BaseDatabase(this._config); + this._propColMaps = {}; + } + + get baseDatabase (): BaseDatabase { + return this._baseDatabase; + } + + async init (): Promise { + this._conn = await this._baseDatabase.init(); + this._setPropColMaps(); + } + + async close (): Promise { + return this._baseDatabase.close(); + } + + async getIsActive ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(IsActive) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getGetKeyRevisionNumber ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetKeyRevisionNumber) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getHasBeenLinked ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(HasBeenLinked) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getIsLive ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(IsLive) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getGetContinuityNumber ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetContinuityNumber) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getGetSpawnCount ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetSpawnCount) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getHasSponsor ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(HasSponsor) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getGetSponsor ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetSponsor) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getIsSponsor ({ blockHash, contractAddress, _point, _sponsor }: { blockHash: string, contractAddress: string, _point: number, _sponsor: number }): Promise { + return this._conn.getRepository(IsSponsor) + .findOne({ + blockHash, + contractAddress, + _point, + _sponsor + }); + } + + async getGetSponsoringCount ({ blockHash, contractAddress, _sponsor }: { blockHash: string, contractAddress: string, _sponsor: number }): Promise { + return this._conn.getRepository(GetSponsoringCount) + .findOne({ + blockHash, + contractAddress, + _sponsor + }); + } + + async getIsEscaping ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(IsEscaping) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getGetEscapeRequest ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetEscapeRequest) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getIsRequestingEscapeTo ({ blockHash, contractAddress, _point, _sponsor }: { blockHash: string, contractAddress: string, _point: number, _sponsor: number }): Promise { + return this._conn.getRepository(IsRequestingEscapeTo) + .findOne({ + blockHash, + contractAddress, + _point, + _sponsor + }); + } + + async getGetEscapeRequestsCount ({ blockHash, contractAddress, _sponsor }: { blockHash: string, contractAddress: string, _sponsor: number }): Promise { + return this._conn.getRepository(GetEscapeRequestsCount) + .findOne({ + blockHash, + contractAddress, + _sponsor + }); + } + + async getGetOwner ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetOwner) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getIsOwner ({ blockHash, contractAddress, _point, _address }: { blockHash: string, contractAddress: string, _point: number, _address: string }): Promise { + return this._conn.getRepository(IsOwner) + .findOne({ + blockHash, + contractAddress, + _point, + _address + }); + } + + async getGetOwnedPointCount ({ blockHash, contractAddress, _whose }: { blockHash: string, contractAddress: string, _whose: string }): Promise { + return this._conn.getRepository(GetOwnedPointCount) + .findOne({ + blockHash, + contractAddress, + _whose + }); + } + + async getGetOwnedPointAtIndex ({ blockHash, contractAddress, _whose, _index }: { blockHash: string, contractAddress: string, _whose: string, _index: bigint }): Promise { + return this._conn.getRepository(GetOwnedPointAtIndex) + .findOne({ + blockHash, + contractAddress, + _whose, + _index + }); + } + + async getGetManagementProxy ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetManagementProxy) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getIsManagementProxy ({ blockHash, contractAddress, _point, _proxy }: { blockHash: string, contractAddress: string, _point: number, _proxy: string }): Promise { + return this._conn.getRepository(IsManagementProxy) + .findOne({ + blockHash, + contractAddress, + _point, + _proxy + }); + } + + async getCanManage ({ blockHash, contractAddress, _point, _who }: { blockHash: string, contractAddress: string, _point: number, _who: string }): Promise { + return this._conn.getRepository(CanManage) + .findOne({ + blockHash, + contractAddress, + _point, + _who + }); + } + + async getGetManagerForCount ({ blockHash, contractAddress, _proxy }: { blockHash: string, contractAddress: string, _proxy: string }): Promise { + return this._conn.getRepository(GetManagerForCount) + .findOne({ + blockHash, + contractAddress, + _proxy + }); + } + + async getGetSpawnProxy ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetSpawnProxy) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getIsSpawnProxy ({ blockHash, contractAddress, _point, _proxy }: { blockHash: string, contractAddress: string, _point: number, _proxy: string }): Promise { + return this._conn.getRepository(IsSpawnProxy) + .findOne({ + blockHash, + contractAddress, + _point, + _proxy + }); + } + + async getCanSpawnAs ({ blockHash, contractAddress, _point, _who }: { blockHash: string, contractAddress: string, _point: number, _who: string }): Promise { + return this._conn.getRepository(CanSpawnAs) + .findOne({ + blockHash, + contractAddress, + _point, + _who + }); + } + + async getGetSpawningForCount ({ blockHash, contractAddress, _proxy }: { blockHash: string, contractAddress: string, _proxy: string }): Promise { + return this._conn.getRepository(GetSpawningForCount) + .findOne({ + blockHash, + contractAddress, + _proxy + }); + } + + async getGetVotingProxy ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetVotingProxy) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getIsVotingProxy ({ blockHash, contractAddress, _point, _proxy }: { blockHash: string, contractAddress: string, _point: number, _proxy: string }): Promise { + return this._conn.getRepository(IsVotingProxy) + .findOne({ + blockHash, + contractAddress, + _point, + _proxy + }); + } + + async getCanVoteAs ({ blockHash, contractAddress, _point, _who }: { blockHash: string, contractAddress: string, _point: number, _who: string }): Promise { + return this._conn.getRepository(CanVoteAs) + .findOne({ + blockHash, + contractAddress, + _point, + _who + }); + } + + async getGetVotingForCount ({ blockHash, contractAddress, _proxy }: { blockHash: string, contractAddress: string, _proxy: string }): Promise { + return this._conn.getRepository(GetVotingForCount) + .findOne({ + blockHash, + contractAddress, + _proxy + }); + } + + async getGetTransferProxy ({ blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }): Promise { + return this._conn.getRepository(GetTransferProxy) + .findOne({ + blockHash, + contractAddress, + _point + }); + } + + async getIsTransferProxy ({ blockHash, contractAddress, _point, _proxy }: { blockHash: string, contractAddress: string, _point: number, _proxy: string }): Promise { + return this._conn.getRepository(IsTransferProxy) + .findOne({ + blockHash, + contractAddress, + _point, + _proxy + }); + } + + async getCanTransfer ({ blockHash, contractAddress, _point, _who }: { blockHash: string, contractAddress: string, _point: number, _who: string }): Promise { + return this._conn.getRepository(CanTransfer) + .findOne({ + blockHash, + contractAddress, + _point, + _who + }); + } + + async getGetTransferringForCount ({ blockHash, contractAddress, _proxy }: { blockHash: string, contractAddress: string, _proxy: string }): Promise { + return this._conn.getRepository(GetTransferringForCount) + .findOne({ + blockHash, + contractAddress, + _proxy + }); + } + + async getIsOperator ({ blockHash, contractAddress, _owner, _operator }: { blockHash: string, contractAddress: string, _owner: string, _operator: string }): Promise { + return this._conn.getRepository(IsOperator) + .findOne({ + blockHash, + contractAddress, + _owner, + _operator + }); + } + + async getGetUpgradeProposalCount ({ blockHash, contractAddress }: { blockHash: string, contractAddress: string }): Promise { + return this._conn.getRepository(GetUpgradeProposalCount) + .findOne({ + blockHash, + contractAddress + }); + } + + async getGetDocumentProposalCount ({ blockHash, contractAddress }: { blockHash: string, contractAddress: string }): Promise { + return this._conn.getRepository(GetDocumentProposalCount) + .findOne({ + blockHash, + contractAddress + }); + } + + async getHasVotedOnUpgradePoll ({ blockHash, contractAddress, _galaxy, _proposal }: { blockHash: string, contractAddress: string, _galaxy: number, _proposal: string }): Promise { + return this._conn.getRepository(HasVotedOnUpgradePoll) + .findOne({ + blockHash, + contractAddress, + _galaxy, + _proposal + }); + } + + async getHasVotedOnDocumentPoll ({ blockHash, contractAddress, _galaxy, _proposal }: { blockHash: string, contractAddress: string, _galaxy: number, _proposal: string }): Promise { + return this._conn.getRepository(HasVotedOnDocumentPoll) + .findOne({ + blockHash, + contractAddress, + _galaxy, + _proposal + }); + } + + async getFindClaim ({ blockHash, contractAddress, _whose, _protocol, _claim }: { blockHash: string, contractAddress: string, _whose: number, _protocol: string, _claim: string }): Promise { + return this._conn.getRepository(FindClaim) + .findOne({ + blockHash, + contractAddress, + _whose, + _protocol, + _claim + }); + } + + async getSupportsInterface ({ blockHash, contractAddress, _interfaceId }: { blockHash: string, contractAddress: string, _interfaceId: string }): Promise { + return this._conn.getRepository(SupportsInterface) + .findOne({ + blockHash, + contractAddress, + _interfaceId + }); + } + + async getBalanceOf ({ blockHash, contractAddress, _owner }: { blockHash: string, contractAddress: string, _owner: string }): Promise { + return this._conn.getRepository(BalanceOf) + .findOne({ + blockHash, + contractAddress, + _owner + }); + } + + async getOwnerOf ({ blockHash, contractAddress, _tokenId }: { blockHash: string, contractAddress: string, _tokenId: bigint }): Promise { + return this._conn.getRepository(OwnerOf) + .findOne({ + blockHash, + contractAddress, + _tokenId + }); + } + + async getExists ({ blockHash, contractAddress, _tokenId }: { blockHash: string, contractAddress: string, _tokenId: bigint }): Promise { + return this._conn.getRepository(Exists) + .findOne({ + blockHash, + contractAddress, + _tokenId + }); + } + + async getGetApproved ({ blockHash, contractAddress, _tokenId }: { blockHash: string, contractAddress: string, _tokenId: bigint }): Promise { + return this._conn.getRepository(GetApproved) + .findOne({ + blockHash, + contractAddress, + _tokenId + }); + } + + async getIsApprovedForAll ({ blockHash, contractAddress, _owner, _operator }: { blockHash: string, contractAddress: string, _owner: string, _operator: string }): Promise { + return this._conn.getRepository(IsApprovedForAll) + .findOne({ + blockHash, + contractAddress, + _owner, + _operator + }); + } + + async getTotalSupply ({ blockHash, contractAddress }: { blockHash: string, contractAddress: string }): Promise { + return this._conn.getRepository(TotalSupply) + .findOne({ + blockHash, + contractAddress + }); + } + + async getTokenOfOwnerByIndex ({ blockHash, contractAddress, _owner, _index }: { blockHash: string, contractAddress: string, _owner: string, _index: bigint }): Promise { + return this._conn.getRepository(TokenOfOwnerByIndex) + .findOne({ + blockHash, + contractAddress, + _owner, + _index + }); + } + + async getTokenByIndex ({ blockHash, contractAddress, _index }: { blockHash: string, contractAddress: string, _index: bigint }): Promise { + return this._conn.getRepository(TokenByIndex) + .findOne({ + blockHash, + contractAddress, + _index + }); + } + + async getName ({ blockHash, contractAddress }: { blockHash: string, contractAddress: string }): Promise { + return this._conn.getRepository(Name) + .findOne({ + blockHash, + contractAddress + }); + } + + // eslint-disable-next-line @typescript-eslint/ban-types + async getSymbol ({ blockHash, contractAddress }: { blockHash: string, contractAddress: string }): Promise { + return this._conn.getRepository(Symbol) + .findOne({ + blockHash, + contractAddress + }); + } + + async getTokenURI ({ blockHash, contractAddress, _tokenId }: { blockHash: string, contractAddress: string, _tokenId: bigint }): Promise { + return this._conn.getRepository(TokenURI) + .findOne({ + blockHash, + contractAddress, + _tokenId + }); + } + + async getGetSpawnLimit ({ blockHash, contractAddress, _point, _time }: { blockHash: string, contractAddress: string, _point: number, _time: bigint }): Promise { + return this._conn.getRepository(GetSpawnLimit) + .findOne({ + blockHash, + contractAddress, + _point, + _time + }); + } + + async getCanEscapeTo ({ blockHash, contractAddress, _point, _sponsor }: { blockHash: string, contractAddress: string, _point: number, _sponsor: number }): Promise { + return this._conn.getRepository(CanEscapeTo) + .findOne({ + blockHash, + contractAddress, + _point, + _sponsor + }); + } + + async getWithdrawLimit ({ blockHash, contractAddress, _participant }: { blockHash: string, contractAddress: string, _participant: string }): Promise { + return this._conn.getRepository(WithdrawLimit) + .findOne({ + blockHash, + contractAddress, + _participant + }); + } + + async getVerifyBalance ({ blockHash, contractAddress, _participant }: { blockHash: string, contractAddress: string, _participant: string }): Promise { + return this._conn.getRepository(VerifyBalance) + .findOne({ + blockHash, + contractAddress, + _participant + }); + } + + async saveIsActive ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsActive); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveGetKeyRevisionNumber ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetKeyRevisionNumber); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveHasBeenLinked ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(HasBeenLinked); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveIsLive ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsLive); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveGetContinuityNumber ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetContinuityNumber); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveGetSpawnCount ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetSpawnCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveHasSponsor ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(HasSponsor); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveGetSponsor ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetSponsor); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveIsSponsor ({ blockHash, blockNumber, contractAddress, _point, _sponsor, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsSponsor); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _sponsor, value, proof }); + return repo.save(entity); + } + + async saveGetSponsoringCount ({ blockHash, blockNumber, contractAddress, _sponsor, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetSponsoringCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _sponsor, value, proof }); + return repo.save(entity); + } + + async saveIsEscaping ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsEscaping); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveGetEscapeRequest ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetEscapeRequest); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveIsRequestingEscapeTo ({ blockHash, blockNumber, contractAddress, _point, _sponsor, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsRequestingEscapeTo); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _sponsor, value, proof }); + return repo.save(entity); + } + + async saveGetEscapeRequestsCount ({ blockHash, blockNumber, contractAddress, _sponsor, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetEscapeRequestsCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _sponsor, value, proof }); + return repo.save(entity); + } + + async saveGetOwner ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetOwner); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveIsOwner ({ blockHash, blockNumber, contractAddress, _point, _address, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsOwner); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _address, value, proof }); + return repo.save(entity); + } + + async saveGetOwnedPointCount ({ blockHash, blockNumber, contractAddress, _whose, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetOwnedPointCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _whose, value, proof }); + return repo.save(entity); + } + + async saveGetOwnedPointAtIndex ({ blockHash, blockNumber, contractAddress, _whose, _index, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetOwnedPointAtIndex); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _whose, _index, value, proof }); + return repo.save(entity); + } + + async saveGetManagementProxy ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetManagementProxy); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveIsManagementProxy ({ blockHash, blockNumber, contractAddress, _point, _proxy, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsManagementProxy); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _proxy, value, proof }); + return repo.save(entity); + } + + async saveCanManage ({ blockHash, blockNumber, contractAddress, _point, _who, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(CanManage); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _who, value, proof }); + return repo.save(entity); + } + + async saveGetManagerForCount ({ blockHash, blockNumber, contractAddress, _proxy, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetManagerForCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _proxy, value, proof }); + return repo.save(entity); + } + + async saveGetSpawnProxy ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetSpawnProxy); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveIsSpawnProxy ({ blockHash, blockNumber, contractAddress, _point, _proxy, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsSpawnProxy); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _proxy, value, proof }); + return repo.save(entity); + } + + async saveCanSpawnAs ({ blockHash, blockNumber, contractAddress, _point, _who, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(CanSpawnAs); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _who, value, proof }); + return repo.save(entity); + } + + async saveGetSpawningForCount ({ blockHash, blockNumber, contractAddress, _proxy, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetSpawningForCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _proxy, value, proof }); + return repo.save(entity); + } + + async saveGetVotingProxy ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetVotingProxy); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveIsVotingProxy ({ blockHash, blockNumber, contractAddress, _point, _proxy, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsVotingProxy); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _proxy, value, proof }); + return repo.save(entity); + } + + async saveCanVoteAs ({ blockHash, blockNumber, contractAddress, _point, _who, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(CanVoteAs); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _who, value, proof }); + return repo.save(entity); + } + + async saveGetVotingForCount ({ blockHash, blockNumber, contractAddress, _proxy, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetVotingForCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _proxy, value, proof }); + return repo.save(entity); + } + + async saveGetTransferProxy ({ blockHash, blockNumber, contractAddress, _point, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetTransferProxy); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, value, proof }); + return repo.save(entity); + } + + async saveIsTransferProxy ({ blockHash, blockNumber, contractAddress, _point, _proxy, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsTransferProxy); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _proxy, value, proof }); + return repo.save(entity); + } + + async saveCanTransfer ({ blockHash, blockNumber, contractAddress, _point, _who, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(CanTransfer); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _who, value, proof }); + return repo.save(entity); + } + + async saveGetTransferringForCount ({ blockHash, blockNumber, contractAddress, _proxy, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetTransferringForCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _proxy, value, proof }); + return repo.save(entity); + } + + async saveIsOperator ({ blockHash, blockNumber, contractAddress, _owner, _operator, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsOperator); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _owner, _operator, value, proof }); + return repo.save(entity); + } + + async saveGetUpgradeProposalCount ({ blockHash, blockNumber, contractAddress, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetUpgradeProposalCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, value, proof }); + return repo.save(entity); + } + + async saveGetDocumentProposalCount ({ blockHash, blockNumber, contractAddress, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetDocumentProposalCount); + const entity = repo.create({ blockHash, blockNumber, contractAddress, value, proof }); + return repo.save(entity); + } + + async saveHasVotedOnUpgradePoll ({ blockHash, blockNumber, contractAddress, _galaxy, _proposal, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(HasVotedOnUpgradePoll); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _galaxy, _proposal, value, proof }); + return repo.save(entity); + } + + async saveHasVotedOnDocumentPoll ({ blockHash, blockNumber, contractAddress, _galaxy, _proposal, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(HasVotedOnDocumentPoll); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _galaxy, _proposal, value, proof }); + return repo.save(entity); + } + + async saveFindClaim ({ blockHash, blockNumber, contractAddress, _whose, _protocol, _claim, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(FindClaim); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _whose, _protocol, _claim, value, proof }); + return repo.save(entity); + } + + async saveSupportsInterface ({ blockHash, blockNumber, contractAddress, _interfaceId, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(SupportsInterface); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _interfaceId, value, proof }); + return repo.save(entity); + } + + async saveBalanceOf ({ blockHash, blockNumber, contractAddress, _owner, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(BalanceOf); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _owner, value, proof }); + return repo.save(entity); + } + + async saveOwnerOf ({ blockHash, blockNumber, contractAddress, _tokenId, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(OwnerOf); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _tokenId, value, proof }); + return repo.save(entity); + } + + async saveExists ({ blockHash, blockNumber, contractAddress, _tokenId, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(Exists); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _tokenId, value, proof }); + return repo.save(entity); + } + + async saveGetApproved ({ blockHash, blockNumber, contractAddress, _tokenId, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetApproved); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _tokenId, value, proof }); + return repo.save(entity); + } + + async saveIsApprovedForAll ({ blockHash, blockNumber, contractAddress, _owner, _operator, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(IsApprovedForAll); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _owner, _operator, value, proof }); + return repo.save(entity); + } + + async saveTotalSupply ({ blockHash, blockNumber, contractAddress, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(TotalSupply); + const entity = repo.create({ blockHash, blockNumber, contractAddress, value, proof }); + return repo.save(entity); + } + + async saveTokenOfOwnerByIndex ({ blockHash, blockNumber, contractAddress, _owner, _index, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(TokenOfOwnerByIndex); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _owner, _index, value, proof }); + return repo.save(entity); + } + + async saveTokenByIndex ({ blockHash, blockNumber, contractAddress, _index, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(TokenByIndex); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _index, value, proof }); + return repo.save(entity); + } + + async saveName ({ blockHash, blockNumber, contractAddress, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(Name); + const entity = repo.create({ blockHash, blockNumber, contractAddress, value, proof }); + return repo.save(entity); + } + + // eslint-disable-next-line @typescript-eslint/ban-types + async saveSymbol ({ blockHash, blockNumber, contractAddress, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(Symbol); + const entity = repo.create({ blockHash, blockNumber, contractAddress, value, proof }); + return repo.save(entity); + } + + async saveTokenURI ({ blockHash, blockNumber, contractAddress, _tokenId, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(TokenURI); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _tokenId, value, proof }); + return repo.save(entity); + } + + async saveGetSpawnLimit ({ blockHash, blockNumber, contractAddress, _point, _time, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(GetSpawnLimit); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _time, value, proof }); + return repo.save(entity); + } + + async saveCanEscapeTo ({ blockHash, blockNumber, contractAddress, _point, _sponsor, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(CanEscapeTo); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _point, _sponsor, value, proof }); + return repo.save(entity); + } + + async saveWithdrawLimit ({ blockHash, blockNumber, contractAddress, _participant, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(WithdrawLimit); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _participant, value, proof }); + return repo.save(entity); + } + + async saveVerifyBalance ({ blockHash, blockNumber, contractAddress, _participant, value, proof }: DeepPartial): Promise { + const repo = this._conn.getRepository(VerifyBalance); + const entity = repo.create({ blockHash, blockNumber, contractAddress, _participant, value, proof }); + return repo.save(entity); + } + + getNewState (): State { + return new State(); + } + + async getStates (where: FindConditions): Promise { + const repo = this._conn.getRepository(State); + + return this._baseDatabase.getStates(repo, where); + } + + async getLatestState (contractAddress: string, kind: StateKind | null, blockNumber?: number): Promise { + const repo = this._conn.getRepository(State); + + return this._baseDatabase.getLatestState(repo, contractAddress, kind, blockNumber); + } + + async getPrevState (blockHash: string, contractAddress: string, kind?: string): Promise { + const repo = this._conn.getRepository(State); + + return this._baseDatabase.getPrevState(repo, blockHash, contractAddress, kind); + } + + // Fetch all diff States after the specified block number. + async getDiffStatesInRange (contractAddress: string, startblock: number, endBlock: number): Promise { + const repo = this._conn.getRepository(State); + + return this._baseDatabase.getDiffStatesInRange(repo, contractAddress, startblock, endBlock); + } + + async saveOrUpdateState (dbTx: QueryRunner, state: State): Promise { + const repo = dbTx.manager.getRepository(State); + + return this._baseDatabase.saveOrUpdateState(repo, state); + } + + async removeStates (dbTx: QueryRunner, blockNumber: number, kind: string): Promise { + const repo = dbTx.manager.getRepository(State); + + await this._baseDatabase.removeStates(repo, blockNumber, kind); + } + + async removeStatesAfterBlock (dbTx: QueryRunner, blockNumber: number): Promise { + const repo = dbTx.manager.getRepository(State); + + await this._baseDatabase.removeStatesAfterBlock(repo, blockNumber); + } + + async getStateSyncStatus (): Promise { + const repo = this._conn.getRepository(StateSyncStatus); + + return this._baseDatabase.getStateSyncStatus(repo); + } + + async updateStateSyncStatusIndexedBlock (queryRunner: QueryRunner, blockNumber: number, force?: boolean): Promise { + const repo = queryRunner.manager.getRepository(StateSyncStatus); + + return this._baseDatabase.updateStateSyncStatusIndexedBlock(repo, blockNumber, force); + } + + async updateStateSyncStatusCheckpointBlock (queryRunner: QueryRunner, blockNumber: number, force?: boolean): Promise { + const repo = queryRunner.manager.getRepository(StateSyncStatus); + + return this._baseDatabase.updateStateSyncStatusCheckpointBlock(repo, blockNumber, force); + } + + async getContracts (): Promise { + const repo = this._conn.getRepository(Contract); + + return this._baseDatabase.getContracts(repo); + } + + async createTransactionRunner (): Promise { + return this._baseDatabase.createTransactionRunner(); + } + + async getProcessedBlockCountForRange (fromBlockNumber: number, toBlockNumber: number): Promise<{ expected: number, actual: number }> { + const repo = this._conn.getRepository(BlockProgress); + + return this._baseDatabase.getProcessedBlockCountForRange(repo, fromBlockNumber, toBlockNumber); + } + + async getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise> { + const repo = this._conn.getRepository(Event); + + return this._baseDatabase.getEventsInRange(repo, fromBlockNumber, toBlockNumber); + } + + async saveEventEntity (queryRunner: QueryRunner, entity: Event): Promise { + const repo = queryRunner.manager.getRepository(Event); + return this._baseDatabase.saveEventEntity(repo, entity); + } + + async getBlockEvents (blockHash: string, where: Where, queryOptions: QueryOptions): Promise { + const repo = this._conn.getRepository(Event); + + return this._baseDatabase.getBlockEvents(repo, blockHash, where, queryOptions); + } + + async saveBlockWithEvents (queryRunner: QueryRunner, block: DeepPartial, events: DeepPartial[]): Promise { + const blockRepo = queryRunner.manager.getRepository(BlockProgress); + const eventRepo = queryRunner.manager.getRepository(Event); + + return this._baseDatabase.saveBlockWithEvents(blockRepo, eventRepo, block, events); + } + + async saveEvents (queryRunner: QueryRunner, events: Event[]): Promise { + const eventRepo = queryRunner.manager.getRepository(Event); + + return this._baseDatabase.saveEvents(eventRepo, events); + } + + async saveBlockProgress (queryRunner: QueryRunner, block: DeepPartial): Promise { + const repo = queryRunner.manager.getRepository(BlockProgress); + + return this._baseDatabase.saveBlockProgress(repo, block); + } + + async saveContract (queryRunner: QueryRunner, address: string, kind: string, checkpoint: boolean, startingBlock: number): Promise { + const repo = queryRunner.manager.getRepository(Contract); + + return this._baseDatabase.saveContract(repo, address, kind, checkpoint, startingBlock); + } + + async updateSyncStatusIndexedBlock (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force = false): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatusIndexedBlock(repo, blockHash, blockNumber, force); + } + + async updateSyncStatusCanonicalBlock (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force = false): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatusCanonicalBlock(repo, blockHash, blockNumber, force); + } + + async updateSyncStatusChainHead (queryRunner: QueryRunner, blockHash: string, blockNumber: number, force = false): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.updateSyncStatusChainHead(repo, blockHash, blockNumber, force); + } + + async getSyncStatus (queryRunner: QueryRunner): Promise { + const repo = queryRunner.manager.getRepository(SyncStatus); + + return this._baseDatabase.getSyncStatus(repo); + } + + async getEvent (id: string): Promise { + const repo = this._conn.getRepository(Event); + + return this._baseDatabase.getEvent(repo, id); + } + + async getBlocksAtHeight (height: number, isPruned: boolean): Promise { + const repo = this._conn.getRepository(BlockProgress); + + return this._baseDatabase.getBlocksAtHeight(repo, height, isPruned); + } + + async markBlocksAsPruned (queryRunner: QueryRunner, blocks: BlockProgress[]): Promise { + const repo = queryRunner.manager.getRepository(BlockProgress); + + return this._baseDatabase.markBlocksAsPruned(repo, blocks); + } + + async getBlockProgress (blockHash: string): Promise { + const repo = this._conn.getRepository(BlockProgress); + return this._baseDatabase.getBlockProgress(repo, blockHash); + } + + async getBlockProgressEntities (where: FindConditions, options: FindManyOptions): Promise { + const repo = this._conn.getRepository(BlockProgress); + + return this._baseDatabase.getBlockProgressEntities(repo, where, options); + } + + async getEntitiesForBlock (blockHash: string, tableName: string): Promise { + return this._baseDatabase.getEntitiesForBlock(blockHash, tableName); + } + + async updateBlockProgress (queryRunner: QueryRunner, block: BlockProgress, lastProcessedEventIndex: number): Promise { + const repo = queryRunner.manager.getRepository(BlockProgress); + + return this._baseDatabase.updateBlockProgress(repo, block, lastProcessedEventIndex); + } + + async removeEntities (queryRunner: QueryRunner, entity: new () => Entity, findConditions?: FindManyOptions | FindConditions): Promise { + return this._baseDatabase.removeEntities(queryRunner, entity, findConditions); + } + + async deleteEntitiesByConditions (queryRunner: QueryRunner, entity: EntityTarget, findConditions: FindConditions): Promise { + await this._baseDatabase.deleteEntitiesByConditions(queryRunner, entity, findConditions); + } + + async getAncestorAtDepth (blockHash: string, depth: number): Promise { + return this._baseDatabase.getAncestorAtDepth(blockHash, depth); + } + + _getPropertyColumnMapForEntity (entityName: string): Map { + return this._conn.getMetadata(entityName).ownColumns.reduce((acc, curr) => { + return acc.set(curr.propertyName, curr.databaseName); + }, new Map()); + } + + _setPropColMaps (): void { + this._propColMaps.IsActive = this._getPropertyColumnMapForEntity('IsActive'); + this._propColMaps.GetKeyRevisionNumber = this._getPropertyColumnMapForEntity('GetKeyRevisionNumber'); + this._propColMaps.HasBeenLinked = this._getPropertyColumnMapForEntity('HasBeenLinked'); + this._propColMaps.IsLive = this._getPropertyColumnMapForEntity('IsLive'); + this._propColMaps.GetContinuityNumber = this._getPropertyColumnMapForEntity('GetContinuityNumber'); + this._propColMaps.GetSpawnCount = this._getPropertyColumnMapForEntity('GetSpawnCount'); + this._propColMaps.HasSponsor = this._getPropertyColumnMapForEntity('HasSponsor'); + this._propColMaps.GetSponsor = this._getPropertyColumnMapForEntity('GetSponsor'); + this._propColMaps.IsSponsor = this._getPropertyColumnMapForEntity('IsSponsor'); + this._propColMaps.GetSponsoringCount = this._getPropertyColumnMapForEntity('GetSponsoringCount'); + this._propColMaps.IsEscaping = this._getPropertyColumnMapForEntity('IsEscaping'); + this._propColMaps.GetEscapeRequest = this._getPropertyColumnMapForEntity('GetEscapeRequest'); + this._propColMaps.IsRequestingEscapeTo = this._getPropertyColumnMapForEntity('IsRequestingEscapeTo'); + this._propColMaps.GetEscapeRequestsCount = this._getPropertyColumnMapForEntity('GetEscapeRequestsCount'); + this._propColMaps.GetOwner = this._getPropertyColumnMapForEntity('GetOwner'); + this._propColMaps.IsOwner = this._getPropertyColumnMapForEntity('IsOwner'); + this._propColMaps.GetOwnedPointCount = this._getPropertyColumnMapForEntity('GetOwnedPointCount'); + this._propColMaps.GetOwnedPointAtIndex = this._getPropertyColumnMapForEntity('GetOwnedPointAtIndex'); + this._propColMaps.GetManagementProxy = this._getPropertyColumnMapForEntity('GetManagementProxy'); + this._propColMaps.IsManagementProxy = this._getPropertyColumnMapForEntity('IsManagementProxy'); + this._propColMaps.CanManage = this._getPropertyColumnMapForEntity('CanManage'); + this._propColMaps.GetManagerForCount = this._getPropertyColumnMapForEntity('GetManagerForCount'); + this._propColMaps.GetSpawnProxy = this._getPropertyColumnMapForEntity('GetSpawnProxy'); + this._propColMaps.IsSpawnProxy = this._getPropertyColumnMapForEntity('IsSpawnProxy'); + this._propColMaps.CanSpawnAs = this._getPropertyColumnMapForEntity('CanSpawnAs'); + this._propColMaps.GetSpawningForCount = this._getPropertyColumnMapForEntity('GetSpawningForCount'); + this._propColMaps.GetVotingProxy = this._getPropertyColumnMapForEntity('GetVotingProxy'); + this._propColMaps.IsVotingProxy = this._getPropertyColumnMapForEntity('IsVotingProxy'); + this._propColMaps.CanVoteAs = this._getPropertyColumnMapForEntity('CanVoteAs'); + this._propColMaps.GetVotingForCount = this._getPropertyColumnMapForEntity('GetVotingForCount'); + this._propColMaps.GetTransferProxy = this._getPropertyColumnMapForEntity('GetTransferProxy'); + this._propColMaps.IsTransferProxy = this._getPropertyColumnMapForEntity('IsTransferProxy'); + this._propColMaps.CanTransfer = this._getPropertyColumnMapForEntity('CanTransfer'); + this._propColMaps.GetTransferringForCount = this._getPropertyColumnMapForEntity('GetTransferringForCount'); + this._propColMaps.IsOperator = this._getPropertyColumnMapForEntity('IsOperator'); + this._propColMaps.GetUpgradeProposalCount = this._getPropertyColumnMapForEntity('GetUpgradeProposalCount'); + this._propColMaps.GetDocumentProposalCount = this._getPropertyColumnMapForEntity('GetDocumentProposalCount'); + this._propColMaps.HasVotedOnUpgradePoll = this._getPropertyColumnMapForEntity('HasVotedOnUpgradePoll'); + this._propColMaps.HasVotedOnDocumentPoll = this._getPropertyColumnMapForEntity('HasVotedOnDocumentPoll'); + this._propColMaps.FindClaim = this._getPropertyColumnMapForEntity('FindClaim'); + this._propColMaps.SupportsInterface = this._getPropertyColumnMapForEntity('SupportsInterface'); + this._propColMaps.BalanceOf = this._getPropertyColumnMapForEntity('BalanceOf'); + this._propColMaps.OwnerOf = this._getPropertyColumnMapForEntity('OwnerOf'); + this._propColMaps.Exists = this._getPropertyColumnMapForEntity('Exists'); + this._propColMaps.GetApproved = this._getPropertyColumnMapForEntity('GetApproved'); + this._propColMaps.IsApprovedForAll = this._getPropertyColumnMapForEntity('IsApprovedForAll'); + this._propColMaps.TotalSupply = this._getPropertyColumnMapForEntity('TotalSupply'); + this._propColMaps.TokenOfOwnerByIndex = this._getPropertyColumnMapForEntity('TokenOfOwnerByIndex'); + this._propColMaps.TokenByIndex = this._getPropertyColumnMapForEntity('TokenByIndex'); + this._propColMaps.Name = this._getPropertyColumnMapForEntity('Name'); + this._propColMaps.Symbol = this._getPropertyColumnMapForEntity('Symbol'); + this._propColMaps.TokenURI = this._getPropertyColumnMapForEntity('TokenURI'); + this._propColMaps.GetSpawnLimit = this._getPropertyColumnMapForEntity('GetSpawnLimit'); + this._propColMaps.CanEscapeTo = this._getPropertyColumnMapForEntity('CanEscapeTo'); + this._propColMaps.WithdrawLimit = this._getPropertyColumnMapForEntity('WithdrawLimit'); + this._propColMaps.VerifyBalance = this._getPropertyColumnMapForEntity('VerifyBalance'); + } +} diff --git a/packages/linear-star-release-watcher/src/entity/BalanceOf.ts b/packages/linear-star-release-watcher/src/entity/BalanceOf.ts new file mode 100644 index 0000000..9409dab --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/BalanceOf.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_owner'], { unique: true }) +export class BalanceOf { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _owner!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/BlockProgress.ts b/packages/linear-star-release-watcher/src/entity/BlockProgress.ts new file mode 100644 index 0000000..e744aae --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/BlockProgress.ts @@ -0,0 +1,48 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, CreateDateColumn } from 'typeorm'; +import { BlockProgressInterface } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash'], { unique: true }) +@Index(['blockNumber']) +@Index(['parentHash']) +export class BlockProgress implements BlockProgressInterface { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar') + cid!: string; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('varchar', { length: 66 }) + parentHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('integer') + blockTimestamp!: number; + + @Column('integer') + numEvents!: number; + + @Column('integer') + numProcessedEvents!: number; + + @Column('integer') + lastProcessedEventIndex!: number; + + @Column('boolean') + isComplete!: boolean; + + @Column('boolean', { default: false }) + isPruned!: boolean; + + @CreateDateColumn() + createdAt!: Date; +} diff --git a/packages/linear-star-release-watcher/src/entity/CanEscapeTo.ts b/packages/linear-star-release-watcher/src/entity/CanEscapeTo.ts new file mode 100644 index 0000000..26a6f69 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/CanEscapeTo.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_sponsor'], { unique: true }) +export class CanEscapeTo { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('integer') + _sponsor!: number; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/CanManage.ts b/packages/linear-star-release-watcher/src/entity/CanManage.ts new file mode 100644 index 0000000..2ad7b1b --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/CanManage.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_who'], { unique: true }) +export class CanManage { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _who!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/CanSpawnAs.ts b/packages/linear-star-release-watcher/src/entity/CanSpawnAs.ts new file mode 100644 index 0000000..9163537 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/CanSpawnAs.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_who'], { unique: true }) +export class CanSpawnAs { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _who!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/CanTransfer.ts b/packages/linear-star-release-watcher/src/entity/CanTransfer.ts new file mode 100644 index 0000000..82fb96e --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/CanTransfer.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_who'], { unique: true }) +export class CanTransfer { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _who!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/CanVoteAs.ts b/packages/linear-star-release-watcher/src/entity/CanVoteAs.ts new file mode 100644 index 0000000..956d249 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/CanVoteAs.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_who'], { unique: true }) +export class CanVoteAs { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _who!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/Contract.ts b/packages/linear-star-release-watcher/src/entity/Contract.ts new file mode 100644 index 0000000..de66b38 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/Contract.ts @@ -0,0 +1,24 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['address'], { unique: true }) +export class Contract { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 42 }) + address!: string; + + @Column('varchar') + kind!: string; + + @Column('boolean') + checkpoint!: boolean; + + @Column('integer') + startingBlock!: number; +} diff --git a/packages/linear-star-release-watcher/src/entity/Event.ts b/packages/linear-star-release-watcher/src/entity/Event.ts new file mode 100644 index 0000000..91f1e6d --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/Event.ts @@ -0,0 +1,38 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne } from 'typeorm'; +import { BlockProgress } from './BlockProgress'; + +@Entity() +@Index(['block', 'contract']) +@Index(['block', 'contract', 'eventName']) +export class Event { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => BlockProgress, { onDelete: 'CASCADE' }) + block!: BlockProgress; + + @Column('varchar', { length: 66 }) + txHash!: string; + + @Column('integer') + index!: number; + + @Column('varchar', { length: 42 }) + contract!: string; + + @Column('varchar', { length: 256 }) + eventName!: string; + + @Column('text') + eventInfo!: string; + + @Column('text') + extraInfo!: string; + + @Column('text') + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/Exists.ts b/packages/linear-star-release-watcher/src/entity/Exists.ts new file mode 100644 index 0000000..e500e24 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/Exists.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_tokenId'], { unique: true }) +export class Exists { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('numeric', { transformer: bigintTransformer }) + _tokenId!: bigint; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/FindClaim.ts b/packages/linear-star-release-watcher/src/entity/FindClaim.ts new file mode 100644 index 0000000..a4c4294 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/FindClaim.ts @@ -0,0 +1,36 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_whose', '_protocol', '_claim'], { unique: true }) +export class FindClaim { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _whose!: number; + + @Column('varchar') + _protocol!: string; + + @Column('varchar') + _claim!: string; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetApproved.ts b/packages/linear-star-release-watcher/src/entity/GetApproved.ts new file mode 100644 index 0000000..a7622e7 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetApproved.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_tokenId'], { unique: true }) +export class GetApproved { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('numeric', { transformer: bigintTransformer }) + _tokenId!: bigint; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetContinuityNumber.ts b/packages/linear-star-release-watcher/src/entity/GetContinuityNumber.ts new file mode 100644 index 0000000..27c158a --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetContinuityNumber.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetContinuityNumber { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetDocumentProposalCount.ts b/packages/linear-star-release-watcher/src/entity/GetDocumentProposalCount.ts new file mode 100644 index 0000000..172f2f7 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetDocumentProposalCount.ts @@ -0,0 +1,28 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress'], { unique: true }) +export class GetDocumentProposalCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetEscapeRequest.ts b/packages/linear-star-release-watcher/src/entity/GetEscapeRequest.ts new file mode 100644 index 0000000..09eb1d9 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetEscapeRequest.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetEscapeRequest { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetEscapeRequestsCount.ts b/packages/linear-star-release-watcher/src/entity/GetEscapeRequestsCount.ts new file mode 100644 index 0000000..9e020db --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetEscapeRequestsCount.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_sponsor'], { unique: true }) +export class GetEscapeRequestsCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _sponsor!: number; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetKeyRevisionNumber.ts b/packages/linear-star-release-watcher/src/entity/GetKeyRevisionNumber.ts new file mode 100644 index 0000000..ca5f269 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetKeyRevisionNumber.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetKeyRevisionNumber { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetManagementProxy.ts b/packages/linear-star-release-watcher/src/entity/GetManagementProxy.ts new file mode 100644 index 0000000..310a4fb --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetManagementProxy.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetManagementProxy { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetManagerForCount.ts b/packages/linear-star-release-watcher/src/entity/GetManagerForCount.ts new file mode 100644 index 0000000..1139bb7 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetManagerForCount.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_proxy'], { unique: true }) +export class GetManagerForCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _proxy!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetOwnedPointAtIndex.ts b/packages/linear-star-release-watcher/src/entity/GetOwnedPointAtIndex.ts new file mode 100644 index 0000000..cabc086 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetOwnedPointAtIndex.ts @@ -0,0 +1,34 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_whose', '_index'], { unique: true }) +export class GetOwnedPointAtIndex { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _whose!: string; + + @Column('numeric', { transformer: bigintTransformer }) + _index!: bigint; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetOwnedPointCount.ts b/packages/linear-star-release-watcher/src/entity/GetOwnedPointCount.ts new file mode 100644 index 0000000..ad0eab0 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetOwnedPointCount.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_whose'], { unique: true }) +export class GetOwnedPointCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _whose!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetOwner.ts b/packages/linear-star-release-watcher/src/entity/GetOwner.ts new file mode 100644 index 0000000..00ff4df --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetOwner.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetOwner { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetSpawnCount.ts b/packages/linear-star-release-watcher/src/entity/GetSpawnCount.ts new file mode 100644 index 0000000..6cc44cc --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetSpawnCount.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetSpawnCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetSpawnLimit.ts b/packages/linear-star-release-watcher/src/entity/GetSpawnLimit.ts new file mode 100644 index 0000000..59ba37d --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetSpawnLimit.ts @@ -0,0 +1,34 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_time'], { unique: true }) +export class GetSpawnLimit { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('numeric', { transformer: bigintTransformer }) + _time!: bigint; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetSpawnProxy.ts b/packages/linear-star-release-watcher/src/entity/GetSpawnProxy.ts new file mode 100644 index 0000000..d1e2cbd --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetSpawnProxy.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetSpawnProxy { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetSpawningForCount.ts b/packages/linear-star-release-watcher/src/entity/GetSpawningForCount.ts new file mode 100644 index 0000000..3e6e140 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetSpawningForCount.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_proxy'], { unique: true }) +export class GetSpawningForCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _proxy!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetSponsor.ts b/packages/linear-star-release-watcher/src/entity/GetSponsor.ts new file mode 100644 index 0000000..3d964f9 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetSponsor.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetSponsor { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetSponsoringCount.ts b/packages/linear-star-release-watcher/src/entity/GetSponsoringCount.ts new file mode 100644 index 0000000..95dcbd9 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetSponsoringCount.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_sponsor'], { unique: true }) +export class GetSponsoringCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _sponsor!: number; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetTransferProxy.ts b/packages/linear-star-release-watcher/src/entity/GetTransferProxy.ts new file mode 100644 index 0000000..f2dd7b2 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetTransferProxy.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetTransferProxy { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetTransferringForCount.ts b/packages/linear-star-release-watcher/src/entity/GetTransferringForCount.ts new file mode 100644 index 0000000..8bb9fdb --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetTransferringForCount.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_proxy'], { unique: true }) +export class GetTransferringForCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _proxy!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetUpgradeProposalCount.ts b/packages/linear-star-release-watcher/src/entity/GetUpgradeProposalCount.ts new file mode 100644 index 0000000..f0ac20e --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetUpgradeProposalCount.ts @@ -0,0 +1,28 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress'], { unique: true }) +export class GetUpgradeProposalCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetVotingForCount.ts b/packages/linear-star-release-watcher/src/entity/GetVotingForCount.ts new file mode 100644 index 0000000..12dcea2 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetVotingForCount.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_proxy'], { unique: true }) +export class GetVotingForCount { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _proxy!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/GetVotingProxy.ts b/packages/linear-star-release-watcher/src/entity/GetVotingProxy.ts new file mode 100644 index 0000000..c4a73e5 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/GetVotingProxy.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class GetVotingProxy { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/HasBeenLinked.ts b/packages/linear-star-release-watcher/src/entity/HasBeenLinked.ts new file mode 100644 index 0000000..4f897dc --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/HasBeenLinked.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class HasBeenLinked { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/HasSponsor.ts b/packages/linear-star-release-watcher/src/entity/HasSponsor.ts new file mode 100644 index 0000000..ccc8875 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/HasSponsor.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class HasSponsor { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/HasVotedOnDocumentPoll.ts b/packages/linear-star-release-watcher/src/entity/HasVotedOnDocumentPoll.ts new file mode 100644 index 0000000..832614f --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/HasVotedOnDocumentPoll.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_galaxy', '_proposal'], { unique: true }) +export class HasVotedOnDocumentPoll { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _galaxy!: number; + + @Column('varchar') + _proposal!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/HasVotedOnUpgradePoll.ts b/packages/linear-star-release-watcher/src/entity/HasVotedOnUpgradePoll.ts new file mode 100644 index 0000000..5f42482 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/HasVotedOnUpgradePoll.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_galaxy', '_proposal'], { unique: true }) +export class HasVotedOnUpgradePoll { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _galaxy!: number; + + @Column('varchar', { length: 42 }) + _proposal!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsActive.ts b/packages/linear-star-release-watcher/src/entity/IsActive.ts new file mode 100644 index 0000000..055e224 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsActive.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class IsActive { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsApprovedForAll.ts b/packages/linear-star-release-watcher/src/entity/IsApprovedForAll.ts new file mode 100644 index 0000000..6a91c15 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsApprovedForAll.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_owner', '_operator'], { unique: true }) +export class IsApprovedForAll { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _owner!: string; + + @Column('varchar', { length: 42 }) + _operator!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsEscaping.ts b/packages/linear-star-release-watcher/src/entity/IsEscaping.ts new file mode 100644 index 0000000..fb4c3bd --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsEscaping.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class IsEscaping { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsLive.ts b/packages/linear-star-release-watcher/src/entity/IsLive.ts new file mode 100644 index 0000000..87ca00f --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsLive.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point'], { unique: true }) +export class IsLive { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsManagementProxy.ts b/packages/linear-star-release-watcher/src/entity/IsManagementProxy.ts new file mode 100644 index 0000000..14ac477 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsManagementProxy.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_proxy'], { unique: true }) +export class IsManagementProxy { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _proxy!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsOperator.ts b/packages/linear-star-release-watcher/src/entity/IsOperator.ts new file mode 100644 index 0000000..b771714 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsOperator.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_owner', '_operator'], { unique: true }) +export class IsOperator { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _owner!: string; + + @Column('varchar', { length: 42 }) + _operator!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsOwner.ts b/packages/linear-star-release-watcher/src/entity/IsOwner.ts new file mode 100644 index 0000000..81a6046 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsOwner.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_address'], { unique: true }) +export class IsOwner { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _address!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsRequestingEscapeTo.ts b/packages/linear-star-release-watcher/src/entity/IsRequestingEscapeTo.ts new file mode 100644 index 0000000..58409ab --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsRequestingEscapeTo.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_sponsor'], { unique: true }) +export class IsRequestingEscapeTo { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('integer') + _sponsor!: number; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsSpawnProxy.ts b/packages/linear-star-release-watcher/src/entity/IsSpawnProxy.ts new file mode 100644 index 0000000..023ca72 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsSpawnProxy.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_proxy'], { unique: true }) +export class IsSpawnProxy { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _proxy!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsSponsor.ts b/packages/linear-star-release-watcher/src/entity/IsSponsor.ts new file mode 100644 index 0000000..a21b71c --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsSponsor.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_sponsor'], { unique: true }) +export class IsSponsor { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('integer') + _sponsor!: number; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsTransferProxy.ts b/packages/linear-star-release-watcher/src/entity/IsTransferProxy.ts new file mode 100644 index 0000000..b1613a4 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsTransferProxy.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_proxy'], { unique: true }) +export class IsTransferProxy { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _proxy!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/IsVotingProxy.ts b/packages/linear-star-release-watcher/src/entity/IsVotingProxy.ts new file mode 100644 index 0000000..172dd15 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/IsVotingProxy.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_point', '_proxy'], { unique: true }) +export class IsVotingProxy { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('integer') + _point!: number; + + @Column('varchar', { length: 42 }) + _proxy!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/Name.ts b/packages/linear-star-release-watcher/src/entity/Name.ts new file mode 100644 index 0000000..c24431c --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/Name.ts @@ -0,0 +1,27 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress'], { unique: true }) +export class Name { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/OwnerOf.ts b/packages/linear-star-release-watcher/src/entity/OwnerOf.ts new file mode 100644 index 0000000..facd96b --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/OwnerOf.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_tokenId'], { unique: true }) +export class OwnerOf { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('numeric', { transformer: bigintTransformer }) + _tokenId!: bigint; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/State.ts b/packages/linear-star-release-watcher/src/entity/State.ts new file mode 100644 index 0000000..bc05bca --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/State.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne } from 'typeorm'; +import { StateKind } from '@cerc-io/util'; +import { BlockProgress } from './BlockProgress'; + +@Entity() +@Index(['cid'], { unique: true }) +@Index(['block', 'contractAddress']) +@Index(['block', 'contractAddress', 'kind'], { unique: true }) +export class State { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => BlockProgress, { onDelete: 'CASCADE' }) + block!: BlockProgress; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar') + cid!: string; + + @Column({ type: 'enum', enum: StateKind }) + kind!: StateKind; + + @Column('bytea') + data!: Buffer; +} diff --git a/packages/linear-star-release-watcher/src/entity/StateSyncStatus.ts b/packages/linear-star-release-watcher/src/entity/StateSyncStatus.ts new file mode 100644 index 0000000..c795212 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/StateSyncStatus.ts @@ -0,0 +1,17 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; + +@Entity() +export class StateSyncStatus { + @PrimaryGeneratedColumn() + id!: number; + + @Column('integer') + latestIndexedBlockNumber!: number; + + @Column('integer', { nullable: true }) + latestCheckpointBlockNumber!: number; +} diff --git a/packages/linear-star-release-watcher/src/entity/SupportsInterface.ts b/packages/linear-star-release-watcher/src/entity/SupportsInterface.ts new file mode 100644 index 0000000..516ee39 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/SupportsInterface.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_interfaceId'], { unique: true }) +export class SupportsInterface { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar') + _interfaceId!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/Symbol.ts b/packages/linear-star-release-watcher/src/entity/Symbol.ts new file mode 100644 index 0000000..e80126a --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/Symbol.ts @@ -0,0 +1,27 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress'], { unique: true }) +export class Symbol { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/SyncStatus.ts b/packages/linear-star-release-watcher/src/entity/SyncStatus.ts new file mode 100644 index 0000000..19d0dfa --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/SyncStatus.ts @@ -0,0 +1,36 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; +import { SyncStatusInterface } from '@cerc-io/util'; + +@Entity() +export class SyncStatus implements SyncStatusInterface { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + chainHeadBlockHash!: string; + + @Column('integer') + chainHeadBlockNumber!: number; + + @Column('varchar', { length: 66 }) + latestIndexedBlockHash!: string; + + @Column('integer') + latestIndexedBlockNumber!: number; + + @Column('varchar', { length: 66 }) + latestCanonicalBlockHash!: string; + + @Column('integer') + latestCanonicalBlockNumber!: number; + + @Column('varchar', { length: 66 }) + initialIndexedBlockHash!: string; + + @Column('integer') + initialIndexedBlockNumber!: number; +} diff --git a/packages/linear-star-release-watcher/src/entity/TokenByIndex.ts b/packages/linear-star-release-watcher/src/entity/TokenByIndex.ts new file mode 100644 index 0000000..cc5bf7b --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/TokenByIndex.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_index'], { unique: true }) +export class TokenByIndex { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('numeric', { transformer: bigintTransformer }) + _index!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/TokenOfOwnerByIndex.ts b/packages/linear-star-release-watcher/src/entity/TokenOfOwnerByIndex.ts new file mode 100644 index 0000000..f14fc2a --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/TokenOfOwnerByIndex.ts @@ -0,0 +1,34 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_owner', '_index'], { unique: true }) +export class TokenOfOwnerByIndex { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _owner!: string; + + @Column('numeric', { transformer: bigintTransformer }) + _index!: bigint; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/TokenURI.ts b/packages/linear-star-release-watcher/src/entity/TokenURI.ts new file mode 100644 index 0000000..9b5db0f --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/TokenURI.ts @@ -0,0 +1,31 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_tokenId'], { unique: true }) +export class TokenURI { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('numeric', { transformer: bigintTransformer }) + _tokenId!: bigint; + + @Column('varchar') + value!: string; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/TotalSupply.ts b/packages/linear-star-release-watcher/src/entity/TotalSupply.ts new file mode 100644 index 0000000..867c01a --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/TotalSupply.ts @@ -0,0 +1,28 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; +import { bigintTransformer } from '@cerc-io/util'; + +@Entity() +@Index(['blockHash', 'contractAddress'], { unique: true }) +export class TotalSupply { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('numeric', { transformer: bigintTransformer }) + value!: bigint; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/VerifyBalance.ts b/packages/linear-star-release-watcher/src/entity/VerifyBalance.ts new file mode 100644 index 0000000..2aea159 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/VerifyBalance.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_participant'], { unique: true }) +export class VerifyBalance { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _participant!: string; + + @Column('boolean') + value!: boolean; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/entity/WithdrawLimit.ts b/packages/linear-star-release-watcher/src/entity/WithdrawLimit.ts new file mode 100644 index 0000000..51c3d93 --- /dev/null +++ b/packages/linear-star-release-watcher/src/entity/WithdrawLimit.ts @@ -0,0 +1,30 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm'; + +@Entity() +@Index(['blockHash', 'contractAddress', '_participant'], { unique: true }) +export class WithdrawLimit { + @PrimaryGeneratedColumn() + id!: number; + + @Column('varchar', { length: 66 }) + blockHash!: string; + + @Column('integer') + blockNumber!: number; + + @Column('varchar', { length: 42 }) + contractAddress!: string; + + @Column('varchar', { length: 42 }) + _participant!: string; + + @Column('integer') + value!: number; + + @Column('text', { nullable: true }) + proof!: string; +} diff --git a/packages/linear-star-release-watcher/src/fill.ts b/packages/linear-star-release-watcher/src/fill.ts new file mode 100644 index 0000000..4db5b46 --- /dev/null +++ b/packages/linear-star-release-watcher/src/fill.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import 'reflect-metadata'; +import debug from 'debug'; + +import { FillCmd } from '@cerc-io/cli'; + +import { Database } from './database'; +import { Indexer } from './indexer'; + +const log = debug('vulcanize:fill'); + +export const main = async (): Promise => { + const fillCmd = new FillCmd(); + await fillCmd.init(Database); + + await fillCmd.initIndexer(Indexer); + + await fillCmd.exec(); +}; + +main().catch(err => { + log(err); +}).finally(() => { + process.exit(); +}); + +process.on('SIGINT', () => { + log(`Exiting process ${process.pid} with code 0`); + process.exit(0); +}); diff --git a/packages/linear-star-release-watcher/src/gql/index.ts b/packages/linear-star-release-watcher/src/gql/index.ts new file mode 100644 index 0000000..4732f68 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/index.ts @@ -0,0 +1,3 @@ +export * as mutations from './mutations'; +export * as queries from './queries'; +export * as subscriptions from './subscriptions'; diff --git a/packages/linear-star-release-watcher/src/gql/mutations/index.ts b/packages/linear-star-release-watcher/src/gql/mutations/index.ts new file mode 100644 index 0000000..0c3bd85 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/mutations/index.ts @@ -0,0 +1,4 @@ +import fs from 'fs'; +import path from 'path'; + +export const watchContract = fs.readFileSync(path.join(__dirname, 'watchContract.gql'), 'utf8'); diff --git a/packages/linear-star-release-watcher/src/gql/mutations/watchContract.gql b/packages/linear-star-release-watcher/src/gql/mutations/watchContract.gql new file mode 100644 index 0000000..2ecc74f --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/mutations/watchContract.gql @@ -0,0 +1,3 @@ +mutation watchContract($address: String!, $kind: String!, $checkpoint: Boolean!, $startingBlock: Int){ + watchContract(address: $address, kind: $kind, checkpoint: $checkpoint, startingBlock: $startingBlock) +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/balanceOf.gql b/packages/linear-star-release-watcher/src/gql/queries/balanceOf.gql new file mode 100644 index 0000000..246d366 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/balanceOf.gql @@ -0,0 +1,8 @@ +query balanceOf($blockHash: String!, $contractAddress: String!, $_owner: String!){ + balanceOf(blockHash: $blockHash, contractAddress: $contractAddress, _owner: $_owner){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/canEscapeTo.gql b/packages/linear-star-release-watcher/src/gql/queries/canEscapeTo.gql new file mode 100644 index 0000000..b065033 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/canEscapeTo.gql @@ -0,0 +1,8 @@ +query canEscapeTo($blockHash: String!, $contractAddress: String!, $_point: Int!, $_sponsor: Int!){ + canEscapeTo(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _sponsor: $_sponsor){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/canManage.gql b/packages/linear-star-release-watcher/src/gql/queries/canManage.gql new file mode 100644 index 0000000..e52d71b --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/canManage.gql @@ -0,0 +1,8 @@ +query canManage($blockHash: String!, $contractAddress: String!, $_point: Int!, $_who: String!){ + canManage(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _who: $_who){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/canSpawnAs.gql b/packages/linear-star-release-watcher/src/gql/queries/canSpawnAs.gql new file mode 100644 index 0000000..af9c463 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/canSpawnAs.gql @@ -0,0 +1,8 @@ +query canSpawnAs($blockHash: String!, $contractAddress: String!, $_point: Int!, $_who: String!){ + canSpawnAs(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _who: $_who){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/canTransfer.gql b/packages/linear-star-release-watcher/src/gql/queries/canTransfer.gql new file mode 100644 index 0000000..14b39fa --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/canTransfer.gql @@ -0,0 +1,8 @@ +query canTransfer($blockHash: String!, $contractAddress: String!, $_point: Int!, $_who: String!){ + canTransfer(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _who: $_who){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/canVoteAs.gql b/packages/linear-star-release-watcher/src/gql/queries/canVoteAs.gql new file mode 100644 index 0000000..d2a79a9 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/canVoteAs.gql @@ -0,0 +1,8 @@ +query canVoteAs($blockHash: String!, $contractAddress: String!, $_point: Int!, $_who: String!){ + canVoteAs(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _who: $_who){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/events.gql b/packages/linear-star-release-watcher/src/gql/queries/events.gql new file mode 100644 index 0000000..1ff9ac1 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/events.gql @@ -0,0 +1,31 @@ +query events($blockHash: String!, $contractAddress: String!, $name: String){ + events(blockHash: $blockHash, contractAddress: $contractAddress, name: $name){ + block{ + cid + hash + number + timestamp + parentHash + } + tx{ + hash + index + from + to + } + contract + eventIndex + event{ + ... on OwnershipRenouncedEvent { + previousOwner + } + ... on OwnershipTransferredEvent { + previousOwner + newOwner + } + } + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/eventsInRange.gql b/packages/linear-star-release-watcher/src/gql/queries/eventsInRange.gql new file mode 100644 index 0000000..3898d77 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/eventsInRange.gql @@ -0,0 +1,31 @@ +query eventsInRange($fromBlockNumber: Int!, $toBlockNumber: Int!){ + eventsInRange(fromBlockNumber: $fromBlockNumber, toBlockNumber: $toBlockNumber){ + block{ + cid + hash + number + timestamp + parentHash + } + tx{ + hash + index + from + to + } + contract + eventIndex + event{ + ... on OwnershipRenouncedEvent { + previousOwner + } + ... on OwnershipTransferredEvent { + previousOwner + newOwner + } + } + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/exists.gql b/packages/linear-star-release-watcher/src/gql/queries/exists.gql new file mode 100644 index 0000000..d01fa34 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/exists.gql @@ -0,0 +1,8 @@ +query exists($blockHash: String!, $contractAddress: String!, $_tokenId: BigInt!){ + exists(blockHash: $blockHash, contractAddress: $contractAddress, _tokenId: $_tokenId){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/findClaim.gql b/packages/linear-star-release-watcher/src/gql/queries/findClaim.gql new file mode 100644 index 0000000..fe8ab15 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/findClaim.gql @@ -0,0 +1,8 @@ +query findClaim($blockHash: String!, $contractAddress: String!, $_whose: Int!, $_protocol: String!, $_claim: String!){ + findClaim(blockHash: $blockHash, contractAddress: $contractAddress, _whose: $_whose, _protocol: $_protocol, _claim: $_claim){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getApproved.gql b/packages/linear-star-release-watcher/src/gql/queries/getApproved.gql new file mode 100644 index 0000000..10d4bae --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getApproved.gql @@ -0,0 +1,8 @@ +query getApproved($blockHash: String!, $contractAddress: String!, $_tokenId: BigInt!){ + getApproved(blockHash: $blockHash, contractAddress: $contractAddress, _tokenId: $_tokenId){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getContinuityNumber.gql b/packages/linear-star-release-watcher/src/gql/queries/getContinuityNumber.gql new file mode 100644 index 0000000..1ad5af4 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getContinuityNumber.gql @@ -0,0 +1,8 @@ +query getContinuityNumber($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getContinuityNumber(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getDocumentProposalCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getDocumentProposalCount.gql new file mode 100644 index 0000000..225d59f --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getDocumentProposalCount.gql @@ -0,0 +1,8 @@ +query getDocumentProposalCount($blockHash: String!, $contractAddress: String!){ + getDocumentProposalCount(blockHash: $blockHash, contractAddress: $contractAddress){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getEscapeRequest.gql b/packages/linear-star-release-watcher/src/gql/queries/getEscapeRequest.gql new file mode 100644 index 0000000..acf7e7b --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getEscapeRequest.gql @@ -0,0 +1,8 @@ +query getEscapeRequest($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getEscapeRequest(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getEscapeRequestsCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getEscapeRequestsCount.gql new file mode 100644 index 0000000..5b6e489 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getEscapeRequestsCount.gql @@ -0,0 +1,8 @@ +query getEscapeRequestsCount($blockHash: String!, $contractAddress: String!, $_sponsor: Int!){ + getEscapeRequestsCount(blockHash: $blockHash, contractAddress: $contractAddress, _sponsor: $_sponsor){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getKeyRevisionNumber.gql b/packages/linear-star-release-watcher/src/gql/queries/getKeyRevisionNumber.gql new file mode 100644 index 0000000..ebcea96 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getKeyRevisionNumber.gql @@ -0,0 +1,8 @@ +query getKeyRevisionNumber($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getKeyRevisionNumber(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getManagementProxy.gql b/packages/linear-star-release-watcher/src/gql/queries/getManagementProxy.gql new file mode 100644 index 0000000..fd499b7 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getManagementProxy.gql @@ -0,0 +1,8 @@ +query getManagementProxy($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getManagementProxy(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getManagerForCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getManagerForCount.gql new file mode 100644 index 0000000..afc9de7 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getManagerForCount.gql @@ -0,0 +1,8 @@ +query getManagerForCount($blockHash: String!, $contractAddress: String!, $_proxy: String!){ + getManagerForCount(blockHash: $blockHash, contractAddress: $contractAddress, _proxy: $_proxy){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getOwnedPointAtIndex.gql b/packages/linear-star-release-watcher/src/gql/queries/getOwnedPointAtIndex.gql new file mode 100644 index 0000000..0d3d02c --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getOwnedPointAtIndex.gql @@ -0,0 +1,8 @@ +query getOwnedPointAtIndex($blockHash: String!, $contractAddress: String!, $_whose: String!, $_index: BigInt!){ + getOwnedPointAtIndex(blockHash: $blockHash, contractAddress: $contractAddress, _whose: $_whose, _index: $_index){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getOwnedPointCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getOwnedPointCount.gql new file mode 100644 index 0000000..f506e9e --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getOwnedPointCount.gql @@ -0,0 +1,8 @@ +query getOwnedPointCount($blockHash: String!, $contractAddress: String!, $_whose: String!){ + getOwnedPointCount(blockHash: $blockHash, contractAddress: $contractAddress, _whose: $_whose){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getOwner.gql b/packages/linear-star-release-watcher/src/gql/queries/getOwner.gql new file mode 100644 index 0000000..f20db27 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getOwner.gql @@ -0,0 +1,8 @@ +query getOwner($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getOwner(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getSpawnCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getSpawnCount.gql new file mode 100644 index 0000000..2edcff0 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getSpawnCount.gql @@ -0,0 +1,8 @@ +query getSpawnCount($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getSpawnCount(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getSpawnLimit.gql b/packages/linear-star-release-watcher/src/gql/queries/getSpawnLimit.gql new file mode 100644 index 0000000..14873c3 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getSpawnLimit.gql @@ -0,0 +1,8 @@ +query getSpawnLimit($blockHash: String!, $contractAddress: String!, $_point: Int!, $_time: BigInt!){ + getSpawnLimit(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _time: $_time){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getSpawnProxy.gql b/packages/linear-star-release-watcher/src/gql/queries/getSpawnProxy.gql new file mode 100644 index 0000000..fe536b2 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getSpawnProxy.gql @@ -0,0 +1,8 @@ +query getSpawnProxy($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getSpawnProxy(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getSpawningForCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getSpawningForCount.gql new file mode 100644 index 0000000..df6f040 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getSpawningForCount.gql @@ -0,0 +1,8 @@ +query getSpawningForCount($blockHash: String!, $contractAddress: String!, $_proxy: String!){ + getSpawningForCount(blockHash: $blockHash, contractAddress: $contractAddress, _proxy: $_proxy){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getSponsor.gql b/packages/linear-star-release-watcher/src/gql/queries/getSponsor.gql new file mode 100644 index 0000000..9843916 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getSponsor.gql @@ -0,0 +1,8 @@ +query getSponsor($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getSponsor(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getSponsoringCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getSponsoringCount.gql new file mode 100644 index 0000000..3d070dd --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getSponsoringCount.gql @@ -0,0 +1,8 @@ +query getSponsoringCount($blockHash: String!, $contractAddress: String!, $_sponsor: Int!){ + getSponsoringCount(blockHash: $blockHash, contractAddress: $contractAddress, _sponsor: $_sponsor){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getState.gql b/packages/linear-star-release-watcher/src/gql/queries/getState.gql new file mode 100644 index 0000000..3b8f605 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getState.gql @@ -0,0 +1,15 @@ +query getState($blockHash: String!, $contractAddress: String!, $kind: String){ + getState(blockHash: $blockHash, contractAddress: $contractAddress, kind: $kind){ + block{ + cid + hash + number + timestamp + parentHash + } + contractAddress + cid + kind + data + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getStateByCID.gql b/packages/linear-star-release-watcher/src/gql/queries/getStateByCID.gql new file mode 100644 index 0000000..6c3c4fd --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getStateByCID.gql @@ -0,0 +1,15 @@ +query getStateByCID($cid: String!){ + getStateByCID(cid: $cid){ + block{ + cid + hash + number + timestamp + parentHash + } + contractAddress + cid + kind + data + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getSyncStatus.gql b/packages/linear-star-release-watcher/src/gql/queries/getSyncStatus.gql new file mode 100644 index 0000000..2f80efd --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getSyncStatus.gql @@ -0,0 +1,8 @@ +query getSyncStatus{ + getSyncStatus{ + latestIndexedBlockHash + latestIndexedBlockNumber + latestCanonicalBlockHash + latestCanonicalBlockNumber + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getTransferProxy.gql b/packages/linear-star-release-watcher/src/gql/queries/getTransferProxy.gql new file mode 100644 index 0000000..852fd2f --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getTransferProxy.gql @@ -0,0 +1,8 @@ +query getTransferProxy($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getTransferProxy(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getTransferringForCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getTransferringForCount.gql new file mode 100644 index 0000000..b3245eb --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getTransferringForCount.gql @@ -0,0 +1,8 @@ +query getTransferringForCount($blockHash: String!, $contractAddress: String!, $_proxy: String!){ + getTransferringForCount(blockHash: $blockHash, contractAddress: $contractAddress, _proxy: $_proxy){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getUpgradeProposalCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getUpgradeProposalCount.gql new file mode 100644 index 0000000..33dd2f6 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getUpgradeProposalCount.gql @@ -0,0 +1,8 @@ +query getUpgradeProposalCount($blockHash: String!, $contractAddress: String!){ + getUpgradeProposalCount(blockHash: $blockHash, contractAddress: $contractAddress){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getVotingForCount.gql b/packages/linear-star-release-watcher/src/gql/queries/getVotingForCount.gql new file mode 100644 index 0000000..6f7e1e0 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getVotingForCount.gql @@ -0,0 +1,8 @@ +query getVotingForCount($blockHash: String!, $contractAddress: String!, $_proxy: String!){ + getVotingForCount(blockHash: $blockHash, contractAddress: $contractAddress, _proxy: $_proxy){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/getVotingProxy.gql b/packages/linear-star-release-watcher/src/gql/queries/getVotingProxy.gql new file mode 100644 index 0000000..1f2f38a --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/getVotingProxy.gql @@ -0,0 +1,8 @@ +query getVotingProxy($blockHash: String!, $contractAddress: String!, $_point: Int!){ + getVotingProxy(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/hasBeenLinked.gql b/packages/linear-star-release-watcher/src/gql/queries/hasBeenLinked.gql new file mode 100644 index 0000000..e9da67e --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/hasBeenLinked.gql @@ -0,0 +1,8 @@ +query hasBeenLinked($blockHash: String!, $contractAddress: String!, $_point: Int!){ + hasBeenLinked(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/hasSponsor.gql b/packages/linear-star-release-watcher/src/gql/queries/hasSponsor.gql new file mode 100644 index 0000000..3e804ed --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/hasSponsor.gql @@ -0,0 +1,8 @@ +query hasSponsor($blockHash: String!, $contractAddress: String!, $_point: Int!){ + hasSponsor(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/hasVotedOnDocumentPoll.gql b/packages/linear-star-release-watcher/src/gql/queries/hasVotedOnDocumentPoll.gql new file mode 100644 index 0000000..55c6eac --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/hasVotedOnDocumentPoll.gql @@ -0,0 +1,8 @@ +query hasVotedOnDocumentPoll($blockHash: String!, $contractAddress: String!, $_galaxy: Int!, $_proposal: String!){ + hasVotedOnDocumentPoll(blockHash: $blockHash, contractAddress: $contractAddress, _galaxy: $_galaxy, _proposal: $_proposal){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/hasVotedOnUpgradePoll.gql b/packages/linear-star-release-watcher/src/gql/queries/hasVotedOnUpgradePoll.gql new file mode 100644 index 0000000..7c30daa --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/hasVotedOnUpgradePoll.gql @@ -0,0 +1,8 @@ +query hasVotedOnUpgradePoll($blockHash: String!, $contractAddress: String!, $_galaxy: Int!, $_proposal: String!){ + hasVotedOnUpgradePoll(blockHash: $blockHash, contractAddress: $contractAddress, _galaxy: $_galaxy, _proposal: $_proposal){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/index.ts b/packages/linear-star-release-watcher/src/gql/queries/index.ts new file mode 100644 index 0000000..fb9c371 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/index.ts @@ -0,0 +1,64 @@ +import fs from 'fs'; +import path from 'path'; + +export const events = fs.readFileSync(path.join(__dirname, 'events.gql'), 'utf8'); +export const eventsInRange = fs.readFileSync(path.join(__dirname, 'eventsInRange.gql'), 'utf8'); +export const isActive = fs.readFileSync(path.join(__dirname, 'isActive.gql'), 'utf8'); +export const getKeyRevisionNumber = fs.readFileSync(path.join(__dirname, 'getKeyRevisionNumber.gql'), 'utf8'); +export const hasBeenLinked = fs.readFileSync(path.join(__dirname, 'hasBeenLinked.gql'), 'utf8'); +export const isLive = fs.readFileSync(path.join(__dirname, 'isLive.gql'), 'utf8'); +export const getContinuityNumber = fs.readFileSync(path.join(__dirname, 'getContinuityNumber.gql'), 'utf8'); +export const getSpawnCount = fs.readFileSync(path.join(__dirname, 'getSpawnCount.gql'), 'utf8'); +export const hasSponsor = fs.readFileSync(path.join(__dirname, 'hasSponsor.gql'), 'utf8'); +export const getSponsor = fs.readFileSync(path.join(__dirname, 'getSponsor.gql'), 'utf8'); +export const isSponsor = fs.readFileSync(path.join(__dirname, 'isSponsor.gql'), 'utf8'); +export const getSponsoringCount = fs.readFileSync(path.join(__dirname, 'getSponsoringCount.gql'), 'utf8'); +export const isEscaping = fs.readFileSync(path.join(__dirname, 'isEscaping.gql'), 'utf8'); +export const getEscapeRequest = fs.readFileSync(path.join(__dirname, 'getEscapeRequest.gql'), 'utf8'); +export const isRequestingEscapeTo = fs.readFileSync(path.join(__dirname, 'isRequestingEscapeTo.gql'), 'utf8'); +export const getEscapeRequestsCount = fs.readFileSync(path.join(__dirname, 'getEscapeRequestsCount.gql'), 'utf8'); +export const getOwner = fs.readFileSync(path.join(__dirname, 'getOwner.gql'), 'utf8'); +export const isOwner = fs.readFileSync(path.join(__dirname, 'isOwner.gql'), 'utf8'); +export const getOwnedPointCount = fs.readFileSync(path.join(__dirname, 'getOwnedPointCount.gql'), 'utf8'); +export const getOwnedPointAtIndex = fs.readFileSync(path.join(__dirname, 'getOwnedPointAtIndex.gql'), 'utf8'); +export const getManagementProxy = fs.readFileSync(path.join(__dirname, 'getManagementProxy.gql'), 'utf8'); +export const isManagementProxy = fs.readFileSync(path.join(__dirname, 'isManagementProxy.gql'), 'utf8'); +export const canManage = fs.readFileSync(path.join(__dirname, 'canManage.gql'), 'utf8'); +export const getManagerForCount = fs.readFileSync(path.join(__dirname, 'getManagerForCount.gql'), 'utf8'); +export const getSpawnProxy = fs.readFileSync(path.join(__dirname, 'getSpawnProxy.gql'), 'utf8'); +export const isSpawnProxy = fs.readFileSync(path.join(__dirname, 'isSpawnProxy.gql'), 'utf8'); +export const canSpawnAs = fs.readFileSync(path.join(__dirname, 'canSpawnAs.gql'), 'utf8'); +export const getSpawningForCount = fs.readFileSync(path.join(__dirname, 'getSpawningForCount.gql'), 'utf8'); +export const getVotingProxy = fs.readFileSync(path.join(__dirname, 'getVotingProxy.gql'), 'utf8'); +export const isVotingProxy = fs.readFileSync(path.join(__dirname, 'isVotingProxy.gql'), 'utf8'); +export const canVoteAs = fs.readFileSync(path.join(__dirname, 'canVoteAs.gql'), 'utf8'); +export const getVotingForCount = fs.readFileSync(path.join(__dirname, 'getVotingForCount.gql'), 'utf8'); +export const getTransferProxy = fs.readFileSync(path.join(__dirname, 'getTransferProxy.gql'), 'utf8'); +export const isTransferProxy = fs.readFileSync(path.join(__dirname, 'isTransferProxy.gql'), 'utf8'); +export const canTransfer = fs.readFileSync(path.join(__dirname, 'canTransfer.gql'), 'utf8'); +export const getTransferringForCount = fs.readFileSync(path.join(__dirname, 'getTransferringForCount.gql'), 'utf8'); +export const isOperator = fs.readFileSync(path.join(__dirname, 'isOperator.gql'), 'utf8'); +export const getUpgradeProposalCount = fs.readFileSync(path.join(__dirname, 'getUpgradeProposalCount.gql'), 'utf8'); +export const getDocumentProposalCount = fs.readFileSync(path.join(__dirname, 'getDocumentProposalCount.gql'), 'utf8'); +export const hasVotedOnUpgradePoll = fs.readFileSync(path.join(__dirname, 'hasVotedOnUpgradePoll.gql'), 'utf8'); +export const hasVotedOnDocumentPoll = fs.readFileSync(path.join(__dirname, 'hasVotedOnDocumentPoll.gql'), 'utf8'); +export const findClaim = fs.readFileSync(path.join(__dirname, 'findClaim.gql'), 'utf8'); +export const supportsInterface = fs.readFileSync(path.join(__dirname, 'supportsInterface.gql'), 'utf8'); +export const balanceOf = fs.readFileSync(path.join(__dirname, 'balanceOf.gql'), 'utf8'); +export const ownerOf = fs.readFileSync(path.join(__dirname, 'ownerOf.gql'), 'utf8'); +export const exists = fs.readFileSync(path.join(__dirname, 'exists.gql'), 'utf8'); +export const getApproved = fs.readFileSync(path.join(__dirname, 'getApproved.gql'), 'utf8'); +export const isApprovedForAll = fs.readFileSync(path.join(__dirname, 'isApprovedForAll.gql'), 'utf8'); +export const totalSupply = fs.readFileSync(path.join(__dirname, 'totalSupply.gql'), 'utf8'); +export const tokenOfOwnerByIndex = fs.readFileSync(path.join(__dirname, 'tokenOfOwnerByIndex.gql'), 'utf8'); +export const tokenByIndex = fs.readFileSync(path.join(__dirname, 'tokenByIndex.gql'), 'utf8'); +export const name = fs.readFileSync(path.join(__dirname, 'name.gql'), 'utf8'); +export const symbol = fs.readFileSync(path.join(__dirname, 'symbol.gql'), 'utf8'); +export const tokenURI = fs.readFileSync(path.join(__dirname, 'tokenURI.gql'), 'utf8'); +export const getSpawnLimit = fs.readFileSync(path.join(__dirname, 'getSpawnLimit.gql'), 'utf8'); +export const canEscapeTo = fs.readFileSync(path.join(__dirname, 'canEscapeTo.gql'), 'utf8'); +export const withdrawLimit = fs.readFileSync(path.join(__dirname, 'withdrawLimit.gql'), 'utf8'); +export const verifyBalance = fs.readFileSync(path.join(__dirname, 'verifyBalance.gql'), 'utf8'); +export const getSyncStatus = fs.readFileSync(path.join(__dirname, 'getSyncStatus.gql'), 'utf8'); +export const getStateByCID = fs.readFileSync(path.join(__dirname, 'getStateByCID.gql'), 'utf8'); +export const getState = fs.readFileSync(path.join(__dirname, 'getState.gql'), 'utf8'); diff --git a/packages/linear-star-release-watcher/src/gql/queries/isActive.gql b/packages/linear-star-release-watcher/src/gql/queries/isActive.gql new file mode 100644 index 0000000..fe365a4 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isActive.gql @@ -0,0 +1,8 @@ +query isActive($blockHash: String!, $contractAddress: String!, $_point: Int!){ + isActive(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isApprovedForAll.gql b/packages/linear-star-release-watcher/src/gql/queries/isApprovedForAll.gql new file mode 100644 index 0000000..d080750 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isApprovedForAll.gql @@ -0,0 +1,8 @@ +query isApprovedForAll($blockHash: String!, $contractAddress: String!, $_owner: String!, $_operator: String!){ + isApprovedForAll(blockHash: $blockHash, contractAddress: $contractAddress, _owner: $_owner, _operator: $_operator){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isEscaping.gql b/packages/linear-star-release-watcher/src/gql/queries/isEscaping.gql new file mode 100644 index 0000000..89113e6 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isEscaping.gql @@ -0,0 +1,8 @@ +query isEscaping($blockHash: String!, $contractAddress: String!, $_point: Int!){ + isEscaping(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isLive.gql b/packages/linear-star-release-watcher/src/gql/queries/isLive.gql new file mode 100644 index 0000000..ceaa49e --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isLive.gql @@ -0,0 +1,8 @@ +query isLive($blockHash: String!, $contractAddress: String!, $_point: Int!){ + isLive(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isManagementProxy.gql b/packages/linear-star-release-watcher/src/gql/queries/isManagementProxy.gql new file mode 100644 index 0000000..c3484d6 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isManagementProxy.gql @@ -0,0 +1,8 @@ +query isManagementProxy($blockHash: String!, $contractAddress: String!, $_point: Int!, $_proxy: String!){ + isManagementProxy(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _proxy: $_proxy){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isOperator.gql b/packages/linear-star-release-watcher/src/gql/queries/isOperator.gql new file mode 100644 index 0000000..c67f1e2 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isOperator.gql @@ -0,0 +1,8 @@ +query isOperator($blockHash: String!, $contractAddress: String!, $_owner: String!, $_operator: String!){ + isOperator(blockHash: $blockHash, contractAddress: $contractAddress, _owner: $_owner, _operator: $_operator){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isOwner.gql b/packages/linear-star-release-watcher/src/gql/queries/isOwner.gql new file mode 100644 index 0000000..84dfc3b --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isOwner.gql @@ -0,0 +1,8 @@ +query isOwner($blockHash: String!, $contractAddress: String!, $_point: Int!, $_address: String!){ + isOwner(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _address: $_address){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isRequestingEscapeTo.gql b/packages/linear-star-release-watcher/src/gql/queries/isRequestingEscapeTo.gql new file mode 100644 index 0000000..bb2d6dd --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isRequestingEscapeTo.gql @@ -0,0 +1,8 @@ +query isRequestingEscapeTo($blockHash: String!, $contractAddress: String!, $_point: Int!, $_sponsor: Int!){ + isRequestingEscapeTo(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _sponsor: $_sponsor){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isSpawnProxy.gql b/packages/linear-star-release-watcher/src/gql/queries/isSpawnProxy.gql new file mode 100644 index 0000000..161923d --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isSpawnProxy.gql @@ -0,0 +1,8 @@ +query isSpawnProxy($blockHash: String!, $contractAddress: String!, $_point: Int!, $_proxy: String!){ + isSpawnProxy(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _proxy: $_proxy){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isSponsor.gql b/packages/linear-star-release-watcher/src/gql/queries/isSponsor.gql new file mode 100644 index 0000000..4daff70 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isSponsor.gql @@ -0,0 +1,8 @@ +query isSponsor($blockHash: String!, $contractAddress: String!, $_point: Int!, $_sponsor: Int!){ + isSponsor(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _sponsor: $_sponsor){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isTransferProxy.gql b/packages/linear-star-release-watcher/src/gql/queries/isTransferProxy.gql new file mode 100644 index 0000000..1057968 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isTransferProxy.gql @@ -0,0 +1,8 @@ +query isTransferProxy($blockHash: String!, $contractAddress: String!, $_point: Int!, $_proxy: String!){ + isTransferProxy(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _proxy: $_proxy){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/isVotingProxy.gql b/packages/linear-star-release-watcher/src/gql/queries/isVotingProxy.gql new file mode 100644 index 0000000..28bdb0f --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/isVotingProxy.gql @@ -0,0 +1,8 @@ +query isVotingProxy($blockHash: String!, $contractAddress: String!, $_point: Int!, $_proxy: String!){ + isVotingProxy(blockHash: $blockHash, contractAddress: $contractAddress, _point: $_point, _proxy: $_proxy){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/name.gql b/packages/linear-star-release-watcher/src/gql/queries/name.gql new file mode 100644 index 0000000..0431f0d --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/name.gql @@ -0,0 +1,8 @@ +query name($blockHash: String!, $contractAddress: String!){ + name(blockHash: $blockHash, contractAddress: $contractAddress){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/ownerOf.gql b/packages/linear-star-release-watcher/src/gql/queries/ownerOf.gql new file mode 100644 index 0000000..56e0cd8 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/ownerOf.gql @@ -0,0 +1,8 @@ +query ownerOf($blockHash: String!, $contractAddress: String!, $_tokenId: BigInt!){ + ownerOf(blockHash: $blockHash, contractAddress: $contractAddress, _tokenId: $_tokenId){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/supportsInterface.gql b/packages/linear-star-release-watcher/src/gql/queries/supportsInterface.gql new file mode 100644 index 0000000..ab758a9 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/supportsInterface.gql @@ -0,0 +1,8 @@ +query supportsInterface($blockHash: String!, $contractAddress: String!, $_interfaceId: String!){ + supportsInterface(blockHash: $blockHash, contractAddress: $contractAddress, _interfaceId: $_interfaceId){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/symbol.gql b/packages/linear-star-release-watcher/src/gql/queries/symbol.gql new file mode 100644 index 0000000..fa278b8 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/symbol.gql @@ -0,0 +1,8 @@ +query symbol($blockHash: String!, $contractAddress: String!){ + symbol(blockHash: $blockHash, contractAddress: $contractAddress){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/tokenByIndex.gql b/packages/linear-star-release-watcher/src/gql/queries/tokenByIndex.gql new file mode 100644 index 0000000..e743dcd --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/tokenByIndex.gql @@ -0,0 +1,8 @@ +query tokenByIndex($blockHash: String!, $contractAddress: String!, $_index: BigInt!){ + tokenByIndex(blockHash: $blockHash, contractAddress: $contractAddress, _index: $_index){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/tokenOfOwnerByIndex.gql b/packages/linear-star-release-watcher/src/gql/queries/tokenOfOwnerByIndex.gql new file mode 100644 index 0000000..27eda46 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/tokenOfOwnerByIndex.gql @@ -0,0 +1,8 @@ +query tokenOfOwnerByIndex($blockHash: String!, $contractAddress: String!, $_owner: String!, $_index: BigInt!){ + tokenOfOwnerByIndex(blockHash: $blockHash, contractAddress: $contractAddress, _owner: $_owner, _index: $_index){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/tokenURI.gql b/packages/linear-star-release-watcher/src/gql/queries/tokenURI.gql new file mode 100644 index 0000000..28aa08c --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/tokenURI.gql @@ -0,0 +1,8 @@ +query tokenURI($blockHash: String!, $contractAddress: String!, $_tokenId: BigInt!){ + tokenURI(blockHash: $blockHash, contractAddress: $contractAddress, _tokenId: $_tokenId){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/totalSupply.gql b/packages/linear-star-release-watcher/src/gql/queries/totalSupply.gql new file mode 100644 index 0000000..d1be1e4 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/totalSupply.gql @@ -0,0 +1,8 @@ +query totalSupply($blockHash: String!, $contractAddress: String!){ + totalSupply(blockHash: $blockHash, contractAddress: $contractAddress){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/verifyBalance.gql b/packages/linear-star-release-watcher/src/gql/queries/verifyBalance.gql new file mode 100644 index 0000000..78079b9 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/verifyBalance.gql @@ -0,0 +1,8 @@ +query verifyBalance($blockHash: String!, $contractAddress: String!, $_participant: String!){ + verifyBalance(blockHash: $blockHash, contractAddress: $contractAddress, _participant: $_participant){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/queries/withdrawLimit.gql b/packages/linear-star-release-watcher/src/gql/queries/withdrawLimit.gql new file mode 100644 index 0000000..8a1efb4 --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/queries/withdrawLimit.gql @@ -0,0 +1,8 @@ +query withdrawLimit($blockHash: String!, $contractAddress: String!, $_participant: String!){ + withdrawLimit(blockHash: $blockHash, contractAddress: $contractAddress, _participant: $_participant){ + value + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/gql/subscriptions/index.ts b/packages/linear-star-release-watcher/src/gql/subscriptions/index.ts new file mode 100644 index 0000000..f12910c --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/subscriptions/index.ts @@ -0,0 +1,4 @@ +import fs from 'fs'; +import path from 'path'; + +export const onEvent = fs.readFileSync(path.join(__dirname, 'onEvent.gql'), 'utf8'); diff --git a/packages/linear-star-release-watcher/src/gql/subscriptions/onEvent.gql b/packages/linear-star-release-watcher/src/gql/subscriptions/onEvent.gql new file mode 100644 index 0000000..ad0441b --- /dev/null +++ b/packages/linear-star-release-watcher/src/gql/subscriptions/onEvent.gql @@ -0,0 +1,31 @@ +subscription onEvent{ + onEvent{ + block{ + cid + hash + number + timestamp + parentHash + } + tx{ + hash + index + from + to + } + contract + eventIndex + event{ + ... on OwnershipRenouncedEvent { + previousOwner + } + ... on OwnershipTransferredEvent { + previousOwner + newOwner + } + } + proof{ + data + } + } +} \ No newline at end of file diff --git a/packages/linear-star-release-watcher/src/hooks.ts b/packages/linear-star-release-watcher/src/hooks.ts new file mode 100644 index 0000000..77d9910 --- /dev/null +++ b/packages/linear-star-release-watcher/src/hooks.ts @@ -0,0 +1,80 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import assert from 'assert'; + +import { updateStateForMappingType, updateStateForElementaryType, ResultEvent } from '@cerc-io/util'; + +import { Indexer } from './indexer'; + +/** + * Hook function to store an initial state. + * @param indexer Indexer instance. + * @param blockHash Hash of the concerned block. + * @param contractAddress Address of the concerned contract. + * @returns Data block to be stored. + */ +export async function createInitialState (indexer: Indexer, contractAddress: string, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + assert(contractAddress); + + // Store an empty State. + const stateData: any = { + state: {} + }; + + // Use updateStateForElementaryType to update initial state with an elementary property. + // Eg. const stateData = updateStateForElementaryType(stateData, '_totalBalance', result.value.toString()); + + // Use updateStateForMappingType to update initial state with a nested property. + // Eg. const stateData = updateStateForMappingType(stateData, '_allowances', [owner, spender], allowance.value.toString()); + + // Return initial state data to be saved. + return stateData; +} + +/** + * Hook function to create state diff. + * @param indexer Indexer instance that contains methods to fetch the contract variable values. + * @param blockHash Block hash of the concerned block. + */ +export async function createStateDiff (indexer: Indexer, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + + // Use indexer.createDiff() method to save custom state diff(s). +} + +/** + * Hook function to create state checkpoint + * @param indexer Indexer instance. + * @param contractAddress Address of the concerned contract. + * @param blockHash Block hash of the concerned block. + * @returns Whether to disable default checkpoint. If false, the state from this hook is updated with that from default checkpoint. + */ +export async function createStateCheckpoint (indexer: Indexer, contractAddress: string, blockHash: string): Promise { + assert(indexer); + assert(blockHash); + assert(contractAddress); + + // Use indexer.createStateCheckpoint() method to create a custom checkpoint. + + // Return false to update the state created by this hook by auto-generated checkpoint state. + // Return true to disable update of the state created by this hook by auto-generated checkpoint state. + return false; +} + +/** + * Event hook function. + * @param indexer Indexer instance that contains methods to fetch and update the contract values in the database. + * @param eventData ResultEvent object containing event information. + */ +export async function handleEvent (indexer: Indexer, eventData: ResultEvent): Promise { + assert(indexer); + assert(eventData); + + // Use indexer methods to index data. + // Pass `diff` parameter to indexer methods as true to save an auto-generated state from the indexed data. +} diff --git a/packages/linear-star-release-watcher/src/indexer.ts b/packages/linear-star-release-watcher/src/indexer.ts new file mode 100644 index 0000000..b5096a7 --- /dev/null +++ b/packages/linear-star-release-watcher/src/indexer.ts @@ -0,0 +1,2084 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import assert from 'assert'; +import debug from 'debug'; +import { DeepPartial, FindConditions, FindManyOptions, ObjectLiteral } from 'typeorm'; +import JSONbig from 'json-bigint'; +import { ethers } from 'ethers'; + +import { JsonFragment } from '@ethersproject/abi'; +import { BaseProvider } from '@ethersproject/providers'; +import { EthClient } from '@cerc-io/ipld-eth-client'; +import { MappingKey, StorageLayout } from '@cerc-io/solidity-mapper'; +import { + Indexer as BaseIndexer, + IndexerInterface, + ValueResult, + ServerConfig, + JobQueue, + Where, + QueryOptions, + updateStateForElementaryType, + updateStateForMappingType, + StateKind, + StateStatus, + ResultEvent, + getResultEvent, + DatabaseInterface, + Clients +} from '@cerc-io/util'; + +import LinearStarReleaseArtifacts from './artifacts/LinearStarRelease.json'; +import { Database, ENTITIES } from './database'; +import { createInitialState, handleEvent, createStateDiff, createStateCheckpoint } from './hooks'; +import { Contract } from './entity/Contract'; +import { Event } from './entity/Event'; +import { SyncStatus } from './entity/SyncStatus'; +import { StateSyncStatus } from './entity/StateSyncStatus'; +import { BlockProgress } from './entity/BlockProgress'; +import { State } from './entity/State'; + +const log = debug('vulcanize:indexer'); +const JSONbigNative = JSONbig({ useNativeBigInt: true }); + +const KIND_LINEARSTARRELEASE = 'LinearStarRelease'; + +export class Indexer implements IndexerInterface { + _db: Database; + _ethClient: EthClient; + _ethProvider: BaseProvider; + _baseIndexer: BaseIndexer; + _serverConfig: ServerConfig; + + _abiMap: Map; + _storageLayoutMap: Map; + _contractMap: Map; + + constructor (serverConfig: ServerConfig, db: DatabaseInterface, clients: Clients, ethProvider: BaseProvider, jobQueue: JobQueue) { + assert(db); + assert(clients.ethClient); + + this._db = db as Database; + this._ethClient = clients.ethClient; + this._ethProvider = ethProvider; + this._serverConfig = serverConfig; + this._baseIndexer = new BaseIndexer(this._serverConfig, this._db, this._ethClient, this._ethProvider, jobQueue); + + this._abiMap = new Map(); + this._storageLayoutMap = new Map(); + this._contractMap = new Map(); + + const { abi: LinearStarReleaseABI } = LinearStarReleaseArtifacts; + + assert(LinearStarReleaseABI); + this._abiMap.set(KIND_LINEARSTARRELEASE, LinearStarReleaseABI); + this._contractMap.set(KIND_LINEARSTARRELEASE, new ethers.utils.Interface(LinearStarReleaseABI)); + } + + get serverConfig (): ServerConfig { + return this._serverConfig; + } + + get storageLayoutMap (): Map { + return this._storageLayoutMap; + } + + async init (): Promise { + await this._baseIndexer.fetchContracts(); + await this._baseIndexer.fetchStateStatus(); + } + + getResultEvent (event: Event): ResultEvent { + return getResultEvent(event); + } + + async isActive (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getIsActive({ blockHash, contractAddress, _point }); + if (entity) { + log('isActive: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isActive: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isActive(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsActive({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getKeyRevisionNumber (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetKeyRevisionNumber({ blockHash, contractAddress, _point }); + if (entity) { + log('getKeyRevisionNumber: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getKeyRevisionNumber: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getKeyRevisionNumber(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetKeyRevisionNumber({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async hasBeenLinked (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getHasBeenLinked({ blockHash, contractAddress, _point }); + if (entity) { + log('hasBeenLinked: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('hasBeenLinked: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.hasBeenLinked(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveHasBeenLinked({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isLive (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getIsLive({ blockHash, contractAddress, _point }); + if (entity) { + log('isLive: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isLive: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isLive(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsLive({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getContinuityNumber (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetContinuityNumber({ blockHash, contractAddress, _point }); + if (entity) { + log('getContinuityNumber: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getContinuityNumber: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getContinuityNumber(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetContinuityNumber({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getSpawnCount (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetSpawnCount({ blockHash, contractAddress, _point }); + if (entity) { + log('getSpawnCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getSpawnCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getSpawnCount(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetSpawnCount({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async hasSponsor (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getHasSponsor({ blockHash, contractAddress, _point }); + if (entity) { + log('hasSponsor: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('hasSponsor: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.hasSponsor(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveHasSponsor({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getSponsor (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetSponsor({ blockHash, contractAddress, _point }); + if (entity) { + log('getSponsor: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getSponsor: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getSponsor(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetSponsor({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isSponsor (blockHash: string, contractAddress: string, _point: number, _sponsor: number): Promise { + const entity = await this._db.getIsSponsor({ blockHash, contractAddress, _point, _sponsor }); + if (entity) { + log('isSponsor: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isSponsor: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isSponsor(_point, _sponsor, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsSponsor({ blockHash, blockNumber, contractAddress, _point, _sponsor, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getSponsoringCount (blockHash: string, contractAddress: string, _sponsor: number): Promise { + const entity = await this._db.getGetSponsoringCount({ blockHash, contractAddress, _sponsor }); + if (entity) { + log('getSponsoringCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getSponsoringCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getSponsoringCount(_sponsor, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetSponsoringCount({ blockHash, blockNumber, contractAddress, _sponsor, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isEscaping (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getIsEscaping({ blockHash, contractAddress, _point }); + if (entity) { + log('isEscaping: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isEscaping: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isEscaping(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsEscaping({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getEscapeRequest (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetEscapeRequest({ blockHash, contractAddress, _point }); + if (entity) { + log('getEscapeRequest: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getEscapeRequest: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getEscapeRequest(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetEscapeRequest({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isRequestingEscapeTo (blockHash: string, contractAddress: string, _point: number, _sponsor: number): Promise { + const entity = await this._db.getIsRequestingEscapeTo({ blockHash, contractAddress, _point, _sponsor }); + if (entity) { + log('isRequestingEscapeTo: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isRequestingEscapeTo: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isRequestingEscapeTo(_point, _sponsor, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsRequestingEscapeTo({ blockHash, blockNumber, contractAddress, _point, _sponsor, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getEscapeRequestsCount (blockHash: string, contractAddress: string, _sponsor: number): Promise { + const entity = await this._db.getGetEscapeRequestsCount({ blockHash, contractAddress, _sponsor }); + if (entity) { + log('getEscapeRequestsCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getEscapeRequestsCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getEscapeRequestsCount(_sponsor, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetEscapeRequestsCount({ blockHash, blockNumber, contractAddress, _sponsor, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getOwner (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetOwner({ blockHash, contractAddress, _point }); + if (entity) { + log('getOwner: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getOwner: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getOwner(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetOwner({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isOwner (blockHash: string, contractAddress: string, _point: number, _address: string): Promise { + const entity = await this._db.getIsOwner({ blockHash, contractAddress, _point, _address }); + if (entity) { + log('isOwner: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isOwner: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isOwner(_point, _address, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsOwner({ blockHash, blockNumber, contractAddress, _point, _address, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getOwnedPointCount (blockHash: string, contractAddress: string, _whose: string): Promise { + const entity = await this._db.getGetOwnedPointCount({ blockHash, contractAddress, _whose }); + if (entity) { + log('getOwnedPointCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getOwnedPointCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getOwnedPointCount(_whose, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetOwnedPointCount({ blockHash, blockNumber, contractAddress, _whose, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getOwnedPointAtIndex (blockHash: string, contractAddress: string, _whose: string, _index: bigint): Promise { + const entity = await this._db.getGetOwnedPointAtIndex({ blockHash, contractAddress, _whose, _index }); + if (entity) { + log('getOwnedPointAtIndex: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getOwnedPointAtIndex: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getOwnedPointAtIndex(_whose, _index, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetOwnedPointAtIndex({ blockHash, blockNumber, contractAddress, _whose, _index, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getManagementProxy (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetManagementProxy({ blockHash, contractAddress, _point }); + if (entity) { + log('getManagementProxy: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getManagementProxy: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getManagementProxy(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetManagementProxy({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isManagementProxy (blockHash: string, contractAddress: string, _point: number, _proxy: string): Promise { + const entity = await this._db.getIsManagementProxy({ blockHash, contractAddress, _point, _proxy }); + if (entity) { + log('isManagementProxy: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isManagementProxy: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isManagementProxy(_point, _proxy, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsManagementProxy({ blockHash, blockNumber, contractAddress, _point, _proxy, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async canManage (blockHash: string, contractAddress: string, _point: number, _who: string): Promise { + const entity = await this._db.getCanManage({ blockHash, contractAddress, _point, _who }); + if (entity) { + log('canManage: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('canManage: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.canManage(_point, _who, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveCanManage({ blockHash, blockNumber, contractAddress, _point, _who, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getManagerForCount (blockHash: string, contractAddress: string, _proxy: string): Promise { + const entity = await this._db.getGetManagerForCount({ blockHash, contractAddress, _proxy }); + if (entity) { + log('getManagerForCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getManagerForCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getManagerForCount(_proxy, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetManagerForCount({ blockHash, blockNumber, contractAddress, _proxy, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getSpawnProxy (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetSpawnProxy({ blockHash, contractAddress, _point }); + if (entity) { + log('getSpawnProxy: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getSpawnProxy: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getSpawnProxy(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetSpawnProxy({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isSpawnProxy (blockHash: string, contractAddress: string, _point: number, _proxy: string): Promise { + const entity = await this._db.getIsSpawnProxy({ blockHash, contractAddress, _point, _proxy }); + if (entity) { + log('isSpawnProxy: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isSpawnProxy: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isSpawnProxy(_point, _proxy, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsSpawnProxy({ blockHash, blockNumber, contractAddress, _point, _proxy, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async canSpawnAs (blockHash: string, contractAddress: string, _point: number, _who: string): Promise { + const entity = await this._db.getCanSpawnAs({ blockHash, contractAddress, _point, _who }); + if (entity) { + log('canSpawnAs: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('canSpawnAs: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.canSpawnAs(_point, _who, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveCanSpawnAs({ blockHash, blockNumber, contractAddress, _point, _who, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getSpawningForCount (blockHash: string, contractAddress: string, _proxy: string): Promise { + const entity = await this._db.getGetSpawningForCount({ blockHash, contractAddress, _proxy }); + if (entity) { + log('getSpawningForCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getSpawningForCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getSpawningForCount(_proxy, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetSpawningForCount({ blockHash, blockNumber, contractAddress, _proxy, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getVotingProxy (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetVotingProxy({ blockHash, contractAddress, _point }); + if (entity) { + log('getVotingProxy: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getVotingProxy: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getVotingProxy(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetVotingProxy({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isVotingProxy (blockHash: string, contractAddress: string, _point: number, _proxy: string): Promise { + const entity = await this._db.getIsVotingProxy({ blockHash, contractAddress, _point, _proxy }); + if (entity) { + log('isVotingProxy: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isVotingProxy: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isVotingProxy(_point, _proxy, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsVotingProxy({ blockHash, blockNumber, contractAddress, _point, _proxy, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async canVoteAs (blockHash: string, contractAddress: string, _point: number, _who: string): Promise { + const entity = await this._db.getCanVoteAs({ blockHash, contractAddress, _point, _who }); + if (entity) { + log('canVoteAs: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('canVoteAs: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.canVoteAs(_point, _who, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveCanVoteAs({ blockHash, blockNumber, contractAddress, _point, _who, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getVotingForCount (blockHash: string, contractAddress: string, _proxy: string): Promise { + const entity = await this._db.getGetVotingForCount({ blockHash, contractAddress, _proxy }); + if (entity) { + log('getVotingForCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getVotingForCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getVotingForCount(_proxy, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetVotingForCount({ blockHash, blockNumber, contractAddress, _proxy, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getTransferProxy (blockHash: string, contractAddress: string, _point: number): Promise { + const entity = await this._db.getGetTransferProxy({ blockHash, contractAddress, _point }); + if (entity) { + log('getTransferProxy: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getTransferProxy: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getTransferProxy(_point, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetTransferProxy({ blockHash, blockNumber, contractAddress, _point, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isTransferProxy (blockHash: string, contractAddress: string, _point: number, _proxy: string): Promise { + const entity = await this._db.getIsTransferProxy({ blockHash, contractAddress, _point, _proxy }); + if (entity) { + log('isTransferProxy: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isTransferProxy: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isTransferProxy(_point, _proxy, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsTransferProxy({ blockHash, blockNumber, contractAddress, _point, _proxy, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async canTransfer (blockHash: string, contractAddress: string, _point: number, _who: string): Promise { + const entity = await this._db.getCanTransfer({ blockHash, contractAddress, _point, _who }); + if (entity) { + log('canTransfer: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('canTransfer: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.canTransfer(_point, _who, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveCanTransfer({ blockHash, blockNumber, contractAddress, _point, _who, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getTransferringForCount (blockHash: string, contractAddress: string, _proxy: string): Promise { + const entity = await this._db.getGetTransferringForCount({ blockHash, contractAddress, _proxy }); + if (entity) { + log('getTransferringForCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getTransferringForCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getTransferringForCount(_proxy, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetTransferringForCount({ blockHash, blockNumber, contractAddress, _proxy, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isOperator (blockHash: string, contractAddress: string, _owner: string, _operator: string): Promise { + const entity = await this._db.getIsOperator({ blockHash, contractAddress, _owner, _operator }); + if (entity) { + log('isOperator: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isOperator: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isOperator(_owner, _operator, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsOperator({ blockHash, blockNumber, contractAddress, _owner, _operator, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getUpgradeProposalCount (blockHash: string, contractAddress: string): Promise { + const entity = await this._db.getGetUpgradeProposalCount({ blockHash, contractAddress }); + if (entity) { + log('getUpgradeProposalCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getUpgradeProposalCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getUpgradeProposalCount({ blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetUpgradeProposalCount({ blockHash, blockNumber, contractAddress, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getDocumentProposalCount (blockHash: string, contractAddress: string): Promise { + const entity = await this._db.getGetDocumentProposalCount({ blockHash, contractAddress }); + if (entity) { + log('getDocumentProposalCount: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getDocumentProposalCount: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.getDocumentProposalCount({ blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveGetDocumentProposalCount({ blockHash, blockNumber, contractAddress, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async hasVotedOnUpgradePoll (blockHash: string, contractAddress: string, _galaxy: number, _proposal: string): Promise { + const entity = await this._db.getHasVotedOnUpgradePoll({ blockHash, contractAddress, _galaxy, _proposal }); + if (entity) { + log('hasVotedOnUpgradePoll: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('hasVotedOnUpgradePoll: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.hasVotedOnUpgradePoll(_galaxy, _proposal, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveHasVotedOnUpgradePoll({ blockHash, blockNumber, contractAddress, _galaxy, _proposal, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async hasVotedOnDocumentPoll (blockHash: string, contractAddress: string, _galaxy: number, _proposal: string): Promise { + const entity = await this._db.getHasVotedOnDocumentPoll({ blockHash, contractAddress, _galaxy, _proposal }); + if (entity) { + log('hasVotedOnDocumentPoll: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('hasVotedOnDocumentPoll: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.hasVotedOnDocumentPoll(_galaxy, _proposal, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveHasVotedOnDocumentPoll({ blockHash, blockNumber, contractAddress, _galaxy, _proposal, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async findClaim (blockHash: string, contractAddress: string, _whose: number, _protocol: string, _claim: string): Promise { + const entity = await this._db.getFindClaim({ blockHash, contractAddress, _whose, _protocol, _claim }); + if (entity) { + log('findClaim: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('findClaim: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.findClaim(_whose, _protocol, _claim, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveFindClaim({ blockHash, blockNumber, contractAddress, _whose, _protocol, _claim, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async supportsInterface (blockHash: string, contractAddress: string, _interfaceId: string): Promise { + const entity = await this._db.getSupportsInterface({ blockHash, contractAddress, _interfaceId }); + if (entity) { + log('supportsInterface: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('supportsInterface: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.supportsInterface(_interfaceId, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveSupportsInterface({ blockHash, blockNumber, contractAddress, _interfaceId, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async balanceOf (blockHash: string, contractAddress: string, _owner: string): Promise { + const entity = await this._db.getBalanceOf({ blockHash, contractAddress, _owner }); + if (entity) { + log('balanceOf: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('balanceOf: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.balanceOf(_owner, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveBalanceOf({ blockHash, blockNumber, contractAddress, _owner, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async ownerOf (blockHash: string, contractAddress: string, _tokenId: bigint): Promise { + const entity = await this._db.getOwnerOf({ blockHash, contractAddress, _tokenId }); + if (entity) { + log('ownerOf: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('ownerOf: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.ownerOf(_tokenId, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveOwnerOf({ blockHash, blockNumber, contractAddress, _tokenId, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async exists (blockHash: string, contractAddress: string, _tokenId: bigint): Promise { + const entity = await this._db.getExists({ blockHash, contractAddress, _tokenId }); + if (entity) { + log('exists: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('exists: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.exists(_tokenId, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveExists({ blockHash, blockNumber, contractAddress, _tokenId, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getApproved (blockHash: string, contractAddress: string, _tokenId: bigint): Promise { + const entity = await this._db.getGetApproved({ blockHash, contractAddress, _tokenId }); + if (entity) { + log('getApproved: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getApproved: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getApproved(_tokenId, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetApproved({ blockHash, blockNumber, contractAddress, _tokenId, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async isApprovedForAll (blockHash: string, contractAddress: string, _owner: string, _operator: string): Promise { + const entity = await this._db.getIsApprovedForAll({ blockHash, contractAddress, _owner, _operator }); + if (entity) { + log('isApprovedForAll: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('isApprovedForAll: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.isApprovedForAll(_owner, _operator, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveIsApprovedForAll({ blockHash, blockNumber, contractAddress, _owner, _operator, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async totalSupply (blockHash: string, contractAddress: string): Promise { + const entity = await this._db.getTotalSupply({ blockHash, contractAddress }); + if (entity) { + log('totalSupply: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('totalSupply: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.totalSupply({ blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveTotalSupply({ blockHash, blockNumber, contractAddress, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async tokenOfOwnerByIndex (blockHash: string, contractAddress: string, _owner: string, _index: bigint): Promise { + const entity = await this._db.getTokenOfOwnerByIndex({ blockHash, contractAddress, _owner, _index }); + if (entity) { + log('tokenOfOwnerByIndex: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('tokenOfOwnerByIndex: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.tokenOfOwnerByIndex(_owner, _index, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveTokenOfOwnerByIndex({ blockHash, blockNumber, contractAddress, _owner, _index, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async tokenByIndex (blockHash: string, contractAddress: string, _index: bigint): Promise { + const entity = await this._db.getTokenByIndex({ blockHash, contractAddress, _index }); + if (entity) { + log('tokenByIndex: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('tokenByIndex: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + let value = await contract.tokenByIndex(_index, { blockTag: blockHash }); + value = value.toString(); + value = BigInt(value); + + const result: ValueResult = { value }; + + await this._db.saveTokenByIndex({ blockHash, blockNumber, contractAddress, _index, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async name (blockHash: string, contractAddress: string): Promise { + const entity = await this._db.getName({ blockHash, contractAddress }); + if (entity) { + log('name: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('name: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.name({ blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveName({ blockHash, blockNumber, contractAddress, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async symbol (blockHash: string, contractAddress: string): Promise { + const entity = await this._db.getSymbol({ blockHash, contractAddress }); + if (entity) { + log('symbol: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('symbol: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.symbol({ blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveSymbol({ blockHash, blockNumber, contractAddress, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async tokenURI (blockHash: string, contractAddress: string, _tokenId: bigint): Promise { + const entity = await this._db.getTokenURI({ blockHash, contractAddress, _tokenId }); + if (entity) { + log('tokenURI: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('tokenURI: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.tokenURI(_tokenId, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveTokenURI({ blockHash, blockNumber, contractAddress, _tokenId, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getSpawnLimit (blockHash: string, contractAddress: string, _point: number, _time: bigint): Promise { + const entity = await this._db.getGetSpawnLimit({ blockHash, contractAddress, _point, _time }); + if (entity) { + log('getSpawnLimit: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('getSpawnLimit: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.getSpawnLimit(_point, _time, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveGetSpawnLimit({ blockHash, blockNumber, contractAddress, _point, _time, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async canEscapeTo (blockHash: string, contractAddress: string, _point: number, _sponsor: number): Promise { + const entity = await this._db.getCanEscapeTo({ blockHash, contractAddress, _point, _sponsor }); + if (entity) { + log('canEscapeTo: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('canEscapeTo: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.canEscapeTo(_point, _sponsor, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveCanEscapeTo({ blockHash, blockNumber, contractAddress, _point, _sponsor, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async withdrawLimit (blockHash: string, contractAddress: string, _participant: string): Promise { + const entity = await this._db.getWithdrawLimit({ blockHash, contractAddress, _participant }); + if (entity) { + log('withdrawLimit: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('withdrawLimit: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.withdrawLimit(_participant, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveWithdrawLimit({ blockHash, blockNumber, contractAddress, _participant, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async verifyBalance (blockHash: string, contractAddress: string, _participant: string): Promise { + const entity = await this._db.getVerifyBalance({ blockHash, contractAddress, _participant }); + if (entity) { + log('verifyBalance: db hit.'); + + return { + value: entity.value, + proof: JSON.parse(entity.proof) + }; + } + + log('verifyBalance: db miss, fetching from upstream server'); + + const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const blockNumber = ethers.BigNumber.from(number).toNumber(); + + const abi = this._abiMap.get(KIND_LINEARSTARRELEASE); + assert(abi); + + const contract = new ethers.Contract(contractAddress, abi, this._ethProvider); + const value = await contract.verifyBalance(_participant, { blockTag: blockHash }); + + const result: ValueResult = { value }; + + await this._db.saveVerifyBalance({ blockHash, blockNumber, contractAddress, _participant, value: result.value, proof: JSONbigNative.stringify(result.proof) }); + + return result; + } + + async getStorageValue (storageLayout: StorageLayout, blockHash: string, contractAddress: string, variable: string, ...mappingKeys: MappingKey[]): Promise { + return this._baseIndexer.getStorageValue( + storageLayout, + blockHash, + contractAddress, + variable, + ...mappingKeys + ); + } + + async getEntitiesForBlock (blockHash: string, tableName: string): Promise { + return this._db.getEntitiesForBlock(blockHash, tableName); + } + + async processInitialState (contractAddress: string, blockHash: string): Promise { + // Call initial state hook. + return createInitialState(this, contractAddress, blockHash); + } + + async processStateCheckpoint (contractAddress: string, blockHash: string): Promise { + // Call checkpoint hook. + return createStateCheckpoint(this, contractAddress, blockHash); + } + + async processCanonicalBlock (blockHash: string, blockNumber: number): Promise { + console.time('time:indexer#processCanonicalBlock-finalize_auto_diffs'); + // Finalize staged diff blocks if any. + await this._baseIndexer.finalizeDiffStaged(blockHash); + console.timeEnd('time:indexer#processCanonicalBlock-finalize_auto_diffs'); + + // Call custom stateDiff hook. + await createStateDiff(this, blockHash); + } + + async processCheckpoint (blockHash: string): Promise { + // Return if checkpointInterval is <= 0. + const checkpointInterval = this._serverConfig.checkpointInterval; + if (checkpointInterval <= 0) return; + + console.time('time:indexer#processCheckpoint-checkpoint'); + await this._baseIndexer.processCheckpoint(this, blockHash, checkpointInterval); + console.timeEnd('time:indexer#processCheckpoint-checkpoint'); + } + + async processCLICheckpoint (contractAddress: string, blockHash?: string): Promise { + return this._baseIndexer.processCLICheckpoint(this, contractAddress, blockHash); + } + + async getPrevState (blockHash: string, contractAddress: string, kind?: string): Promise { + return this._db.getPrevState(blockHash, contractAddress, kind); + } + + async getLatestState (contractAddress: string, kind: StateKind | null, blockNumber?: number): Promise { + return this._db.getLatestState(contractAddress, kind, blockNumber); + } + + async getStatesByHash (blockHash: string): Promise { + return this._baseIndexer.getStatesByHash(blockHash); + } + + async getStateByCID (cid: string): Promise { + return this._baseIndexer.getStateByCID(cid); + } + + async getStates (where: FindConditions): Promise { + return this._db.getStates(where); + } + + getStateData (state: State): any { + return this._baseIndexer.getStateData(state); + } + + // Method used to create auto diffs (diff_staged). + async createDiffStaged (contractAddress: string, blockHash: string, data: any): Promise { + console.time('time:indexer#createDiffStaged-auto_diff'); + await this._baseIndexer.createDiffStaged(contractAddress, blockHash, data); + console.timeEnd('time:indexer#createDiffStaged-auto_diff'); + } + + // Method to be used by createStateDiff hook. + async createDiff (contractAddress: string, blockHash: string, data: any): Promise { + const block = await this.getBlockProgress(blockHash); + assert(block); + + await this._baseIndexer.createDiff(contractAddress, block, data); + } + + // Method to be used by createStateCheckpoint hook. + async createStateCheckpoint (contractAddress: string, blockHash: string, data: any): Promise { + const block = await this.getBlockProgress(blockHash); + assert(block); + + return this._baseIndexer.createStateCheckpoint(contractAddress, block, data); + } + + // Method to be used by export-state CLI. + async createCheckpoint (contractAddress: string, blockHash: string): Promise { + const block = await this.getBlockProgress(blockHash); + assert(block); + + return this._baseIndexer.createCheckpoint(this, contractAddress, block); + } + + async saveOrUpdateState (state: State): Promise { + return this._baseIndexer.saveOrUpdateState(state); + } + + async removeStates (blockNumber: number, kind: StateKind): Promise { + await this._baseIndexer.removeStates(blockNumber, kind); + } + + async triggerIndexingOnEvent (event: Event): Promise { + const resultEvent = this.getResultEvent(event); + + // Call custom hook function for indexing on event. + await handleEvent(this, resultEvent); + } + + async processEvent (event: Event): Promise { + // Trigger indexing of data based on the event. + await this.triggerIndexingOnEvent(event); + } + + async processBlock (blockProgress: BlockProgress): Promise { + console.time('time:indexer#processBlock-init_state'); + // Call a function to create initial state for contracts. + await this._baseIndexer.createInit(this, blockProgress.blockHash, blockProgress.blockNumber); + console.timeEnd('time:indexer#processBlock-init_state'); + } + + parseEventNameAndArgs (kind: string, logObj: any): any { + const { topics, data } = logObj; + + const contract = this._contractMap.get(kind); + assert(contract); + + const logDescription = contract.parseLog({ data, topics }); + + const { eventName, eventInfo, eventSignature } = this._baseIndexer.parseEvent(logDescription); + + return { + eventName, + eventInfo, + eventSignature + }; + } + + async getStateSyncStatus (): Promise { + return this._db.getStateSyncStatus(); + } + + async updateStateSyncStatusIndexedBlock (blockNumber: number, force?: boolean): Promise { + const dbTx = await this._db.createTransactionRunner(); + let res; + + try { + res = await this._db.updateStateSyncStatusIndexedBlock(dbTx, blockNumber, force); + await dbTx.commitTransaction(); + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + + return res; + } + + async updateStateSyncStatusCheckpointBlock (blockNumber: number, force?: boolean): Promise { + const dbTx = await this._db.createTransactionRunner(); + let res; + + try { + res = await this._db.updateStateSyncStatusCheckpointBlock(dbTx, blockNumber, force); + await dbTx.commitTransaction(); + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + + return res; + } + + async getLatestCanonicalBlock (): Promise { + const syncStatus = await this.getSyncStatus(); + assert(syncStatus); + + const latestCanonicalBlock = await this.getBlockProgress(syncStatus.latestCanonicalBlockHash); + assert(latestCanonicalBlock); + + return latestCanonicalBlock; + } + + async getLatestStateIndexedBlock (): Promise { + return this._baseIndexer.getLatestStateIndexedBlock(); + } + + async watchContract (address: string, kind: string, checkpoint: boolean, startingBlock: number): Promise { + return this._baseIndexer.watchContract(address, kind, checkpoint, startingBlock); + } + + updateStateStatusMap (address: string, stateStatus: StateStatus): void { + this._baseIndexer.updateStateStatusMap(address, stateStatus); + } + + cacheContract (contract: Contract): void { + return this._baseIndexer.cacheContract(contract); + } + + async saveEventEntity (dbEvent: Event): Promise { + return this._baseIndexer.saveEventEntity(dbEvent); + } + + async getEventsByFilter (blockHash: string, contract?: string, name?: string): Promise> { + return this._baseIndexer.getEventsByFilter(blockHash, contract, name); + } + + isWatchedContract (address : string): Contract | undefined { + return this._baseIndexer.isWatchedContract(address); + } + + getContractsByKind (kind: string): Contract[] { + return this._baseIndexer.getContractsByKind(kind); + } + + async getProcessedBlockCountForRange (fromBlockNumber: number, toBlockNumber: number): Promise<{ expected: number, actual: number }> { + return this._baseIndexer.getProcessedBlockCountForRange(fromBlockNumber, toBlockNumber); + } + + async getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise> { + return this._baseIndexer.getEventsInRange(fromBlockNumber, toBlockNumber, this._serverConfig.maxEventsBlockRange); + } + + async getSyncStatus (): Promise { + return this._baseIndexer.getSyncStatus(); + } + + async getBlocks (blockFilter: { blockHash?: string, blockNumber?: number }): Promise { + return this._baseIndexer.getBlocks(blockFilter); + } + + async updateSyncStatusIndexedBlock (blockHash: string, blockNumber: number, force = false): Promise { + return this._baseIndexer.updateSyncStatusIndexedBlock(blockHash, blockNumber, force); + } + + async updateSyncStatusChainHead (blockHash: string, blockNumber: number, force = false): Promise { + return this._baseIndexer.updateSyncStatusChainHead(blockHash, blockNumber, force); + } + + async updateSyncStatusCanonicalBlock (blockHash: string, blockNumber: number, force = false): Promise { + const syncStatus = this._baseIndexer.updateSyncStatusCanonicalBlock(blockHash, blockNumber, force); + + return syncStatus; + } + + async getEvent (id: string): Promise { + return this._baseIndexer.getEvent(id); + } + + async getBlockProgress (blockHash: string): Promise { + return this._baseIndexer.getBlockProgress(blockHash); + } + + async getBlockProgressEntities (where: FindConditions, options: FindManyOptions): Promise { + return this._baseIndexer.getBlockProgressEntities(where, options); + } + + async getBlocksAtHeight (height: number, isPruned: boolean): Promise { + return this._baseIndexer.getBlocksAtHeight(height, isPruned); + } + + async saveBlockAndFetchEvents (block: DeepPartial): Promise<[BlockProgress, DeepPartial[]]> { + return this._saveBlockAndFetchEvents(block); + } + + async getBlockEvents (blockHash: string, where: Where, queryOptions: QueryOptions): Promise> { + return this._baseIndexer.getBlockEvents(blockHash, where, queryOptions); + } + + async removeUnknownEvents (block: BlockProgress): Promise { + return this._baseIndexer.removeUnknownEvents(Event, block); + } + + async markBlocksAsPruned (blocks: BlockProgress[]): Promise { + await this._baseIndexer.markBlocksAsPruned(blocks); + } + + async updateBlockProgress (block: BlockProgress, lastProcessedEventIndex: number): Promise { + return this._baseIndexer.updateBlockProgress(block, lastProcessedEventIndex); + } + + async getAncestorAtDepth (blockHash: string, depth: number): Promise { + return this._baseIndexer.getAncestorAtDepth(blockHash, depth); + } + + async resetWatcherToBlock (blockNumber: number): Promise { + const entities = [...ENTITIES]; + await this._baseIndexer.resetWatcherToBlock(blockNumber, entities); + } + + async _saveBlockAndFetchEvents ({ + cid: blockCid, + blockHash, + blockNumber, + blockTimestamp, + parentHash + }: DeepPartial): Promise<[BlockProgress, DeepPartial[]]> { + assert(blockHash); + assert(blockNumber); + + const dbEvents = await this._baseIndexer.fetchEvents(blockHash, blockNumber, this.parseEventNameAndArgs.bind(this)); + + const dbTx = await this._db.createTransactionRunner(); + try { + const block = { + cid: blockCid, + blockHash, + blockNumber, + blockTimestamp, + parentHash + }; + + console.time(`time:indexer#_saveBlockAndFetchEvents-db-save-${blockNumber}`); + const blockProgress = await this._db.saveBlockWithEvents(dbTx, block, dbEvents); + await dbTx.commitTransaction(); + console.timeEnd(`time:indexer#_saveBlockAndFetchEvents-db-save-${blockNumber}`); + + return [blockProgress, []]; + } catch (error) { + await dbTx.rollbackTransaction(); + throw error; + } finally { + await dbTx.release(); + } + } +} diff --git a/packages/linear-star-release-watcher/src/job-runner.ts b/packages/linear-star-release-watcher/src/job-runner.ts new file mode 100644 index 0000000..27cfa69 --- /dev/null +++ b/packages/linear-star-release-watcher/src/job-runner.ts @@ -0,0 +1,37 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import debug from 'debug'; + +import { JobRunnerCmd } from '@cerc-io/cli'; +import { JobRunner } from '@cerc-io/util'; + +import { Indexer } from './indexer'; +import { Database } from './database'; + +const log = debug('vulcanize:job-runner'); + +export const main = async (): Promise => { + const jobRunnerCmd = new JobRunnerCmd(); + await jobRunnerCmd.init(Database); + + await jobRunnerCmd.initIndexer(Indexer); + + await jobRunnerCmd.exec(async (jobRunner: JobRunner): Promise => { + await jobRunner.subscribeBlockProcessingQueue(); + await jobRunner.subscribeEventProcessingQueue(); + await jobRunner.subscribeBlockCheckpointQueue(); + await jobRunner.subscribeHooksQueue(); + }); +}; + +main().then(() => { + log('Starting job runner...'); +}).catch(err => { + log(err); +}); + +process.on('uncaughtException', err => { + log('uncaughtException', err); +}); diff --git a/packages/linear-star-release-watcher/src/resolvers.ts b/packages/linear-star-release-watcher/src/resolvers.ts new file mode 100644 index 0000000..3e879cb --- /dev/null +++ b/packages/linear-star-release-watcher/src/resolvers.ts @@ -0,0 +1,1025 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import assert from 'assert'; +import BigInt from 'apollo-type-bigint'; +import debug from 'debug'; +import Decimal from 'decimal.js'; +import { GraphQLResolveInfo, GraphQLScalarType } from 'graphql'; + +import { + ValueResult, + BlockHeight, + gqlTotalQueryCount, + gqlQueryCount, + jsonBigIntStringReplacer, + getResultState, + setGQLCacheHints, + IndexerInterface, + EventWatcher +} from '@cerc-io/util'; + +import { Indexer } from './indexer'; + +const log = debug('vulcanize:resolver'); + +export const createResolvers = async (indexerArg: IndexerInterface, eventWatcher: EventWatcher): Promise => { + const indexer = indexerArg as Indexer; + + const gqlCacheConfig = indexer.serverConfig.gqlCache; + + return { + BigInt: new BigInt('bigInt'), + + BigDecimal: new GraphQLScalarType({ + name: 'BigDecimal', + description: 'BigDecimal custom scalar type', + parseValue (value) { + // value from the client + return new Decimal(value); + }, + serialize (value: Decimal) { + // value sent to the client + return value.toFixed(); + } + }), + + Event: { + __resolveType: (obj: any) => { + assert(obj.__typename); + + return obj.__typename; + } + }, + + Subscription: { + onEvent: { + subscribe: () => eventWatcher.getEventIterator() + } + }, + + Mutation: { + watchContract: async (_: any, { address, kind, checkpoint, startingBlock = 1 }: { address: string, kind: string, checkpoint: boolean, startingBlock: number }): Promise => { + log('watchContract', address, kind, checkpoint, startingBlock); + await indexer.watchContract(address, kind, checkpoint, startingBlock); + + return true; + } + }, + + Query: { + isActive: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isActive', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isActive').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isActive(blockHash, contractAddress, _point); + }, + + getKeyRevisionNumber: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getKeyRevisionNumber', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getKeyRevisionNumber').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getKeyRevisionNumber(blockHash, contractAddress, _point); + }, + + hasBeenLinked: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('hasBeenLinked', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('hasBeenLinked').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.hasBeenLinked(blockHash, contractAddress, _point); + }, + + isLive: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isLive', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isLive').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isLive(blockHash, contractAddress, _point); + }, + + getContinuityNumber: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getContinuityNumber', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getContinuityNumber').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getContinuityNumber(blockHash, contractAddress, _point); + }, + + getSpawnCount: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getSpawnCount', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getSpawnCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getSpawnCount(blockHash, contractAddress, _point); + }, + + hasSponsor: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('hasSponsor', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('hasSponsor').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.hasSponsor(blockHash, contractAddress, _point); + }, + + getSponsor: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getSponsor', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getSponsor').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getSponsor(blockHash, contractAddress, _point); + }, + + isSponsor: ( + _: any, + { blockHash, contractAddress, _point, _sponsor }: { blockHash: string, contractAddress: string, _point: number, _sponsor: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isSponsor', blockHash, contractAddress, _point, _sponsor); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isSponsor').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isSponsor(blockHash, contractAddress, _point, _sponsor); + }, + + getSponsoringCount: ( + _: any, + { blockHash, contractAddress, _sponsor }: { blockHash: string, contractAddress: string, _sponsor: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getSponsoringCount', blockHash, contractAddress, _sponsor); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getSponsoringCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getSponsoringCount(blockHash, contractAddress, _sponsor); + }, + + isEscaping: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isEscaping', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isEscaping').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isEscaping(blockHash, contractAddress, _point); + }, + + getEscapeRequest: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getEscapeRequest', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getEscapeRequest').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getEscapeRequest(blockHash, contractAddress, _point); + }, + + isRequestingEscapeTo: ( + _: any, + { blockHash, contractAddress, _point, _sponsor }: { blockHash: string, contractAddress: string, _point: number, _sponsor: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isRequestingEscapeTo', blockHash, contractAddress, _point, _sponsor); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isRequestingEscapeTo').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isRequestingEscapeTo(blockHash, contractAddress, _point, _sponsor); + }, + + getEscapeRequestsCount: ( + _: any, + { blockHash, contractAddress, _sponsor }: { blockHash: string, contractAddress: string, _sponsor: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getEscapeRequestsCount', blockHash, contractAddress, _sponsor); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getEscapeRequestsCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getEscapeRequestsCount(blockHash, contractAddress, _sponsor); + }, + + getOwner: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getOwner', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getOwner').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getOwner(blockHash, contractAddress, _point); + }, + + isOwner: ( + _: any, + { blockHash, contractAddress, _point, _address }: { blockHash: string, contractAddress: string, _point: number, _address: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isOwner', blockHash, contractAddress, _point, _address); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isOwner').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isOwner(blockHash, contractAddress, _point, _address); + }, + + getOwnedPointCount: ( + _: any, + { blockHash, contractAddress, _whose }: { blockHash: string, contractAddress: string, _whose: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getOwnedPointCount', blockHash, contractAddress, _whose); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getOwnedPointCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getOwnedPointCount(blockHash, contractAddress, _whose); + }, + + getOwnedPointAtIndex: ( + _: any, + { blockHash, contractAddress, _whose, _index }: { blockHash: string, contractAddress: string, _whose: string, _index: bigint }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getOwnedPointAtIndex', blockHash, contractAddress, _whose, _index); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getOwnedPointAtIndex').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getOwnedPointAtIndex(blockHash, contractAddress, _whose, _index); + }, + + getManagementProxy: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getManagementProxy', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getManagementProxy').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getManagementProxy(blockHash, contractAddress, _point); + }, + + isManagementProxy: ( + _: any, + { blockHash, contractAddress, _point, _proxy }: { blockHash: string, contractAddress: string, _point: number, _proxy: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isManagementProxy', blockHash, contractAddress, _point, _proxy); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isManagementProxy').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isManagementProxy(blockHash, contractAddress, _point, _proxy); + }, + + canManage: ( + _: any, + { blockHash, contractAddress, _point, _who }: { blockHash: string, contractAddress: string, _point: number, _who: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('canManage', blockHash, contractAddress, _point, _who); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('canManage').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.canManage(blockHash, contractAddress, _point, _who); + }, + + getManagerForCount: ( + _: any, + { blockHash, contractAddress, _proxy }: { blockHash: string, contractAddress: string, _proxy: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getManagerForCount', blockHash, contractAddress, _proxy); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getManagerForCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getManagerForCount(blockHash, contractAddress, _proxy); + }, + + getSpawnProxy: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getSpawnProxy', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getSpawnProxy').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getSpawnProxy(blockHash, contractAddress, _point); + }, + + isSpawnProxy: ( + _: any, + { blockHash, contractAddress, _point, _proxy }: { blockHash: string, contractAddress: string, _point: number, _proxy: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isSpawnProxy', blockHash, contractAddress, _point, _proxy); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isSpawnProxy').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isSpawnProxy(blockHash, contractAddress, _point, _proxy); + }, + + canSpawnAs: ( + _: any, + { blockHash, contractAddress, _point, _who }: { blockHash: string, contractAddress: string, _point: number, _who: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('canSpawnAs', blockHash, contractAddress, _point, _who); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('canSpawnAs').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.canSpawnAs(blockHash, contractAddress, _point, _who); + }, + + getSpawningForCount: ( + _: any, + { blockHash, contractAddress, _proxy }: { blockHash: string, contractAddress: string, _proxy: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getSpawningForCount', blockHash, contractAddress, _proxy); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getSpawningForCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getSpawningForCount(blockHash, contractAddress, _proxy); + }, + + getVotingProxy: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getVotingProxy', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getVotingProxy').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getVotingProxy(blockHash, contractAddress, _point); + }, + + isVotingProxy: ( + _: any, + { blockHash, contractAddress, _point, _proxy }: { blockHash: string, contractAddress: string, _point: number, _proxy: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isVotingProxy', blockHash, contractAddress, _point, _proxy); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isVotingProxy').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isVotingProxy(blockHash, contractAddress, _point, _proxy); + }, + + canVoteAs: ( + _: any, + { blockHash, contractAddress, _point, _who }: { blockHash: string, contractAddress: string, _point: number, _who: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('canVoteAs', blockHash, contractAddress, _point, _who); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('canVoteAs').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.canVoteAs(blockHash, contractAddress, _point, _who); + }, + + getVotingForCount: ( + _: any, + { blockHash, contractAddress, _proxy }: { blockHash: string, contractAddress: string, _proxy: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getVotingForCount', blockHash, contractAddress, _proxy); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getVotingForCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getVotingForCount(blockHash, contractAddress, _proxy); + }, + + getTransferProxy: ( + _: any, + { blockHash, contractAddress, _point }: { blockHash: string, contractAddress: string, _point: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getTransferProxy', blockHash, contractAddress, _point); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getTransferProxy').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getTransferProxy(blockHash, contractAddress, _point); + }, + + isTransferProxy: ( + _: any, + { blockHash, contractAddress, _point, _proxy }: { blockHash: string, contractAddress: string, _point: number, _proxy: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isTransferProxy', blockHash, contractAddress, _point, _proxy); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isTransferProxy').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isTransferProxy(blockHash, contractAddress, _point, _proxy); + }, + + canTransfer: ( + _: any, + { blockHash, contractAddress, _point, _who }: { blockHash: string, contractAddress: string, _point: number, _who: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('canTransfer', blockHash, contractAddress, _point, _who); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('canTransfer').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.canTransfer(blockHash, contractAddress, _point, _who); + }, + + getTransferringForCount: ( + _: any, + { blockHash, contractAddress, _proxy }: { blockHash: string, contractAddress: string, _proxy: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getTransferringForCount', blockHash, contractAddress, _proxy); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getTransferringForCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getTransferringForCount(blockHash, contractAddress, _proxy); + }, + + isOperator: ( + _: any, + { blockHash, contractAddress, _owner, _operator }: { blockHash: string, contractAddress: string, _owner: string, _operator: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isOperator', blockHash, contractAddress, _owner, _operator); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isOperator').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isOperator(blockHash, contractAddress, _owner, _operator); + }, + + getUpgradeProposalCount: ( + _: any, + { blockHash, contractAddress }: { blockHash: string, contractAddress: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getUpgradeProposalCount', blockHash, contractAddress); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getUpgradeProposalCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getUpgradeProposalCount(blockHash, contractAddress); + }, + + getDocumentProposalCount: ( + _: any, + { blockHash, contractAddress }: { blockHash: string, contractAddress: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getDocumentProposalCount', blockHash, contractAddress); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getDocumentProposalCount').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getDocumentProposalCount(blockHash, contractAddress); + }, + + hasVotedOnUpgradePoll: ( + _: any, + { blockHash, contractAddress, _galaxy, _proposal }: { blockHash: string, contractAddress: string, _galaxy: number, _proposal: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('hasVotedOnUpgradePoll', blockHash, contractAddress, _galaxy, _proposal); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('hasVotedOnUpgradePoll').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.hasVotedOnUpgradePoll(blockHash, contractAddress, _galaxy, _proposal); + }, + + hasVotedOnDocumentPoll: ( + _: any, + { blockHash, contractAddress, _galaxy, _proposal }: { blockHash: string, contractAddress: string, _galaxy: number, _proposal: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('hasVotedOnDocumentPoll', blockHash, contractAddress, _galaxy, _proposal); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('hasVotedOnDocumentPoll').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.hasVotedOnDocumentPoll(blockHash, contractAddress, _galaxy, _proposal); + }, + + findClaim: ( + _: any, + { blockHash, contractAddress, _whose, _protocol, _claim }: { blockHash: string, contractAddress: string, _whose: number, _protocol: string, _claim: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('findClaim', blockHash, contractAddress, _whose, _protocol, _claim); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('findClaim').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.findClaim(blockHash, contractAddress, _whose, _protocol, _claim); + }, + + supportsInterface: ( + _: any, + { blockHash, contractAddress, _interfaceId }: { blockHash: string, contractAddress: string, _interfaceId: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('supportsInterface', blockHash, contractAddress, _interfaceId); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('supportsInterface').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.supportsInterface(blockHash, contractAddress, _interfaceId); + }, + + balanceOf: ( + _: any, + { blockHash, contractAddress, _owner }: { blockHash: string, contractAddress: string, _owner: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('balanceOf', blockHash, contractAddress, _owner); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('balanceOf').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.balanceOf(blockHash, contractAddress, _owner); + }, + + ownerOf: ( + _: any, + { blockHash, contractAddress, _tokenId }: { blockHash: string, contractAddress: string, _tokenId: bigint }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('ownerOf', blockHash, contractAddress, _tokenId); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('ownerOf').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.ownerOf(blockHash, contractAddress, _tokenId); + }, + + exists: ( + _: any, + { blockHash, contractAddress, _tokenId }: { blockHash: string, contractAddress: string, _tokenId: bigint }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('exists', blockHash, contractAddress, _tokenId); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('exists').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.exists(blockHash, contractAddress, _tokenId); + }, + + getApproved: ( + _: any, + { blockHash, contractAddress, _tokenId }: { blockHash: string, contractAddress: string, _tokenId: bigint }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getApproved', blockHash, contractAddress, _tokenId); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getApproved').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getApproved(blockHash, contractAddress, _tokenId); + }, + + isApprovedForAll: ( + _: any, + { blockHash, contractAddress, _owner, _operator }: { blockHash: string, contractAddress: string, _owner: string, _operator: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('isApprovedForAll', blockHash, contractAddress, _owner, _operator); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('isApprovedForAll').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.isApprovedForAll(blockHash, contractAddress, _owner, _operator); + }, + + totalSupply: ( + _: any, + { blockHash, contractAddress }: { blockHash: string, contractAddress: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('totalSupply', blockHash, contractAddress); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('totalSupply').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.totalSupply(blockHash, contractAddress); + }, + + tokenOfOwnerByIndex: ( + _: any, + { blockHash, contractAddress, _owner, _index }: { blockHash: string, contractAddress: string, _owner: string, _index: bigint }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('tokenOfOwnerByIndex', blockHash, contractAddress, _owner, _index); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('tokenOfOwnerByIndex').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.tokenOfOwnerByIndex(blockHash, contractAddress, _owner, _index); + }, + + tokenByIndex: ( + _: any, + { blockHash, contractAddress, _index }: { blockHash: string, contractAddress: string, _index: bigint }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('tokenByIndex', blockHash, contractAddress, _index); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('tokenByIndex').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.tokenByIndex(blockHash, contractAddress, _index); + }, + + name: ( + _: any, + { blockHash, contractAddress }: { blockHash: string, contractAddress: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('name', blockHash, contractAddress); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('name').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.name(blockHash, contractAddress); + }, + + symbol: ( + _: any, + { blockHash, contractAddress }: { blockHash: string, contractAddress: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('symbol', blockHash, contractAddress); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('symbol').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.symbol(blockHash, contractAddress); + }, + + tokenURI: ( + _: any, + { blockHash, contractAddress, _tokenId }: { blockHash: string, contractAddress: string, _tokenId: bigint }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('tokenURI', blockHash, contractAddress, _tokenId); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('tokenURI').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.tokenURI(blockHash, contractAddress, _tokenId); + }, + + getSpawnLimit: ( + _: any, + { blockHash, contractAddress, _point, _time }: { blockHash: string, contractAddress: string, _point: number, _time: bigint }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('getSpawnLimit', blockHash, contractAddress, _point, _time); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getSpawnLimit').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.getSpawnLimit(blockHash, contractAddress, _point, _time); + }, + + canEscapeTo: ( + _: any, + { blockHash, contractAddress, _point, _sponsor }: { blockHash: string, contractAddress: string, _point: number, _sponsor: number }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('canEscapeTo', blockHash, contractAddress, _point, _sponsor); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('canEscapeTo').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.canEscapeTo(blockHash, contractAddress, _point, _sponsor); + }, + + withdrawLimit: ( + _: any, + { blockHash, contractAddress, _participant }: { blockHash: string, contractAddress: string, _participant: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('withdrawLimit', blockHash, contractAddress, _participant); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('withdrawLimit').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.withdrawLimit(blockHash, contractAddress, _participant); + }, + + verifyBalance: ( + _: any, + { blockHash, contractAddress, _participant }: { blockHash: string, contractAddress: string, _participant: string }, + __: any, + info: GraphQLResolveInfo + ): Promise => { + log('verifyBalance', blockHash, contractAddress, _participant); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('verifyBalance').inc(1); + + // Set cache-control hints + // setGQLCacheHints(info, {}, gqlCacheConfig); + + return indexer.verifyBalance(blockHash, contractAddress, _participant); + }, + + events: async (_: any, { blockHash, contractAddress, name }: { blockHash: string, contractAddress: string, name?: string }) => { + log('events', blockHash, contractAddress, name); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('events').inc(1); + + const block = await indexer.getBlockProgress(blockHash); + if (!block || !block.isComplete) { + throw new Error(`Block hash ${blockHash} number ${block?.blockNumber} not processed yet`); + } + + const events = await indexer.getEventsByFilter(blockHash, contractAddress, name); + return events.map(event => indexer.getResultEvent(event)); + }, + + eventsInRange: async (_: any, { fromBlockNumber, toBlockNumber }: { fromBlockNumber: number, toBlockNumber: number }) => { + log('eventsInRange', fromBlockNumber, toBlockNumber); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('eventsInRange').inc(1); + + const { expected, actual } = await indexer.getProcessedBlockCountForRange(fromBlockNumber, toBlockNumber); + if (expected !== actual) { + throw new Error(`Range not available, expected ${expected}, got ${actual} blocks in range`); + } + + const events = await indexer.getEventsInRange(fromBlockNumber, toBlockNumber); + return events.map(event => indexer.getResultEvent(event)); + }, + + getStateByCID: async (_: any, { cid }: { cid: string }) => { + log('getStateByCID', cid); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getStateByCID').inc(1); + + const state = await indexer.getStateByCID(cid); + + return state && state.block.isComplete ? getResultState(state) : undefined; + }, + + getState: async (_: any, { blockHash, contractAddress, kind }: { blockHash: string, contractAddress: string, kind: string }) => { + log('getState', blockHash, contractAddress, kind); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getState').inc(1); + + const state = await indexer.getPrevState(blockHash, contractAddress, kind); + + return state && state.block.isComplete ? getResultState(state) : undefined; + }, + + getSyncStatus: async () => { + log('getSyncStatus'); + gqlTotalQueryCount.inc(1); + gqlQueryCount.labels('getSyncStatus').inc(1); + + return indexer.getSyncStatus(); + } + } + }; +}; diff --git a/packages/linear-star-release-watcher/src/schema.gql b/packages/linear-star-release-watcher/src/schema.gql new file mode 100644 index 0000000..e0266ed --- /dev/null +++ b/packages/linear-star-release-watcher/src/schema.gql @@ -0,0 +1,158 @@ +directive @cacheControl(maxAge: Int, inheritMaxAge: Boolean, scope: CacheControlScope) on FIELD_DEFINITION | OBJECT | INTERFACE | UNION + +enum CacheControlScope { + PUBLIC + PRIVATE +} + +scalar BigInt + +scalar BigDecimal + +scalar Bytes + +type Proof { + data: String! +} + +type ResultBoolean { + value: Boolean! + proof: Proof +} + +type ResultString { + value: String! + proof: Proof +} + +type ResultInt { + value: Int! + proof: Proof +} + +type ResultBigInt { + value: BigInt! + proof: Proof +} + +type _Block_ { + cid: String! + hash: String! + number: Int! + timestamp: Int! + parentHash: String! +} + +type _Transaction_ { + hash: String! + index: Int! + from: String! + to: String! +} + +type ResultEvent { + block: _Block_! + tx: _Transaction_! + contract: String! + eventIndex: Int! + event: Event! + proof: Proof +} + +union Event = OwnershipRenouncedEvent | OwnershipTransferredEvent + +type OwnershipRenouncedEvent { + previousOwner: String! +} + +type OwnershipTransferredEvent { + previousOwner: String! + newOwner: String! +} + +type SyncStatus { + latestIndexedBlockHash: String! + latestIndexedBlockNumber: Int! + latestCanonicalBlockHash: String! + latestCanonicalBlockNumber: Int! +} + +type ResultState { + block: _Block_! + contractAddress: String! + cid: String! + kind: String! + data: String! +} + +type Query { + events(blockHash: String!, contractAddress: String!, name: String): [ResultEvent!] + eventsInRange(fromBlockNumber: Int!, toBlockNumber: Int!): [ResultEvent!] + isActive(blockHash: String!, contractAddress: String!, _point: Int!): ResultBoolean! + getKeyRevisionNumber(blockHash: String!, contractAddress: String!, _point: Int!): ResultInt! + hasBeenLinked(blockHash: String!, contractAddress: String!, _point: Int!): ResultBoolean! + isLive(blockHash: String!, contractAddress: String!, _point: Int!): ResultBoolean! + getContinuityNumber(blockHash: String!, contractAddress: String!, _point: Int!): ResultInt! + getSpawnCount(blockHash: String!, contractAddress: String!, _point: Int!): ResultInt! + hasSponsor(blockHash: String!, contractAddress: String!, _point: Int!): ResultBoolean! + getSponsor(blockHash: String!, contractAddress: String!, _point: Int!): ResultInt! + isSponsor(blockHash: String!, contractAddress: String!, _point: Int!, _sponsor: Int!): ResultBoolean! + getSponsoringCount(blockHash: String!, contractAddress: String!, _sponsor: Int!): ResultBigInt! + isEscaping(blockHash: String!, contractAddress: String!, _point: Int!): ResultBoolean! + getEscapeRequest(blockHash: String!, contractAddress: String!, _point: Int!): ResultInt! + isRequestingEscapeTo(blockHash: String!, contractAddress: String!, _point: Int!, _sponsor: Int!): ResultBoolean! + getEscapeRequestsCount(blockHash: String!, contractAddress: String!, _sponsor: Int!): ResultBigInt! + getOwner(blockHash: String!, contractAddress: String!, _point: Int!): ResultString! + isOwner(blockHash: String!, contractAddress: String!, _point: Int!, _address: String!): ResultBoolean! + getOwnedPointCount(blockHash: String!, contractAddress: String!, _whose: String!): ResultBigInt! + getOwnedPointAtIndex(blockHash: String!, contractAddress: String!, _whose: String!, _index: BigInt!): ResultInt! + getManagementProxy(blockHash: String!, contractAddress: String!, _point: Int!): ResultString! + isManagementProxy(blockHash: String!, contractAddress: String!, _point: Int!, _proxy: String!): ResultBoolean! + canManage(blockHash: String!, contractAddress: String!, _point: Int!, _who: String!): ResultBoolean! + getManagerForCount(blockHash: String!, contractAddress: String!, _proxy: String!): ResultBigInt! + getSpawnProxy(blockHash: String!, contractAddress: String!, _point: Int!): ResultString! + isSpawnProxy(blockHash: String!, contractAddress: String!, _point: Int!, _proxy: String!): ResultBoolean! + canSpawnAs(blockHash: String!, contractAddress: String!, _point: Int!, _who: String!): ResultBoolean! + getSpawningForCount(blockHash: String!, contractAddress: String!, _proxy: String!): ResultBigInt! + getVotingProxy(blockHash: String!, contractAddress: String!, _point: Int!): ResultString! + isVotingProxy(blockHash: String!, contractAddress: String!, _point: Int!, _proxy: String!): ResultBoolean! + canVoteAs(blockHash: String!, contractAddress: String!, _point: Int!, _who: String!): ResultBoolean! + getVotingForCount(blockHash: String!, contractAddress: String!, _proxy: String!): ResultBigInt! + getTransferProxy(blockHash: String!, contractAddress: String!, _point: Int!): ResultString! + isTransferProxy(blockHash: String!, contractAddress: String!, _point: Int!, _proxy: String!): ResultBoolean! + canTransfer(blockHash: String!, contractAddress: String!, _point: Int!, _who: String!): ResultBoolean! + getTransferringForCount(blockHash: String!, contractAddress: String!, _proxy: String!): ResultBigInt! + isOperator(blockHash: String!, contractAddress: String!, _owner: String!, _operator: String!): ResultBoolean! + getUpgradeProposalCount(blockHash: String!, contractAddress: String!): ResultBigInt! + getDocumentProposalCount(blockHash: String!, contractAddress: String!): ResultBigInt! + hasVotedOnUpgradePoll(blockHash: String!, contractAddress: String!, _galaxy: Int!, _proposal: String!): ResultBoolean! + hasVotedOnDocumentPoll(blockHash: String!, contractAddress: String!, _galaxy: Int!, _proposal: String!): ResultBoolean! + findClaim(blockHash: String!, contractAddress: String!, _whose: Int!, _protocol: String!, _claim: String!): ResultInt! + supportsInterface(blockHash: String!, contractAddress: String!, _interfaceId: String!): ResultBoolean! + balanceOf(blockHash: String!, contractAddress: String!, _owner: String!): ResultBigInt! + ownerOf(blockHash: String!, contractAddress: String!, _tokenId: BigInt!): ResultString! + exists(blockHash: String!, contractAddress: String!, _tokenId: BigInt!): ResultBoolean! + getApproved(blockHash: String!, contractAddress: String!, _tokenId: BigInt!): ResultString! + isApprovedForAll(blockHash: String!, contractAddress: String!, _owner: String!, _operator: String!): ResultBoolean! + totalSupply(blockHash: String!, contractAddress: String!): ResultBigInt! + tokenOfOwnerByIndex(blockHash: String!, contractAddress: String!, _owner: String!, _index: BigInt!): ResultBigInt! + tokenByIndex(blockHash: String!, contractAddress: String!, _index: BigInt!): ResultBigInt! + name(blockHash: String!, contractAddress: String!): ResultString! + symbol(blockHash: String!, contractAddress: String!): ResultString! + tokenURI(blockHash: String!, contractAddress: String!, _tokenId: BigInt!): ResultString! + getSpawnLimit(blockHash: String!, contractAddress: String!, _point: Int!, _time: BigInt!): ResultInt! + canEscapeTo(blockHash: String!, contractAddress: String!, _point: Int!, _sponsor: Int!): ResultBoolean! + withdrawLimit(blockHash: String!, contractAddress: String!, _participant: String!): ResultInt! + verifyBalance(blockHash: String!, contractAddress: String!, _participant: String!): ResultBoolean! + getSyncStatus: SyncStatus + getStateByCID(cid: String!): ResultState + getState(blockHash: String!, contractAddress: String!, kind: String): ResultState +} + +type Mutation { + watchContract(address: String!, kind: String!, checkpoint: Boolean!, startingBlock: Int): Boolean! +} + +type Subscription { + onEvent: ResultEvent! +} diff --git a/packages/linear-star-release-watcher/src/server.ts b/packages/linear-star-release-watcher/src/server.ts new file mode 100644 index 0000000..83ca702 --- /dev/null +++ b/packages/linear-star-release-watcher/src/server.ts @@ -0,0 +1,33 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import fs from 'fs'; +import path from 'path'; +import 'reflect-metadata'; +import debug from 'debug'; + +import { ServerCmd } from '@cerc-io/cli'; + +import { createResolvers } from './resolvers'; +import { Indexer } from './indexer'; +import { Database } from './database'; + +const log = debug('vulcanize:server'); + +export const main = async (): Promise => { + const serverCmd = new ServerCmd(); + await serverCmd.init(Database); + + await serverCmd.initIndexer(Indexer); + + const typeDefs = fs.readFileSync(path.join(__dirname, 'schema.gql')).toString(); + + return serverCmd.exec(createResolvers, typeDefs); +}; + +main().then(() => { + log('Starting server...'); +}).catch(err => { + log(err); +}); diff --git a/packages/linear-star-release-watcher/src/types.ts b/packages/linear-star-release-watcher/src/types.ts new file mode 100644 index 0000000..c456217 --- /dev/null +++ b/packages/linear-star-release-watcher/src/types.ts @@ -0,0 +1,3 @@ +// +// Copyright 2021 Vulcanize, Inc. +// diff --git a/packages/linear-star-release-watcher/tsconfig.json b/packages/linear-star-release-watcher/tsconfig.json new file mode 100644 index 0000000..f4b8852 --- /dev/null +++ b/packages/linear-star-release-watcher/tsconfig.json @@ -0,0 +1,74 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "lib": ["es2019"], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "dist", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + "resolveJsonModule": true /* Enabling the option allows importing JSON, and validating the types in that JSON file. */ + }, + "include": ["src/**/*"] +}