Browse Source

Add support for CodeAt

Taylor Gerring 10 years ago
parent
commit
961e4da7d8
3 changed files with 58 additions and 2 deletions
  1. 6 2
      rpc/json.go
  2. 15 0
      rpc/message.go
  3. 37 0
      rpc/packages.go

+ 6 - 2
rpc/json.go

@@ -72,8 +72,12 @@ func (self jsonWrapper) GetRequestReply(xeth *EthereumApi, req *RpcRequest, repl
 			return err
 		}
 		return xeth.GetTxCountAt(args, reply)
-	// case "eth_codeAt":
-	// return nil
+	case "eth_codeAt":
+		args, err := req.ToGetCodeAtArgs()
+		if err != nil {
+			return err
+		}
+		return xeth.GetCodeAt(args, reply)
 	case "eth_balanceAt":
 		args, err := req.ToGetBalanceArgs()
 		if err != nil {

+ 15 - 0
rpc/message.go

@@ -147,6 +147,21 @@ func (req *RpcRequest) ToGetBalanceArgs() (*GetBalanceArgs, error) {
 	return args, nil
 }
 
+func (req *RpcRequest) ToGetCodeAtArgs() (*GetCodeAtArgs, error) {
+	if len(req.Params) < 1 {
+		return nil, NewErrorResponse(ErrorArguments)
+	}
+
+	args := new(GetCodeAtArgs)
+	r := bytes.NewReader(req.Params[0])
+	err := json.NewDecoder(r).Decode(args)
+	if err != nil {
+		return nil, NewErrorResponse(ErrorDecodeArgs)
+	}
+	jsonlogger.DebugDetailf("%T %v", args, args)
+	return args, nil
+}
+
 // func NewSuccessRes(object JsonResponse) string {
 // 	e := SuccessRes{Error: false, Result: object}
 // 	res, err := json.Marshal(e)

+ 37 - 0
rpc/packages.go

@@ -149,6 +149,15 @@ func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *interface{}) err
 	return nil
 }
 
+func (p *EthereumApi) GetCodeAt(args *GetCodeAtArgs, reply *interface{}) error {
+	err := args.requirements()
+	if err != nil {
+		return err
+	}
+	*reply = p.pipe.CodeAt(args.Address)
+	return nil
+}
+
 type GetBlockArgs struct {
 	BlockNumber int32
 	Hash        string
@@ -236,6 +245,15 @@ type GetStorageArgs struct {
 	Key     string
 }
 
+func (obj *GetStorageArgs) UnmarshalJSON(b []byte) (err error) {
+	arg0 := ""
+	if err = json.Unmarshal(b, arg0); err == nil {
+		obj.Address = arg0
+		return
+	}
+	return NewErrorResponse(ErrorDecodeArgs)
+}
+
 func (a *GetStorageArgs) requirements() error {
 	if a.Address == "" {
 		return NewErrorResponse("GetStorageAt requires an 'address' value as argument")
@@ -316,3 +334,22 @@ type BalanceRes struct {
 	Balance string `json:"balance"`
 	Address string `json:"address"`
 }
+type GetCodeAtArgs struct {
+	Address string
+}
+
+func (obj *GetCodeAtArgs) UnmarshalJSON(b []byte) (err error) {
+	arg0 := ""
+	if err = json.Unmarshal(b, &arg0); err == nil {
+		obj.Address = arg0
+		return
+	}
+	return NewErrorResponse(ErrorDecodeArgs)
+}
+
+func (a *GetCodeAtArgs) requirements() error {
+	if a.Address == "" {
+		return NewErrorResponse("GetCodeAt requires an 'address' value as argument")
+	}
+	return nil
+}