From 73089dacc38bb0ff4adda9b261613e51d3883c8f Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Tue, 13 Sep 2022 20:07:10 +0300 Subject: [PATCH] add erc725 key/value store (#533) --- schema.graphql | 10 ++++++++++ src/mappings/nftUpdate.ts | 19 ++++++++++++++++--- subgraph.template.yaml | 2 ++ test/integration/Nft.test.ts | 22 ++++++++++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/schema.graphql b/schema.graphql index 5174a5d..9cafc57 100644 --- a/schema.graphql +++ b/schema.graphql @@ -113,8 +113,18 @@ type Nft @entity{ "has metadata" hasMetadata: Boolean! + + nftData: [NftData!] @derivedFrom(field: "nft") } +type NftData @entity{ + "nft address+key" + id: ID! + nft: Nft! + key: Bytes + value: Bytes + } + type OrderReuse @entity { id: ID! order: Order! diff --git a/src/mappings/nftUpdate.ts b/src/mappings/nftUpdate.ts index e02d366..216eba7 100644 --- a/src/mappings/nftUpdate.ts +++ b/src/mappings/nftUpdate.ts @@ -1,4 +1,4 @@ -import { Nft, NftUpdate } from '../@types/schema' +import { Nft, NftUpdate, NftData } from '../@types/schema' import { MetadataCreated, MetadataState, @@ -13,7 +13,8 @@ import { RemovedFromMetadataList, RemovedManager, CleanedPermissions, - Transfer + Transfer, + DataChanged } from '../@types/templates/ERC721Template/ERC721Template' import { NftUpdateType } from './utils/constants' import { getNftToken, getNftTokenWithID } from './utils/tokenUtils' @@ -257,6 +258,18 @@ export function handleNftTransferred(event: Transfer): void { const nft = getNftTokenWithID(id) const newOwner = getUser(event.params.to.toHexString()) nft.owner = newOwner.id - nft.save() } + +export function handleNftData(event: DataChanged): void { + const id = event.address.toHexString() + '-' + event.params.key.toHexString() + const nft = getNftToken(event.address) + let data = NftData.load(id) + if (data == null) { + data = new NftData(id) + } + data.key = event.params.key + data.value = event.params.value + data.nft = nft.id + data.save() +} diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 83dcce6..a7e8c63 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -97,6 +97,8 @@ templates: handler: handleCleanedPermissions - event: Transfer(indexed address,indexed address,indexed uint256) handler: handleNftTransferred + - event: DataChanged(indexed bytes32,bytes) + handler: handleNftData - name: Dispenser kind: ethereum/contract diff --git a/test/integration/Nft.test.ts b/test/integration/Nft.test.ts index d7da81c..5d09988 100644 --- a/test/integration/Nft.test.ts +++ b/test/integration/Nft.test.ts @@ -285,4 +285,26 @@ describe('NFT tests', async () => { assert(updatedNft.block < blockNumber + 50, 'incorrect value for: block') assert(updatedNft.orderCount === '0', 'incorrect value for: orderCount') }) + + it('Set a key/value in erc725 store', async () => { + await nft.setData(nftAddress, publisher, 'test_key', 'test_value') + await sleep(2000) + const query = { + query: `query { + nft(id:"${nftAddress}"){ + nftData{ + id + key + value + } + } + }` + } + const response = await fetch(subgraphUrl, { + method: 'POST', + body: JSON.stringify(query) + }) + const updatedNft = (await response.json()).data.nft + assert(updatedNft.nftData.key !== null, 'incorrect value for key') + }) })