|
@@ -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{
|
|
|
|
|
- vm.NewLog(firstAddr, []common.Hash{}, []byte(""), 0),
|
|
|
|
|
- vm.NewLog(firstAddr, []common.Hash{firstTopic}, []byte(""), 1),
|
|
|
|
|
- vm.NewLog(secondAddr, []common.Hash{firstTopic}, []byte(""), 1),
|
|
|
|
|
- vm.NewLog(thirdAddress, []common.Hash{secondTopic}, []byte(""), 2),
|
|
|
|
|
- vm.NewLog(thirdAddress, []common.Hash{secondTopic}, []byte(""), 3),
|
|
|
|
|
|
|
+ allLogs = []*types.Log{
|
|
|
|
|
+ {Address: firstAddr},
|
|
|
|
|
+ {Address: firstAddr, Topics: []common.Hash{firstTopic}, BlockNumber: 1},
|
|
|
|
|
+ {Address: secondAddr, Topics: []common.Hash{firstTopic}, BlockNumber: 1},
|
|
|
|
|
+ {Address: thirdAddress, Topics: []common.Hash{secondTopic}, BlockNumber: 2},
|
|
|
|
|
+ {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]}
|
|
|
|
|
- expectedCase11 = vm.Logs{allLogs[1], allLogs[2], allLogs[1], allLogs[2]}
|
|
|
|
|
|
|
+ expectedCase7 = []*types.Log{allLogs[3], allLogs[4], allLogs[0], allLogs[1], allLogs[2], allLogs[3], allLogs[4]}
|
|
|
|
|
+ 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)}},
|
|
|
|
|
- core.PendingLogsEvent{Logs: vm.Logs{vm.NewLog(firstAddr, []common.Hash{firstTopic}, []byte(""), 1)}},
|
|
|
|
|
- core.PendingLogsEvent{Logs: vm.Logs{vm.NewLog(secondAddr, []common.Hash{firstTopic}, []byte(""), 2)}},
|
|
|
|
|
- core.PendingLogsEvent{Logs: vm.Logs{vm.NewLog(thirdAddress, []common.Hash{secondTopic}, []byte(""), 3)}},
|
|
|
|
|
- core.PendingLogsEvent{Logs: vm.Logs{vm.NewLog(thirdAddress, []common.Hash{secondTopic}, []byte(""), 4)}},
|
|
|
|
|
- core.PendingLogsEvent{Logs: vm.Logs{
|
|
|
|
|
- vm.NewLog(thirdAddress, []common.Hash{firstTopic}, []byte(""), 5),
|
|
|
|
|
- vm.NewLog(thirdAddress, []common.Hash{thirdTopic}, []byte(""), 5),
|
|
|
|
|
- vm.NewLog(thirdAddress, []common.Hash{forthTopic}, []byte(""), 5),
|
|
|
|
|
- vm.NewLog(firstAddr, []common.Hash{firstTopic}, []byte(""), 5),
|
|
|
|
|
|
|
+ {Logs: []*types.Log{{Address: firstAddr, Topics: []common.Hash{}, BlockNumber: 0}}},
|
|
|
|
|
+ {Logs: []*types.Log{{Address: firstAddr, Topics: []common.Hash{firstTopic}, BlockNumber: 1}}},
|
|
|
|
|
+ {Logs: []*types.Log{{Address: secondAddr, Topics: []common.Hash{firstTopic}, BlockNumber: 2}}},
|
|
|
|
|
+ {Logs: []*types.Log{{Address: thirdAddress, Topics: []common.Hash{secondTopic}, BlockNumber: 3}}},
|
|
|
|
|
+ {Logs: []*types.Log{{Address: thirdAddress, Topics: []common.Hash{secondTopic}, BlockNumber: 4}}},
|
|
|
|
|
+ {Logs: []*types.Log{
|
|
|
|
|
+ {Address: thirdAddress, Topics: []common.Hash{firstTopic}, BlockNumber: 5},
|
|
|
|
|
+ {Address: thirdAddress, Topics: []common.Hash{thirdTopic}, BlockNumber: 5},
|
|
|
|
|
+ {Address: thirdAddress, Topics: []common.Hash{forthTopic}, BlockNumber: 5},
|
|
|
|
|
+ {Address: firstAddr, Topics: []common.Hash{firstTopic}, BlockNumber: 5},
|
|
|
}},
|
|
}},
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- convertLogs = func(pl []core.PendingLogsEvent) vm.Logs {
|
|
|
|
|
- var logs vm.Logs
|
|
|
|
|
|
|
+ convertLogs = func(pl []core.PendingLogsEvent) []*types.Log {
|
|
|
|
|
+ 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
|
|
|
|
|
- c chan []*vm.Log
|
|
|
|
|
|
|
+ expected []*types.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
|