Merge pull request #82 from 8thlight/add-contract-types

Add contract types
This commit is contained in:
ericmeyer 2017-11-30 10:21:21 -06:00 committed by GitHub
commit 437e052bbb
7 changed files with 27 additions and 27 deletions

View File

@ -6,5 +6,5 @@ type Blockchain interface {
StartListening()
StopListening()
GetContractAttributes(contractHash string) (ContractAttributes, error)
GetContractStateAttribute(contractHash string, attributeName string) (*string, error)
GetContractStateAttribute(contractHash string, attributeName string) (interface{}, error)
}

View File

@ -1,8 +1,9 @@
package fakes
import (
"github.com/8thlight/vulcanizedb/pkg/core"
"sort"
"github.com/8thlight/vulcanizedb/pkg/core"
)
type Blockchain struct {
@ -24,9 +25,8 @@ func (blockchain *Blockchain) GetContractAttributes(contractHash string) (core.C
return contractAttributes, nil
}
func (blockchain *Blockchain) GetContractStateAttribute(contractHash string, attributeName string) (*string, error) {
result := new(string)
*result = blockchain.contractAttributes[contractHash][attributeName]
func (blockchain *Blockchain) GetContractStateAttribute(contractHash string, attributeName string) (interface{}, error) {
result := blockchain.contractAttributes[contractHash][attributeName]
return result, nil
}

View File

@ -22,7 +22,7 @@ func (blockchain *GethBlockchain) GetContractAttributes(contractHash string) (co
parsed, _ := ParseAbiFile(abiFilePath)
var contractAttributes core.ContractAttributes
for _, abiElement := range parsed.Methods {
if (len(abiElement.Outputs) > 0) && (len(abiElement.Inputs) == 0) && abiElement.Const && abiElement.Outputs[0].Type.String() == "string" {
if (len(abiElement.Outputs) > 0) && (len(abiElement.Inputs) == 0) && abiElement.Const {
attributeType := abiElement.Outputs[0].Type.String()
contractAttributes = append(contractAttributes, core.ContractAttribute{abiElement.Name, attributeType})
}
@ -31,13 +31,13 @@ func (blockchain *GethBlockchain) GetContractAttributes(contractHash string) (co
return contractAttributes, nil
}
func (blockchain *GethBlockchain) GetContractStateAttribute(contractHash string, attributeName string) (*string, error) {
func (blockchain *GethBlockchain) GetContractStateAttribute(contractHash string, attributeName string) (interface{}, error) {
boundContract, err := bindContract(common.HexToAddress(contractHash), blockchain.client, blockchain.client)
if err != nil {
return nil, err
}
result := new(string)
err = boundContract.Call(&bind.CallOpts{}, result, attributeName)
var result interface{}
err = boundContract.Call(&bind.CallOpts{}, &result, attributeName)
if err != nil {
return nil, ErrInvalidStateAttribute
}

View File

@ -48,18 +48,6 @@ package geth_test
// attribute := testing.FindAttribute(attributes, "unpause")
// Expect(attribute).To(BeNil())
// })
//
// It("temporarily filters out non-string attributes", func() {
// config, _ := cfg.NewConfig("public")
// blockchain := geth.NewGethBlockchain(config.Client.IPCPath)
// contractHash := "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07"
//
// attributes, err := blockchain.GetContractAttributes(contractHash)
//
// Expect(err).To(BeNil())
// attribute := testing.FindAttribute(attributes, "decimals")
// Expect(attribute).To(BeNil())
// })
// })
//
// Describe("Getting a contract attribute", func() {
@ -70,7 +58,7 @@ package geth_test
//
// name, err := blockchain.GetContractStateAttribute(contractHash, "name")
//
// Expect(*name).To(Equal("OMGToken"))
// Expect(name).To(Equal("OMGToken"))
// Expect(err).To(BeNil())
// })
//

View File

@ -4,6 +4,7 @@ import (
"fmt"
"github.com/8thlight/vulcanizedb/pkg/core"
"github.com/ethereum/go-ethereum/common"
)
func GenerateConsoleOutput(summary *ContractSummary) string {
@ -45,6 +46,16 @@ func attributesString(summary *ContractSummary) string {
}
func formatAttribute(attributeName string, summary *ContractSummary) string {
formattedAttribute := fmt.Sprintf("%s: %s", attributeName, summary.GetStateAttribute(attributeName))
return formattedAttribute
var stringResult string
result := summary.GetStateAttribute(attributeName)
fmt.Println(fmt.Sprintf("%s: %v (%T)", attributeName, result, result))
switch t := result.(type) {
case common.Address:
ca := result.(common.Address)
stringResult = fmt.Sprintf("%v", ca.Hex())
default:
_ = t
stringResult = fmt.Sprintf("%v", result)
}
return stringResult
}

View File

@ -29,9 +29,9 @@ func NewSummary(blockchain core.Blockchain, repository repositories.Repository,
}
}
func (contractSummary ContractSummary) GetStateAttribute(attributeName string) string {
func (contractSummary ContractSummary) GetStateAttribute(attributeName string) interface{} {
result, _ := contractSummary.blockChain.GetContractStateAttribute(contractSummary.ContractHash, attributeName)
return *result
return result
}
func newContractSummary(blockchain core.Blockchain, watchedContract core.WatchedContract) *ContractSummary {

View File

@ -91,8 +91,9 @@ var _ bool = Describe("The watched contract summary", func() {
blockchain.SetContractStateAttribute("0x123", "foo", "bar")
contractSummary, _ := watched_contracts.NewSummary(blockchain, repository, "0x123")
attribute := contractSummary.GetStateAttribute("foo")
Expect(contractSummary.GetStateAttribute("foo")).To(Equal("bar"))
Expect(attribute).To(Equal("bar"))
})
It("gets attributes for the contract from the blockchain", func() {