add filter support

pull/7/head
Iuri Matias 6 years ago
parent 2e64ca7e88
commit 0b34718876
  1. 38
      remix-lib/src/execution/logsManager.js
  2. 14
      remix-simulator/README.md
  3. 38
      remix-simulator/src/methods/filters.js

@ -6,6 +6,8 @@ class LogsManager {
constructor () { constructor () {
this.notificationCallbacks = [] this.notificationCallbacks = []
this.subscriptions = {} this.subscriptions = {}
this.filters = {}
this.filterTracking = {}
this.oldLogs = [] this.oldLogs = []
} }
@ -66,7 +68,7 @@ class LogsManager {
const subscriptionParams = this.subscriptions[subscriptionId] const subscriptionParams = this.subscriptions[subscriptionId]
const [queryType, queryFilter] = subscriptionParams const [queryType, queryFilter] = subscriptionParams
if (this.eventMatchesFilter(changeEvent, queryType, queryFilter)) { if (this.eventMatchesFilter(changeEvent, queryType, queryFilter || {topics: []})) {
matchedSubscriptions.push(subscriptionId) matchedSubscriptions.push(subscriptionId)
} }
} }
@ -104,6 +106,40 @@ class LogsManager {
delete this.subscriptions[subscriptionId] delete this.subscriptions[subscriptionId]
} }
newFilter (filterType, params) {
let filterId = '0x' + crypto.randomBytes(16).toString('hex')
if (filterType === 'block' || filterType === 'pendingTransactions') {
this.filters[filterId] = { filterType }
}
if (filterType === 'filter') {
this.filters[filterId] = { filterType, params }
}
this.filterTracking[filterId] = {}
return filterId
}
uninstallFilter (filterId) {
delete this.filters[filterId]
}
getLogsForFilter(filterId, logsOnly) {
const {filterType, params} = this.filter[filterId]
const tracking = this.filterTracking[filterId]
if (logsOnly || filterType === 'filter') {
return this.getLogsFor(params || {topics: []})
}
if (filterType === 'block') {
let blocks = oldLogs.filter(x => x.type === 'block').filter(x => tracking.block === undefined || x.blockNumber >= tracking.block)
tracking.block = blocks[blocks.length - 1]
return blocks.map(block => ('0x' + block.hash().toString('hex')))
}
if (filterType === 'pendingTransactions') {
// TODO: pending transaction hashes
return []
}
}
getLogsFor (params) { getLogsFor (params) {
let results = [] let results = []
for (let log of this.oldLogs) { for (let log of this.oldLogs) {

@ -40,12 +40,12 @@ Implemented:
* [X] eth_compileSolidity (DEPRECATED) * [X] eth_compileSolidity (DEPRECATED)
* [X] eth_compileLLL (DEPRECATED) * [X] eth_compileLLL (DEPRECATED)
* [X] eth_compileSerpent (DEPRECATED) * [X] eth_compileSerpent (DEPRECATED)
* [_] eth_newFilter * [X] eth_newFilter
* [_] eth_newBlockFilter * [X] eth_newBlockFilter
* [_] eth_newPendingTransactionFilter * [X] eth_newPendingTransactionFilter
* [_] eth_uninstallFilter * [X] eth_uninstallFilter
* [_] eth_getFilterChanges * [~] eth_getFilterChanges
* [X] eth_getFilterLogs * [~] eth_getFilterLogs
* [X] eth_getLogs * [X] eth_getLogs
* [_] eth_getWork * [_] eth_getWork
* [_] eth_submitWork * [_] eth_submitWork
@ -79,5 +79,3 @@ Implemented:
* [_] personal_unlockAccount * [_] personal_unlockAccount
* [_] personal_sendTransaction * [_] personal_sendTransaction
* [_] rpc_modules * [_] rpc_modules
* [_] web3_clientVersion
* [_] web3_sha3

@ -13,12 +13,6 @@ Filters.prototype.methods = function () {
} }
} }
Filters.prototype.eth_getFilterLogs = function (payload, cb) {
let subscriptionId = payload.params[0];
let results = executionContext.logsManager.getLogsForSubscription(subscriptionId)
cb(null, results)
}
Filters.prototype.eth_getLogs = function (payload, cb) { Filters.prototype.eth_getLogs = function (payload, cb) {
let results = executionContext.logsManager.getLogsFor(payload.params[0]) let results = executionContext.logsManager.getLogsFor(payload.params[0])
cb(null, results) cb(null, results)
@ -34,4 +28,36 @@ Filters.prototype.eth_unsubscribe = function (payload, cb) {
cb(null, true) cb(null, true)
} }
Filters.prototype.eth_newFilter = function (payload, cb) {
const filterId = executionContext.logsManager.newFilter('filter', payload.params[0])
cb(null, filterId)
}
Filters.prototype.eth_newBlockFilter = function (payload, cb) {
const filterId = executionContext.logsManager.newFilter('block')
cb(null, filterId)
}
Filters.prototype.eth_newPendingTransactionFilter = function (payload, cb) {
const filterId = executionContext.logsManager.newFilter('pendingTransactions')
cb(null, filterId)
}
Filters.prototype.eth_uninstallfilter = function (payload, cb) {
const result = executionContext.logsManager.uninstallFilter(payload.params[0])
cb(null, result)
}
Filters.prototype.eth_getFilterChanges = function (payload, cb) {
const filterId = payload.params[0]
let results = executionContext.logsManager.getLogsForFilter(filterId)
cb(null, results)
}
Filters.prototype.eth_getFilterLogs = function (payload, cb) {
const filterId = payload.params[0]
let results = executionContext.logsManager.getLogsForFilter(filterId, true)
cb(null, results)
}
module.exports = Filters module.exports = Filters

Loading…
Cancel
Save