-
Notifications
You must be signed in to change notification settings - Fork 145
/
request_json.go
136 lines (111 loc) · 4.17 KB
/
request_json.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package isc
import (
"encoding/json"
"strconv"
iotago "github.com/iotaledger/iota.go/v3"
"github.com/iotaledger/wasp/packages/kv/dict"
"github.com/iotaledger/wasp/packages/parameters"
)
type RequestJSON struct {
Allowance *AssetsJSON `json:"allowance" swagger:"required"`
CallTarget CallTargetJSON `json:"callTarget" swagger:"required"`
Assets *AssetsJSON `json:"fungibleTokens" swagger:"required"`
GasBudget string `json:"gasBudget,string" swagger:"required,desc(The gas budget (uint64 as string))"`
IsEVM bool `json:"isEVM" swagger:"required"`
IsOffLedger bool `json:"isOffLedger" swagger:"required"`
NFT *NFTJSON `json:"nft" swagger:"required"`
Params dict.JSONDict `json:"params" swagger:"required"`
RequestID string `json:"requestId" swagger:"required"`
SenderAccount string `json:"senderAccount" swagger:"required"`
TargetAddress string `json:"targetAddress" swagger:"required"`
}
func RequestToJSONObject(request Request) RequestJSON {
gasBudget, isEVM := request.GasBudget()
return RequestJSON{
Allowance: assetsToJSONObject(request.Allowance()),
CallTarget: callTargetToJSONObject(request.CallTarget()),
Assets: assetsToJSONObject(request.Assets()),
GasBudget: strconv.FormatUint(gasBudget, 10),
IsEVM: isEVM,
IsOffLedger: request.IsOffLedger(),
NFT: NFTToJSONObject(request.NFT()),
Params: request.Params().JSONDict(),
RequestID: request.ID().String(),
SenderAccount: request.SenderAccount().String(),
TargetAddress: request.TargetAddress().Bech32(parameters.L1().Protocol.Bech32HRP),
}
}
func RequestToJSON(req Request) ([]byte, error) {
return json.Marshal(RequestToJSONObject(req))
}
// ----------------------------------------------------------------------------
type AssetsJSON struct {
BaseTokens string `json:"baseTokens" swagger:"required,desc(The base tokens (uint64 as string))"`
NativeTokens []*NativeTokenJSON `json:"nativeTokens" swagger:"required"`
NFTs []string `json:"nfts" swagger:"required"`
}
func assetsToJSONObject(assets *Assets) *AssetsJSON {
if assets == nil {
return nil
}
ret := &AssetsJSON{
BaseTokens: strconv.FormatUint(assets.BaseTokens, 10),
NativeTokens: NativeTokensToJSONObject(assets.NativeTokens),
NFTs: make([]string, len(assets.NFTs)),
}
for k, v := range assets.NFTs {
ret.NFTs[k] = v.ToHex()
}
return ret
}
// ----------------------------------------------------------------------------
type NFTJSON struct {
ID string `json:"id" swagger:"required"`
Issuer string `json:"issuer" swagger:"required"`
Metadata string `json:"metadata" swagger:"required"`
Owner string `json:"owner" swagger:"required"`
}
func NFTToJSONObject(nft *NFT) *NFTJSON {
if nft == nil {
return nil
}
ownerString := ""
if nft.Owner != nil {
ownerString = nft.Owner.String()
}
return &NFTJSON{
ID: nft.ID.ToHex(),
Issuer: nft.Issuer.String(),
Metadata: iotago.EncodeHex(nft.Metadata),
Owner: ownerString,
}
}
// ----------------------------------------------------------------------------
type NativeTokenJSON struct {
ID string `json:"id" swagger:"required"`
Amount string `json:"amount" swagger:"required"`
}
func NativeTokenToJSONObject(token *iotago.NativeToken) *NativeTokenJSON {
return &NativeTokenJSON{
ID: token.ID.ToHex(),
Amount: token.Amount.String(),
}
}
func NativeTokensToJSONObject(tokens iotago.NativeTokens) []*NativeTokenJSON {
nativeTokens := make([]*NativeTokenJSON, len(tokens))
for k, v := range tokens {
nativeTokens[k] = NativeTokenToJSONObject(v)
}
return nativeTokens
}
// ----------------------------------------------------------------------------
type CallTargetJSON struct {
ContractHName string `json:"contractHName" swagger:"desc(The contract name as HName (Hex)),required"`
FunctionHName string `json:"functionHName" swagger:"desc(The function name as HName (Hex)),required"`
}
func callTargetToJSONObject(target CallTarget) CallTargetJSON {
return CallTargetJSON{
ContractHName: target.Contract.String(),
FunctionHName: target.EntryPoint.String(),
}
}