func makeHeader() *types.Header { header := &types.Header{ ParentHash: common.StringToHash("0x00"), UncleHash: common.StringToHash("0x00"), Coinbase: common.StringToAddress("0x00"), Root: common.StringToHash("0x00"), TxHash: common.StringToHash("0x00"), ReceiptHash: common.StringToHash("0x00"), // Bloom: Difficulty: big.NewInt(88888888), Number: big.NewInt(16), GasLimit: big.NewInt(70000), GasUsed: big.NewInt(25000), Time: 124356789, Extra: nil, MixDigest: common.StringToHash("0x00"), Nonce: [8]byte{0, 1, 2, 3, 4, 5, 6, 7}, } return header }
import ( "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" ) type testBackend struct { // contracts mock contracts map[string](map[string]string) } var ( text = "test" codehash = common.StringToHash("1234") hash = common.BytesToHash(crypto.Sha3([]byte(text))) url = "bzz://bzzhash/my/path/contr.act" ) func NewTestBackend() *testBackend { HashRegContractAddress = common.BigToAddress(common.Big0).Hex()[2:] UrlHintContractAddress = common.BigToAddress(common.Big1).Hex()[2:] self := &testBackend{} self.contracts = make(map[string](map[string]string)) self.contracts[HashRegContractAddress] = make(map[string]string) key := storageAddress(storageMapping(storageIdx2Addr(1), codehash[:])) self.contracts[HashRegContractAddress][key] = hash.Hex() self.contracts[UrlHintContractAddress] = make(map[string]string)
func (args *NewFilterArgs) UnmarshalJSON(data []byte) error { type input struct { From *rpc.BlockNumber `json:"fromBlock"` ToBlock *rpc.BlockNumber `json:"toBlock"` Addresses interface{} `json:"address"` Topics interface{} `json:"topics"` } var raw input if err := json.Unmarshal(data, &raw); err != nil { return err } if raw.From == nil || raw.From.Int64() < 0 { args.FromBlock = rpc.LatestBlockNumber } else { args.FromBlock = *raw.From } if raw.ToBlock == nil || raw.ToBlock.Int64() < 0 { args.ToBlock = rpc.LatestBlockNumber } else { args.ToBlock = *raw.ToBlock } args.Addresses = []common.Address{} if raw.Addresses != nil { // raw.Address can contain a single address or an array of addresses var addresses []common.Address if strAddrs, ok := raw.Addresses.([]interface{}); ok { for i, addr := range strAddrs { if strAddr, ok := addr.(string); ok { if len(strAddr) >= 2 && strAddr[0] == '0' && (strAddr[1] == 'x' || strAddr[1] == 'X') { strAddr = strAddr[2:] } if decAddr, err := hex.DecodeString(strAddr); err == nil { addresses = append(addresses, common.BytesToAddress(decAddr)) } else { return fmt.Errorf("invalid address given") } } else { return fmt.Errorf("invalid address on index %d", i) } } } else if singleAddr, ok := raw.Addresses.(string); ok { if len(singleAddr) >= 2 && singleAddr[0] == '0' && (singleAddr[1] == 'x' || singleAddr[1] == 'X') { singleAddr = singleAddr[2:] } if decAddr, err := hex.DecodeString(singleAddr); err == nil { addresses = append(addresses, common.BytesToAddress(decAddr)) } else { return fmt.Errorf("invalid address given") } } else { return errors.New("invalid address(es) given") } args.Addresses = addresses } topicConverter := func(raw string) (common.Hash, error) { if len(raw) == 0 { return common.Hash{}, nil } if len(raw) >= 2 && raw[0] == '0' && (raw[1] == 'x' || raw[1] == 'X') { raw = raw[2:] } if decAddr, err := hex.DecodeString(raw); err == nil { return common.BytesToHash(decAddr), nil } return common.Hash{}, errors.New("invalid topic given") } // topics is an array consisting of strings or arrays of strings if raw.Topics != nil { topics, ok := raw.Topics.([]interface{}) if ok { parsedTopics := make([][]common.Hash, len(topics)) for i, topic := range topics { if topic == nil { parsedTopics[i] = []common.Hash{common.StringToHash("")} } else if strTopic, ok := topic.(string); ok { if t, err := topicConverter(strTopic); err != nil { return fmt.Errorf("invalid topic on index %d", i) } else { parsedTopics[i] = []common.Hash{t} } } else if arrTopic, ok := topic.([]interface{}); ok { parsedTopics[i] = make([]common.Hash, len(arrTopic)) for j := 0; j < len(parsedTopics[i]); i++ { if arrTopic[j] == nil { parsedTopics[i][j] = common.StringToHash("") } else if str, ok := arrTopic[j].(string); ok { if t, err := topicConverter(str); err != nil { return fmt.Errorf("invalid topic on index %d", i) } else { parsedTopics[i] = []common.Hash{t} } } else { return fmt.Errorf("topic[%d][%d] not a string", i, j) } } } else { return fmt.Errorf("topic[%d] invalid", i) } } args.Topics = parsedTopics } } return nil }