forked from cerc-io/ipld-eth-server
method piping
This commit is contained in:
@@ -33,8 +33,8 @@ type Parser interface {
|
||||
Parse(contractAddr string) error
|
||||
Abi() string
|
||||
ParsedAbi() abi.ABI
|
||||
GetMethods(wanted []string) map[string]types.Method
|
||||
GetSelectMethods(wanted []string) map[string]types.Method
|
||||
GetMethods(wanted []string) []types.Method
|
||||
GetSelectMethods(wanted []string) []types.Method
|
||||
GetEvents(wanted []string) map[string]types.Event
|
||||
}
|
||||
|
||||
@@ -91,37 +91,38 @@ func (p *parser) lookUp(contractAddr string) (string, error) {
|
||||
return "", errors.New("ABI not present in lookup tabe")
|
||||
}
|
||||
|
||||
// Returns wanted methods, if they meet the criteria, as map of types.Methods
|
||||
// Empty wanted array => all methods that fit are returned
|
||||
// Returns only specified methods, if they meet the criteria
|
||||
// Returns as array with methods in same order they were specified
|
||||
// Nil wanted array => no events are returned
|
||||
func (p *parser) GetSelectMethods(wanted []string) map[string]types.Method {
|
||||
addrMethods := map[string]types.Method{}
|
||||
if wanted == nil {
|
||||
func (p *parser) GetSelectMethods(wanted []string) []types.Method {
|
||||
wLen := len(wanted)
|
||||
if wLen == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
methods := make([]types.Method, wLen)
|
||||
for _, m := range p.parsedAbi.Methods {
|
||||
if okInputTypes(m, wanted) {
|
||||
addrMethods[m.Name] = types.NewMethod(m)
|
||||
for i, name := range wanted {
|
||||
if name == m.Name && okTypes(m, wanted) {
|
||||
methods[i] = types.NewMethod(m)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return addrMethods
|
||||
return methods
|
||||
}
|
||||
|
||||
// Returns wanted methods as map of types.Methods
|
||||
// Empty wanted array => all events are returned
|
||||
// Nil wanted array => no events are returned
|
||||
func (p *parser) GetMethods(wanted []string) map[string]types.Method {
|
||||
methods := map[string]types.Method{}
|
||||
// Returns wanted methods
|
||||
// Empty wanted array => all methods are returned
|
||||
// Nil wanted array => no methods are returned
|
||||
func (p *parser) GetMethods(wanted []string) []types.Method {
|
||||
if wanted == nil {
|
||||
return methods
|
||||
return nil
|
||||
}
|
||||
|
||||
methods := make([]types.Method, 0)
|
||||
length := len(wanted)
|
||||
for _, m := range p.parsedAbi.Methods {
|
||||
if length == 0 || stringInSlice(wanted, m.Name) {
|
||||
methods[m.Name] = types.NewMethod(m)
|
||||
methods = append(methods, types.NewMethod(m))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,7 +170,7 @@ func okReturnType(arg abi.Argument) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func okInputTypes(m abi.Method, wanted []string) bool {
|
||||
func okTypes(m abi.Method, wanted []string) bool {
|
||||
// Only return method if it has less than 3 arguments, a single output value, and it is a method we want or we want all methods (empty 'wanted' slice)
|
||||
if len(m.Inputs) < 3 && len(m.Outputs) == 1 && (len(wanted) == 0 || stringInSlice(wanted, m.Name)) {
|
||||
// Only return methods if inputs are all of accepted types and output is of the accepted types
|
||||
@@ -178,12 +179,18 @@ func okInputTypes(m abi.Method, wanted []string) bool {
|
||||
}
|
||||
for _, input := range m.Inputs {
|
||||
switch input.Type.T {
|
||||
case abi.AddressTy, abi.HashTy, abi.BytesTy, abi.FixedBytesTy:
|
||||
// Addresses are properly labeled and caught
|
||||
// But hashes tend to not be explicitly labeled and caught
|
||||
// Instead bytes32 are assumed to be hashes
|
||||
case abi.AddressTy, abi.HashTy:
|
||||
case abi.FixedBytesTy:
|
||||
if input.Type.Size != 32 {
|
||||
return false
|
||||
}
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
"github.com/vulcanize/vulcanizedb/pkg/omni/shared/constants"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/omni/shared/helpers/test_helpers/mocks"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/omni/shared/parser"
|
||||
"github.com/vulcanize/vulcanizedb/pkg/omni/shared/types"
|
||||
)
|
||||
|
||||
var _ = Describe("Parser", func() {
|
||||
@@ -48,15 +49,14 @@ var _ = Describe("Parser", func() {
|
||||
Expect(parsedAbi).To(Equal(expectedAbi))
|
||||
|
||||
methods := mp.GetSelectMethods([]string{"balanceOf"})
|
||||
_, ok := methods["totalSupply"]
|
||||
Expect(ok).To(Equal(false))
|
||||
m, ok := methods["balanceOf"]
|
||||
Expect(ok).To(Equal(true))
|
||||
Expect(len(m.Args)).To(Equal(1))
|
||||
Expect(len(m.Return)).To(Equal(1))
|
||||
Expect(len(methods)).To(Equal(1))
|
||||
balOf := methods[0]
|
||||
Expect(balOf.Name).To(Equal("balanceOf"))
|
||||
Expect(len(balOf.Args)).To(Equal(1))
|
||||
Expect(len(balOf.Return)).To(Equal(1))
|
||||
|
||||
events := mp.GetEvents([]string{"Transfer"})
|
||||
_, ok = events["Mint"]
|
||||
_, ok := events["Mint"]
|
||||
Expect(ok).To(Equal(false))
|
||||
e, ok := events["Transfer"]
|
||||
Expect(ok).To(Equal(true))
|
||||
@@ -119,99 +119,108 @@ var _ = Describe("Parser", func() {
|
||||
})
|
||||
})
|
||||
|
||||
Describe("GetSelectMethods", func() {
|
||||
It("Parses and returns only methods specified in passed array", func() {
|
||||
contractAddr := "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"
|
||||
err = p.Parse(contractAddr)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
methods := p.GetSelectMethods([]string{"balanceOf"})
|
||||
Expect(len(methods)).To(Equal(1))
|
||||
|
||||
balOf := methods[0]
|
||||
Expect(balOf.Name).To(Equal("balanceOf"))
|
||||
Expect(len(balOf.Args)).To(Equal(1))
|
||||
Expect(len(balOf.Return)).To(Equal(1))
|
||||
|
||||
abiTy := balOf.Args[0].Type.T
|
||||
Expect(abiTy).To(Equal(abi.AddressTy))
|
||||
|
||||
pgTy := balOf.Args[0].PgType
|
||||
Expect(pgTy).To(Equal("CHARACTER VARYING(66)"))
|
||||
|
||||
abiTy = balOf.Return[0].Type.T
|
||||
Expect(abiTy).To(Equal(abi.UintTy))
|
||||
|
||||
pgTy = balOf.Return[0].PgType
|
||||
Expect(pgTy).To(Equal("DECIMAL"))
|
||||
|
||||
})
|
||||
|
||||
It("Parses and returns methods in the order they were specified", func() {
|
||||
contractAddr := "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"
|
||||
err = p.Parse(contractAddr)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
selectMethods := p.GetSelectMethods([]string{"balanceOf", "allowance"})
|
||||
Expect(len(selectMethods)).To(Equal(2))
|
||||
|
||||
balOf := selectMethods[0]
|
||||
allow := selectMethods[1]
|
||||
|
||||
Expect(balOf.Name).To(Equal("balanceOf"))
|
||||
Expect(allow.Name).To(Equal("allowance"))
|
||||
})
|
||||
|
||||
It("Returns nil if given a nil or empty array", func() {
|
||||
contractAddr := "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"
|
||||
err = p.Parse(contractAddr)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
var nilArr []types.Method
|
||||
selectMethods := p.GetSelectMethods([]string{})
|
||||
Expect(selectMethods).To(Equal(nilArr))
|
||||
selectMethods = p.GetMethods(nil)
|
||||
Expect(selectMethods).To(Equal(nilArr))
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
Describe("GetMethods", func() {
|
||||
It("Parses and returns only methods specified in passed array", func() {
|
||||
contractAddr := "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"
|
||||
err = p.Parse(contractAddr)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
selectMethods := p.GetMethods([]string{"balanceOf"})
|
||||
methods := p.GetMethods([]string{"balanceOf"})
|
||||
Expect(len(methods)).To(Equal(1))
|
||||
|
||||
m, ok := selectMethods["balanceOf"]
|
||||
Expect(ok).To(Equal(true))
|
||||
balOf := methods[0]
|
||||
Expect(balOf.Name).To(Equal("balanceOf"))
|
||||
Expect(len(balOf.Args)).To(Equal(1))
|
||||
Expect(len(balOf.Return)).To(Equal(1))
|
||||
|
||||
abiTy := m.Args[0].Type.T
|
||||
abiTy := balOf.Args[0].Type.T
|
||||
Expect(abiTy).To(Equal(abi.AddressTy))
|
||||
|
||||
pgTy := m.Args[0].PgType
|
||||
pgTy := balOf.Args[0].PgType
|
||||
Expect(pgTy).To(Equal("CHARACTER VARYING(66)"))
|
||||
|
||||
abiTy = m.Return[0].Type.T
|
||||
abiTy = balOf.Return[0].Type.T
|
||||
Expect(abiTy).To(Equal(abi.UintTy))
|
||||
|
||||
pgTy = m.Return[0].PgType
|
||||
pgTy = balOf.Return[0].PgType
|
||||
Expect(pgTy).To(Equal("DECIMAL"))
|
||||
|
||||
_, ok = selectMethods["totalSupply"]
|
||||
Expect(ok).To(Equal(false))
|
||||
})
|
||||
|
||||
It("Parses and returns all methods if passed an empty array", func() {
|
||||
It("Returns nil if given a nil array", func() {
|
||||
contractAddr := "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"
|
||||
err = p.Parse(contractAddr)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
var nilArr []types.Method
|
||||
selectMethods := p.GetMethods(nil)
|
||||
Expect(selectMethods).To(Equal(nilArr))
|
||||
})
|
||||
|
||||
It("Returns every method if given an empty array", func() {
|
||||
contractAddr := "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"
|
||||
err = p.Parse(contractAddr)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
selectMethods := p.GetMethods([]string{})
|
||||
|
||||
_, ok := selectMethods["balanceOf"]
|
||||
Expect(ok).To(Equal(true))
|
||||
|
||||
_, ok = selectMethods["totalSupply"]
|
||||
Expect(ok).To(Equal(true))
|
||||
|
||||
_, ok = selectMethods["allowance"]
|
||||
Expect(ok).To(Equal(true))
|
||||
})
|
||||
|
||||
It("Parses and returns no methods if pass a nil array", func() {
|
||||
contractAddr := "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"
|
||||
err = p.Parse(contractAddr)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
selectMethods := p.GetMethods(nil)
|
||||
Expect(len(selectMethods)).To(Equal(0))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("GetAddrMethods", func() {
|
||||
It("Parses and returns only methods whose inputs, if any, are all of type address, hash or []byte", func() {
|
||||
contractAddr := "0xDdE2D979e8d39BB8416eAfcFC1758f3CaB2C9C72"
|
||||
err = p.Parse(contractAddr)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
wanted := []string{"isApprovedForAll", "supportsInterface", "getApproved", "totalSupply", "balanceOf"}
|
||||
|
||||
methods := p.GetMethods(wanted)
|
||||
selectMethods := p.GetSelectMethods(wanted)
|
||||
|
||||
_, ok := selectMethods["totalSupply"]
|
||||
Expect(ok).To(Equal(true))
|
||||
_, ok = methods["totalSupply"]
|
||||
Expect(ok).To(Equal(true))
|
||||
|
||||
_, ok = selectMethods["balanceOf"]
|
||||
Expect(ok).To(Equal(true))
|
||||
_, ok = methods["balanceOf"]
|
||||
Expect(ok).To(Equal(true))
|
||||
|
||||
_, ok = selectMethods["isApprovedForAll"]
|
||||
Expect(ok).To(Equal(true))
|
||||
_, ok = methods["isApprovedForAll"]
|
||||
Expect(ok).To(Equal(true))
|
||||
|
||||
_, ok = selectMethods["supportsInterface"]
|
||||
Expect(ok).To(Equal(true))
|
||||
_, ok = methods["supportsInterface"]
|
||||
Expect(ok).To(Equal(true))
|
||||
|
||||
_, ok = selectMethods["getApproved"]
|
||||
Expect(ok).To(Equal(false))
|
||||
_, ok = methods["getApproved"]
|
||||
Expect(ok).To(Equal(true))
|
||||
|
||||
_, ok = selectMethods["name"]
|
||||
Expect(ok).To(Equal(false))
|
||||
_, ok = methods["name"]
|
||||
Expect(ok).To(Equal(false))
|
||||
Expect(len(selectMethods)).To(Equal(22))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user