-
Notifications
You must be signed in to change notification settings - Fork 205
/
vlocalchain.go
109 lines (90 loc) · 2.54 KB
/
vlocalchain.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package vlocalchain
import (
"context"
"encoding/json"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/gogo/protobuf/jsonpb"
"github.com/Agoric/agoric-sdk/golang/cosmos/vm"
"github.com/Agoric/agoric-sdk/golang/cosmos/x/vlocalchain/keeper"
"github.com/Agoric/agoric-sdk/golang/cosmos/x/vlocalchain/types"
)
var _ vm.PortHandler = (*portHandler)(nil)
type portHandler struct {
keeper keeper.Keeper
}
type portMessage struct {
Type string `json:"type"`
Address string `json:"address,omitempty"`
Messages json.RawMessage `json:"messages,omitempty"`
}
func NewReceiver(keeper keeper.Keeper) portHandler {
return portHandler{keeper: keeper}
}
func (h portHandler) Receive(cctx context.Context, str string) (ret string, err error) {
var msg portMessage
err = json.Unmarshal([]byte(str), &msg)
if err != nil {
return
}
switch msg.Type {
case "VLOCALCHAIN_ALLOCATE_ADDRESS":
addr := h.keeper.AllocateAddress(cctx)
var bz []byte
if bz, err = json.Marshal(addr.String()); err != nil {
return
}
ret = string(bz)
case "VLOCALCHAIN_QUERY_MANY":
// Copy the JSON messages string into a CosmosTx object so we can
// deserialize it with just proto3 JSON.
cosmosTxBz := []byte(`{"messages":` + string(msg.Messages) + `}`)
var qms []types.QueryRequest
qms, err = h.keeper.DeserializeRequests(cosmosTxBz)
if err != nil {
return
}
// We need jsonpb for its access to the global registry.
marshaller := jsonpb.Marshaler{EmitDefaults: true, OrigName: true}
var s string
resps := make([]json.RawMessage, len(qms))
for i, qm := range qms {
var qr *types.QueryResponse
qr, err = h.keeper.Query(cctx, qm)
if err != nil {
return
}
if s, err = marshaller.MarshalToString(qr); err != nil {
return
}
resps[i] = []byte(s)
}
var bz []byte
if bz, err = json.Marshal(resps); err != nil {
return
}
ret = string(bz)
case "VLOCALCHAIN_EXECUTE_TX":
origCtx := sdk.UnwrapSDKContext(cctx)
// Copy the JSON messages string into a CosmosTx object so we can
// deserialize it with just proto3 JSON.
cosmosTxBz := []byte(`{"messages":` + string(msg.Messages) + `}`)
var msgs []sdk.Msg
if msgs, err = h.keeper.DeserializeTxMessages(cosmosTxBz); err != nil {
return
}
var resps []interface{}
resps, err = h.keeper.ExecuteTx(origCtx, msg.Address, msgs)
if err != nil {
return
}
var bz []byte
if bz, err = json.Marshal(resps); err != nil {
return
}
ret = string(bz)
default:
err = fmt.Errorf("unrecognized message type %s", msg.Type)
}
return
}