add erc725 key/value store (#533)

This commit is contained in:
Alex Coseru 2022-09-13 20:07:10 +03:00 committed by GitHub
parent a74e3edb3a
commit 73089dacc3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 3 deletions

View File

@ -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!

View File

@ -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()
}

View File

@ -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

View File

@ -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')
})
})