feat: add token and holder entities (#94)
* chore: add the verify command to the package.json file * docs: add the re-deployment section to the README.md file * feat: add support for token and holder entities based on transfer events that are emitted from the contract during the mint process. --------- Co-authored-by: EmperorOrokuSaki <artie.eth@gmail.com>
This commit is contained in:
parent
91aeb47aef
commit
ce1a3fc141
|
|
@ -14,7 +14,8 @@
|
|||
"compile": "hardhat compile",
|
||||
"postinstall": "husky install",
|
||||
"prepack": "pinst --disable",
|
||||
"postpack": "pinst --enable"
|
||||
"postpack": "pinst --enable",
|
||||
"verify:mumbai": "npx hardhat run ./scripts/verify-polyscan.js --network mumbai"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ async function main() {
|
|||
await hre.run('verify:verify', {
|
||||
address: address,
|
||||
constructorArguments: [
|
||||
'FleekNFAs', // Collection name
|
||||
'FleekNFA', // Collection name
|
||||
'FLKNFA', // Collection symbol
|
||||
],
|
||||
});
|
||||
|
|
|
|||
|
|
@ -86,6 +86,47 @@ The `graph-cli` command to init a subgraph is included below, please make sure y
|
|||
|
||||
`graph init --contract-name CONTRACT_NAME --index-events --studio --from-contract CONTRACT_ADDRESS --abi PATH/TO/ABI/JSON --network mumbai SUBGRAPH_NAME`
|
||||
|
||||
## Re-deployment
|
||||
|
||||
If a change is needed in the subgraph, you should update the `schema.graphql` and `subgraph.yaml` files to match the new changes that have happened on the contract side.
|
||||
|
||||
A typical re-deployment consists of a new contract address, ABI, and finally entities.
|
||||
|
||||
### Updating the addresses
|
||||
|
||||
To update the address of the contract, the following files need to be changed:
|
||||
|
||||
- [networks.json](./networks.json): update the address for the right blockchain network
|
||||
- [subgraph.yaml](./subgraph.yaml): update the address in `dataSources.source.address`
|
||||
|
||||
### Updating the entities and handlers
|
||||
|
||||
It is important to make sure the subgraph is going to support the new version of the entities by updating the `schema.graphql` file.
|
||||
|
||||
Define the new entities and the relationships between them. Also, take care of entities that should be removed from the schema.
|
||||
|
||||
If your contract is emitting new events, update the `subgraph.yaml` file's `dataSources.mapping.eventHandlers`. Remove events that are not a part of the new contract.
|
||||
|
||||
### Re-generating the TS files
|
||||
|
||||
To re-generate files in `generated/` you can simply run `yarn codegen` or `npm run codegen` only and only **after** the previous two steps. If you do it before, you will still need to redo it later.
|
||||
|
||||
### Update the handlers
|
||||
|
||||
If you need new handlers in your code, you should update the `./src/fleek-nfa.ts` file and create functions to handle new events.
|
||||
|
||||
**NOTE: The name of your handler functions should be exactly the same as the name you have specified in the `subgraph.yaml` file for the target event.**
|
||||
|
||||
### Generate a new build
|
||||
|
||||
Finally, you can generate the build that is going to be deployed to the Hosted Service by running `yarn build` or `npm run build`.
|
||||
|
||||
### Re-deployment
|
||||
|
||||
The command that should be used for re-deployment purposes is no different than the one that is used to deploy subgraphs in the first place (remember to replace the access token and the github_username/subgraph_name parts):
|
||||
|
||||
`graph deploy --product hosted-service --deploy-key YOUR_ACCESS_TOKEN --version-lable v0.0.1 YOUR_GITHUB_USERNAME/SUBGRAPH_NAME_ON_HOSTED_SERVICE`
|
||||
|
||||
## Testing
|
||||
|
||||
You can run the unit tests found in `./tests/` with `yarn test` or `npm run test`.
|
||||
|
|
@ -129,3 +129,15 @@ type Transfer @entity(immutable: true) {
|
|||
blockTimestamp: BigInt!
|
||||
transactionHash: Bytes!
|
||||
}
|
||||
|
||||
type Token @entity {
|
||||
id: Bytes! #transaction hash
|
||||
tokenId: BigInt! # uint256
|
||||
owner: Holder!
|
||||
minted_by: Bytes!
|
||||
}
|
||||
|
||||
type Holder @entity {
|
||||
id: Bytes! #address
|
||||
tokens: [Token!] @derivedFrom(field: "owner")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
import { Address, log } from '@graphprotocol/graph-ts';
|
||||
import {
|
||||
Approval as ApprovalEvent,
|
||||
ApprovalForAll as ApprovalForAllEvent,
|
||||
CollectionRoleGranted as CollectionRoleGrantedEvent,
|
||||
CollectionRoleRevoked as CollectionRoleRevokedEvent,
|
||||
FleekNFA,
|
||||
NewBuild as NewBuildEvent,
|
||||
NewTokenDescription as NewTokenDescriptionEvent,
|
||||
NewTokenENS as NewTokenENSEvent,
|
||||
|
|
@ -232,4 +234,26 @@ export function handleTransfer(event: TransferEvent): void {
|
|||
entity.transactionHash = event.transaction.hash;
|
||||
|
||||
entity.save();
|
||||
|
||||
if (parseInt(event.params.from.toHexString()) === 0) {
|
||||
// This is a new mint
|
||||
|
||||
let id = event.transaction.hash;
|
||||
let token = new Token(id);
|
||||
let owner = event.params.to;
|
||||
|
||||
let holder = Holder.load(owner);
|
||||
|
||||
if (!holder) {
|
||||
// Create a new holder entity
|
||||
holder = new Holder(owner);
|
||||
}
|
||||
|
||||
token.owner = owner;
|
||||
token.minted_by = event.transaction.from;
|
||||
token.tokenId = event.params.tokenId;
|
||||
|
||||
holder.save();
|
||||
token.save();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ dataSources:
|
|||
source:
|
||||
address: "0x34F21E970A7cd383eE429aDB5ed57bbc40ea2B57"
|
||||
abi: FleekNFA
|
||||
startBlock: 30825341
|
||||
mapping:
|
||||
kind: ethereum/events
|
||||
apiVersion: 0.0.7
|
||||
|
|
|
|||
Loading…
Reference in New Issue