@ -27,7 +27,6 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/params"
@ -263,30 +262,30 @@ func TestLogFilter(t *testing.T) {
notUsedTopic = common . HexToHash ( "0x9999999999999999999999999999999999999999999999999999999999999999" )
notUsedTopic = common . HexToHash ( "0x9999999999999999999999999999999999999999999999999999999999999999" )
// posted twice, once as vm.Logs and once as core.PendingLogsEvent
// posted twice, once as vm.Logs and once as core.PendingLogsEvent
allLogs = vm . Logs {
allLogs = [ ] * types . Log {
vm . NewLog ( firstAddr , [ ] common . Hash { } , [ ] byte ( "" ) , 0 ) ,
{ Address : firstAddr } ,
vm . NewLog ( firstAddr , [ ] common . Hash { firstTopic } , [ ] byte ( "" ) , 1 ) ,
{ Address : firstAddr , Topics : [ ] common . Hash { firstTopic } , BlockNumber : 1 } ,
vm . NewLog ( secondAddr , [ ] common . Hash { firstTopic } , [ ] byte ( "" ) , 1 ) ,
{ Address : secondAddr , Topics : [ ] common . Hash { firstTopic } , BlockNumber : 1 } ,
vm . NewLog ( thirdAddress , [ ] common . Hash { secondTopic } , [ ] byte ( "" ) , 2 ) ,
{ Address : thirdAddress , Topics : [ ] common . Hash { secondTopic } , BlockNumber : 2 } ,
vm . NewLog ( thirdAddress , [ ] common . Hash { secondTopic } , [ ] byte ( "" ) , 3 ) ,
{ Address : thirdAddress , Topics : [ ] common . Hash { secondTopic } , BlockNumber : 3 } ,
}
}
expectedCase7 = vm . Logs { allLogs [ 3 ] , allLogs [ 4 ] , allLogs [ 0 ] , allLogs [ 1 ] , allLogs [ 2 ] , allLogs [ 3 ] , allLogs [ 4 ] }
expectedCase7 = [ ] * types . Log { allLogs [ 3 ] , allLogs [ 4 ] , allLogs [ 0 ] , allLogs [ 1 ] , allLogs [ 2 ] , allLogs [ 3 ] , allLogs [ 4 ] }
expectedCase11 = vm . Logs { allLogs [ 1 ] , allLogs [ 2 ] , allLogs [ 1 ] , allLogs [ 2 ] }
expectedCase11 = [ ] * types . Log { allLogs [ 1 ] , allLogs [ 2 ] , allLogs [ 1 ] , allLogs [ 2 ] }
testCases = [ ] struct {
testCases = [ ] struct {
crit FilterCriteria
crit FilterCriteria
expected vm . Logs
expected [ ] * types . Log
id rpc . ID
id rpc . ID
} {
} {
// match all
// match all
0 : { FilterCriteria { } , allLogs , "" } ,
0 : { FilterCriteria { } , allLogs , "" } ,
// match none due to no matching addresses
// match none due to no matching addresses
1 : { FilterCriteria { Addresses : [ ] common . Address { common . Address { } , notUsedAddress } , Topics : [ ] [ ] common . Hash { allLogs [ 0 ] . Topics } } , vm . Logs { } , "" } ,
1 : { FilterCriteria { Addresses : [ ] common . Address { common . Address { } , notUsedAddress } , Topics : [ ] [ ] common . Hash { allLogs [ 0 ] . Topics } } , [ ] * types . Log { } , "" } ,
// match logs based on addresses, ignore topics
// match logs based on addresses, ignore topics
2 : { FilterCriteria { Addresses : [ ] common . Address { firstAddr } } , allLogs [ : 2 ] , "" } ,
2 : { FilterCriteria { Addresses : [ ] common . Address { firstAddr } } , allLogs [ : 2 ] , "" } ,
// match none due to no matching topics (match with address)
// match none due to no matching topics (match with address)
3 : { FilterCriteria { Addresses : [ ] common . Address { secondAddr } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { notUsedTopic } } } , vm . Logs { } , "" } ,
3 : { FilterCriteria { Addresses : [ ] common . Address { secondAddr } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { notUsedTopic } } } , [ ] * types . Log { } , "" } ,
// match logs based on addresses and topics
// match logs based on addresses and topics
4 : { FilterCriteria { Addresses : [ ] common . Address { thirdAddress } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { firstTopic , secondTopic } } } , allLogs [ 3 : 5 ] , "" } ,
4 : { FilterCriteria { Addresses : [ ] common . Address { thirdAddress } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { firstTopic , secondTopic } } } , allLogs [ 3 : 5 ] , "" } ,
// match logs based on multiple addresses and "or" topics
// match logs based on multiple addresses and "or" topics
@ -321,14 +320,14 @@ func TestLogFilter(t *testing.T) {
}
}
for i , tt := range testCases {
for i , tt := range testCases {
var fetched [ ] * vm . Log
var fetched [ ] * types . Log
for { // fetch all expected logs
for { // fetch all expected logs
results , err := api . GetFilterChanges ( tt . id )
results , err := api . GetFilterChanges ( tt . id )
if err != nil {
if err != nil {
t . Fatalf ( "Unable to fetch logs: %v" , err )
t . Fatalf ( "Unable to fetch logs: %v" , err )
}
}
fetched = append ( fetched , results . ( [ ] * vm . Log ) ... )
fetched = append ( fetched , results . ( [ ] * types . Log ) ... )
if len ( fetched ) >= len ( tt . expected ) {
if len ( fetched ) >= len ( tt . expected ) {
break
break
}
}
@ -373,21 +372,21 @@ func TestPendingLogsSubscription(t *testing.T) {
notUsedTopic = common . HexToHash ( "0x9999999999999999999999999999999999999999999999999999999999999999" )
notUsedTopic = common . HexToHash ( "0x9999999999999999999999999999999999999999999999999999999999999999" )
allLogs = [ ] core . PendingLogsEvent {
allLogs = [ ] core . PendingLogsEvent {
core . PendingLogsEvent { Logs : vm . Logs { vm . NewLog ( firstAddr , [ ] common . Hash { } , [ ] byte ( "" ) , 0 ) } } ,
{ Logs : [ ] * types . Log { { Address : firstAddr , Topics : [ ] common . Hash { } , BlockNumber : 0 } } } ,
core . PendingLogsEvent { Logs : vm . Logs { vm . NewLog ( firstAddr , [ ] common . Hash { firstTopic } , [ ] byte ( "" ) , 1 ) } } ,
{ Logs : [ ] * types . Log { { Address : firstAddr , Topics : [ ] common . Hash { firstTopic } , BlockNumber : 1 } } } ,
core . PendingLogsEvent { Logs : vm . Logs { vm . NewLog ( secondAddr , [ ] common . Hash { firstTopic } , [ ] byte ( "" ) , 2 ) } } ,
{ Logs : [ ] * types . Log { { Address : secondAddr , Topics : [ ] common . Hash { firstTopic } , BlockNumber : 2 } } } ,
core . PendingLogsEvent { Logs : vm . Logs { vm . NewLog ( thirdAddress , [ ] common . Hash { secondTopic } , [ ] byte ( "" ) , 3 ) } } ,
{ Logs : [ ] * types . Log { { Address : thirdAddress , Topics : [ ] common . Hash { secondTopic } , BlockNumber : 3 } } } ,
core . PendingLogsEvent { Logs : vm . Logs { vm . NewLog ( thirdAddress , [ ] common . Hash { secondTopic } , [ ] byte ( "" ) , 4 ) } } ,
{ Logs : [ ] * types . Log { { Address : thirdAddress , Topics : [ ] common . Hash { secondTopic } , BlockNumber : 4 } } } ,
core . PendingLogsEvent { Logs : vm . Logs {
{ Logs : [ ] * types . Log {
vm . NewLog ( thirdAddress , [ ] common . Hash { firstTopic } , [ ] byte ( "" ) , 5 ) ,
{ Address : thirdAddress , Topics : [ ] common . Hash { firstTopic } , BlockNumber : 5 } ,
vm . NewLog ( thirdAddress , [ ] common . Hash { thirdTopic } , [ ] byte ( "" ) , 5 ) ,
{ Address : thirdAddress , Topics : [ ] common . Hash { thirdTopic } , BlockNumber : 5 } ,
vm . NewLog ( thirdAddress , [ ] common . Hash { forthTopic } , [ ] byte ( "" ) , 5 ) ,
{ Address : thirdAddress , Topics : [ ] common . Hash { forthTopic } , BlockNumber : 5 } ,
vm . NewLog ( firstAddr , [ ] common . Hash { firstTopic } , [ ] byte ( "" ) , 5 ) ,
{ Address : firstAddr , Topics : [ ] common . Hash { firstTopic } , BlockNumber : 5 } ,
} } ,
} } ,
}
}
convertLogs = func ( pl [ ] core . PendingLogsEvent ) vm . Logs {
convertLogs = func ( pl [ ] core . PendingLogsEvent ) [ ] * types . Log {
var logs vm . Logs
var logs [ ] * types . Log
for _ , l := range pl {
for _ , l := range pl {
logs = append ( logs , l . Logs ... )
logs = append ( logs , l . Logs ... )
}
}
@ -396,18 +395,18 @@ func TestPendingLogsSubscription(t *testing.T) {
testCases = [ ] struct {
testCases = [ ] struct {
crit FilterCriteria
crit FilterCriteria
expected vm . Logs
expected [ ] * types . Log
c chan [ ] * vm . Log
c chan [ ] * types . Log
sub * Subscription
sub * Subscription
} {
} {
// match all
// match all
{ FilterCriteria { } , convertLogs ( allLogs ) , nil , nil } ,
{ FilterCriteria { } , convertLogs ( allLogs ) , nil , nil } ,
// match none due to no matching addresses
// match none due to no matching addresses
{ FilterCriteria { Addresses : [ ] common . Address { common . Address { } , notUsedAddress } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { } } } , vm . Logs { } , nil , nil } ,
{ FilterCriteria { Addresses : [ ] common . Address { common . Address { } , notUsedAddress } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { } } } , [ ] * types . Log { } , nil , nil } ,
// match logs based on addresses, ignore topics
// match logs based on addresses, ignore topics
{ FilterCriteria { Addresses : [ ] common . Address { firstAddr } } , append ( convertLogs ( allLogs [ : 2 ] ) , allLogs [ 5 ] . Logs [ 3 ] ) , nil , nil } ,
{ FilterCriteria { Addresses : [ ] common . Address { firstAddr } } , append ( convertLogs ( allLogs [ : 2 ] ) , allLogs [ 5 ] . Logs [ 3 ] ) , nil , nil } ,
// match none due to no matching topics (match with address)
// match none due to no matching topics (match with address)
{ FilterCriteria { Addresses : [ ] common . Address { secondAddr } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { notUsedTopic } } } , vm . Logs { } , nil , nil } ,
{ FilterCriteria { Addresses : [ ] common . Address { secondAddr } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { notUsedTopic } } } , [ ] * types . Log { } , nil , nil } ,
// match logs based on addresses and topics
// match logs based on addresses and topics
{ FilterCriteria { Addresses : [ ] common . Address { thirdAddress } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { firstTopic , secondTopic } } } , append ( convertLogs ( allLogs [ 3 : 5 ] ) , allLogs [ 5 ] . Logs [ 0 ] ) , nil , nil } ,
{ FilterCriteria { Addresses : [ ] common . Address { thirdAddress } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { firstTopic , secondTopic } } } , append ( convertLogs ( allLogs [ 3 : 5 ] ) , allLogs [ 5 ] . Logs [ 0 ] ) , nil , nil } ,
// match logs based on multiple addresses and "or" topics
// match logs based on multiple addresses and "or" topics
@ -415,7 +414,7 @@ func TestPendingLogsSubscription(t *testing.T) {
// block numbers are ignored for filters created with New***Filter, these return all logs that match the given criterias when the state changes
// block numbers are ignored for filters created with New***Filter, these return all logs that match the given criterias when the state changes
{ FilterCriteria { Addresses : [ ] common . Address { firstAddr } , FromBlock : big . NewInt ( 2 ) , ToBlock : big . NewInt ( 3 ) } , append ( convertLogs ( allLogs [ : 2 ] ) , allLogs [ 5 ] . Logs [ 3 ] ) , nil , nil } ,
{ FilterCriteria { Addresses : [ ] common . Address { firstAddr } , FromBlock : big . NewInt ( 2 ) , ToBlock : big . NewInt ( 3 ) } , append ( convertLogs ( allLogs [ : 2 ] ) , allLogs [ 5 ] . Logs [ 3 ] ) , nil , nil } ,
// multiple pending logs, should match only 2 topics from the logs in block 5
// multiple pending logs, should match only 2 topics from the logs in block 5
{ FilterCriteria { Addresses : [ ] common . Address { thirdAddress } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { firstTopic , forthTopic } } } , vm . Logs { allLogs [ 5 ] . Logs [ 0 ] , allLogs [ 5 ] . Logs [ 2 ] } , nil , nil } ,
{ FilterCriteria { Addresses : [ ] common . Address { thirdAddress } , Topics : [ ] [ ] common . Hash { [ ] common . Hash { firstTopic , forthTopic } } } , [ ] * types . Log { allLogs [ 5 ] . Logs [ 0 ] , allLogs [ 5 ] . Logs [ 2 ] } , nil , nil } ,
}
}
)
)
@ -423,7 +422,7 @@ func TestPendingLogsSubscription(t *testing.T) {
// on slow machines this could otherwise lead to missing events when the subscription is created after
// on slow machines this could otherwise lead to missing events when the subscription is created after
// (some) events are posted.
// (some) events are posted.
for i := range testCases {
for i := range testCases {
testCases [ i ] . c = make ( chan [ ] * vm . Log )
testCases [ i ] . c = make ( chan [ ] * types . Log )
testCases [ i ] . sub , _ = api . events . SubscribeLogs ( testCases [ i ] . crit , testCases [ i ] . c )
testCases [ i ] . sub , _ = api . events . SubscribeLogs ( testCases [ i ] . crit , testCases [ i ] . c )
}
}
@ -431,7 +430,7 @@ func TestPendingLogsSubscription(t *testing.T) {
i := n
i := n
tt := test
tt := test
go func ( ) {
go func ( ) {
var fetched [ ] * vm . Log
var fetched [ ] * types . Log
fetchLoop :
fetchLoop :
for {
for {
logs := <- tt . c
logs := <- tt . c