Skip to content

Commit 603a25f

Browse files
Tracking transfer event & updating nft owner (#436)
* Adding Tranfer eventHandler to subgraph.template.yaml * Started adding transfer event to mapping * updating getNftTokenWithID function * Pulling from Origin v4main * Removing console.log * Updating token Utils * Updating newOwner with User & writting new test * Updating test * Ensuring account is in lowercase * Creating seperate test for transfering an NFT query * Updating test name * Removing console.logs * Moviving transfer event tracking from factory to template * Moving handleNftTransferred to nftUpdate mapping * Adding logging * Using correct token address * Fix linting * Checking the correct owner account has been set originally
1 parent 28979c8 commit 603a25f

File tree

5 files changed

+120
-4
lines changed

5 files changed

+120
-4
lines changed

scripts/generatenetworkssubgraphs.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable no-unused-vars */
2-
var fs = require('fs')
3-
var addresses = require('@oceanprotocol/contracts/addresses/address.json')
2+
const fs = require('fs')
3+
let addresses = require('@oceanprotocol/contracts/addresses/address.json')
44

55
async function replaceContractAddresses() {
66
// load addresses file first

src/mappings/nftUpdate.ts

+13-2
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import {
1212
RemovedFromCreateERC20List,
1313
RemovedFromMetadataList,
1414
RemovedManager,
15-
CleanedPermissions
15+
CleanedPermissions,
16+
Transfer
1617
} from '../@types/templates/ERC721Template/ERC721Template'
1718
import { NftUpdateType } from './utils/constants'
18-
import { getNftToken } from './utils/tokenUtils'
19+
import { getNftToken, getNftTokenWithID } from './utils/tokenUtils'
20+
import { getUser } from './utils/userUtils'
1921

2022
function getId(tx: string, nftAddress: string): string {
2123
return `${tx}-${nftAddress}`
@@ -247,3 +249,12 @@ export function handleCleanedPermissions(event: CleanedPermissions): void {
247249
nft.managerRole = newList
248250
nft.save()
249251
}
252+
253+
export function handleNftTransferred(event: Transfer): void {
254+
const id = event.address.toHex()
255+
const nft = getNftTokenWithID(id)
256+
const newOwner = getUser(event.params.to.toHexString())
257+
nft.owner = newOwner.id
258+
259+
nft.save()
260+
}

src/mappings/utils/tokenUtils.ts

+14
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,20 @@ export function getNftToken(address: Address): Nft {
6060
return newToken
6161
}
6262

63+
export function getNftTokenWithID(tokenId: string): Nft {
64+
let nftToken = Nft.load(tokenId)
65+
if (nftToken === null) {
66+
nftToken = new Nft(tokenId)
67+
// const contract = ERC721Template.bind(address)
68+
nftToken.name = ''
69+
nftToken.symbol = ''
70+
nftToken.address = tokenId
71+
nftToken.save()
72+
addNft()
73+
}
74+
return nftToken
75+
}
76+
6377
export function getUSDValue(
6478
address: string,
6579
value: BigDecimal,

subgraph.template.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ templates:
197197
handler: handleRemovedManager
198198
- event: CleanedPermissions(indexed address,uint256,uint256)
199199
handler: handleCleanedPermissions
200+
- event: Transfer(indexed address,indexed address,indexed uint256)
201+
handler: handleNftTransferred
200202

201203
- name: Dispenser
202204
kind: ethereum/contract

test/integration/SimplePublishConsume.test.ts

+89
Original file line numberDiff line numberDiff line change
@@ -192,4 +192,93 @@ describe('Simple Publish & consume test', async () => {
192192
}
193193
*/
194194
})
195+
it('should publish and transfer an NFT', async () => {
196+
const nft = new Nft(web3)
197+
const Factory = new NftFactory(addresses.ERC721Factory, web3)
198+
const accounts = await web3.eth.getAccounts()
199+
const publisherAccount = accounts[0]
200+
const newOwnerAccount = accounts[1].toLowerCase()
201+
202+
const nftParams: NftCreateData = {
203+
name: 'testNFT',
204+
symbol: 'TST',
205+
templateIndex: 1,
206+
tokenURI: '',
207+
transferable: true,
208+
owner: publisherAccount
209+
}
210+
const erc20Params: Erc20CreateParams = {
211+
templateIndex: 1,
212+
cap: '100000',
213+
feeAmount: '0',
214+
paymentCollector: '0x0000000000000000000000000000000000000000',
215+
feeToken: '0x0000000000000000000000000000000000000000',
216+
minter: publisherAccount,
217+
mpFeeAddress: '0x0000000000000000000000000000000000000000'
218+
}
219+
const result = await Factory.createNftWithErc20(
220+
publisherAccount,
221+
nftParams,
222+
erc20Params
223+
)
224+
await sleep(2000)
225+
const erc721Address = result.events.NFTCreated.returnValues[0]
226+
const datatokenAddress = result.events.TokenCreated.returnValues[0]
227+
const graphNftToken = erc721Address.toLowerCase()
228+
229+
const queryOriginalOwner = {
230+
query: `query {
231+
nft(id:"${graphNftToken}"){symbol,id,owner}}`
232+
}
233+
const initialResponse = await fetch(subgraphUrl, {
234+
method: 'POST',
235+
body: JSON.stringify(queryOriginalOwner)
236+
})
237+
const initialResult = await initialResponse.json()
238+
// Checking original owner account has been set correctly
239+
assert(
240+
initialResult.data.nft.owner.toLowerCase() ===
241+
publisherAccount.toLowerCase()
242+
)
243+
244+
// create the files encrypted string
245+
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
246+
ddo.services[0].files = await providerResponse
247+
ddo.services[0].datatokenAddress = datatokenAddress
248+
// update ddo and set the right did
249+
ddo.nftAddress = erc721Address
250+
const chain = await web3.eth.getChainId()
251+
ddo.id =
252+
'did:op:' +
253+
SHA256(web3.utils.toChecksumAddress(erc721Address) + chain.toString(10))
254+
255+
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
256+
const encryptedResponse = await providerResponse
257+
const metadataHash = getHash(JSON.stringify(ddo))
258+
await nft.setMetadata(
259+
erc721Address,
260+
publisherAccount,
261+
0,
262+
providerUrl,
263+
'',
264+
'0x2',
265+
encryptedResponse,
266+
'0x' + metadataHash
267+
)
268+
await sleep(2000)
269+
270+
// Transfer the NFT
271+
await nft.transferNft(graphNftToken, publisherAccount, newOwnerAccount)
272+
await sleep(2000)
273+
const query2 = {
274+
query: `query {
275+
nft(id:"${graphNftToken}"){symbol,id,owner, transferable}}`
276+
}
277+
const response = await fetch(subgraphUrl, {
278+
method: 'POST',
279+
body: JSON.stringify(query2)
280+
})
281+
const queryResult = await response.json()
282+
assert(queryResult.data.nft.owner === newOwnerAccount)
283+
})
195284
})

0 commit comments

Comments
 (0)