forked from cerc-io/ipld-eth-server
Rename watched_contracts package to contract_summary
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package contract_summary
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/8thlight/vulcanizedb/pkg/core"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
)
|
||||
|
||||
func GenerateConsoleOutput(summary ContractSummary) string {
|
||||
return fmt.Sprintf(template(),
|
||||
summary.ContractHash,
|
||||
summary.NumberOfTransactions,
|
||||
transactionToString(summary.LastTransaction),
|
||||
attributesString(summary),
|
||||
)
|
||||
}
|
||||
|
||||
func template() string {
|
||||
return `********************Contract Summary***********************
|
||||
HASH: %v
|
||||
NUMBER OF TRANSACTIONS: %d
|
||||
LAST TRANSACTION:
|
||||
%s
|
||||
ATTRIBUTES:
|
||||
%s
|
||||
`
|
||||
}
|
||||
|
||||
func transactionToString(transaction *core.Transaction) string {
|
||||
if transaction == nil {
|
||||
return "NONE"
|
||||
} else {
|
||||
return fmt.Sprintf(`Hash: %s
|
||||
To: %s
|
||||
From: %s`, transaction.Hash, transaction.To, transaction.From)
|
||||
}
|
||||
}
|
||||
|
||||
func attributesString(summary ContractSummary) string {
|
||||
var formattedAttributes string
|
||||
for _, attribute := range summary.Attributes {
|
||||
formattedAttributes += formatAttribute(attribute.Name, summary) + "\n" + " "
|
||||
}
|
||||
return formattedAttributes
|
||||
}
|
||||
|
||||
func formatAttribute(attributeName string, summary ContractSummary) string {
|
||||
var stringResult string
|
||||
result := summary.GetStateAttribute(attributeName)
|
||||
switch t := result.(type) {
|
||||
case common.Address:
|
||||
ca := result.(common.Address)
|
||||
stringResult = fmt.Sprintf("%s: %v", attributeName, ca.Hex())
|
||||
default:
|
||||
_ = t
|
||||
stringResult = fmt.Sprintf("%s: %v", attributeName, result)
|
||||
}
|
||||
return stringResult
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package contract_summary_test
|
||||
|
||||
import (
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/gomega"
|
||||
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestWatchedContracts(t *testing.T) {
|
||||
RegisterFailHandler(Fail)
|
||||
RunSpecs(t, "ContractSummary Suite")
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package contract_summary
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"math/big"
|
||||
|
||||
"github.com/8thlight/vulcanizedb/pkg/core"
|
||||
"github.com/8thlight/vulcanizedb/pkg/repositories"
|
||||
)
|
||||
|
||||
type ContractSummary struct {
|
||||
Contract core.Contract
|
||||
ContractHash string
|
||||
NumberOfTransactions int
|
||||
LastTransaction *core.Transaction
|
||||
blockChain core.Blockchain
|
||||
Attributes core.ContractAttributes
|
||||
BlockNumber *big.Int
|
||||
}
|
||||
|
||||
var NewContractNotWatchedErr = func(contractHash string) error {
|
||||
return errors.New(fmt.Sprintf("Contract %v not being watched", contractHash))
|
||||
}
|
||||
|
||||
func NewSummary(blockchain core.Blockchain, repository repositories.Repository, contractHash string, blockNumber *big.Int) (ContractSummary, error) {
|
||||
watchedContract := repository.FindWatchedContract(contractHash)
|
||||
if watchedContract != nil {
|
||||
return newContractSummary(blockchain, *watchedContract, blockNumber), nil
|
||||
} else {
|
||||
return ContractSummary{}, NewContractNotWatchedErr(contractHash)
|
||||
}
|
||||
}
|
||||
|
||||
func (contractSummary ContractSummary) GetStateAttribute(attributeName string) interface{} {
|
||||
var result interface{}
|
||||
result, _ = contractSummary.blockChain.GetAttribute(contractSummary.Contract, attributeName, contractSummary.BlockNumber)
|
||||
return result
|
||||
}
|
||||
|
||||
func newContractSummary(blockchain core.Blockchain, watchedContract core.WatchedContract, blockNumber *big.Int) ContractSummary {
|
||||
contract, _ := blockchain.GetContract(watchedContract.Hash)
|
||||
return ContractSummary{
|
||||
blockChain: blockchain,
|
||||
Contract: contract,
|
||||
ContractHash: watchedContract.Hash,
|
||||
NumberOfTransactions: len(watchedContract.Transactions),
|
||||
LastTransaction: lastTransaction(watchedContract),
|
||||
Attributes: contract.Attributes,
|
||||
BlockNumber: blockNumber,
|
||||
}
|
||||
}
|
||||
|
||||
func lastTransaction(watchedContract core.WatchedContract) *core.Transaction {
|
||||
if len(watchedContract.Transactions) > 0 {
|
||||
return &watchedContract.Transactions[0]
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
package contract_summary_test
|
||||
|
||||
import (
|
||||
"math/big"
|
||||
|
||||
"github.com/8thlight/vulcanizedb/pkg/contract_summary"
|
||||
"github.com/8thlight/vulcanizedb/pkg/core"
|
||||
"github.com/8thlight/vulcanizedb/pkg/fakes"
|
||||
"github.com/8thlight/vulcanizedb/pkg/repositories"
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
func NewCurrentContractSummary(blockchain core.Blockchain, repository repositories.Repository, contractHash string) (contract_summary.ContractSummary, error) {
|
||||
return contract_summary.NewSummary(blockchain, repository, contractHash, nil)
|
||||
}
|
||||
|
||||
var _ = Describe("The watched contract summary", func() {
|
||||
|
||||
Context("when the given contract is not being watched", func() {
|
||||
It("returns an error", func() {
|
||||
repository := repositories.NewInMemory()
|
||||
blockchain := fakes.NewBlockchain()
|
||||
|
||||
contractSummary, err := NewCurrentContractSummary(blockchain, repository, "0x123")
|
||||
|
||||
Expect(contractSummary).To(Equal(contract_summary.ContractSummary{}))
|
||||
Expect(err).NotTo(BeNil())
|
||||
})
|
||||
})
|
||||
|
||||
Context("when the given contract is being watched", func() {
|
||||
It("returns the summary", func() {
|
||||
repository := repositories.NewInMemory()
|
||||
watchedContract := core.WatchedContract{Hash: "0x123"}
|
||||
repository.CreateWatchedContract(watchedContract)
|
||||
blockchain := fakes.NewBlockchain()
|
||||
|
||||
contractSummary, err := NewCurrentContractSummary(blockchain, repository, "0x123")
|
||||
|
||||
Expect(contractSummary).NotTo(Equal(contract_summary.ContractSummary{}))
|
||||
Expect(err).To(BeNil())
|
||||
})
|
||||
|
||||
It("includes the contract hash in the summary", func() {
|
||||
repository := repositories.NewInMemory()
|
||||
watchedContract := core.WatchedContract{Hash: "0x123"}
|
||||
repository.CreateWatchedContract(watchedContract)
|
||||
blockchain := fakes.NewBlockchain()
|
||||
|
||||
contractSummary, _ := NewCurrentContractSummary(blockchain, repository, "0x123")
|
||||
|
||||
Expect(contractSummary.ContractHash).To(Equal("0x123"))
|
||||
})
|
||||
|
||||
It("sets the number of transactions", func() {
|
||||
repository := repositories.NewInMemory()
|
||||
watchedContract := core.WatchedContract{Hash: "0x123"}
|
||||
repository.CreateWatchedContract(watchedContract)
|
||||
block := core.Block{
|
||||
Transactions: []core.Transaction{
|
||||
{To: "0x123"},
|
||||
{To: "0x123"},
|
||||
},
|
||||
}
|
||||
repository.CreateBlock(block)
|
||||
blockchain := fakes.NewBlockchain()
|
||||
|
||||
contractSummary, _ := NewCurrentContractSummary(blockchain, repository, "0x123")
|
||||
|
||||
Expect(contractSummary.NumberOfTransactions).To(Equal(2))
|
||||
})
|
||||
|
||||
It("sets the last transaction", func() {
|
||||
repository := repositories.NewInMemory()
|
||||
watchedContract := core.WatchedContract{Hash: "0x123"}
|
||||
repository.CreateWatchedContract(watchedContract)
|
||||
block := core.Block{
|
||||
Transactions: []core.Transaction{
|
||||
{Hash: "TRANSACTION2", To: "0x123"},
|
||||
{Hash: "TRANSACTION1", To: "0x123"},
|
||||
},
|
||||
}
|
||||
repository.CreateBlock(block)
|
||||
blockchain := fakes.NewBlockchain()
|
||||
|
||||
contractSummary, _ := NewCurrentContractSummary(blockchain, repository, "0x123")
|
||||
|
||||
Expect(contractSummary.LastTransaction.Hash).To(Equal("TRANSACTION2"))
|
||||
})
|
||||
|
||||
It("gets contract state attribute for the contract from the blockchain", func() {
|
||||
repository := repositories.NewInMemory()
|
||||
watchedContract := core.WatchedContract{Hash: "0x123"}
|
||||
repository.CreateWatchedContract(watchedContract)
|
||||
blockchain := fakes.NewBlockchain()
|
||||
blockchain.SetContractStateAttribute("0x123", nil, "foo", "bar")
|
||||
|
||||
contractSummary, _ := NewCurrentContractSummary(blockchain, repository, "0x123")
|
||||
attribute := contractSummary.GetStateAttribute("foo")
|
||||
|
||||
Expect(attribute).To(Equal("bar"))
|
||||
})
|
||||
|
||||
It("gets contract state attribute for the contract from the blockchain at specific block height", func() {
|
||||
repository := repositories.NewInMemory()
|
||||
watchedContract := core.WatchedContract{Hash: "0x123"}
|
||||
repository.CreateWatchedContract(watchedContract)
|
||||
blockchain := fakes.NewBlockchain()
|
||||
blockNumber := big.NewInt(1000)
|
||||
blockchain.SetContractStateAttribute("0x123", nil, "foo", "bar")
|
||||
blockchain.SetContractStateAttribute("0x123", blockNumber, "foo", "baz")
|
||||
|
||||
contractSummary, _ := contract_summary.NewSummary(blockchain, repository, "0x123", blockNumber)
|
||||
attribute := contractSummary.GetStateAttribute("foo")
|
||||
|
||||
Expect(attribute).To(Equal("baz"))
|
||||
})
|
||||
|
||||
It("gets attributes for the contract from the blockchain", func() {
|
||||
repository := repositories.NewInMemory()
|
||||
watchedContract := core.WatchedContract{Hash: "0x123"}
|
||||
repository.CreateWatchedContract(watchedContract)
|
||||
blockchain := fakes.NewBlockchain()
|
||||
blockchain.SetContractStateAttribute("0x123", nil, "foo", "bar")
|
||||
blockchain.SetContractStateAttribute("0x123", nil, "baz", "bar")
|
||||
|
||||
contractSummary, _ := NewCurrentContractSummary(blockchain, repository, "0x123")
|
||||
|
||||
Expect(contractSummary.Attributes).To(Equal(
|
||||
core.ContractAttributes{
|
||||
{Name: "baz", Type: "string"},
|
||||
{Name: "foo", Type: "string"},
|
||||
},
|
||||
))
|
||||
})
|
||||
})
|
||||
|
||||
})
|
||||
Reference in New Issue
Block a user