diff --git a/package-lock.json b/package-lock.json index a07c2790..3a4a5ab8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2901,6 +2901,15 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "abi-decoder": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-2.3.0.tgz", + "integrity": "sha512-RZXG5mo1JhJjTBg/4NXlS8hyTr2fxiuFaz3UveRpoX9IIc3LPHmWz89dFqTHNQVbWi3VZqxSJqfUwWpb/mCHxA==", + "requires": { + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" + } + }, "abstract-leveldown": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", diff --git a/package.json b/package.json index 03a7ddc8..99dcef87 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "@rsksmart/rif-marketplace-storage": "^0.1.0-dev.0", "@rsksmart/rns-reverse": "^1.0.2", "@rsksmart/rns-rskregistrar": "^1.2.1", + "abi-decoder": "^2.3.0", "async-sema": "^3.1.0", "coingecko-api": "^1.0.10", "colors": "^1.4.0", diff --git a/src/definitions.ts b/src/definitions.ts index f590ef95..0652b03f 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -138,6 +138,8 @@ export interface Config { // Sets if RNS service should be enabled enabled?: boolean + fifsAddrRegistrar?: BlockchainServiceOptions + // Owner contract's options owner?: BlockchainServiceOptions diff --git a/src/rns/index.ts b/src/rns/index.ts index d0f9e441..977fa0e3 100644 --- a/src/rns/index.ts +++ b/src/rns/index.ts @@ -23,6 +23,8 @@ import rnsReverseContractAbi from '@rsksmart/rns-reverse/NameResolverData.json' import simplePlacementsContractAbi from '@rsksmart/rif-marketplace-nfts/ERC721SimplePlacementsABI.json' import { errorHandler } from '../utils' +import rnsPrecache from './rns.precache' + const logger = loggingFactory('rns') export class RnsService extends Service { @@ -49,6 +51,8 @@ async function precache (eth?: Eth): Promise { const eventsDataQueue: EventData[] = [] const dataQueuePusher = (event: EventData): void => { eventsDataQueue.push(event) } + await rnsPrecache(eth, rnsContractAbi.abi as AbiItem[], config.get(`rns.owner.contractAddress`), config.get(`rns.fifsAddrRegistrar.contractAddress`)) + await fetchEventsForService(eth, 'rns.owner', rnsContractAbi.abi as AbiItem[], dataQueuePusher) await fetchEventsForService(eth, 'rns.reverse', rnsReverseContractAbi.abi as AbiItem[], dataQueuePusher) await fetchEventsForService(eth, 'rns.placement', simplePlacementsContractAbi as AbiItem[], dataQueuePusher) diff --git a/src/rns/rns.precache.ts b/src/rns/rns.precache.ts new file mode 100644 index 00000000..2b2b37c8 --- /dev/null +++ b/src/rns/rns.precache.ts @@ -0,0 +1,51 @@ +import Utils from 'web3-utils' +import abiDecoder from 'abi-decoder' + +import Domain from './models/domain.model' + +abiDecoder.addABI([ + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_data", + "type": "bytes" + } + ], + "name": "transferAndCall", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } +]); + +export default async function processRskOwner(eth: Eth, contractAbi: Utils.AbiItem[], rskOwnerAddresses: string, fifsAddrAddress: string) { + const rskOwner = new eth.Contract(contractAbi, rskOwnerAddresses) + const rskOwnerEvents = await rskOwner.getPastEvents('Transfer', { + filter: { from: fifsAddrAddress }, + fromBlock: 0 + }); + for (const rskOwnerEvent of rskOwnerEvents) { + const transaction = await eth.getTransaction(rskOwnerEvent.transactionHash) + const decodedData = abiDecoder.decodeMethod(transaction.input) + const name = Utils.hexToAscii("0x" + decodedData.params[2].value.slice(218, decodedData.params[2].value.length)) + const tokenId = Utils.sha3(name) + const ownerAddress = rskOwnerEvent.returnValues.to.toLowerCase() + const req = new Domain({tokenId, name, ownerAddress}) + await req.save() + }; +}