```javascript
const platforms = [{
id: 'soundxyz',
name: 'Sound.xyz',
createdAtBlock: 1337,
deprecatedAtBlock: 1339, // could be used to ignore crawling future blocks if platform depricated usage
selectors: {
events: ['0x....'],
addresses: ['0x...']
},
filter: async (log) => {}, // filter out based on selectors.event , selectors.addresses
transform: async (nft) => {}, // schema-fy
extract: async (log) => {},
}, {
id: 'sound-protocol',
name: 'Sound Protocol',
createdAtBlock: 1337,
deprecatedAtBlock: null,
selectors: {
events: ['0x....'],
addresses: ['0x...']
},
filter: async (log) => {},
transform: async (nft) => {},
extract: async (log) => {},
}]
const options = {
refetch: true , //overwrite persisted log / transformations etc.
}
// Sync Operations: used to fetch logs per platform using eth_getLogs
await syncRange([platforms], from, to, options)
// Syncs logs for each platform createdAtBlock -> latest block.
// Overlapping platform ranges -> only fetches each block once.
await syncAll([platforms], options)
// Filter Operations: filter out logs per platform using fetched logs from syncRange / syncAll ()
await filterRange([platforms], from, to, options)
await filterAll([platforms], options)
// Transform Operations: Runs all transformers such as injectOwner, injectOwnershipHistory,, injectArtist, etc.
await transformRange([platforms], from, to, options)
await transformAll([platforms])
await exportRange([platforms], from, to, options)
await exportAll([platforms], options)
```