@layerzerolabs/layerzero-v2-ton 3.0.27 → 3.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/build/ActionsSerde.test.compiled.json +1 -0
  3. package/build/AllStorages.compiled.json +1 -1
  4. package/build/AllStorages.test.compiled.json +1 -1
  5. package/build/BaseContract.test.compiled.json +1 -1
  6. package/build/Channel.compiled.json +1 -1
  7. package/build/Channel.permissions.test.compiled.json +1 -1
  8. package/build/ChannelBurn.test.compiled.json +1 -1
  9. package/build/ChannelCommitPacket.test.compiled.json +1 -1
  10. package/build/ChannelConfig.test.compiled.json +1 -1
  11. package/build/ChannelInitialize.test.compiled.json +1 -1
  12. package/build/ChannelMsglibIntegration.test.compiled.json +1 -1
  13. package/build/ChannelMsglibSendCallback.test.compiled.json +1 -1
  14. package/build/ChannelNilify.test.compiled.json +1 -1
  15. package/build/ChannelReceive.test.compiled.json +1 -1
  16. package/build/ChannelReceiveCallback.test.compiled.json +1 -1
  17. package/build/ChannelReceiveView.test.compiled.json +1 -1
  18. package/build/ChannelSend.test.compiled.json +1 -1
  19. package/build/ChannelSerde.test.compiled.json +1 -0
  20. package/build/Classlib.test.compiled.json +1 -1
  21. package/build/ComputeDataSizeGas.test.compiled.json +1 -1
  22. package/build/Connection.compiled.json +1 -1
  23. package/build/Controller.assertions.test.compiled.json +1 -1
  24. package/build/Controller.compiled.json +1 -1
  25. package/build/Controller.permissions.test.compiled.json +1 -1
  26. package/build/Controller.test.compiled.json +1 -1
  27. package/build/Counter.compiled.json +1 -1
  28. package/build/Counter.permissions.test.compiled.json +1 -1
  29. package/build/Counter.setters.test.compiled.json +1 -1
  30. package/build/Counter.test.compiled.json +1 -1
  31. package/build/Dvn.compiled.json +1 -1
  32. package/build/Dvn.test.compiled.json +1 -1
  33. package/build/DvnFeeLib.compiled.json +1 -1
  34. package/build/DvnFeeLibSerde.test.compiled.json +1 -0
  35. package/build/DvnPermissions.test.compiled.json +1 -1
  36. package/build/DvnSerde.test.compiled.json +1 -0
  37. package/build/Endpoint.compiled.json +1 -1
  38. package/build/Endpoint.permissions.test.compiled.json +1 -1
  39. package/build/Endpoint.test.compiled.json +1 -1
  40. package/build/EndpointSerde.test.compiled.json +1 -0
  41. package/build/EndpointSetEpConfigDefaults.test.compiled.json +1 -1
  42. package/build/Executor.compiled.json +1 -1
  43. package/build/Executor.test.compiled.json +1 -1
  44. package/build/ExecutorFeeLib.compiled.json +1 -1
  45. package/build/ExecutorFeeLibSerde.test.compiled.json +1 -0
  46. package/build/ExecutorPermissions.test.compiled.json +1 -1
  47. package/build/ExecutorSerde.test.compiled.json +1 -0
  48. package/build/LzClasses.test.compiled.json +1 -1
  49. package/build/LzClassesSerde.test.compiled.json +1 -0
  50. package/build/LzUtil.test.compiled.json +1 -1
  51. package/build/MsgData.test.compiled.json +1 -1
  52. package/build/MsgDataSerde.test.compiled.json +1 -0
  53. package/build/MsglibPacketCodec.test.compiled.json +1 -1
  54. package/build/PipelinedOutOfOrder.test.compiled.json +1 -1
  55. package/build/PipelinedOutOfOrderSerde.test.compiled.json +1 -0
  56. package/build/PriceFeedCache.compiled.json +1 -1
  57. package/build/PriceFeedCache.test.compiled.json +1 -1
  58. package/build/PriceFeedCache.test.permissions.compiled.json +1 -1
  59. package/build/PriceFeedCacheSerde.test.compiled.json +1 -0
  60. package/build/PriceFeedFeeLibSerde.test.compiled.json +1 -0
  61. package/build/Proxy.compiled.json +1 -1
  62. package/build/Proxy.permissions.test.compiled.json +1 -1
  63. package/build/Proxy.test.compiled.json +1 -1
  64. package/build/SmlConnection.compiled.json +1 -1
  65. package/build/SmlConnection.permissions.test.compiled.json +1 -1
  66. package/build/SmlConnection.test.compiled.json +1 -1
  67. package/build/SmlManager.compiled.json +1 -1
  68. package/build/SmlManager.permissions.test.compiled.json +1 -1
  69. package/build/SmlManager.test.compiled.json +1 -1
  70. package/build/Uln.compiled.json +1 -1
  71. package/build/Uln.test.compiled.json +1 -1
  72. package/build/UlnConnection.compiled.json +1 -1
  73. package/build/UlnConnection.test.compiled.json +1 -1
  74. package/build/UlnConnectionPermissions.test.compiled.json +1 -1
  75. package/build/UlnConnectionSerde.test.compiled.json +1 -0
  76. package/build/UlnManagement.test.compiled.json +1 -1
  77. package/build/UlnManager.compiled.json +1 -1
  78. package/build/UlnManager.test.compiled.json +1 -1
  79. package/build/UlnManagerPermissions.test.compiled.json +1 -1
  80. package/build/UlnManagerUtil.test.compiled.json +1 -1
  81. package/build/UlnMsgDataSerde.test.compiled.json +1 -0
  82. package/build/UlnPermissions.test.compiled.json +1 -1
  83. package/build/UlnReceiveConfig.test.compiled.json +1 -1
  84. package/build/UlnSend.test.compiled.json +1 -1
  85. package/build/UlnSendConfig.test.compiled.json +1 -1
  86. package/build/UlnSendWithDvnFeeLib.test.compiled.json +1 -1
  87. package/build/UlnSendWithExecFeeLib.test.compiled.json +1 -1
  88. package/build/UlnSendWorkerFactory.test.compiled.json +1 -1
  89. package/build/UlnSerde.test.compiled.json +1 -0
  90. package/build/UlnUtil.test.compiled.json +1 -1
  91. package/build/WorkerCore.test.compiled.json +1 -1
  92. package/build/WorkerCoreMsgDataSerde.test.compiled.json +1 -0
  93. package/build/WorkerCoreSerde.test.compiled.json +1 -0
  94. package/build/badFeeLib1.test.compiled.json +1 -1
  95. package/build/badFeeLib10.test.compiled.json +1 -1
  96. package/build/badFeeLib11.test.compiled.json +1 -1
  97. package/build/badFeeLib12.test.compiled.json +1 -1
  98. package/build/badFeeLib2.test.compiled.json +1 -1
  99. package/build/badFeeLib3.test.compiled.json +1 -1
  100. package/build/badFeeLib4.test.compiled.json +1 -1
  101. package/build/badFeeLib5.test.compiled.json +1 -1
  102. package/build/badFeeLib6.test.compiled.json +1 -1
  103. package/build/badFeeLib7.test.compiled.json +1 -1
  104. package/build/badFeeLib8.test.compiled.json +1 -1
  105. package/build/badFeeLib9.test.compiled.json +1 -1
  106. package/package.json +2 -1
  107. package/src/classes/lz/EpConfig.fc +90 -23
  108. package/src/classes/lz/MsglibInfo.fc +32 -5
  109. package/src/classes/lz/Packet.fc +109 -48
  110. package/src/classes/lz/Path.fc +55 -4
  111. package/src/classes/lz/ReceiveEpConfig.fc +36 -5
  112. package/src/classes/lz/SendEpConfig.fc +55 -5
  113. package/src/classes/msgdata/AddMsglib.fc +11 -0
  114. package/src/classes/msgdata/ChannelNonceInfo.fc +20 -0
  115. package/src/classes/msgdata/CoinsAmount.fc +8 -0
  116. package/src/classes/msgdata/Deploy.fc +19 -0
  117. package/src/classes/msgdata/ExtendedMd.fc +52 -1
  118. package/src/classes/msgdata/LzReceivePrepare.fc +21 -1
  119. package/src/classes/msgdata/LzReceiveStatus.fc +72 -1
  120. package/src/classes/msgdata/LzSend.fc +143 -24
  121. package/src/classes/msgdata/MdAddress.fc +42 -0
  122. package/src/classes/msgdata/MdEid.fc +8 -0
  123. package/src/classes/msgdata/MdObj.fc +32 -0
  124. package/src/classes/msgdata/MessagingReceipt.fc +34 -1
  125. package/src/classes/msgdata/MsglibSendCallback.fc +82 -0
  126. package/src/classes/msgdata/Nonce.fc +30 -0
  127. package/src/classes/msgdata/OptionsV1.fc +21 -1
  128. package/src/classes/msgdata/OptionsV2.fc +27 -0
  129. package/src/classes/msgdata/PacketId.fc +24 -0
  130. package/src/classes/msgdata/PacketSent.fc +35 -1
  131. package/src/classes/msgdata/SetAddress.fc +7 -0
  132. package/src/classes/msgdata/SetEpConfig.fc +17 -0
  133. package/src/funC++/actions/event.fc +17 -2
  134. package/src/funC++/actions/utils.fc +2 -2
  135. package/src/funC++/classlib.fc +33 -43
  136. package/src/funC++/constants.fc +28 -28
  137. package/src/funC++/dataStructures/PipelinedOutOfOrder.fc +75 -59
  138. package/src/funC++/stdlib.fc +26 -11
  139. package/src/funC++/testutils.fc +2 -2
  140. package/src/funC++/txnContext.fc +14 -14
  141. package/src/funC++/utils.fc +97 -1
  142. package/src/protocol/channel/handler.fc +247 -189
  143. package/src/protocol/channel/storage.fc +206 -1
  144. package/src/protocol/controller/handler.fc +35 -17
  145. package/src/protocol/controller/main.fc +1 -1
  146. package/src/protocol/core/abstract/protocolHandler.fc +11 -21
  147. package/src/protocol/core/baseStorage.fc +24 -0
  148. package/src/protocol/endpoint/handler.fc +99 -57
  149. package/src/protocol/endpoint/storage.fc +69 -5
  150. package/src/protocol/msglibs/BytesEncoder.fc +11 -10
  151. package/src/protocol/msglibs/simpleMsglib/smlManager/handler.fc +1 -4
  152. package/src/protocol/msglibs/ultralightnode/feeLibInterface.fc +1 -0
  153. package/src/protocol/msglibs/ultralightnode/msgdata/Attestation.fc +7 -8
  154. package/src/protocol/msglibs/ultralightnode/msgdata/DvnFeesPaidEvent.fc +20 -0
  155. package/src/protocol/msglibs/ultralightnode/msgdata/ExecutorFeePaidEvent.fc +15 -0
  156. package/src/protocol/msglibs/ultralightnode/msgdata/InitUln.fc +1 -1
  157. package/src/protocol/msglibs/ultralightnode/msgdata/InitUlnConnection.fc +1 -1
  158. package/src/protocol/msglibs/ultralightnode/msgdata/SetAdminWorkerAddresses.fc +6 -0
  159. package/src/protocol/msglibs/ultralightnode/msgdata/UlnEvents.fc +20 -0
  160. package/src/protocol/msglibs/ultralightnode/msgdata/UlnReceiveConfig.fc +114 -28
  161. package/src/protocol/msglibs/ultralightnode/msgdata/UlnSend.fc +51 -1
  162. package/src/protocol/msglibs/ultralightnode/msgdata/UlnSendConfig.fc +1 -1
  163. package/src/protocol/msglibs/ultralightnode/msgdata/UlnVerification.fc +10 -0
  164. package/src/protocol/msglibs/ultralightnode/msgdata/UlnWorkerFeelibBytecode.fc +6 -0
  165. package/src/protocol/msglibs/ultralightnode/msgdata/UlnWorkerFeelibInfo.fc +51 -1
  166. package/src/protocol/msglibs/ultralightnode/msgdata/VerificationStatus.fc +15 -0
  167. package/src/protocol/msglibs/ultralightnode/uln/handler.fc +84 -107
  168. package/src/protocol/msglibs/ultralightnode/uln/storage.fc +77 -1
  169. package/src/protocol/msglibs/ultralightnode/ulnConnection/handler.fc +92 -66
  170. package/src/protocol/msglibs/ultralightnode/ulnConnection/storage.fc +113 -6
  171. package/src/protocol/msglibs/ultralightnode/ulnConnection/utils.fc +6 -91
  172. package/src/protocol/msglibs/ultralightnode/ulnManager/handler.fc +55 -31
  173. package/src/protocol/msglibs/ultralightnode/workerFeeLibs/dvnFeeLib/handler.fc +13 -9
  174. package/src/protocol/msglibs/ultralightnode/workerFeeLibs/dvnFeeLib/storage.fc +23 -0
  175. package/src/protocol/msglibs/ultralightnode/workerFeeLibs/executorFeeLib/handler.fc +63 -27
  176. package/src/protocol/msglibs/ultralightnode/workerFeeLibs/executorFeeLib/storage.fc +19 -0
  177. package/src/protocol/msglibs/ultralightnode/workerFeeLibs/priceFeedFeeLib/storage.fc +55 -6
  178. package/src/workers/core/abstract/workerHandler.fc +20 -19
  179. package/src/workers/core/interface.fc +2 -1
  180. package/src/workers/core/workerCoreStorage.fc +16 -1
  181. package/src/workers/dvn/handler.fc +67 -26
  182. package/src/workers/dvn/storage.fc +15 -2
  183. package/src/workers/executor/handler.fc +18 -6
  184. package/src/workers/executor/interface.fc +1 -0
  185. package/src/workers/executor/storage.fc +8 -1
  186. package/src/workers/msgdata/DropEvent.fc +18 -0
  187. package/src/workers/msgdata/ExecuteParams.fc +66 -3
  188. package/src/workers/msgdata/NativeDrop.fc +4 -0
  189. package/src/workers/msgdata/SetDict.fc +6 -4
  190. package/src/workers/msgdata/SetQuorum.fc +4 -2
  191. package/src/workers/msgdata/SignedRequest.fc +8 -0
  192. package/src/workers/priceFeedCache/handler.fc +21 -27
  193. package/src/workers/priceFeedCache/storage.fc +16 -1
  194. package/src/workers/proxy/handler.fc +2 -1
  195. package/src/workers/proxy/storage.fc +1 -1
  196. package/tests/baseContractTest.fc +2 -6
  197. package/tests/baseSerdeTest.fc +117 -0
  198. package/tests/testMain.fc +2 -2
  199. package/src/classes/msgdata/Amount.fc +0 -16
  200. package/src/funC++/actions/destroy.fc +0 -27
@@ -1,31 +1,34 @@
1
1
  #include "../../funC++/classlib.fc";
2
+ #include "../lz/Packet.fc";
2
3
 
3
4
  ;; required storage name
4
5
  const int md::LzSend::NAME = "lzSend"u;
5
6
 
6
7
  ;; field names
7
8
  const int md::LzSend::sendRequestId = 0;
8
- const int md::LzSend::sendMsglib = 1;
9
- const int md::LzSend::sendMsglibConnection = 2;
10
- const int md::LzSend::packet = 3;
11
- const int md::LzSend::nativeFee = 4;
12
- const int md::LzSend::zroFee = 5;
13
- const int md::LzSend::extraOptions = 6;
14
- const int md::LzSend::enforcedOptions = 7;
15
- const int md::LzSend::callbackData = 8;
9
+ const int md::LzSend::sendMsglibManager = 1;
10
+ const int md::LzSend::sendMsglib = 2;
11
+ const int md::LzSend::sendMsglibConnection = 3;
12
+ const int md::LzSend::packet = 4;
13
+ const int md::LzSend::nativeFee = 5;
14
+ const int md::LzSend::zroFee = 6;
15
+ const int md::LzSend::extraOptions = 7;
16
+ const int md::LzSend::enforcedOptions = 8;
17
+ const int md::LzSend::callbackData = 9;
16
18
 
17
19
  cell md::LzSend::New(
18
- int nativeFee,
19
- int zroFee,
20
- cell $extraOptions,
21
- cell $enforcedOptions,
22
- cell $packet,
23
- cell callbackData
20
+ int nativeFee,
21
+ int zroFee,
22
+ cell $extraOptions,
23
+ cell $enforcedOptions,
24
+ cell $packet,
25
+ cell callbackData
24
26
  ) inline method_id {
25
27
  return cl::declare(
26
28
  md::LzSend::NAME,
27
29
  unsafeTuple([
28
30
  [cl::t::uint64, 0], ;; md::LzSend::sendRequestId
31
+ [cl::t::address, NULLADDRESS], ;; md::LzSend::sendMsglibManager
29
32
  [cl::t::address, NULLADDRESS], ;; md::lzSend::sendMsglib
30
33
  [cl::t::address, NULLADDRESS], ;; md::lzSend::sendMsglibConnection
31
34
  [cl::t::objRef, $packet], ;; md::LzSend::packet
@@ -38,21 +41,137 @@ cell md::LzSend::New(
38
41
  );
39
42
  }
40
43
 
41
- const md::lzSend::requestInfoWidth = _HEADER_WIDTH + 64 + 256 + 256;
42
- ;; low-level hacking to set these 3 fields in LzSend
43
- ;; saves about 7000 gas
44
- cell md::lzSend::fillRequestInfo(
45
- cell $lzSend,
44
+ const int md::LzSend::_headerPostNameBits = 180;
45
+ const int md::LzSend::_headerFillerBits = _HEADER_WIDTH - (md::LzSend::_headerPostNameBits + _NAME_WIDTH);
46
+ const int md::LzSend::_headerInfo = 582890735024998957421269964955452773563747974476099581;
47
+
48
+ ;; ========================== Object Builders ==========================
49
+
50
+ ;; this function is unused by the protocol but will be used by OApps
51
+ cell md::LzSend::build(
52
+ int nativeFee,
53
+ int zroFee,
54
+ cell $extraOptions,
55
+ cell $enforcedOptions,
56
+ cell $packet,
57
+ cell callbackData
58
+ ) impure inline {
59
+ return begin_cell()
60
+ .store_uint(md::LzSend::NAME, _NAME_WIDTH)
61
+ .store_uint(md::LzSend::_headerInfo, md::LzSend::_headerPostNameBits)
62
+ .store_ones(md::LzSend::_headerFillerBits)
63
+ .store_uint64(0) ;; sendRequestId
64
+ .store_uint256(NULLADDRESS) ;; sendMsglibManager
65
+ .store_uint256(NULLADDRESS) ;; sendMsglib
66
+ .store_ref($packet)
67
+ .store_ref($extraOptions)
68
+ .store_ref(
69
+ begin_cell()
70
+ .store_uint256(NULLADDRESS) ;; sendMsglibConnection
71
+ .store_uint128(nativeFee) ;; nativeFee
72
+ .store_uint128(zroFee) ;; zroFee
73
+ .store_ref($enforcedOptions) ;; enforcedOptions
74
+ .store_ref(callbackData) ;; callbackData
75
+ .end_cell()
76
+ )
77
+ .end_cell();
78
+ }
79
+
80
+ ;; ====================== Object Accessors =====================
81
+
82
+ ;; in root cell
83
+ const int md::LzSend::_sendRequestIdffset = _HEADER_WIDTH;
84
+ const int md::LzSend::_sendMsglibManagerOffset = md::LzSend::_sendRequestIdffset + 64;
85
+ const int md::LzSend::_sendMsglibOffset = md::LzSend::_sendMsglibManagerOffset + 256;
86
+
87
+ ;; in ref[2]
88
+ const int md::LzSend::_sendMsglibConnectionOffset = 0;
89
+ const int md::LzSend::_nativeFeeOffset = md::LzSend::_sendMsglibConnectionOffset + 256;
90
+ const int md::LzSend::_zroFeeOffset = md::LzSend::_nativeFeeOffset + 128;
91
+
92
+ int md::LzSend::getSendMsglib(cell $self) impure inline {
93
+ return $self.cellPreloadAddressAt(md::LzSend::_sendMsglibOffset);
94
+ }
95
+
96
+ cell md::LzSend::getPacket(cell $self) impure inline {
97
+ return $self.cellPreloadRefAt(0);
98
+ }
99
+
100
+ ;; gets the path from the packet inside the LzSend
101
+ cell md::LzSend::getPath(cell $self) impure inline {
102
+ return $self.cellPreloadRefAt(0).cellPreloadRefAt(0);
103
+ }
104
+
105
+ ;; (requestId, nativeFee, zroFee, extraOptions, enforcedOptions)
106
+ (int, int, int, cell, cell) md::LzSend::deserializeSendCallback(cell $self) impure inline {
107
+ slice selfSlice = $self.begin_parse();
108
+ slice ref2Slice = selfSlice.preloadRefSliceAt(2);
109
+ return (
110
+ selfSlice.preloadUint64At(md::LzSend::_sendRequestIdffset),
111
+ ref2Slice.preloadCoinsAt(md::LzSend::_nativeFeeOffset),
112
+ ref2Slice.preloadCoinsAt(md::LzSend::_zroFeeOffset),
113
+ selfSlice.preloadRefAt(1),
114
+ ref2Slice.preloadRefAt(0)
115
+ );
116
+ }
117
+
118
+ ;; (packet, extraOptions, enforcedOptions)
119
+ (cell, cell, cell) md::LzSend::getQuoteInformation(cell $self) impure inline {
120
+ return (
121
+ $self.cellPreloadRefAt(0),
122
+ $self.cellPreloadRefAt(1),
123
+ $self.cellPreloadRefAt(2).cellPreloadRefAt(0)
124
+ );
125
+ }
126
+
127
+ int md::LzSend::getSendMsglibManager(cell $self) impure inline {
128
+ return $self.cellPreloadAddressAt(md::LzSend::_sendMsglibManagerOffset);
129
+ }
130
+
131
+ ;; ====================== Object Composite Modifiers =====================
132
+
133
+ const int md::lzSend::requestInfoWidth = _HEADER_WIDTH + 64 + 256 + 256;
134
+ ;; Can't easily store a slice constant because the header isn't byte-aligned
135
+ const int md::lzSend::_headerInfoBits = _BASIC_HEADER_WIDTH + (_FIELD_INFO_WIDTH * 10);
136
+ const int md::lzSend::_headerPrefix = 11424049401754228397633815938683071207390004427712457772775726065407;
137
+ const int md::lzSend::_headerSuffix = 17331160549995323848587739135;
138
+ const int md::lzSend::_headerTrailingBits = _HEADER_WIDTH - 256;
139
+
140
+ cell md::LzSend::fillRequestInfo(
141
+ cell $self,
46
142
  int requestId,
143
+ int sendMsglibManager,
47
144
  int sendMsglib,
48
145
  int sendMsglibConnection
49
- ) inline method_id {
50
- slice lzSendSlice = $lzSend.begin_parse();
146
+ ) impure inline method_id {
147
+ slice selfslice = $self.begin_parse();
148
+ slice ref2Slice = selfslice.preloadRefSliceAt(2);
149
+
150
+ ;; Fill in the fields AND overwrite the entire header to match the expected format
51
151
  return begin_cell()
52
- .store_slice(lzSendSlice.scutfirst(_HEADER_WIDTH, 0))
152
+ .store_uint256(md::lzSend::_headerPrefix)
153
+ .store_uint(md::lzSend::_headerSuffix, md::lzSend::_headerTrailingBits)
154
+ .store_slice(selfslice.scutfirst(0, 2))
53
155
  .store_uint64(requestId)
156
+ .store_uint256(sendMsglibManager)
54
157
  .store_uint256(sendMsglib)
55
- .store_uint256(sendMsglibConnection)
56
- .store_slice(lzSendSlice.sskipfirst(md::lzSend::requestInfoWidth, 0))
158
+ .store_ref(
159
+ begin_cell()
160
+ .store_uint256(sendMsglibConnection)
161
+ .store_slice(ref2Slice.sskipfirst(md::LzSend::_nativeFeeOffset, 0))
162
+ .end_cell()
163
+ )
164
+ .end_cell();
165
+ }
166
+
167
+ cell md::LzSend::setPacketNonceAndGuid(cell $self, int packetNonce, int packetGuid) impure inline {
168
+ slice selfSlice = $self.begin_parse();
169
+
170
+ cell $newPacket = selfSlice~load_ref()
171
+ .lz::Packet::setNonceAndGuid(packetNonce, packetGuid);
172
+
173
+ return begin_cell()
174
+ .store_ref($newPacket)
175
+ .store_slice(selfSlice)
57
176
  .end_cell();
58
177
  }
@@ -15,4 +15,46 @@ cell md::MdAddress::New(cell $md, int address) inline method_id {
15
15
  [cl::t::address, address] ;; md::MdAddress::address
16
16
  ])
17
17
  );
18
+ }
19
+
20
+ ;; ========================== Object Builders ==========================
21
+
22
+ const int md::MdAddress::_headerInfoBits = _BASIC_HEADER_WIDTH + (_FIELD_INFO_WIDTH * 2);
23
+ const int md::MdAddress::_headerFillerBits = _HEADER_WIDTH - md::MdAddress::_headerInfoBits;
24
+ const int md::MdAddress::_headerInfo = 5847545689438192720283003;
25
+
26
+ cell md::MdAddress::build(cell $md, int address) impure inline method_id {
27
+ return begin_cell()
28
+ .store_uint(md::MdAddress::_headerInfo, md::MdAddress::_headerInfoBits) ;; header info
29
+ .store_ones(md::MdAddress::_headerFillerBits) ;; header filler
30
+ .store_uint256(address) ;; md::MdAddress::address
31
+ .store_ref($md) ;; md::MdAddress::md = ref[0]
32
+ .end_cell();
33
+ }
34
+
35
+ ;; ========================== Object Getters ==========================
36
+
37
+ const int md::MdAddress::_addressOffset = _HEADER_WIDTH;
38
+
39
+ cell md::MdAddress::getMd(cell $self) impure inline {
40
+ return $self.cellPreloadRefAt(0);
41
+ }
42
+
43
+ ;; ========================== Object Multi-Getters ==========================
44
+
45
+ (cell, int) md::MdAddress::deserialize(cell $self) impure inline {
46
+ slice selfSlice = $self.begin_parse();
47
+ return (
48
+ selfSlice.preloadRefAt(0),
49
+ selfSlice.preloadAddressAt(md::MdAddress::_addressOffset)
50
+ );
51
+ }
52
+
53
+ ;; ========================== Sanitize ==========================
54
+
55
+ cell md::MdAddress::sanitize(cell $self) impure inline_ref {
56
+ int address = $self.cl::get<uint256>(md::MdAddress::address);
57
+ cell $md = $self.cl::get<objRef>(md::MdAddress::md);
58
+
59
+ return md::MdAddress::New($md, address);
18
60
  }
@@ -15,4 +15,12 @@ cell md::MdEid::New(cell $md, int eid) inline method_id {
15
15
  [cl::t::uint32, eid] ;; md::MdEid::eid
16
16
  ])
17
17
  );
18
+ }
19
+
20
+
21
+ cell md::MdEid::sanitize(cell $mdEid) impure inline_ref {
22
+ cell $md = $mdEid.cl::get<objRef>(md::MdEid::md);
23
+ int eid = $mdEid.cl::get<uint32>(md::MdEid::eid);
24
+
25
+ return md::MdEid::New($md, eid);
18
26
  }
@@ -15,4 +15,36 @@ cell md::MdObj::New(cell $md, cell $obj) inline method_id {
15
15
  [cl::t::objRef, $obj] ;; md::MdObj::obj
16
16
  ])
17
17
  );
18
+ }
19
+
20
+
21
+ ;; ========================== Object Builders ==========================
22
+ const int md::MdObj::_headerInfoBits = _BASIC_HEADER_WIDTH + (_FIELD_INFO_WIDTH * 2);
23
+ const int md::MdObj::_headerFillerBits = _HEADER_WIDTH - md::MdObj::_headerInfoBits;
24
+ const int md::MdObj::_headerInfo = 22842038364999638994941;
25
+
26
+ cell md::MdObj::build(cell $md, cell $obj) impure inline {
27
+ return begin_cell()
28
+ .store_uint(md::MdObj::_headerInfo, md::MdObj::_headerInfoBits) ;; header info
29
+ .store_ones(md::MdObj::_headerFillerBits) ;; header filler
30
+ .store_ref($md) ;; ref[0]
31
+ .store_ref($obj) ;; ref[1]
32
+ .end_cell();
33
+ }
34
+
35
+ ;; ========================== Object Multi-Getters ==========================
36
+
37
+ (cell, cell) md::MdObj::deserialize(cell $self) impure inline {
38
+ slice selfSlice = $self.begin_parse();
39
+ return (
40
+ selfSlice.preloadRefAt(0),
41
+ selfSlice.preloadRefAt(1)
42
+ );
43
+ }
44
+
45
+ cell md::MdObj::sanitize(cell $mdObj) impure {
46
+ cell $md = $mdObj.cl::get<objRef>(md::MdObj::md);
47
+ cell $obj = $mdObj.cl::get<objRef>(md::MdObj::obj);
48
+
49
+ return md::MdObj::New($md, $obj);
18
50
  }
@@ -1,7 +1,7 @@
1
1
  #include "../../funC++/classlib.fc";
2
2
 
3
3
  ;; required storage name
4
- const int md::MessagingReceipt::NAME = "msgreceipt"u;
4
+ const int md::MessagingReceipt::NAME = "MsgReceipt"u;
5
5
 
6
6
  ;; field names
7
7
  const int md::MessagingReceipt::lzSend = 0;
@@ -20,3 +20,36 @@ cell md::MessagingReceipt::New(cell $lzSend, int nativeFee, int zroFee, int erro
20
20
  ])
21
21
  );
22
22
  }
23
+
24
+
25
+ ;; ========================== Object Builders ==========================
26
+
27
+ const int md::MessagingReceipt::_headerInfoBits = _BASIC_HEADER_WIDTH + (_FIELD_INFO_WIDTH * 4);
28
+ const int md::MessagingReceipt::_headerFillerBits = _HEADER_WIDTH - md::MessagingReceipt::_headerInfoBits;
29
+ const int md::MessagingReceipt::_headerInfo = 1727210451775936897226519655289233983117527419;
30
+
31
+ cell md::MessagingReceipt::build(cell $lzSend, int nativeFee, int zroFee, int errorCode) impure inline {
32
+ return begin_cell()
33
+ .store_uint(md::MessagingReceipt::_headerInfo, md::MessagingReceipt::_headerInfoBits) ;; header info
34
+ .store_ones(md::MessagingReceipt::_headerFillerBits) ;; header filler
35
+ .store_ref($lzSend) ;; ref[0]
36
+ .store_uint128(nativeFee) ;; coins[1]
37
+ .store_uint128(zroFee) ;; coins[2]
38
+ .store_uint16(errorCode) ;; uint16[3]
39
+ .end_cell();
40
+ }
41
+
42
+ ;; ========================== Object Accessors ==========================
43
+
44
+ const int md::MessagingReceipt::_nativeFeeOffset = _HEADER_WIDTH;
45
+ const int md::MessagingReceipt::_zroFeeOffset = _HEADER_WIDTH + 128;
46
+ const int md::MessagingReceipt::_errorCodeOffset = _HEADER_WIDTH + 256;
47
+
48
+ ;; this function is unused by the protocol but will be used by OApps
49
+ (int, cell) md::MessagingReceipt::getErrorCodeAndLzSend(cell $self) impure inline {
50
+ slice selfSlice = $self.begin_parse();
51
+ return (
52
+ selfSlice.preloadUint16At(md::MessagingReceipt::_errorCodeOffset),
53
+ selfSlice.preloadRefAt(0)
54
+ );
55
+ }
@@ -47,6 +47,88 @@ cell md::MsglibSendCallback::New(
47
47
  );
48
48
  }
49
49
 
50
+ ;; ========================== Object Builders ==========================
51
+
52
+ const int md::MsglibSendCallback::_headerInfoBits = 198;
53
+ const int md::MsglibSendCallback::_headerFillerBits = _HEADER_WIDTH - (198 + _NAME_WIDTH);
54
+ const int md::MsglibSendCallback::_headerInfo = 177909621499943220462532613625031755041688677811453802367547;
55
+
56
+ cell md::MsglibSendCallback::build(
57
+ int nativeFee,
58
+ int zroFee,
59
+ cell $lzSend,
60
+ cell packetEncoded,
61
+ cell payees,
62
+ int nonceByteOffset,
63
+ int nonceBytes,
64
+ int guidByteOffset,
65
+ int guidBytes,
66
+ cell $msglibSendEvents,
67
+ int errorCode
68
+ ) impure inline {
69
+ return begin_cell()
70
+ .store_uint(md::MsglibSendCallback::NAME, _NAME_WIDTH) ;; name
71
+ .store_uint(md::MsglibSendCallback::_headerInfo, md::MsglibSendCallback::_headerInfoBits) ;; rest of the header
72
+ .store_ones(md::MsglibSendCallback::_headerFillerBits) ;; header filler
73
+ .store_uint128(nativeFee) ;; nativeFee
74
+ .store_uint128(zroFee) ;; zroFee
75
+ .store_uint16(nonceByteOffset) ;; nonceByteOffset
76
+ .store_uint8(nonceBytes) ;; nonceBytes
77
+ .store_uint16(guidByteOffset) ;; guidByteOffset
78
+ .store_uint8(guidBytes) ;; guidBytes
79
+ .store_uint8(errorCode) ;; errorCode
80
+ .store_ref($lzSend) ;; lzSend
81
+ .store_ref(packetEncoded) ;; packetEncoded
82
+ .store_ref(
83
+ begin_cell()
84
+ .store_ref(payees) ;; payees
85
+ .store_ref($msglibSendEvents) ;; msglibSendEvents
86
+ .end_cell()
87
+ )
88
+ .end_cell();
89
+ }
90
+
91
+ ;; ========================== Object Getters ==========================
92
+
93
+ const int md::MsglibSendCallback::_nativeFeeOffset = _HEADER_WIDTH;
94
+ const int md::MsglibSendCallback::_zroFeeOffset = md::MsglibSendCallback::_nativeFeeOffset + 128;
95
+ const int md::MsglibSendCallback::_nonceByteOffsetOffset = md::MsglibSendCallback::_zroFeeOffset + 128;
96
+ const int md::MsglibSendCallback::_nonceBytesOffset = md::MsglibSendCallback::_nonceByteOffsetOffset + 16;
97
+ const int md::MsglibSendCallback::_guidByteOffsetOffset = md::MsglibSendCallback::_nonceBytesOffset + 8;
98
+ const int md::MsglibSendCallback::_guidBytesOffset = md::MsglibSendCallback::_guidByteOffsetOffset + 16;
99
+ const int md::MsglibSendCallback::_errorCodeOffset = md::MsglibSendCallback::_guidBytesOffset + 8;
100
+
101
+
102
+ cell md::MsglibSendCallback::getLzSend(cell $self) impure inline {
103
+ return $self
104
+ .begin_parse()
105
+ .preload_ref_at(0);
106
+ }
107
+
108
+ ;; ========================== Object Multi-Getters ==========================
109
+
110
+ ;; (errorCode, nativeFee, zroFee, lzSend, payees, encodedPacket, nonceByteOffset, nonceBytes, guidByteOffset, guidBytes, sendEvents)
111
+ (int, int, int, cell, cell, cell, int, int, int, int, cell) md::MsglibSendCallback::deserialize(cell $self) impure inline {
112
+ slice selfSlice = $self.begin_parse();
113
+ slice ref2 = selfSlice.preloadRefSliceAt(2);
114
+
115
+ return (
116
+ selfSlice.preloadUint8At(md::MsglibSendCallback::_errorCodeOffset), ;; errorCode
117
+ selfSlice.preloadCoinsAt(md::MsglibSendCallback::_nativeFeeOffset), ;; nativeFee
118
+ selfSlice.preloadCoinsAt(md::MsglibSendCallback::_zroFeeOffset), ;; zroFee
119
+ selfSlice.preloadRefAt(0), ;; lzSend
120
+ ref2.preloadRefAt(0), ;; payees
121
+ selfSlice.preloadRefAt(1), ;; encodedPacket
122
+ selfSlice.preloadUint16At(md::MsglibSendCallback::_nonceByteOffsetOffset),;; nonceByteOffset
123
+ selfSlice.preloadUint8At(md::MsglibSendCallback::_nonceBytesOffset), ;; nonceBytes
124
+ selfSlice.preloadUint16At(md::MsglibSendCallback::_guidByteOffsetOffset), ;; guidByteOffset
125
+ selfSlice.preloadUint8At(md::MsglibSendCallback::_guidBytesOffset), ;; guidBytes
126
+ ref2.preloadRefAt(1)
127
+ );
128
+ }
129
+
130
+ ;; ========================== Payees Utilities ==========================
131
+
50
132
  const int payeesTuple::addressIdx = 0;
51
133
  const int payeesTuple::nativeAmountIdx = 1;
52
134
  const int payees::addressBits = 256;
@@ -13,4 +13,34 @@ cell md::Nonce::New(int nonce) inline method_id {
13
13
  [cl::t::uint64, nonce] ;; md::Nonce::nonce
14
14
  ])
15
15
  );
16
+ }
17
+
18
+ ;; ========================== Object Builders ==========================
19
+ const int md::Nonce::_headerInfoBits = _BASIC_HEADER_WIDTH + (_FIELD_INFO_WIDTH * 1);
20
+ const int md::Nonce::_headerFillerBits = _HEADER_WIDTH - md::Nonce::_headerInfoBits;
21
+ const int md::Nonce::_headerInfo = 124339069371385211;
22
+
23
+ ;; this function is unused by the protocol but will be used by OApps
24
+ cell md::Nonce::build(int nonce) impure inline {
25
+ return begin_cell()
26
+ .store_uint(md::Nonce::_headerInfo, md::Nonce::_headerInfoBits) ;; header info
27
+ .store_ones(md::Nonce::_headerFillerBits) ;; header filler
28
+ .store_uint64(nonce)
29
+ .end_cell();
30
+ }
31
+
32
+
33
+ ;; ========================== Object Getters ==========================
34
+ const int md::Nonce::_nonceOffset = _HEADER_WIDTH;
35
+
36
+ int md::Nonce::getNonce(cell $self) impure inline {
37
+ return $self.cellPreloadUint64At(md::Nonce::_nonceOffset);
38
+ }
39
+
40
+ ;; ========================== Sanitize ==========================
41
+
42
+ cell md::Nonce::sanitize(cell $self) impure inline_ref {
43
+ int nonce = $self.cl::get<uint64>(md::Nonce::nonce);
44
+
45
+ return md::Nonce::New(nonce);
16
46
  }
@@ -24,4 +24,24 @@ cell md::OptionsV1::New(
24
24
  [cl::t::uint256, nativeDropAmount] ;; md::OptionsV1::nativeDropAmount
25
25
  ])
26
26
  );
27
- }
27
+ }
28
+
29
+ ;; ========================== Object Multi-Getters ==========================
30
+
31
+ const int md::OptionsV1::_lzReceiveGasOffset = _HEADER_WIDTH;
32
+ const int md::OptionsV1::_lzReceiveValueOffset = md::OptionsV1::_lzReceiveGasOffset + 256;
33
+
34
+ const int md::OptionsV1::_nativeDropAddressOffset = 0;
35
+ const int md::OptionsV1::_nativeDropAmountOffset = md::OptionsV1::_nativeDropAddressOffset + 256;
36
+
37
+
38
+ ;; (lzReceiveGas, lzReceiveValue, nativeDropAmount)
39
+ (int, int, int) md::OptionsV1::decodeCoins(cell $self) impure inline {
40
+ slice selfSlice = $self.begin_parse();
41
+ slice ref2 = selfSlice.preloadRefSliceAt(2);
42
+ return (
43
+ selfSlice.preloadUint256At(md::OptionsV1::_lzReceiveGasOffset),
44
+ selfSlice.preloadUint256At(md::OptionsV1::_lzReceiveValueOffset),
45
+ ref2.preloadUint256At(md::OptionsV1::_nativeDropAmountOffset)
46
+ );
47
+ }
@@ -34,4 +34,31 @@ cell md::OptionsV2::New(
34
34
  [cl::t::uint256, nativeDropAmount] ;; md::OptionsV2::nativeDropAmount
35
35
  ])
36
36
  );
37
+ }
38
+
39
+ ;; ========================== Object Multi-Getters ==========================
40
+
41
+ const int md::OptionsV2::_lzReceiveGasOffset = _HEADER_WIDTH;
42
+ const int md::OptionsV2::_lzReceiveValueOffset = md::OptionsV2::_lzReceiveGasOffset + 256;
43
+
44
+ const int md::OptionsV2::_lzComposeGasOffset = 0;
45
+ const int md::OptionsV2::_lzComposeValueOffset = md::OptionsV2::_lzComposeGasOffset + 256;
46
+ const int md::OptionsV2::_nativeDropAddressOffset = md::OptionsV2::_lzComposeValueOffset + 256;
47
+
48
+ const int md::OptionsV2::_nativeDropAmountOffset = 0;
49
+
50
+ ;; (lzComposeGas, lzComposeValue, lzReceiveGas, lzReceiveValue, nativeDropAmount)
51
+ (int, int, int, int, int) md::OptionsV2::decodeCoins(cell $self) impure inline {
52
+ slice selfSlice = $self.begin_parse();
53
+
54
+ slice ref2 = selfSlice.preloadRefSliceAt(2);
55
+ slice ref3 = selfSlice.preloadRefSliceAt(3);
56
+
57
+ return (
58
+ ref2.preloadUint256At(md::OptionsV2::_lzComposeGasOffset),
59
+ ref2.preloadUint256At(md::OptionsV2::_lzComposeValueOffset),
60
+ selfSlice.preloadUint256At(md::OptionsV2::_lzReceiveGasOffset),
61
+ selfSlice.preloadUint256At(md::OptionsV2::_lzReceiveValueOffset),
62
+ ref3.preloadUint256At(md::OptionsV2::_nativeDropAmountOffset)
63
+ );
37
64
  }
@@ -15,4 +15,28 @@ cell md::PacketId::New(cell $path, int nonce) inline method_id {
15
15
  [cl::t::uint64, nonce] ;; md::PacketId::nonce
16
16
  ])
17
17
  );
18
+ }
19
+
20
+ ;; ========================== Object Builders ==========================
21
+
22
+ const int md::PacketId::_headerInfoBits = _BASIC_HEADER_WIDTH + (_FIELD_INFO_WIDTH * 2);
23
+ const int md::PacketId::_headerFillerBits = _HEADER_WIDTH - md::PacketId::_headerInfoBits;
24
+ const int md::PacketId::_headerInfo = 33180451689778480514427;
25
+
26
+ cell md::PacketId::build(cell $path, int nonce) impure inline {
27
+ return begin_cell()
28
+ .store_uint(md::PacketId::_headerInfo, md::PacketId::_headerInfoBits) ;; header info
29
+ .store_ones(md::PacketId::_headerFillerBits) ;; header filler
30
+ .store_ref($path) ;; ref[0]
31
+ .store_uint(nonce, 64) ;; uint[1]
32
+ .end_cell();
33
+ }
34
+
35
+ ;; ========================== Sanitize ==========================
36
+
37
+ cell md::PacketId::sanitize(cell $self) impure {
38
+ cell $path = $self.cl::get<objRef>(md::PacketId::path);
39
+ int nonce = $self.cl::get<uint64>(md::PacketId::nonce);
40
+
41
+ return md::PacketId::New($path, nonce);
18
42
  }
@@ -22,7 +22,7 @@ cell md::PacketSent::New(
22
22
  int nonce,
23
23
  int msglibAddress,
24
24
  cell $msglibSendEvents
25
- ) inline method_id {
25
+ ) impure inline method_id {
26
26
  return cl::declare(
27
27
  md::PacketSent::NAME,
28
28
  unsafeTuple([
@@ -37,3 +37,37 @@ cell md::PacketSent::New(
37
37
  ])
38
38
  );
39
39
  }
40
+
41
+ ;; ========================== Object Builders ==========================
42
+
43
+ const int md::PacketSent::_headerInfoBits = _BASIC_HEADER_WIDTH + (_FIELD_INFO_WIDTH * 8);
44
+ const int md::PacketSent::_headerFillerBits = _HEADER_WIDTH - md::PacketSent::_headerInfoBits;
45
+ const int md::PacketSent::_headerInfo = 705670168524170966093988960735291442056898952154447392698365;
46
+
47
+ cell md::PacketSent::build(
48
+ int nativeFee,
49
+ int zroFee,
50
+ cell $extraOptions,
51
+ cell $enforcedOptions,
52
+ cell packetEncoded,
53
+ int nonce,
54
+ int msglibAddress,
55
+ cell $msglibSendEvents
56
+ ) impure inline {
57
+ return begin_cell()
58
+ .store_uint(md::PacketSent::_headerInfo, md::PacketSent::_headerInfoBits)
59
+ .store_ones(md::PacketSent::_headerFillerBits)
60
+ .store_uint128(nativeFee)
61
+ .store_uint128(zroFee)
62
+ .store_uint64(nonce)
63
+ .store_uint256(msglibAddress)
64
+ .store_ref($extraOptions)
65
+ .store_ref($enforcedOptions)
66
+ .store_ref(
67
+ begin_cell()
68
+ .store_ref(packetEncoded)
69
+ .store_ref($msglibSendEvents)
70
+ .end_cell()
71
+ )
72
+ .end_cell();
73
+ }
@@ -13,4 +13,11 @@ cell md::SetAddress::New(int address) inline method_id {
13
13
  [cl::t::address, address] ;; md::SetAddress::owner
14
14
  ])
15
15
  );
16
+ }
17
+
18
+ ;; Ensure SetAddress doesn't have garbage bits that would cause undefined behaviors in the protocol
19
+ cell md::SetAddress::sanitize(cell $setAddress) impure {
20
+ return md::SetAddress::New(
21
+ $setAddress.cl::get<address>(md::SetAddress::address)
22
+ );
16
23
  }
@@ -30,4 +30,21 @@ cell md::SetEpConfig::New(
30
30
  [cl::t::uint64, timeoutReceiveMsglibExpiry] ;; md::SetEpConfig::timeoutReceiveMsglibExpiry
31
31
  ])
32
32
  );
33
+ }
34
+
35
+ ;; Ensure SetEpConfig doesn't have garbage bits that would cause undefined behaviors in the protocol
36
+ cell md::SetEpConfig::sanitize(cell $setEpConfig) impure inline_ref {
37
+ int useDefaults = $setEpConfig.cl::get<bool>(md::SetEpConfig::useDefaults);
38
+ int sendMsglibManager = $setEpConfig.cl::get<address>(md::SetEpConfig::sendMsglibManager);
39
+ int receiveMsglibManager = $setEpConfig.cl::get<address>(md::SetEpConfig::receiveMsglibManager);
40
+ int timeoutReceiveMsglibManager = $setEpConfig.cl::get<address>(md::SetEpConfig::timeoutReceiveMsglibManager);
41
+ int timeoutReceiveMsglibExpiry = $setEpConfig.cl::get<uint64>(md::SetEpConfig::timeoutReceiveMsglibExpiry);
42
+
43
+ return md::SetEpConfig::New(
44
+ useDefaults,
45
+ sendMsglibManager,
46
+ receiveMsglibManager,
47
+ timeoutReceiveMsglibManager,
48
+ timeoutReceiveMsglibExpiry
49
+ );
33
50
  }
@@ -1,4 +1,5 @@
1
1
  #include "../baseInterface.fc";
2
+ #include "../classlib.fc";
2
3
  #include "utils.fc";
3
4
 
4
5
  const int action::event::NAME = "event"u;
@@ -15,7 +16,7 @@ int _getEventSink() impure inline;
15
16
  ;; @info Events in LZ contracts are internal messages to an event sink
16
17
  ;; where the resulting transaction always reverts
17
18
  ;; @non-terminal
18
- cell action::event::New(int topic, cell $body, cell $initialStorage) inline method_id {
19
+ cell action::event::New(int topic, cell $body, cell $initialStorage) impure inline method_id {
19
20
  return cl::declare(
20
21
  action::event::NAME,
21
22
  unsafeTuple([
@@ -26,10 +27,24 @@ cell action::event::New(int topic, cell $body, cell $initialStorage) inline meth
26
27
  );
27
28
  }
28
29
 
30
+ const int action::event::_headerInfoBits = _BASIC_HEADER_WIDTH + (_FIELD_INFO_WIDTH * 3);
31
+ const int action::event::_headerFillerBits = _HEADER_WIDTH - action::event::_headerInfoBits;
32
+ const int action::event::_headerInfo = 7850279558805522911016931325;
33
+
34
+ cell action::event::build(int topic, cell $body, cell $initialStorage) impure inline method_id {
35
+ return begin_cell()
36
+ .store_uint(action::event::_headerInfo, action::event::_headerInfoBits) ;; header info
37
+ .store_ones(action::event::_headerFillerBits) ;; header filler
38
+ .store_uint256(topic)
39
+ .store_ref($body)
40
+ .store_ref($initialStorage)
41
+ .end_cell();
42
+ }
43
+
29
44
  tuple action::event::create(int topic, cell $body, cell $initialStorage) inline {
30
45
  return unsafeTuple([
31
46
  action::event::NAME,
32
- action::event::New(topic, $body, $initialStorage)
47
+ action::event::build(topic, $body, $initialStorage)
33
48
  ]);
34
49
  }
35
50