1
+ import { Address , Cell } from "@ton/core" ;
1
2
import BigNumber from "bignumber.js" ;
2
- import type { RawTonTransaction , TonTransaction } from "./types" ;
3
+ import type {
4
+ RawTonTransaction ,
5
+ TonPayloadFormat ,
6
+ TonPayloadFormatRaw ,
7
+ TonTransaction ,
8
+ } from "./types" ;
3
9
4
10
export const serializeTonTransaction = ( {
5
11
amount,
6
12
recipient,
7
13
family,
8
14
fees,
9
15
comment,
16
+ payload,
10
17
} : TonTransaction ) : RawTonTransaction => ( {
11
18
amount : amount . toString ( ) ,
12
19
recipient,
13
20
family,
14
21
fees : fees . toString ( ) ,
15
22
comment,
23
+ payload : payload ? toTransactionPayloadRaw ( payload ) : undefined ,
16
24
} ) ;
17
25
18
26
export const deserializeTonTransaction = ( {
@@ -21,10 +29,238 @@ export const deserializeTonTransaction = ({
21
29
family,
22
30
fees,
23
31
comment,
32
+ payload,
24
33
} : RawTonTransaction ) : TonTransaction => ( {
25
34
amount : new BigNumber ( amount ) ,
26
35
recipient,
27
36
family,
28
37
fees : new BigNumber ( fees ) ,
29
38
comment,
39
+ payload : payload ? fromTransactionPayloadRaw ( payload ) : undefined ,
30
40
} ) ;
41
+
42
+ const fromTransactionPayloadRaw = (
43
+ payload : TonPayloadFormatRaw ,
44
+ ) : TonPayloadFormat => {
45
+ switch ( payload . type ) {
46
+ case "unsafe" :
47
+ return {
48
+ type : payload . type ,
49
+ message : Cell . fromBase64 ( payload . message ) ,
50
+ } ;
51
+ case "jetton-transfer" :
52
+ return {
53
+ type : payload . type ,
54
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
55
+ amount : BigInt ( payload . amount ) ,
56
+ destination : Address . parse ( payload . destination ) ,
57
+ responseDestination : Address . parse ( payload . responseDestination ) ,
58
+ customPayload : payload . customPayload
59
+ ? Cell . fromBase64 ( payload . customPayload )
60
+ : null ,
61
+ forwardAmount : BigInt ( payload . forwardAmount ) ,
62
+ forwardPayload : payload . forwardPayload
63
+ ? Cell . fromBase64 ( payload . forwardPayload )
64
+ : null ,
65
+ knownJetton : payload . knownJetton ,
66
+ } ;
67
+ case "nft-transfer" :
68
+ return {
69
+ type : payload . type ,
70
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
71
+ newOwner : Address . parse ( payload . newOwner ) ,
72
+ responseDestination : Address . parse ( payload . responseDestination ) ,
73
+ customPayload : payload . customPayload
74
+ ? Cell . fromBase64 ( payload . customPayload )
75
+ : null ,
76
+ forwardAmount : BigInt ( payload . forwardAmount ) ,
77
+ forwardPayload : payload . forwardPayload
78
+ ? Cell . fromBase64 ( payload . forwardPayload )
79
+ : null ,
80
+ } ;
81
+ case "jetton-burn" :
82
+ return {
83
+ type : payload . type ,
84
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
85
+ amount : BigInt ( payload . amount ) ,
86
+ responseDestination : Address . parse ( payload . responseDestination ) ,
87
+ // Handle customPayload could be a buffer, we should try/catch the fromBase64
88
+ customPayload : payload . customPayload
89
+ ? Cell . fromBase64 ( payload . customPayload )
90
+ : null ,
91
+ } ;
92
+ case "add-whitelist" :
93
+ case "single-nominator-change-validator" :
94
+ return {
95
+ type : payload . type ,
96
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
97
+ address : Address . parse ( payload . address ) ,
98
+ } ;
99
+ case "single-nominator-withdraw" :
100
+ return {
101
+ type : payload . type ,
102
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
103
+ amount : BigInt ( payload . amount ) ,
104
+ } ;
105
+ case "tonstakers-deposit" :
106
+ return {
107
+ type : payload . type ,
108
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
109
+ appId : payload . appId ? BigInt ( payload . appId ) : null ,
110
+ } ;
111
+ case "vote-for-proposal" :
112
+ return {
113
+ type : payload . type ,
114
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
115
+ votingAddress : Address . parse ( payload . votingAddress ) ,
116
+ expirationDate : payload . expirationDate ,
117
+ vote : payload . vote ,
118
+ needConfirmation : payload . needConfirmation ,
119
+ } ;
120
+ case "change-dns-record" :
121
+ return {
122
+ type : payload . type ,
123
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
124
+ record :
125
+ payload . record . type === "wallet"
126
+ ? {
127
+ type : payload . record . type ,
128
+ value : payload . record . value
129
+ ? {
130
+ address : Address . parse ( payload . record . value . address ) ,
131
+ capabilities : payload . record . value . capabilities ,
132
+ }
133
+ : null ,
134
+ }
135
+ : {
136
+ type : payload . record . type ,
137
+ key : Buffer . from ( payload . record . key , "hex" ) ,
138
+ value : payload . record . value
139
+ ? Cell . fromBase64 ( payload . record . value )
140
+ : null ,
141
+ } ,
142
+ } ;
143
+ case "token-bridge-pay-swap" :
144
+ return {
145
+ type : payload . type ,
146
+ queryId : payload . queryId ? BigInt ( payload . queryId ) : null ,
147
+ swapId : Buffer . from ( payload . swapId , "hex" ) ,
148
+ } ;
149
+ case "comment" :
150
+ return payload ;
151
+ }
152
+ } ;
153
+
154
+ const toTransactionPayloadRaw = (
155
+ payload : TonPayloadFormat ,
156
+ ) : TonPayloadFormatRaw => {
157
+ switch ( payload . type ) {
158
+ case "unsafe" :
159
+ return {
160
+ type : payload . type ,
161
+ message : payload . message . toBoc ( ) . toString ( "base64" ) ,
162
+ } ;
163
+ case "jetton-transfer" :
164
+ return {
165
+ type : payload . type ,
166
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
167
+ amount : payload . amount . toString ( ) ,
168
+ destination : payload . destination . toRawString ( ) ,
169
+ responseDestination : payload . responseDestination . toRawString ( ) ,
170
+ customPayload : payload . customPayload
171
+ ? payload . customPayload . toBoc ( ) . toString ( "base64" )
172
+ : null ,
173
+ forwardAmount : payload . forwardAmount . toString ( ) ,
174
+ forwardPayload : payload . forwardPayload
175
+ ? payload . forwardPayload . toBoc ( ) . toString ( "base64" )
176
+ : null ,
177
+ knownJetton : payload . knownJetton ,
178
+ } ;
179
+ case "nft-transfer" :
180
+ return {
181
+ type : payload . type ,
182
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
183
+ newOwner : payload . newOwner . toRawString ( ) ,
184
+ responseDestination : payload . responseDestination . toRawString ( ) ,
185
+ customPayload : payload . customPayload
186
+ ? payload . customPayload . toBoc ( ) . toString ( "base64" )
187
+ : null ,
188
+ forwardAmount : payload . forwardAmount . toString ( ) ,
189
+ forwardPayload : payload . forwardPayload
190
+ ? payload . forwardPayload . toBoc ( ) . toString ( "base64" )
191
+ : null ,
192
+ } ;
193
+ case "jetton-burn" :
194
+ return {
195
+ type : payload . type ,
196
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
197
+ amount : payload . amount . toString ( ) ,
198
+ responseDestination : payload . responseDestination . toRawString ( ) ,
199
+ customPayload :
200
+ payload . customPayload && "toBoc" in payload . customPayload
201
+ ? payload . customPayload . toBoc ( ) . toString ( "base64" )
202
+ : payload . customPayload
203
+ ? payload . customPayload . toString ( "hex" )
204
+ : null ,
205
+ } ;
206
+ case "add-whitelist" :
207
+ case "single-nominator-change-validator" :
208
+ return {
209
+ type : payload . type ,
210
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
211
+ address : payload . address . toRawString ( ) ,
212
+ } ;
213
+ case "single-nominator-withdraw" :
214
+ return {
215
+ type : payload . type ,
216
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
217
+ amount : payload . amount . toString ( ) ,
218
+ } ;
219
+ case "tonstakers-deposit" :
220
+ return {
221
+ type : payload . type ,
222
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
223
+ appId : payload . appId ? payload . appId . toString ( ) : null ,
224
+ } ;
225
+ case "vote-for-proposal" :
226
+ return {
227
+ type : payload . type ,
228
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
229
+ votingAddress : payload . votingAddress . toRawString ( ) ,
230
+ expirationDate : payload . expirationDate ,
231
+ vote : payload . vote ,
232
+ needConfirmation : payload . needConfirmation ,
233
+ } ;
234
+ case "change-dns-record" :
235
+ return {
236
+ type : payload . type ,
237
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
238
+ record :
239
+ payload . record . type === "wallet"
240
+ ? {
241
+ type : payload . record . type ,
242
+ value : payload . record . value
243
+ ? {
244
+ address : payload . record . value . address . toRawString ( ) ,
245
+ capabilities : payload . record . value . capabilities ,
246
+ }
247
+ : null ,
248
+ }
249
+ : {
250
+ type : payload . record . type ,
251
+ key : payload . record . key . toString ( "hex" ) ,
252
+ value : payload . record . value
253
+ ? payload . record . value . toBoc ( ) . toString ( "base64" )
254
+ : null ,
255
+ } ,
256
+ } ;
257
+ case "token-bridge-pay-swap" :
258
+ return {
259
+ type : payload . type ,
260
+ queryId : payload . queryId ? payload . queryId . toString ( ) : null ,
261
+ swapId : payload . swapId . toString ( "hex" ) ,
262
+ } ;
263
+ case "comment" :
264
+ return payload ;
265
+ }
266
+ } ;
0 commit comments