wowok 2.1.10 → 2.1.13

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 (896) hide show
  1. package/dist/cjs/bcs/bcs.d.ts +199 -199
  2. package/dist/cjs/bcs/bcs.js +273 -318
  3. package/dist/cjs/bcs/bcs.js.map +1 -0
  4. package/dist/cjs/bcs/effects.d.ts +109 -109
  5. package/dist/cjs/bcs/effects.js +205 -230
  6. package/dist/cjs/bcs/effects.js.map +1 -0
  7. package/dist/cjs/bcs/index.d.ts +1 -2584
  8. package/dist/cjs/bcs/index.js +61 -76
  9. package/dist/cjs/bcs/index.js.map +1 -0
  10. package/dist/cjs/bcs/pure.js +38 -58
  11. package/dist/cjs/bcs/pure.js.map +1 -0
  12. package/dist/cjs/bcs/type-tag-serializer.js +102 -114
  13. package/dist/cjs/bcs/type-tag-serializer.js.map +1 -0
  14. package/dist/cjs/bcs/types.js +6 -23
  15. package/dist/cjs/bcs/types.js.map +1 -0
  16. package/dist/cjs/client/index.js +17 -33
  17. package/dist/cjs/client/index.js.map +1 -0
  18. package/dist/cjs/client/network.js +25 -40
  19. package/dist/cjs/client/network.js.map +1 -0
  20. package/dist/cjs/cryptography/index.js +29 -45
  21. package/dist/cjs/cryptography/index.js.map +1 -0
  22. package/dist/cjs/cryptography/intent.d.ts +1 -1
  23. package/dist/cjs/cryptography/intent.js +20 -31
  24. package/dist/cjs/cryptography/intent.js.map +1 -0
  25. package/dist/cjs/cryptography/keypair.js +102 -116
  26. package/dist/cjs/cryptography/keypair.js.map +1 -0
  27. package/dist/cjs/cryptography/mnemonics.js +43 -41
  28. package/dist/cjs/cryptography/mnemonics.js.map +1 -0
  29. package/dist/cjs/cryptography/publickey.js +112 -134
  30. package/dist/cjs/cryptography/publickey.js.map +1 -0
  31. package/dist/cjs/cryptography/signature-scheme.js +24 -43
  32. package/dist/cjs/cryptography/signature-scheme.js.map +1 -0
  33. package/dist/cjs/cryptography/signature.d.ts +2 -24
  34. package/dist/cjs/cryptography/signature.js +50 -67
  35. package/dist/cjs/cryptography/signature.js.map +1 -0
  36. package/dist/cjs/experimental/cache.js +65 -0
  37. package/dist/cjs/experimental/cache.js.map +1 -0
  38. package/dist/cjs/experimental/client.js +27 -0
  39. package/dist/cjs/experimental/client.js.map +1 -0
  40. package/dist/cjs/experimental/core.js +89 -0
  41. package/dist/cjs/experimental/core.js.map +1 -0
  42. package/dist/cjs/experimental/errors.js +32 -0
  43. package/dist/cjs/experimental/errors.js.map +1 -0
  44. package/dist/cjs/experimental/index.js +15 -0
  45. package/dist/cjs/experimental/index.js.map +1 -0
  46. package/dist/cjs/experimental/persistent-storage.js +343 -0
  47. package/dist/cjs/experimental/persistent-storage.js.map +1 -0
  48. package/dist/cjs/experimental/persistent-storage.test.js +200 -0
  49. package/dist/cjs/experimental/persistent-storage.test.js.map +1 -0
  50. package/dist/cjs/experimental/transports/utils.js +104 -0
  51. package/dist/cjs/experimental/transports/utils.js.map +1 -0
  52. package/dist/cjs/experimental/types.js +6 -0
  53. package/dist/cjs/experimental/types.js.map +1 -0
  54. package/dist/cjs/faucet/faucet.js +106 -124
  55. package/dist/cjs/faucet/faucet.js.map +1 -0
  56. package/dist/cjs/faucet/index.js +12 -28
  57. package/dist/cjs/faucet/index.js.map +1 -0
  58. package/dist/cjs/grpc/client.js +47 -62
  59. package/dist/cjs/grpc/client.js.map +1 -0
  60. package/dist/cjs/grpc/core.js +580 -617
  61. package/dist/cjs/grpc/core.js.map +1 -0
  62. package/dist/cjs/grpc/index.js +9 -25
  63. package/dist/cjs/grpc/index.js.map +1 -0
  64. package/dist/cjs/grpc/proto/google/protobuf/any.js +168 -135
  65. package/dist/cjs/grpc/proto/google/protobuf/any.js.map +1 -0
  66. package/dist/cjs/grpc/proto/google/protobuf/duration.js +105 -90
  67. package/dist/cjs/grpc/proto/google/protobuf/duration.js.map +1 -0
  68. package/dist/cjs/grpc/proto/google/protobuf/empty.js +50 -28
  69. package/dist/cjs/grpc/proto/google/protobuf/empty.js.map +1 -0
  70. package/dist/cjs/grpc/proto/google/protobuf/field_mask.js +96 -75
  71. package/dist/cjs/grpc/proto/google/protobuf/field_mask.js.map +1 -0
  72. package/dist/cjs/grpc/proto/google/protobuf/struct.js +266 -215
  73. package/dist/cjs/grpc/proto/google/protobuf/struct.js.map +1 -0
  74. package/dist/cjs/grpc/proto/google/protobuf/timestamp.js +150 -131
  75. package/dist/cjs/grpc/proto/google/protobuf/timestamp.js.map +1 -0
  76. package/dist/cjs/grpc/proto/google/rpc/error_details.js +331 -302
  77. package/dist/cjs/grpc/proto/google/rpc/error_details.js.map +1 -0
  78. package/dist/cjs/grpc/proto/google/rpc/status.js +50 -50
  79. package/dist/cjs/grpc/proto/google/rpc/status.js.map +1 -0
  80. package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js +84 -68
  81. package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js.map +1 -0
  82. package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js +45 -50
  83. package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js.map +1 -0
  84. package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js +38 -43
  85. package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js.map +1 -0
  86. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js +70 -75
  87. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js.map +1 -0
  88. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js +79 -81
  89. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js.map +1 -0
  90. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js +183 -166
  91. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js.map +1 -0
  92. package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js +369 -296
  93. package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js.map +1 -0
  94. package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js +80 -85
  95. package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js.map +1 -0
  96. package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js +31 -28
  97. package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js.map +1 -0
  98. package/dist/cjs/grpc/proto/sui/rpc/v2/event.js +81 -83
  99. package/dist/cjs/grpc/proto/sui/rpc/v2/event.js.map +1 -0
  100. package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js +80 -85
  101. package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js.map +1 -0
  102. package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js +876 -506
  103. package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js.map +1 -0
  104. package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js +56 -61
  105. package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js.map +1 -0
  106. package/dist/cjs/grpc/proto/sui/rpc/v2/input.js +103 -83
  107. package/dist/cjs/grpc/proto/sui/rpc/v2/input.js.map +1 -0
  108. package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js +76 -78
  109. package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js.map +1 -0
  110. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js +69 -119
  111. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js.map +1 -0
  112. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js +392 -350
  113. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js.map +1 -0
  114. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js +599 -473
  115. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js.map +1 -0
  116. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js +46 -78
  117. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js.map +1 -0
  118. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js +242 -224
  119. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js.map +1 -0
  120. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js +32 -52
  121. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js.map +1 -0
  122. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js +139 -134
  123. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js.map +1 -0
  124. package/dist/cjs/grpc/proto/sui/rpc/v2/object.js +109 -111
  125. package/dist/cjs/grpc/proto/sui/rpc/v2/object.js.map +1 -0
  126. package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js +46 -51
  127. package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js.map +1 -0
  128. package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js +76 -61
  129. package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js.map +1 -0
  130. package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js +46 -59
  131. package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js.map +1 -0
  132. package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js +568 -522
  133. package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js.map +1 -0
  134. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js +54 -32
  135. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js.map +1 -0
  136. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +27 -47
  137. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js.map +1 -0
  138. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js +83 -86
  139. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js.map +1 -0
  140. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js +53 -85
  141. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js.map +1 -0
  142. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js +645 -529
  143. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js.map +1 -0
  144. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js +37 -51
  145. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js.map +1 -0
  146. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js +58 -61
  147. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js.map +1 -0
  148. package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js +749 -730
  149. package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js.map +1 -0
  150. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js +1218 -975
  151. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js.map +1 -0
  152. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +32 -46
  153. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js.map +1 -0
  154. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js +186 -167
  155. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js.map +1 -0
  156. package/dist/cjs/index.js +96 -91
  157. package/dist/cjs/index.js.map +1 -0
  158. package/dist/cjs/jsonRpc/client.js +654 -743
  159. package/dist/cjs/jsonRpc/client.js.map +1 -0
  160. package/dist/cjs/jsonRpc/core.d.ts +7 -7
  161. package/dist/cjs/jsonRpc/core.js +562 -606
  162. package/dist/cjs/jsonRpc/core.js.map +1 -0
  163. package/dist/cjs/jsonRpc/errors.js +38 -56
  164. package/dist/cjs/jsonRpc/errors.js.map +1 -0
  165. package/dist/cjs/jsonRpc/http-transport.js +70 -114
  166. package/dist/cjs/jsonRpc/http-transport.js.map +1 -0
  167. package/dist/cjs/jsonRpc/index.js +14 -30
  168. package/dist/cjs/jsonRpc/index.js.map +1 -0
  169. package/dist/cjs/jsonRpc/json-rpc-resolver.js +286 -290
  170. package/dist/cjs/jsonRpc/json-rpc-resolver.js.map +1 -0
  171. package/dist/cjs/jsonRpc/rpc-websocket-client.js +150 -207
  172. package/dist/cjs/jsonRpc/rpc-websocket-client.js.map +1 -0
  173. package/dist/cjs/jsonRpc/types/chain.js +4 -15
  174. package/dist/cjs/jsonRpc/types/chain.js.map +1 -0
  175. package/dist/cjs/jsonRpc/types/changes.js +4 -15
  176. package/dist/cjs/jsonRpc/types/changes.js.map +1 -0
  177. package/dist/cjs/jsonRpc/types/coins.js +4 -15
  178. package/dist/cjs/jsonRpc/types/coins.js.map +1 -0
  179. package/dist/cjs/jsonRpc/types/common.js +4 -15
  180. package/dist/cjs/jsonRpc/types/common.js.map +1 -0
  181. package/dist/cjs/jsonRpc/types/generated.d.ts +1 -1
  182. package/dist/cjs/jsonRpc/types/generated.js +4 -15
  183. package/dist/cjs/jsonRpc/types/generated.js.map +1 -0
  184. package/dist/cjs/jsonRpc/types/index.js +4 -15
  185. package/dist/cjs/jsonRpc/types/index.js.map +1 -0
  186. package/dist/cjs/jsonRpc/types/params.js +4 -15
  187. package/dist/cjs/jsonRpc/types/params.js.map +1 -0
  188. package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js +54 -69
  189. package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js.map +1 -0
  190. package/dist/cjs/keypairs/ed25519/index.js +10 -26
  191. package/dist/cjs/keypairs/ed25519/index.js.map +1 -0
  192. package/dist/cjs/keypairs/ed25519/keypair.js +134 -159
  193. package/dist/cjs/keypairs/ed25519/keypair.js.map +1 -0
  194. package/dist/cjs/keypairs/ed25519/publickey.js +70 -84
  195. package/dist/cjs/keypairs/ed25519/publickey.js.map +1 -0
  196. package/dist/cjs/keypairs/index.js +21 -19
  197. package/dist/cjs/keypairs/index.js.map +1 -0
  198. package/dist/cjs/keypairs/passkey/index.js +11 -27
  199. package/dist/cjs/keypairs/passkey/index.js.map +1 -0
  200. package/dist/cjs/keypairs/passkey/keypair.js +245 -256
  201. package/dist/cjs/keypairs/passkey/keypair.js.map +1 -0
  202. package/dist/cjs/keypairs/passkey/publickey.js +163 -162
  203. package/dist/cjs/keypairs/passkey/publickey.js.map +1 -0
  204. package/dist/cjs/keypairs/passkey/types.js +4 -15
  205. package/dist/cjs/keypairs/passkey/types.js.map +1 -0
  206. package/dist/cjs/keypairs/secp256k1/index.js +10 -26
  207. package/dist/cjs/keypairs/secp256k1/index.js.map +1 -0
  208. package/dist/cjs/keypairs/secp256k1/keypair.js +129 -151
  209. package/dist/cjs/keypairs/secp256k1/keypair.js.map +1 -0
  210. package/dist/cjs/keypairs/secp256k1/publickey.js +71 -89
  211. package/dist/cjs/keypairs/secp256k1/publickey.js.map +1 -0
  212. package/dist/cjs/keypairs/secp256r1/index.js +10 -26
  213. package/dist/cjs/keypairs/secp256r1/index.js.map +1 -0
  214. package/dist/cjs/keypairs/secp256r1/keypair.js +127 -148
  215. package/dist/cjs/keypairs/secp256r1/keypair.js.map +1 -0
  216. package/dist/cjs/keypairs/secp256r1/publickey.js +72 -90
  217. package/dist/cjs/keypairs/secp256r1/publickey.js.map +1 -0
  218. package/dist/cjs/multisig/index.js +10 -26
  219. package/dist/cjs/multisig/index.js.map +1 -0
  220. package/dist/cjs/multisig/publickey.d.ts +1 -1
  221. package/dist/cjs/multisig/publickey.js +228 -276
  222. package/dist/cjs/multisig/publickey.js.map +1 -0
  223. package/dist/cjs/multisig/signer.js +62 -110
  224. package/dist/cjs/multisig/signer.js.map +1 -0
  225. package/dist/cjs/transactions/Arguments.d.ts +4 -4
  226. package/dist/cjs/transactions/Arguments.js +13 -34
  227. package/dist/cjs/transactions/Arguments.js.map +1 -0
  228. package/dist/cjs/transactions/Commands.js +111 -141
  229. package/dist/cjs/transactions/Commands.js.map +1 -0
  230. package/dist/cjs/transactions/Inputs.js +53 -82
  231. package/dist/cjs/transactions/Inputs.js.map +1 -0
  232. package/dist/cjs/transactions/ObjectCache.d.ts +8 -8
  233. package/dist/cjs/transactions/ObjectCache.js +204 -241
  234. package/dist/cjs/transactions/ObjectCache.js.map +1 -0
  235. package/dist/cjs/transactions/Transaction.d.ts +31 -31
  236. package/dist/cjs/transactions/Transaction.js +628 -719
  237. package/dist/cjs/transactions/Transaction.js.map +1 -0
  238. package/dist/cjs/transactions/TransactionData.d.ts +9 -9
  239. package/dist/cjs/transactions/TransactionData.js +396 -440
  240. package/dist/cjs/transactions/TransactionData.js.map +1 -0
  241. package/dist/cjs/transactions/__tests__/Transaction.test.js +169 -0
  242. package/dist/cjs/transactions/__tests__/Transaction.test.js.map +1 -0
  243. package/dist/cjs/transactions/__tests__/bcs.test.js +202 -0
  244. package/dist/cjs/transactions/__tests__/bcs.test.js.map +1 -0
  245. package/dist/cjs/transactions/data/internal.js +166 -207
  246. package/dist/cjs/transactions/data/internal.js.map +1 -0
  247. package/dist/cjs/transactions/data/v1.js +436 -495
  248. package/dist/cjs/transactions/data/v1.js.map +1 -0
  249. package/dist/cjs/transactions/data/v2.d.ts +5 -5
  250. package/dist/cjs/transactions/data/v2.js +94 -107
  251. package/dist/cjs/transactions/data/v2.js.map +1 -0
  252. package/dist/cjs/transactions/executor/caching.js +71 -113
  253. package/dist/cjs/transactions/executor/caching.js.map +1 -0
  254. package/dist/cjs/transactions/executor/parallel.js +339 -378
  255. package/dist/cjs/transactions/executor/parallel.js.map +1 -0
  256. package/dist/cjs/transactions/executor/queue.js +60 -80
  257. package/dist/cjs/transactions/executor/queue.js.map +1 -0
  258. package/dist/cjs/transactions/executor/serial.d.ts +4 -4
  259. package/dist/cjs/transactions/executor/serial.js +102 -131
  260. package/dist/cjs/transactions/executor/serial.js.map +1 -0
  261. package/dist/cjs/transactions/hash.js +17 -28
  262. package/dist/cjs/transactions/hash.js.map +1 -0
  263. package/dist/cjs/transactions/index.js +33 -49
  264. package/dist/cjs/transactions/index.js.map +1 -0
  265. package/dist/cjs/transactions/intents/CoinWithBalance.js +137 -191
  266. package/dist/cjs/transactions/intents/CoinWithBalance.js.map +1 -0
  267. package/dist/cjs/transactions/object.js +88 -111
  268. package/dist/cjs/transactions/object.js.map +1 -0
  269. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js +20 -32
  270. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js.map +1 -0
  271. package/dist/cjs/transactions/pure.js +38 -60
  272. package/dist/cjs/transactions/pure.js.map +1 -0
  273. package/dist/cjs/transactions/resolve.js +62 -88
  274. package/dist/cjs/transactions/resolve.js.map +1 -0
  275. package/dist/cjs/transactions/serializer.js +150 -163
  276. package/dist/cjs/transactions/serializer.js.map +1 -0
  277. package/dist/cjs/transactions/utils.d.ts +1 -1
  278. package/dist/cjs/transactions/utils.js +114 -125
  279. package/dist/cjs/transactions/utils.js.map +1 -0
  280. package/dist/cjs/utils/constants.js +29 -56
  281. package/dist/cjs/utils/constants.js.map +1 -0
  282. package/dist/cjs/utils/derived-objects.js +14 -30
  283. package/dist/cjs/utils/derived-objects.js.map +1 -0
  284. package/dist/cjs/utils/dynamic-fields.js +20 -37
  285. package/dist/cjs/utils/dynamic-fields.js.map +1 -0
  286. package/dist/cjs/utils/format.js +14 -30
  287. package/dist/cjs/utils/format.js.map +1 -0
  288. package/dist/cjs/utils/index.js +50 -64
  289. package/dist/cjs/utils/index.js.map +1 -0
  290. package/dist/cjs/utils/move-registry.js +37 -35
  291. package/dist/cjs/utils/move-registry.js.map +1 -0
  292. package/dist/cjs/utils/sui-types.js +74 -68
  293. package/dist/cjs/utils/sui-types.js.map +1 -0
  294. package/dist/cjs/utils/suins.js +30 -46
  295. package/dist/cjs/utils/suins.js.map +1 -0
  296. package/dist/cjs/verify/index.js +12 -27
  297. package/dist/cjs/verify/index.js.map +1 -0
  298. package/dist/cjs/verify/verify.js +83 -110
  299. package/dist/cjs/verify/verify.js.map +1 -0
  300. package/dist/cjs/version.js +8 -25
  301. package/dist/cjs/version.js.map +1 -0
  302. package/dist/cjs/w/call/allocation.js +323 -413
  303. package/dist/cjs/w/call/allocation.js.map +1 -0
  304. package/dist/cjs/w/call/arb.js +105 -136
  305. package/dist/cjs/w/call/arb.js.map +1 -0
  306. package/dist/cjs/w/call/arbitration.js +1206 -1581
  307. package/dist/cjs/w/call/arbitration.js.map +1 -0
  308. package/dist/cjs/w/call/base.js +303 -333
  309. package/dist/cjs/w/call/base.js.map +1 -0
  310. package/dist/cjs/w/call/contact.js +335 -452
  311. package/dist/cjs/w/call/contact.js.map +1 -0
  312. package/dist/cjs/w/call/demand.js +690 -844
  313. package/dist/cjs/w/call/demand.js.map +1 -0
  314. package/dist/cjs/w/call/entity.js +167 -201
  315. package/dist/cjs/w/call/entity.js.map +1 -0
  316. package/dist/cjs/w/call/guard-ins.js +4376 -4389
  317. package/dist/cjs/w/call/guard-ins.js.map +1 -0
  318. package/dist/cjs/w/call/guard.js +1078 -1112
  319. package/dist/cjs/w/call/guard.js.map +1 -0
  320. package/dist/cjs/w/call/index.js +69 -70
  321. package/dist/cjs/w/call/index.js.map +1 -0
  322. package/dist/cjs/w/call/machine.js +1105 -1419
  323. package/dist/cjs/w/call/machine.js.map +1 -0
  324. package/dist/cjs/w/call/order.js +314 -454
  325. package/dist/cjs/w/call/order.js.map +1 -0
  326. package/dist/cjs/w/call/passport.js +214 -253
  327. package/dist/cjs/w/call/passport.js.map +1 -0
  328. package/dist/cjs/w/call/payment.js +187 -224
  329. package/dist/cjs/w/call/payment.js.map +1 -0
  330. package/dist/cjs/w/call/permission.js +1183 -1294
  331. package/dist/cjs/w/call/permission.js.map +1 -0
  332. package/dist/cjs/w/call/personal.js +132 -170
  333. package/dist/cjs/w/call/personal.js.map +1 -0
  334. package/dist/cjs/w/call/progress.js +634 -794
  335. package/dist/cjs/w/call/progress.js.map +1 -0
  336. package/dist/cjs/w/call/proof.js +67 -116
  337. package/dist/cjs/w/call/proof.js.map +1 -0
  338. package/dist/cjs/w/call/repository.js +1037 -1251
  339. package/dist/cjs/w/call/repository.js.map +1 -0
  340. package/dist/cjs/w/call/resource.js +111 -131
  341. package/dist/cjs/w/call/resource.js.map +1 -0
  342. package/dist/cjs/w/call/reward.js +675 -853
  343. package/dist/cjs/w/call/reward.js.map +1 -0
  344. package/dist/cjs/w/call/service.js +1879 -2385
  345. package/dist/cjs/w/call/service.js.map +1 -0
  346. package/dist/cjs/w/call/treasury.js +841 -1138
  347. package/dist/cjs/w/call/treasury.js.map +1 -0
  348. package/dist/cjs/w/call/util.js +593 -624
  349. package/dist/cjs/w/call/util.js.map +1 -0
  350. package/dist/cjs/w/common.d.ts +1 -1
  351. package/dist/cjs/w/common.js +548 -518
  352. package/dist/cjs/w/common.js.map +1 -0
  353. package/dist/cjs/w/exception.js +574 -584
  354. package/dist/cjs/w/exception.js.map +1 -0
  355. package/dist/cjs/w/index.js +26 -23
  356. package/dist/cjs/w/index.js.map +1 -0
  357. package/dist/cjs/w/local/account.js +664 -741
  358. package/dist/cjs/w/local/account.js.map +1 -0
  359. package/dist/cjs/w/local/cache.js +180 -166
  360. package/dist/cjs/w/local/cache.js.map +1 -0
  361. package/dist/cjs/w/local/config.js +51 -80
  362. package/dist/cjs/w/local/config.js.map +1 -0
  363. package/dist/cjs/w/local/index.js +225 -290
  364. package/dist/cjs/w/local/index.js.map +1 -0
  365. package/dist/cjs/w/local/local.d.ts +2 -2
  366. package/dist/cjs/w/local/local.js +638 -646
  367. package/dist/cjs/w/local/local.js.map +1 -0
  368. package/dist/cjs/w/local/storage.js +210 -164
  369. package/dist/cjs/w/local/storage.js.map +1 -0
  370. package/dist/cjs/w/local/token.js +158 -175
  371. package/dist/cjs/w/local/token.js.map +1 -0
  372. package/dist/cjs/w/local/util.js +80 -51
  373. package/dist/cjs/w/local/util.js.map +1 -0
  374. package/dist/cjs/w/local/wip.js +1078 -802
  375. package/dist/cjs/w/local/wip.js.map +1 -0
  376. package/dist/cjs/w/messenger/crypto.js +496 -389
  377. package/dist/cjs/w/messenger/crypto.js.map +1 -0
  378. package/dist/cjs/w/messenger/index.js +53 -35
  379. package/dist/cjs/w/messenger/index.js.map +1 -0
  380. package/dist/cjs/w/messenger/messenger-api.js +1159 -1035
  381. package/dist/cjs/w/messenger/messenger-api.js.map +1 -0
  382. package/dist/cjs/w/messenger/messenger-manager.js +954 -1083
  383. package/dist/cjs/w/messenger/messenger-manager.js.map +1 -0
  384. package/dist/cjs/w/messenger/messenger.d.ts +1 -1
  385. package/dist/cjs/w/messenger/messenger.js +1304 -1450
  386. package/dist/cjs/w/messenger/messenger.js.map +1 -0
  387. package/dist/cjs/w/messenger/server.js +390 -512
  388. package/dist/cjs/w/messenger/server.js.map +1 -0
  389. package/dist/cjs/w/messenger/session.js +399 -403
  390. package/dist/cjs/w/messenger/session.js.map +1 -0
  391. package/dist/cjs/w/messenger/storage.js +881 -777
  392. package/dist/cjs/w/messenger/storage.js.map +1 -0
  393. package/dist/cjs/w/messenger/types.d.ts +2 -2
  394. package/dist/cjs/w/messenger/types.js +83 -103
  395. package/dist/cjs/w/messenger/types.js.map +1 -0
  396. package/dist/cjs/w/messenger/utils.js +29 -34
  397. package/dist/cjs/w/messenger/utils.js.map +1 -0
  398. package/dist/cjs/w/query/bult-in.js +101 -110
  399. package/dist/cjs/w/query/bult-in.js.map +1 -0
  400. package/dist/cjs/w/query/event.js +134 -146
  401. package/dist/cjs/w/query/event.js.map +1 -0
  402. package/dist/cjs/w/query/index.js +22 -20
  403. package/dist/cjs/w/query/index.js.map +1 -0
  404. package/dist/cjs/w/query/object.js +1576 -1576
  405. package/dist/cjs/w/query/object.js.map +1 -0
  406. package/dist/cjs/w/query/received.js +66 -88
  407. package/dist/cjs/w/query/received.js.map +1 -0
  408. package/dist/cjs/w/query/util.js +53 -77
  409. package/dist/cjs/w/query/util.js.map +1 -0
  410. package/dist/cjs/w/util.js +589 -675
  411. package/dist/cjs/w/util.js.map +1 -0
  412. package/dist/esm/bcs/bcs.d.ts +199 -199
  413. package/dist/esm/bcs/bcs.js +269 -310
  414. package/dist/esm/bcs/bcs.js.map +1 -0
  415. package/dist/esm/bcs/effects.d.ts +109 -109
  416. package/dist/esm/bcs/effects.js +171 -179
  417. package/dist/esm/bcs/effects.js.map +1 -0
  418. package/dist/esm/bcs/index.d.ts +1 -2584
  419. package/dist/esm/bcs/index.js +51 -94
  420. package/dist/esm/bcs/index.js.map +1 -0
  421. package/dist/esm/bcs/pure.js +35 -38
  422. package/dist/esm/bcs/pure.js.map +1 -0
  423. package/dist/esm/bcs/type-tag-serializer.js +98 -95
  424. package/dist/esm/bcs/type-tag-serializer.js.map +1 -0
  425. package/dist/esm/bcs/types.js +5 -5
  426. package/dist/esm/bcs/types.js.map +1 -0
  427. package/dist/esm/client/index.js +7 -23
  428. package/dist/esm/client/index.js.map +1 -0
  429. package/dist/esm/client/network.js +23 -22
  430. package/dist/esm/client/network.js.map +1 -0
  431. package/dist/esm/cryptography/index.js +9 -46
  432. package/dist/esm/cryptography/index.js.map +1 -0
  433. package/dist/esm/cryptography/intent.d.ts +1 -1
  434. package/dist/esm/cryptography/intent.js +18 -12
  435. package/dist/esm/cryptography/intent.js.map +1 -0
  436. package/dist/esm/cryptography/keypair.js +95 -99
  437. package/dist/esm/cryptography/keypair.js.map +1 -0
  438. package/dist/esm/cryptography/mnemonics.js +40 -24
  439. package/dist/esm/cryptography/mnemonics.js.map +1 -0
  440. package/dist/esm/cryptography/publickey.js +104 -115
  441. package/dist/esm/cryptography/publickey.js.map +1 -0
  442. package/dist/esm/cryptography/signature-scheme.js +22 -24
  443. package/dist/esm/cryptography/signature-scheme.js.map +1 -0
  444. package/dist/esm/cryptography/signature.d.ts +2 -24
  445. package/dist/esm/cryptography/signature.js +44 -48
  446. package/dist/esm/cryptography/signature.js.map +1 -0
  447. package/dist/esm/experimental/cache.js +61 -0
  448. package/dist/esm/experimental/cache.js.map +1 -0
  449. package/dist/esm/experimental/client.js +23 -0
  450. package/dist/esm/experimental/client.js.map +1 -0
  451. package/dist/esm/experimental/core.js +85 -0
  452. package/dist/esm/experimental/core.js.map +1 -0
  453. package/dist/esm/experimental/errors.js +27 -0
  454. package/dist/esm/experimental/errors.js.map +1 -0
  455. package/dist/esm/experimental/index.js +8 -0
  456. package/dist/esm/experimental/index.js.map +1 -0
  457. package/dist/esm/experimental/persistent-storage.js +337 -0
  458. package/dist/esm/experimental/persistent-storage.js.map +1 -0
  459. package/dist/esm/experimental/persistent-storage.test.js +198 -0
  460. package/dist/esm/experimental/persistent-storage.test.js.map +1 -0
  461. package/dist/esm/experimental/transports/utils.js +100 -0
  462. package/dist/esm/experimental/transports/utils.js.map +1 -0
  463. package/dist/esm/experimental/types.js +5 -0
  464. package/dist/esm/experimental/types.js.map +1 -0
  465. package/dist/esm/faucet/faucet.js +104 -111
  466. package/dist/esm/faucet/faucet.js.map +1 -0
  467. package/dist/esm/faucet/index.js +4 -16
  468. package/dist/esm/faucet/index.js.map +1 -0
  469. package/dist/esm/grpc/client.js +34 -34
  470. package/dist/esm/grpc/client.js.map +1 -0
  471. package/dist/esm/grpc/core.js +570 -601
  472. package/dist/esm/grpc/core.js.map +1 -0
  473. package/dist/esm/grpc/index.js +5 -6
  474. package/dist/esm/grpc/index.js.map +1 -0
  475. package/dist/esm/grpc/proto/google/protobuf/any.js +161 -111
  476. package/dist/esm/grpc/proto/google/protobuf/any.js.map +1 -0
  477. package/dist/esm/grpc/proto/google/protobuf/duration.js +99 -67
  478. package/dist/esm/grpc/proto/google/protobuf/duration.js.map +1 -0
  479. package/dist/esm/grpc/proto/google/protobuf/empty.js +46 -7
  480. package/dist/esm/grpc/proto/google/protobuf/empty.js.map +1 -0
  481. package/dist/esm/grpc/proto/google/protobuf/field_mask.js +90 -52
  482. package/dist/esm/grpc/proto/google/protobuf/field_mask.js.map +1 -0
  483. package/dist/esm/grpc/proto/google/protobuf/struct.js +258 -190
  484. package/dist/esm/grpc/proto/google/protobuf/struct.js.map +1 -0
  485. package/dist/esm/grpc/proto/google/protobuf/timestamp.js +144 -108
  486. package/dist/esm/grpc/proto/google/protobuf/timestamp.js.map +1 -0
  487. package/dist/esm/grpc/proto/google/rpc/error_details.js +313 -267
  488. package/dist/esm/grpc/proto/google/rpc/error_details.js.map +1 -0
  489. package/dist/esm/grpc/proto/google/rpc/status.js +45 -28
  490. package/dist/esm/grpc/proto/google/rpc/status.js.map +1 -0
  491. package/dist/esm/grpc/proto/sui/rpc/v2/argument.js +80 -47
  492. package/dist/esm/grpc/proto/sui/rpc/v2/argument.js.map +1 -0
  493. package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js +41 -29
  494. package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js.map +1 -0
  495. package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js +34 -22
  496. package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js.map +1 -0
  497. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js +61 -49
  498. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js.map +1 -0
  499. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js +72 -57
  500. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js.map +1 -0
  501. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js +173 -139
  502. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js.map +1 -0
  503. package/dist/esm/grpc/proto/sui/rpc/v2/effects.js +358 -268
  504. package/dist/esm/grpc/proto/sui/rpc/v2/effects.js.map +1 -0
  505. package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js +72 -60
  506. package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js.map +1 -0
  507. package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js +29 -9
  508. package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js.map +1 -0
  509. package/dist/esm/grpc/proto/sui/rpc/v2/event.js +74 -59
  510. package/dist/esm/grpc/proto/sui/rpc/v2/event.js.map +1 -0
  511. package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js +69 -57
  512. package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js.map +1 -0
  513. package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js +861 -474
  514. package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js.map +1 -0
  515. package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js +52 -40
  516. package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js.map +1 -0
  517. package/dist/esm/grpc/proto/sui/rpc/v2/input.js +98 -61
  518. package/dist/esm/grpc/proto/sui/rpc/v2/input.js.map +1 -0
  519. package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js +71 -56
  520. package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js.map +1 -0
  521. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js +65 -100
  522. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js.map +1 -0
  523. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js +365 -306
  524. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js.map +1 -0
  525. package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js +585 -442
  526. package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js.map +1 -0
  527. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js +42 -59
  528. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js.map +1 -0
  529. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js +226 -191
  530. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js.map +1 -0
  531. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js +28 -33
  532. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js.map +1 -0
  533. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js +129 -107
  534. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js.map +1 -0
  535. package/dist/esm/grpc/proto/sui/rpc/v2/object.js +100 -85
  536. package/dist/esm/grpc/proto/sui/rpc/v2/object.js.map +1 -0
  537. package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js +42 -30
  538. package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js.map +1 -0
  539. package/dist/esm/grpc/proto/sui/rpc/v2/owner.js +72 -40
  540. package/dist/esm/grpc/proto/sui/rpc/v2/owner.js.map +1 -0
  541. package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js +42 -38
  542. package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js.map +1 -0
  543. package/dist/esm/grpc/proto/sui/rpc/v2/signature.js +544 -481
  544. package/dist/esm/grpc/proto/sui/rpc/v2/signature.js.map +1 -0
  545. package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js +52 -13
  546. package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js.map +1 -0
  547. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +23 -28
  548. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js.map +1 -0
  549. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js +74 -60
  550. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js.map +1 -0
  551. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js +49 -66
  552. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js.map +1 -0
  553. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js +623 -490
  554. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js.map +1 -0
  555. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js +33 -32
  556. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js.map +1 -0
  557. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js +50 -36
  558. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js.map +1 -0
  559. package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js +737 -701
  560. package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js.map +1 -0
  561. package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js +1177 -917
  562. package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js.map +1 -0
  563. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +28 -27
  564. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js.map +1 -0
  565. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js +169 -133
  566. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js.map +1 -0
  567. package/dist/esm/index.js +21 -107
  568. package/dist/esm/index.js.map +1 -0
  569. package/dist/esm/jsonRpc/client.js +646 -727
  570. package/dist/esm/jsonRpc/client.js.map +1 -0
  571. package/dist/esm/jsonRpc/core.d.ts +7 -7
  572. package/dist/esm/jsonRpc/core.js +550 -581
  573. package/dist/esm/jsonRpc/core.js.map +1 -0
  574. package/dist/esm/jsonRpc/errors.js +36 -41
  575. package/dist/esm/jsonRpc/errors.js.map +1 -0
  576. package/dist/esm/jsonRpc/http-transport.js +65 -93
  577. package/dist/esm/jsonRpc/http-transport.js.map +1 -0
  578. package/dist/esm/jsonRpc/index.js +6 -20
  579. package/dist/esm/jsonRpc/index.js.map +1 -0
  580. package/dist/esm/jsonRpc/json-rpc-resolver.js +281 -276
  581. package/dist/esm/jsonRpc/json-rpc-resolver.js.map +1 -0
  582. package/dist/esm/jsonRpc/rpc-websocket-client.js +147 -189
  583. package/dist/esm/jsonRpc/rpc-websocket-client.js.map +1 -0
  584. package/dist/esm/jsonRpc/types/chain.js +4 -0
  585. package/dist/esm/jsonRpc/types/chain.js.map +1 -0
  586. package/dist/esm/jsonRpc/types/changes.js +4 -0
  587. package/dist/esm/jsonRpc/types/changes.js.map +1 -0
  588. package/dist/esm/jsonRpc/types/coins.js +4 -0
  589. package/dist/esm/jsonRpc/types/coins.js.map +1 -0
  590. package/dist/esm/jsonRpc/types/common.js +4 -0
  591. package/dist/esm/jsonRpc/types/common.js.map +1 -0
  592. package/dist/esm/jsonRpc/types/generated.d.ts +1 -1
  593. package/dist/esm/jsonRpc/types/generated.js +4 -0
  594. package/dist/esm/jsonRpc/types/generated.js.map +1 -0
  595. package/dist/esm/jsonRpc/types/index.js +4 -0
  596. package/dist/esm/jsonRpc/types/index.js.map +1 -0
  597. package/dist/esm/jsonRpc/types/params.js +4 -0
  598. package/dist/esm/jsonRpc/types/params.js.map +1 -0
  599. package/dist/esm/keypairs/ed25519/ed25519-hd-key.js +49 -48
  600. package/dist/esm/keypairs/ed25519/ed25519-hd-key.js.map +1 -0
  601. package/dist/esm/keypairs/ed25519/index.js +5 -10
  602. package/dist/esm/keypairs/ed25519/index.js.map +1 -0
  603. package/dist/esm/keypairs/ed25519/keypair.js +128 -146
  604. package/dist/esm/keypairs/ed25519/keypair.js.map +1 -0
  605. package/dist/esm/keypairs/ed25519/publickey.js +64 -67
  606. package/dist/esm/keypairs/ed25519/publickey.js.map +1 -0
  607. package/dist/esm/keypairs/index.js +3 -0
  608. package/dist/esm/keypairs/index.js.map +1 -0
  609. package/dist/esm/keypairs/passkey/index.js +5 -12
  610. package/dist/esm/keypairs/passkey/index.js.map +1 -0
  611. package/dist/esm/keypairs/passkey/keypair.js +236 -243
  612. package/dist/esm/keypairs/passkey/keypair.js.map +1 -0
  613. package/dist/esm/keypairs/passkey/publickey.js +154 -140
  614. package/dist/esm/keypairs/passkey/publickey.js.map +1 -0
  615. package/dist/esm/keypairs/passkey/types.js +4 -0
  616. package/dist/esm/keypairs/passkey/types.js.map +1 -0
  617. package/dist/esm/keypairs/secp256k1/index.js +5 -10
  618. package/dist/esm/keypairs/secp256k1/index.js.map +1 -0
  619. package/dist/esm/keypairs/secp256k1/keypair.js +120 -134
  620. package/dist/esm/keypairs/secp256k1/keypair.js.map +1 -0
  621. package/dist/esm/keypairs/secp256k1/publickey.js +64 -71
  622. package/dist/esm/keypairs/secp256k1/publickey.js.map +1 -0
  623. package/dist/esm/keypairs/secp256r1/index.js +5 -10
  624. package/dist/esm/keypairs/secp256r1/index.js.map +1 -0
  625. package/dist/esm/keypairs/secp256r1/keypair.js +118 -131
  626. package/dist/esm/keypairs/secp256r1/keypair.js.map +1 -0
  627. package/dist/esm/keypairs/secp256r1/publickey.js +63 -66
  628. package/dist/esm/keypairs/secp256r1/publickey.js.map +1 -0
  629. package/dist/esm/multisig/index.js +5 -10
  630. package/dist/esm/multisig/index.js.map +1 -0
  631. package/dist/esm/multisig/publickey.d.ts +1 -1
  632. package/dist/esm/multisig/publickey.js +216 -253
  633. package/dist/esm/multisig/publickey.js.map +1 -0
  634. package/dist/esm/multisig/signer.js +57 -89
  635. package/dist/esm/multisig/signer.js.map +1 -0
  636. package/dist/esm/transactions/Arguments.d.ts +4 -4
  637. package/dist/esm/transactions/Arguments.js +9 -13
  638. package/dist/esm/transactions/Arguments.js.map +1 -0
  639. package/dist/esm/transactions/Commands.js +105 -118
  640. package/dist/esm/transactions/Commands.js.map +1 -0
  641. package/dist/esm/transactions/Inputs.js +49 -61
  642. package/dist/esm/transactions/Inputs.js.map +1 -0
  643. package/dist/esm/transactions/ObjectCache.d.ts +8 -8
  644. package/dist/esm/transactions/ObjectCache.js +200 -223
  645. package/dist/esm/transactions/ObjectCache.js.map +1 -0
  646. package/dist/esm/transactions/Transaction.d.ts +32 -32
  647. package/dist/esm/transactions/Transaction.js +611 -696
  648. package/dist/esm/transactions/Transaction.js.map +1 -0
  649. package/dist/esm/transactions/TransactionData.d.ts +9 -9
  650. package/dist/esm/transactions/TransactionData.js +386 -415
  651. package/dist/esm/transactions/TransactionData.js.map +1 -0
  652. package/dist/esm/transactions/__tests__/Transaction.test.js +167 -0
  653. package/dist/esm/transactions/__tests__/Transaction.test.js.map +1 -0
  654. package/dist/esm/transactions/__tests__/bcs.test.js +200 -0
  655. package/dist/esm/transactions/__tests__/bcs.test.js.map +1 -0
  656. package/dist/esm/transactions/data/internal.js +158 -205
  657. package/dist/esm/transactions/data/internal.js.map +1 -0
  658. package/dist/esm/transactions/data/v1.js +419 -487
  659. package/dist/esm/transactions/data/v1.js.map +1 -0
  660. package/dist/esm/transactions/data/v2.d.ts +5 -5
  661. package/dist/esm/transactions/data/v2.js +89 -107
  662. package/dist/esm/transactions/data/v2.js.map +1 -0
  663. package/dist/esm/transactions/executor/caching.d.ts +2 -2
  664. package/dist/esm/transactions/executor/caching.js +66 -93
  665. package/dist/esm/transactions/executor/caching.js.map +1 -0
  666. package/dist/esm/transactions/executor/parallel.js +329 -352
  667. package/dist/esm/transactions/executor/parallel.js.map +1 -0
  668. package/dist/esm/transactions/executor/queue.js +58 -64
  669. package/dist/esm/transactions/executor/queue.js.map +1 -0
  670. package/dist/esm/transactions/executor/serial.d.ts +5 -5
  671. package/dist/esm/transactions/executor/serial.js +96 -110
  672. package/dist/esm/transactions/executor/serial.js.map +1 -0
  673. package/dist/esm/transactions/hash.js +15 -9
  674. package/dist/esm/transactions/hash.js.map +1 -0
  675. package/dist/esm/transactions/index.js +15 -41
  676. package/dist/esm/transactions/index.js.map +1 -0
  677. package/dist/esm/transactions/intents/CoinWithBalance.js +127 -165
  678. package/dist/esm/transactions/intents/CoinWithBalance.js.map +1 -0
  679. package/dist/esm/transactions/object.js +86 -92
  680. package/dist/esm/transactions/object.js.map +1 -0
  681. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js +18 -15
  682. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js.map +1 -0
  683. package/dist/esm/transactions/pure.js +34 -39
  684. package/dist/esm/transactions/pure.js.map +1 -0
  685. package/dist/esm/transactions/resolve.js +58 -69
  686. package/dist/esm/transactions/resolve.js.map +1 -0
  687. package/dist/esm/transactions/serializer.js +145 -144
  688. package/dist/esm/transactions/serializer.js.map +1 -0
  689. package/dist/esm/transactions/utils.d.ts +1 -1
  690. package/dist/esm/transactions/utils.js +110 -109
  691. package/dist/esm/transactions/utils.js.map +1 -0
  692. package/dist/esm/utils/constants.js +26 -36
  693. package/dist/esm/utils/constants.js.map +1 -0
  694. package/dist/esm/utils/derived-objects.js +11 -10
  695. package/dist/esm/utils/derived-objects.js.map +1 -0
  696. package/dist/esm/utils/dynamic-fields.js +16 -16
  697. package/dist/esm/utils/dynamic-fields.js.map +1 -0
  698. package/dist/esm/utils/format.js +13 -13
  699. package/dist/esm/utils/format.js.map +1 -0
  700. package/dist/esm/utils/index.js +15 -76
  701. package/dist/esm/utils/index.js.map +1 -0
  702. package/dist/esm/utils/move-registry.js +34 -17
  703. package/dist/esm/utils/move-registry.js.map +1 -0
  704. package/dist/esm/utils/sui-types.js +70 -54
  705. package/dist/esm/utils/sui-types.js.map +1 -0
  706. package/dist/esm/utils/suins.js +29 -29
  707. package/dist/esm/utils/suins.js.map +1 -0
  708. package/dist/esm/verify/index.js +5 -14
  709. package/dist/esm/verify/index.js.map +1 -0
  710. package/dist/esm/verify/verify.js +76 -93
  711. package/dist/esm/verify/verify.js.map +1 -0
  712. package/dist/esm/version.js +6 -6
  713. package/dist/esm/version.js.map +1 -0
  714. package/dist/esm/w/call/allocation.js +307 -402
  715. package/dist/esm/w/call/allocation.js.map +1 -0
  716. package/dist/esm/w/call/arb.js +100 -129
  717. package/dist/esm/w/call/arb.js.map +1 -0
  718. package/dist/esm/w/call/arbitration.js +1170 -1568
  719. package/dist/esm/w/call/arbitration.js.map +1 -0
  720. package/dist/esm/w/call/base.js +288 -315
  721. package/dist/esm/w/call/base.js.map +1 -0
  722. package/dist/esm/w/call/contact.js +318 -442
  723. package/dist/esm/w/call/contact.js.map +1 -0
  724. package/dist/esm/w/call/demand.js +673 -841
  725. package/dist/esm/w/call/demand.js.map +1 -0
  726. package/dist/esm/w/call/entity.js +162 -203
  727. package/dist/esm/w/call/entity.js.map +1 -0
  728. package/dist/esm/w/call/guard-ins.js +4373 -4371
  729. package/dist/esm/w/call/guard-ins.js.map +1 -0
  730. package/dist/esm/w/call/guard.js +1061 -1108
  731. package/dist/esm/w/call/guard.js.map +1 -0
  732. package/dist/esm/w/call/index.js +24 -56
  733. package/dist/esm/w/call/index.js.map +1 -0
  734. package/dist/esm/w/call/machine.js +1086 -1433
  735. package/dist/esm/w/call/machine.js.map +1 -0
  736. package/dist/esm/w/call/order.js +301 -448
  737. package/dist/esm/w/call/order.js.map +1 -0
  738. package/dist/esm/w/call/passport.js +204 -240
  739. package/dist/esm/w/call/passport.js.map +1 -0
  740. package/dist/esm/w/call/payment.js +177 -215
  741. package/dist/esm/w/call/payment.js.map +1 -0
  742. package/dist/esm/w/call/permission.js +1172 -1320
  743. package/dist/esm/w/call/permission.js.map +1 -0
  744. package/dist/esm/w/call/personal.js +121 -156
  745. package/dist/esm/w/call/personal.js.map +1 -0
  746. package/dist/esm/w/call/progress.js +625 -797
  747. package/dist/esm/w/call/progress.js.map +1 -0
  748. package/dist/esm/w/call/proof.js +61 -103
  749. package/dist/esm/w/call/proof.js.map +1 -0
  750. package/dist/esm/w/call/repository.js +1017 -1251
  751. package/dist/esm/w/call/repository.js.map +1 -0
  752. package/dist/esm/w/call/resource.js +108 -124
  753. package/dist/esm/w/call/resource.js.map +1 -0
  754. package/dist/esm/w/call/reward.js +660 -847
  755. package/dist/esm/w/call/reward.js.map +1 -0
  756. package/dist/esm/w/call/service.js +1849 -2400
  757. package/dist/esm/w/call/service.js.map +1 -0
  758. package/dist/esm/w/call/treasury.js +815 -1125
  759. package/dist/esm/w/call/treasury.js.map +1 -0
  760. package/dist/esm/w/call/util.js +553 -576
  761. package/dist/esm/w/call/util.js.map +1 -0
  762. package/dist/esm/w/common.d.ts +1 -1
  763. package/dist/esm/w/common.js +579 -580
  764. package/dist/esm/w/common.js.map +1 -0
  765. package/dist/esm/w/exception.js +570 -573
  766. package/dist/esm/w/exception.js.map +1 -0
  767. package/dist/esm/w/index.js +4 -0
  768. package/dist/esm/w/index.js.map +1 -0
  769. package/dist/esm/w/local/account.js +652 -709
  770. package/dist/esm/w/local/account.js.map +1 -0
  771. package/dist/esm/w/local/cache.js +176 -147
  772. package/dist/esm/w/local/cache.js.map +1 -0
  773. package/dist/esm/w/local/config.js +46 -60
  774. package/dist/esm/w/local/config.js.map +1 -0
  775. package/dist/esm/w/local/index.js +196 -273
  776. package/dist/esm/w/local/index.js.map +1 -0
  777. package/dist/esm/w/local/local.d.ts +2 -2
  778. package/dist/esm/w/local/local.js +631 -626
  779. package/dist/esm/w/local/local.js.map +1 -0
  780. package/dist/esm/w/local/storage.js +168 -136
  781. package/dist/esm/w/local/storage.js.map +1 -0
  782. package/dist/esm/w/local/token.js +149 -151
  783. package/dist/esm/w/local/token.js.map +1 -0
  784. package/dist/esm/w/local/util.js +45 -22
  785. package/dist/esm/w/local/util.js.map +1 -0
  786. package/dist/esm/w/local/wip.js +1038 -781
  787. package/dist/esm/w/local/wip.js.map +1 -0
  788. package/dist/esm/w/messenger/crypto.js +491 -387
  789. package/dist/esm/w/messenger/crypto.js.map +1 -0
  790. package/dist/esm/w/messenger/index.js +27 -24
  791. package/dist/esm/w/messenger/index.js.map +1 -0
  792. package/dist/esm/w/messenger/messenger-api.js +1111 -1017
  793. package/dist/esm/w/messenger/messenger-api.js.map +1 -0
  794. package/dist/esm/w/messenger/messenger-manager.js +944 -1052
  795. package/dist/esm/w/messenger/messenger-manager.js.map +1 -0
  796. package/dist/esm/w/messenger/messenger.d.ts +1 -1
  797. package/dist/esm/w/messenger/messenger.js +1258 -1421
  798. package/dist/esm/w/messenger/messenger.js.map +1 -0
  799. package/dist/esm/w/messenger/server.js +388 -499
  800. package/dist/esm/w/messenger/server.js.map +1 -0
  801. package/dist/esm/w/messenger/session.js +394 -399
  802. package/dist/esm/w/messenger/session.js.map +1 -0
  803. package/dist/esm/w/messenger/storage.js +840 -751
  804. package/dist/esm/w/messenger/storage.js.map +1 -0
  805. package/dist/esm/w/messenger/types.d.ts +2 -2
  806. package/dist/esm/w/messenger/types.js +80 -85
  807. package/dist/esm/w/messenger/types.js.map +1 -0
  808. package/dist/esm/w/messenger/utils.js +28 -16
  809. package/dist/esm/w/messenger/utils.js.map +1 -0
  810. package/dist/esm/w/query/bult-in.js +95 -100
  811. package/dist/esm/w/query/bult-in.js.map +1 -0
  812. package/dist/esm/w/query/event.js +128 -125
  813. package/dist/esm/w/query/event.js.map +1 -0
  814. package/dist/esm/w/query/index.js +3 -0
  815. package/dist/esm/w/query/index.js.map +1 -0
  816. package/dist/esm/w/query/object.js +1560 -1574
  817. package/dist/esm/w/query/object.js.map +1 -0
  818. package/dist/esm/w/query/received.js +57 -63
  819. package/dist/esm/w/query/received.js.map +1 -0
  820. package/dist/esm/w/query/util.js +48 -56
  821. package/dist/esm/w/query/util.js.map +1 -0
  822. package/dist/esm/w/util.js +578 -673
  823. package/dist/esm/w/util.js.map +1 -0
  824. package/package.json +13 -7
  825. package/prebuilds/better-sqlite3-v12.9.0-node-v115-darwin-arm64.node +0 -0
  826. package/prebuilds/better-sqlite3-v12.9.0-node-v115-darwin-x64.node +0 -0
  827. package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-arm.node +0 -0
  828. package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-arm64.node +0 -0
  829. package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-x64.node +0 -0
  830. package/prebuilds/better-sqlite3-v12.9.0-node-v115-win32-arm64.node +0 -0
  831. package/prebuilds/better-sqlite3-v12.9.0-node-v115-win32-x64.node +0 -0
  832. package/prebuilds/better-sqlite3-v12.9.0-node-v127-darwin-arm64.node +0 -0
  833. package/prebuilds/better-sqlite3-v12.9.0-node-v127-darwin-x64.node +0 -0
  834. package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-arm.node +0 -0
  835. package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-arm64.node +0 -0
  836. package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-x64.node +0 -0
  837. package/prebuilds/better-sqlite3-v12.9.0-node-v127-win32-arm64.node +0 -0
  838. package/prebuilds/better-sqlite3-v12.9.0-node-v127-win32-x64.node +0 -0
  839. package/scripts/download-prebuilds.js +234 -0
  840. package/scripts/install-better-sqlite3.js +377 -0
  841. package/dist/cjs/graphql/client.js +0 -98
  842. package/dist/cjs/graphql/core.js +0 -506
  843. package/dist/cjs/graphql/generated/2024.1/tada-env.js +0 -13141
  844. package/dist/cjs/graphql/generated/2024.1/tsconfig.tada.js +0 -11
  845. package/dist/cjs/graphql/generated/2024.4/tada-env.js +0 -13287
  846. package/dist/cjs/graphql/generated/2024.4/tsconfig.tada.js +0 -11
  847. package/dist/cjs/graphql/generated/latest/tada-env.js +0 -12925
  848. package/dist/cjs/graphql/generated/latest/tsconfig.tada.js +0 -11
  849. package/dist/cjs/graphql/generated/queries.js +0 -807
  850. package/dist/cjs/graphql/index.js +0 -25
  851. package/dist/cjs/graphql/schemas/2024.1/index.js +0 -28
  852. package/dist/cjs/graphql/schemas/2024.4/index.js +0 -28
  853. package/dist/cjs/graphql/schemas/latest/index.js +0 -28
  854. package/dist/cjs/graphql/types.js +0 -16
  855. package/dist/cjs/package.json +0 -5
  856. package/dist/cjs/w/local/.eslintrc.js +0 -15
  857. package/dist/cjs/w/messenger/.eslintrc.js +0 -15
  858. package/dist/cjs/zklogin/address.js +0 -93
  859. package/dist/cjs/zklogin/bcs.js +0 -41
  860. package/dist/cjs/zklogin/index.js +0 -45
  861. package/dist/cjs/zklogin/jwt-decode.js +0 -88
  862. package/dist/cjs/zklogin/jwt-utils.js +0 -128
  863. package/dist/cjs/zklogin/nonce.js +0 -60
  864. package/dist/cjs/zklogin/poseidon.js +0 -64
  865. package/dist/cjs/zklogin/publickey.js +0 -281
  866. package/dist/cjs/zklogin/signature.js +0 -57
  867. package/dist/cjs/zklogin/utils.js +0 -98
  868. package/dist/esm/graphql/client.js +0 -79
  869. package/dist/esm/graphql/core.js +0 -505
  870. package/dist/esm/graphql/generated/2024.1/tada-env.js +0 -13121
  871. package/dist/esm/graphql/generated/2024.1/tsconfig.tada.js +0 -16
  872. package/dist/esm/graphql/generated/2024.4/tada-env.js +0 -13267
  873. package/dist/esm/graphql/generated/2024.4/tsconfig.tada.js +0 -16
  874. package/dist/esm/graphql/generated/latest/tada-env.js +0 -12905
  875. package/dist/esm/graphql/generated/latest/tsconfig.tada.js +0 -16
  876. package/dist/esm/graphql/generated/queries.js +0 -788
  877. package/dist/esm/graphql/index.js +0 -8
  878. package/dist/esm/graphql/schemas/2024.1/index.js +0 -8
  879. package/dist/esm/graphql/schemas/2024.4/index.js +0 -8
  880. package/dist/esm/graphql/schemas/latest/index.js +0 -8
  881. package/dist/esm/graphql/types.js +0 -0
  882. package/dist/esm/package.json +0 -5
  883. package/dist/esm/w/local/.eslintrc.js +0 -23
  884. package/dist/esm/w/messenger/.eslintrc.js +0 -23
  885. package/dist/esm/zklogin/address.js +0 -78
  886. package/dist/esm/zklogin/bcs.js +0 -21
  887. package/dist/esm/zklogin/index.js +0 -38
  888. package/dist/esm/zklogin/jwt-decode.js +0 -68
  889. package/dist/esm/zklogin/jwt-utils.js +0 -108
  890. package/dist/esm/zklogin/nonce.js +0 -40
  891. package/dist/esm/zklogin/poseidon.js +0 -61
  892. package/dist/esm/zklogin/publickey.js +0 -265
  893. package/dist/esm/zklogin/signature.js +0 -37
  894. package/dist/esm/zklogin/utils.js +0 -78
  895. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  896. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,669 +1,819 @@
1
+ // Copyright (c) Wowok.
2
+ // SPDX-License-Identifier: Apache-2.0
1
3
  import { MessengerManager } from "./messenger-manager.js";
2
4
  import { Account } from "../local/account.js";
3
5
  import { W_ERROR, WErrors } from "../exception.js";
4
6
  import { isValidWowAddress } from "../../utils/sui-types.js";
5
7
  import { LocalMark } from "../local/local.js";
6
8
  import { MessageStorage } from "./storage.js";
7
- import {
8
- MessengerError,
9
- MessengerErrorCode,
10
- CHAIN_PROOF_TYPE
11
- } from "./types.js";
9
+ import { MessengerError, MessengerErrorCode, CHAIN_PROOF_TYPE, } from "./types.js";
12
10
  import { createHash } from "crypto";
13
11
  import * as fs from "fs";
14
12
  import * as path from "path";
15
13
  import { isValidU64 } from "../common.js";
16
- import {
17
- verifySingleMerkleRoot,
18
- hashPlaintext,
19
- verifyEd25519Signature
20
- } from "./crypto.js";
14
+ import { verifySingleMerkleRoot, hashPlaintext, verifyEd25519Signature, } from "./crypto.js";
21
15
  import { canonicalizeJson } from "./utils.js";
22
- import {
23
- GetAccountOrMark_Address,
24
- GetManyAccountOrMark_Address
25
- } from "../local/index.js";
16
+ import { GetAccountOrMark_Address, GetManyAccountOrMark_Address, } from "../local/index.js";
26
17
  import { query_objects } from "../query/object.js";
27
18
  import { Messenger } from "./messenger.js";
28
19
  let managerInstance = null;
29
20
  let isInitialized = false;
30
21
  let backgroundTimer = null;
22
+ /**
23
+ * 自动检查并注册所有设置了 messenger name 的账号
24
+ * 如果账号已注册(identity 已存在),则跳过
25
+ */
31
26
  async function autoRegisterMessengerAccounts() {
32
- const accounts = await Account.Instance().list_messenger_accounts();
33
- for (const account of accounts) {
34
- if (!account.address || !account.m) {
35
- continue;
27
+ const accounts = await Account.Instance().list_messenger_accounts();
28
+ for (const account of accounts) {
29
+ if (!account.address || !account.m) {
30
+ continue;
31
+ }
32
+ const messenger = new Messenger(account.address);
33
+ await messenger.initialize();
36
34
  }
37
- const messenger = new Messenger(account.address);
38
- await messenger.initialize();
39
- }
40
35
  }
41
- function getMessengerManager() {
42
- if (!managerInstance) {
43
- managerInstance = new MessengerManager();
44
- }
45
- if (!isInitialized) {
46
- isInitialized = true;
47
- autoRegisterMessengerAccounts().catch((err) => {
48
- console.error("Failed to auto-register messenger accounts:", err);
49
- });
50
- managerInstance.start().catch((err) => {
51
- console.error("Failed to auto-start messenger manager:", err);
52
- });
53
- }
54
- return managerInstance;
36
+ /**
37
+ * 获取 MessengerManager 实例(单例)
38
+ * 首次调用时会自动启动后台服务
39
+ */
40
+ export function getMessengerManager() {
41
+ if (!managerInstance) {
42
+ managerInstance = new MessengerManager();
43
+ }
44
+ if (!isInitialized) {
45
+ isInitialized = true;
46
+ // 启动时先自动检查并注册账号
47
+ autoRegisterMessengerAccounts().catch((err) => {
48
+ console.error("Failed to auto-register messenger accounts:", err);
49
+ });
50
+ managerInstance.start().catch((err) => {
51
+ console.error("Failed to auto-start messenger manager:", err);
52
+ });
53
+ }
54
+ return managerInstance;
55
55
  }
56
+ /**
57
+ * 后台检查任务:1 分钟执行一次
58
+ * 1. 检查 SSE 连接状态,未连接则尝试连接
59
+ * 2. SSE 失败时回退到轮询
60
+ * 3. 检查并注册所有设置了 messenger name 的账号
61
+ */
56
62
  async function backgroundCheck() {
57
- try {
58
- const manager = getMessengerManager();
59
- await manager.start();
60
- } catch (err) {
61
- console.error("Background check failed:", err);
62
- }
63
- await autoRegisterMessengerAccounts();
63
+ try {
64
+ const manager = getMessengerManager();
65
+ await manager.start();
66
+ }
67
+ catch (err) {
68
+ console.error("Background check failed:", err);
69
+ }
70
+ // 每次后台检查时也检查并注册账号
71
+ await autoRegisterMessengerAccounts();
64
72
  }
73
+ /**
74
+ * 启动后台定时器(1 分钟执行一次)
75
+ */
65
76
  function startBackgroundTimer() {
66
- if (backgroundTimer) {
67
- clearInterval(backgroundTimer);
68
- }
69
- backgroundTimer = setInterval(() => {
70
- backgroundCheck().catch(() => {
71
- });
72
- }, 60 * 1e3);
73
- backgroundCheck().catch(() => {
74
- });
75
- }
76
- function registerCleanupHandler() {
77
- const cleanup = () => {
78
77
  if (backgroundTimer) {
79
- clearInterval(backgroundTimer);
80
- backgroundTimer = null;
78
+ clearInterval(backgroundTimer);
81
79
  }
82
- if (managerInstance) {
83
- managerInstance.stop();
84
- }
85
- };
86
- process.on("exit", cleanup);
87
- process.on("SIGINT", () => {
88
- cleanup();
89
- process.exit();
90
- });
91
- process.on("SIGTERM", () => {
92
- cleanup();
93
- process.exit();
94
- });
80
+ backgroundTimer = setInterval(() => {
81
+ backgroundCheck().catch(() => { });
82
+ }, 60 * 1000);
83
+ backgroundCheck().catch(() => { });
84
+ }
85
+ /**
86
+ * 进程退出时自动清理
87
+ */
88
+ function registerCleanupHandler() {
89
+ const cleanup = () => {
90
+ if (backgroundTimer) {
91
+ clearInterval(backgroundTimer);
92
+ backgroundTimer = null;
93
+ }
94
+ if (managerInstance) {
95
+ managerInstance.stop();
96
+ }
97
+ };
98
+ process.on("exit", cleanup);
99
+ process.on("SIGINT", () => {
100
+ cleanup();
101
+ process.exit();
102
+ });
103
+ process.on("SIGTERM", () => {
104
+ cleanup();
105
+ process.exit();
106
+ });
95
107
  }
96
108
  registerCleanupHandler();
97
109
  startBackgroundTimer();
98
- async function watch_conversations(account) {
99
- const address = await Account.Instance().get_address(account);
100
- if (!address) {
101
- W_ERROR(
102
- WErrors.AccountNotFound,
103
- `watch_conversations.account ${account}`
104
- );
105
- }
106
- const manager = getMessengerManager();
107
- return manager.get_conversations(address);
110
+ export async function watch_conversations(account) {
111
+ const address = await Account.Instance().get_address(account);
112
+ if (!address) {
113
+ W_ERROR(WErrors.AccountNotFound, `watch_conversations.account ${account}`);
114
+ }
115
+ const manager = getMessengerManager();
116
+ return manager.get_conversations(address);
108
117
  }
109
- async function send_message(from, to, content, options) {
110
- const fromAddress = await Account.Instance().get_address(from);
111
- if (!fromAddress) {
112
- W_ERROR(WErrors.AccountNotFound, `send_message.from ${from}`);
113
- }
114
- const t = await GetAccountOrMark_Address(to);
115
- if (!t) {
116
- W_ERROR(
117
- WErrors.AccountNotFound,
118
- `send_message.to ${to} is not a valid account/address`
119
- );
120
- }
121
- if (options?.guardAddress != null && options?.passportAddress != null) {
122
- [options.guardAddress, options.passportAddress] = await LocalMark.Instance().get_many_address([
123
- options.guardAddress,
124
- options.passportAddress
125
- ]);
126
- if (!options.guardAddress || !options.passportAddress) {
127
- W_ERROR(
128
- WErrors.AccountNotFound,
129
- `send_message.guardAddress or passportAddress not found`
130
- );
118
+ /**
119
+ * 发送消息
120
+ *
121
+ * @param from 发送者地址
122
+ * @param to 接收者地址
123
+ * @param content 消息内容
124
+ * @param options 可选配置
125
+ * @returns SendMessageResult
126
+ */
127
+ export async function send_message(from, to, content, options) {
128
+ const fromAddress = await Account.Instance().get_address(from);
129
+ if (!fromAddress) {
130
+ W_ERROR(WErrors.AccountNotFound, `send_message.from ${from}`);
131
+ }
132
+ const t = await GetAccountOrMark_Address(to);
133
+ if (!t) {
134
+ W_ERROR(WErrors.AccountNotFound, `send_message.to ${to} is not a valid account/address`);
131
135
  }
132
- }
133
- const manager = getMessengerManager();
134
- return manager.send(fromAddress, t, content, options);
136
+ if (options?.guardAddress != null && options?.passportAddress != null) {
137
+ [options.guardAddress, options.passportAddress] =
138
+ await LocalMark.Instance().get_many_address([
139
+ options.guardAddress,
140
+ options.passportAddress,
141
+ ]);
142
+ if (!options.guardAddress || !options.passportAddress) {
143
+ W_ERROR(WErrors.AccountNotFound, `send_message.guardAddress or passportAddress not found`);
144
+ }
145
+ }
146
+ const manager = getMessengerManager();
147
+ return manager.send(fromAddress, t, content, options);
135
148
  }
136
- async function send_file(from, to, filePath, options) {
137
- const fromAddress = await Account.Instance().get_address(from);
138
- if (!fromAddress) {
139
- W_ERROR(WErrors.AccountNotFound, `send_file.from ${from}`);
140
- }
141
- const t = await GetAccountOrMark_Address(to);
142
- if (!t) {
143
- W_ERROR(
144
- WErrors.AccountNotFound,
145
- `send_file.to ${to} is not a valid account/address`
146
- );
147
- }
148
- if (options?.guardAddress != null && options?.passportAddress != null) {
149
- [options.guardAddress, options.passportAddress] = await LocalMark.Instance().get_many_address([
150
- options.guardAddress,
151
- options.passportAddress
152
- ]);
153
- if (!options.guardAddress || !options.passportAddress) {
154
- W_ERROR(
155
- WErrors.AccountNotFound,
156
- `send_file.guardAddress or passportAddress not found`
157
- );
149
+ /**
150
+ * 发送文件(ZIP 格式)
151
+ *
152
+ * 支持发送本地文件,经过 ZIP 压缩后发送给对方
153
+ * 支持 Guard 验证,如果提供 guardAddress 和 passportAddress,消息将进入 Guard 验证流程
154
+ *
155
+ * @param from 发送者账号或地址
156
+ * @param to 接收者地址
157
+ * @param filePath 本地文件路径
158
+ * @param options 可选配置
159
+ * @returns SendMessageResult
160
+ */
161
+ export async function send_file(from, to, filePath, options) {
162
+ const fromAddress = await Account.Instance().get_address(from);
163
+ if (!fromAddress) {
164
+ W_ERROR(WErrors.AccountNotFound, `send_file.from ${from}`);
165
+ }
166
+ const t = await GetAccountOrMark_Address(to);
167
+ if (!t) {
168
+ W_ERROR(WErrors.AccountNotFound, `send_file.to ${to} is not a valid account/address`);
169
+ }
170
+ if (options?.guardAddress != null && options?.passportAddress != null) {
171
+ [options.guardAddress, options.passportAddress] =
172
+ await LocalMark.Instance().get_many_address([
173
+ options.guardAddress,
174
+ options.passportAddress,
175
+ ]);
176
+ if (!options.guardAddress || !options.passportAddress) {
177
+ W_ERROR(WErrors.AccountNotFound, `send_file.guardAddress or passportAddress not found`);
178
+ }
158
179
  }
159
- }
160
- const manager = getMessengerManager();
161
- return manager.send_file(fromAddress, t, filePath, options);
180
+ const manager = getMessengerManager();
181
+ return manager.send_file(fromAddress, t, filePath, options);
162
182
  }
163
- async function watch_messages(filter) {
164
- if (filter?.account) {
165
- filter.account = await Account.Instance().get_address(filter.account);
166
- }
167
- if (filter?.customListFilter?.includeAddresses != null) {
168
- filter.customListFilter.includeAddresses = (await Account.Instance().get_many_address(
169
- filter.customListFilter.includeAddresses
170
- )).filter((v) => v != null);
171
- }
172
- if (filter?.customListFilter?.excludeAddresses != null) {
173
- filter.customListFilter.excludeAddresses = (await Account.Instance().get_many_address(
174
- filter.customListFilter.excludeAddresses
175
- )).filter((v) => v != null);
176
- }
177
- const manager = getMessengerManager();
178
- return manager.watch(filter);
183
+ /**
184
+ * 查询消息
185
+ *
186
+ * @param filter 过滤条件
187
+ * @returns Message 数组
188
+ */
189
+ export async function watch_messages(filter) {
190
+ if (filter?.account) {
191
+ filter.account = await Account.Instance().get_address(filter.account);
192
+ }
193
+ if (filter?.customListFilter?.includeAddresses != null) {
194
+ filter.customListFilter.includeAddresses = (await Account.Instance().get_many_address(filter.customListFilter.includeAddresses)).filter((v) => v != null);
195
+ }
196
+ if (filter?.customListFilter?.excludeAddresses != null) {
197
+ filter.customListFilter.excludeAddresses = (await Account.Instance().get_many_address(filter.customListFilter.excludeAddresses)).filter((v) => v != null);
198
+ }
199
+ const manager = getMessengerManager();
200
+ return manager.watch(filter);
179
201
  }
202
+ /**
203
+ * 解压 ZIP 消息到指定目录
204
+ *
205
+ * @param message 包含 ZIP 数据的消息对象
206
+ * @param outputDir 输出目录路径
207
+ * @returns 解压后的文件路径
208
+ */
180
209
  async function extract_zip_message(message, outputDir) {
181
- if (!message.zipMetadata) {
182
- throw new MessengerError(
183
- MessengerErrorCode.INVALID_MESSAGE_TYPE,
184
- "Message is not a ZIP archive"
185
- );
186
- }
187
- if (!message.plaintext) {
188
- throw new MessengerError(
189
- MessengerErrorCode.MESSAGE_NOT_DECRYPTED,
190
- "Message plaintext not available"
191
- );
192
- }
193
- const zipBase64 = message.plaintext;
194
- const zipData = Buffer.from(zipBase64, "base64");
195
- if (message.zipMetadata?.fileHash) {
196
- const actualHash = createHash("sha256").update(zipData).digest("hex");
197
- const expectedHash = message.zipMetadata.fileHash.replace("0x", "");
198
- if (actualHash !== expectedHash) {
199
- throw new MessengerError(
200
- MessengerErrorCode.HASH_MISMATCH,
201
- `ZIP file hash mismatch: expected ${expectedHash}, got ${actualHash}`
202
- );
210
+ if (!message.zipMetadata) {
211
+ throw new MessengerError(MessengerErrorCode.INVALID_MESSAGE_TYPE, "Message is not a ZIP archive");
203
212
  }
204
- }
205
- const JSZip = (await import("jszip")).default;
206
- const zip = await JSZip.loadAsync(zipData);
207
- if (!fs.existsSync(outputDir)) {
208
- fs.mkdirSync(outputDir, { recursive: true });
209
- }
210
- const savedPaths = [];
211
- for (const [fileName, file] of Object.entries(zip.files)) {
212
- const zipFile = file;
213
- if (!zipFile.dir) {
214
- const content = await zipFile.async("nodebuffer");
215
- const outputPath = path.join(outputDir, fileName);
216
- fs.writeFileSync(outputPath, content);
217
- savedPaths.push(outputPath);
213
+ if (!message.plaintext) {
214
+ throw new MessengerError(MessengerErrorCode.MESSAGE_NOT_DECRYPTED, "Message plaintext not available");
218
215
  }
219
- }
220
- if (savedPaths.length > 0 && message.zipMetadata) {
221
- const updatedMetadata = {
222
- fileName: message.zipMetadata.fileName,
223
- fileSize: message.zipMetadata.fileSize,
224
- fileHash: message.zipMetadata.fileHash,
225
- contentType: message.zipMetadata.contentType,
226
- localCachePath: savedPaths[0],
227
- downloadedAt: Date.now()
228
- };
229
- message.zipMetadata = updatedMetadata;
230
- const userAddress = message.direction === "sent" ? message.fromAddress : message.toAddress;
231
- const messageStorage = new MessageStorage(userAddress);
232
- messageStorage.saveMessage(message);
233
- }
234
- return savedPaths[0] || "";
235
- }
236
- async function extract_zip_messages(account, messages, outputDir) {
237
- const results = [];
238
- const userAddress = await Account.Instance().get_address(account);
239
- if (!userAddress) {
240
- throw new MessengerError(
241
- MessengerErrorCode.INVALID_INPUT,
242
- "account is required when extracting by message IDs"
243
- );
244
- }
245
- const isMessageIds = messages.length > 0 && typeof messages[0] === "string";
246
- for (const item of messages) {
247
- try {
248
- let message;
249
- if (isMessageIds) {
250
- const messageId = item;
216
+ // 1. 解码 base64 ZIP 数据
217
+ const zipBase64 = message.plaintext;
218
+ const zipData = Buffer.from(zipBase64, "base64");
219
+ // 2. 验证文件哈希
220
+ if (message.zipMetadata?.fileHash) {
221
+ const actualHash = createHash("sha256").update(zipData).digest("hex");
222
+ const expectedHash = message.zipMetadata.fileHash.replace("0x", "");
223
+ if (actualHash !== expectedHash) {
224
+ throw new MessengerError(MessengerErrorCode.HASH_MISMATCH, `ZIP file hash mismatch: expected ${expectedHash}, got ${actualHash}`);
225
+ }
226
+ }
227
+ // 3. 解压 ZIP 文件
228
+ const JSZip = (await import("jszip")).default;
229
+ const zip = await JSZip.loadAsync(zipData);
230
+ // 4. 确保输出目录存在
231
+ if (!fs.existsSync(outputDir)) {
232
+ fs.mkdirSync(outputDir, { recursive: true });
233
+ }
234
+ // 5. 保存文件
235
+ const savedPaths = [];
236
+ for (const [fileName, file] of Object.entries(zip.files)) {
237
+ const zipFile = file;
238
+ if (!zipFile.dir) {
239
+ const content = await zipFile.async("nodebuffer");
240
+ const outputPath = path.join(outputDir, fileName);
241
+ fs.writeFileSync(outputPath, content);
242
+ savedPaths.push(outputPath);
243
+ }
244
+ }
245
+ // 6. 更新消息元数据
246
+ if (savedPaths.length > 0 && message.zipMetadata) {
247
+ const updatedMetadata = {
248
+ fileName: message.zipMetadata.fileName,
249
+ fileSize: message.zipMetadata.fileSize,
250
+ fileHash: message.zipMetadata.fileHash,
251
+ contentType: message.zipMetadata.contentType,
252
+ localCachePath: savedPaths[0],
253
+ downloadedAt: Date.now(),
254
+ };
255
+ message.zipMetadata = updatedMetadata;
256
+ // 根据消息方向确定用户地址
257
+ const userAddress = message.direction === "sent"
258
+ ? message.fromAddress
259
+ : message.toAddress;
251
260
  const messageStorage = new MessageStorage(userAddress);
252
- const storedMessage = messageStorage.getMessageById(messageId);
253
- if (!storedMessage) {
254
- console.error(`Message not found: ${messageId}`);
255
- continue;
261
+ messageStorage.saveMessage(message);
262
+ }
263
+ return savedPaths[0] || "";
264
+ }
265
+ /**
266
+ * 批量解压多个 ZIP 消息到指定目录
267
+ *
268
+ * @param messages 包含 ZIP 数据的消息数组,或消息 ID 数组
269
+ * @param outputDir 输出目录路径
270
+ * @param userAddress 用户地址(当传入消息ID数组时需要)
271
+ * @returns 解压后的文件路径数组
272
+ */
273
+ export async function extract_zip_messages(account, messages, outputDir) {
274
+ const results = [];
275
+ const userAddress = await Account.Instance().get_address(account);
276
+ if (!userAddress) {
277
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, "account is required when extracting by message IDs");
278
+ }
279
+ // 判断是 Message 数组还是 messageId 数组
280
+ const isMessageIds = messages.length > 0 && typeof messages[0] === "string";
281
+ for (const item of messages) {
282
+ try {
283
+ let message;
284
+ if (isMessageIds) {
285
+ const messageId = item;
286
+ const messageStorage = new MessageStorage(userAddress);
287
+ const storedMessage = messageStorage.getMessageById(messageId);
288
+ if (!storedMessage) {
289
+ console.error(`Message not found: ${messageId}`);
290
+ continue;
291
+ }
292
+ message = storedMessage;
293
+ }
294
+ else {
295
+ message = item;
296
+ }
297
+ // 检查是否为 ZIP 消息
298
+ if (!message.zipMetadata) {
299
+ console.error(`Message ${message.messageId} is not a ZIP archive`);
300
+ continue;
301
+ }
302
+ const filePath = await extract_zip_message(message, outputDir);
303
+ results.push(filePath);
304
+ }
305
+ catch (e) {
306
+ const id = isMessageIds
307
+ ? item
308
+ : item.messageId;
309
+ console.error(`Failed to extract message ${id}:`, e);
256
310
  }
257
- message = storedMessage;
258
- } else {
259
- message = item;
260
- }
261
- if (!message.zipMetadata) {
262
- console.error(
263
- `Message ${message.messageId} is not a ZIP archive`
264
- );
265
- continue;
266
- }
267
- const filePath = await extract_zip_message(message, outputDir);
268
- results.push(filePath);
269
- } catch (e) {
270
- const id = isMessageIds ? item : item.messageId;
271
- console.error(`Failed to extract message ${id}:`, e);
272
311
  }
273
- }
274
- return results;
312
+ return results;
275
313
  }
276
- async function generate_wts(params) {
277
- const myAddress = await Account.Instance().get_address(params.myAccount);
278
- if (!myAddress) {
279
- W_ERROR(
280
- WErrors.AccountNotFound,
281
- `generate_wts.myAccount ${params.myAccount}`
282
- );
283
- }
284
- if (!isValidWowAddress(params.peerAccount)) {
285
- const t = await Account.Instance().get_address(params.peerAccount);
286
- if (!t) {
287
- W_ERROR(
288
- WErrors.AccountNotFound,
289
- `generate_wts.peerAccount ${params.peerAccount}`
290
- );
314
+ export async function generate_wts(params) {
315
+ const myAddress = await Account.Instance().get_address(params.myAccount);
316
+ if (!myAddress) {
317
+ W_ERROR(WErrors.AccountNotFound, `generate_wts.myAccount ${params.myAccount}`);
291
318
  }
292
- params.peerAccount = t;
293
- }
294
- return getMessengerManager().generate_wts(params);
319
+ if (!isValidWowAddress(params.peerAccount)) {
320
+ const t = await Account.Instance().get_address(params.peerAccount);
321
+ if (!t) {
322
+ W_ERROR(WErrors.AccountNotFound, `generate_wts.peerAccount ${params.peerAccount}`);
323
+ }
324
+ params.peerAccount = t;
325
+ }
326
+ return getMessengerManager().generate_wts(params);
295
327
  }
328
+ /**
329
+ * 加载 WTS 文件
330
+ *
331
+ * @param filePath WTS 文件路径
332
+ * @returns WtsFile 对象
333
+ */
296
334
  function load_wts(filePath) {
297
- const content = fs.readFileSync(filePath, "utf-8");
298
- return JSON.parse(content);
335
+ const content = fs.readFileSync(filePath, "utf-8");
336
+ return JSON.parse(content);
299
337
  }
338
+ /**
339
+ * 保存 WTS 文件
340
+ *
341
+ * @param wtsFile WTS 文件对象
342
+ * @param filePath 保存路径
343
+ */
300
344
  function save_wts(wtsFile, filePath) {
301
- const dir = path.dirname(filePath);
302
- if (!fs.existsSync(dir)) {
303
- fs.mkdirSync(dir, { recursive: true });
304
- }
305
- fs.writeFileSync(filePath, JSON.stringify(wtsFile, null, 2), "utf-8");
306
- }
307
- async function verify_wts(wtsFilePath) {
308
- try {
309
- const wtsFile = load_wts(wtsFilePath);
310
- if (!wtsFile.wts || !wtsFile.payload || !wtsFile.meta) {
311
- return { valid: false, error: "Invalid WTS file structure" };
312
- }
313
- if (wtsFile.meta.type !== "wts") {
314
- return {
315
- valid: false,
316
- error: `Invalid meta.type: ${wtsFile.meta.type}`
317
- };
318
- }
319
- const { payload, meta } = wtsFile;
320
- for (const msg of payload.messages) {
321
- const result = verifySingleMerkleRoot(
322
- msg.prevRoot,
323
- msg.merkleRoot,
324
- msg.plaintextHash,
325
- msg.timestamp,
326
- msg.leafIndex
327
- );
328
- if (!result.valid) {
329
- return {
330
- valid: false,
331
- error: `${result.error} at leafIndex ${msg.leafIndex}`
332
- };
333
- }
345
+ const dir = path.dirname(filePath);
346
+ if (!fs.existsSync(dir)) {
347
+ fs.mkdirSync(dir, { recursive: true });
334
348
  }
335
- for (let i = 0; i < payload.messages.length; i++) {
336
- const msg = payload.messages[i];
337
- const isNonTextMsg = !!msg.zipMetadata;
338
- if (!isNonTextMsg) {
339
- if (!msg.plaintextHash.startsWith("0x") || msg.plaintextHash.length !== 66) {
340
- return {
341
- valid: false,
342
- error: `Message ${i}: Invalid plaintextHash format`
343
- };
349
+ fs.writeFileSync(filePath, JSON.stringify(wtsFile, null, 2), "utf-8");
350
+ }
351
+ /**
352
+ * 验证 WTS 文件
353
+ *
354
+ * 验证内容包括:
355
+ * 1. 文件结构完整性
356
+ * 2. Merkle 链连续性
357
+ * 3. 消息哈希格式
358
+ * 4. Payload 哈希匹配
359
+ * 5. 数字签名(如果存在)
360
+ *
361
+ * @param wtsFilePath WTS 文件路径(本地或网络文件)
362
+ * @returns 验证结果
363
+ */
364
+ export async function verify_wts(wtsFilePath) {
365
+ try {
366
+ // 1. 加载 WTS 文件
367
+ const wtsFile = load_wts(wtsFilePath);
368
+ // 2. 验证基本结构
369
+ if (!wtsFile.wts || !wtsFile.payload || !wtsFile.meta) {
370
+ return { valid: false, error: "Invalid WTS file structure" };
344
371
  }
345
- if (msg.plaintext) {
346
- const computedHash2 = hashPlaintext(
347
- msg.plaintext,
348
- msg.clientTimestamp,
349
- msg.guardAddress,
350
- msg.passportAddress,
351
- msg.lastReceivedLeafIndex
352
- );
353
- if (computedHash2.toLowerCase() !== msg.plaintextHash.toLowerCase()) {
372
+ if (wtsFile.meta.type !== "wts") {
354
373
  return {
355
- valid: false,
356
- error: `Message ${i}: Plaintext hash mismatch`
374
+ valid: false,
375
+ error: `Invalid meta.type: ${wtsFile.meta.type}`,
357
376
  };
358
- }
359
377
  }
360
- }
361
- if (msg.serverSignature && msg.serverPublicKey) {
362
- if (!msg.timestamp) {
363
- return {
364
- valid: false,
365
- error: `Message ${i}: Missing timestamp for signature verification`
366
- };
367
- }
368
- if (!msg.merkleRoot) {
369
- return {
370
- valid: false,
371
- error: `Message ${i}: Missing merkleRoot for signature verification`
372
- };
378
+ const { payload, meta } = wtsFile;
379
+ // 2. 验证每个消息的 Merkle Root 计算(不验证跨消息链连续性)
380
+ // 因为消息可能来自不同的 Merkle Tree(不同会话方向)
381
+ for (const msg of payload.messages) {
382
+ const result = verifySingleMerkleRoot(msg.prevRoot, msg.merkleRoot, msg.plaintextHash, msg.timestamp, msg.leafIndex);
383
+ if (!result.valid) {
384
+ return {
385
+ valid: false,
386
+ error: `${result.error} at leafIndex ${msg.leafIndex}`,
387
+ };
388
+ }
373
389
  }
374
- if (!msg.prevRoot) {
375
- return {
376
- valid: false,
377
- error: `Message ${i}: Missing prevRoot for signature verification`
378
- };
390
+ // 3. 验证每个消息的 plaintextHash 和服务器签名(如果提供了明文)
391
+ for (let i = 0; i < payload.messages.length; i++) {
392
+ const msg = payload.messages[i];
393
+ // 判断是否为非文本消息(ZIP/WTS/WIP)
394
+ const isNonTextMsg = !!msg.zipMetadata;
395
+ // 对于非文本消息,跳过 plaintextHash 格式验证(它们使用不同的哈希格式)
396
+ if (!isNonTextMsg) {
397
+ // 验证普通消息的 plaintextHash 格式
398
+ if (!msg.plaintextHash.startsWith("0x") ||
399
+ msg.plaintextHash.length !== 66) {
400
+ return {
401
+ valid: false,
402
+ error: `Message ${i}: Invalid plaintextHash format`,
403
+ };
404
+ }
405
+ // 如果提供了明文,验证 plaintextHash
406
+ if (msg.plaintext) {
407
+ const computedHash = hashPlaintext(msg.plaintext, msg.clientTimestamp, msg.guardAddress, msg.passportAddress, msg.lastReceivedLeafIndex);
408
+ if (computedHash.toLowerCase() !==
409
+ msg.plaintextHash.toLowerCase()) {
410
+ return {
411
+ valid: false,
412
+ error: `Message ${i}: Plaintext hash mismatch`,
413
+ };
414
+ }
415
+ }
416
+ }
417
+ // 验证服务器签名(如果提供了签名和公钥)
418
+ if (msg.serverSignature && msg.serverPublicKey) {
419
+ // 检查必需的字段
420
+ if (!msg.timestamp) {
421
+ return {
422
+ valid: false,
423
+ error: `Message ${i}: Missing timestamp for signature verification`,
424
+ };
425
+ }
426
+ if (!msg.merkleRoot) {
427
+ return {
428
+ valid: false,
429
+ error: `Message ${i}: Missing merkleRoot for signature verification`,
430
+ };
431
+ }
432
+ if (!msg.prevRoot) {
433
+ return {
434
+ valid: false,
435
+ error: `Message ${i}: Missing prevRoot for signature verification`,
436
+ };
437
+ }
438
+ const signData = `${msg.prevRoot}:${msg.merkleRoot}:${msg.timestamp}:${msg.serverPublicKey}`;
439
+ const signatureValid = verifyEd25519Signature(msg.serverPublicKey, signData, msg.serverSignature);
440
+ if (!signatureValid) {
441
+ return {
442
+ valid: false,
443
+ error: `Message ${i}: Server signature verification failed`,
444
+ };
445
+ }
446
+ }
379
447
  }
380
- const signData = `${msg.prevRoot}:${msg.merkleRoot}:${msg.timestamp}:${msg.serverPublicKey}`;
381
- const signatureValid2 = verifyEd25519Signature(
382
- msg.serverPublicKey,
383
- signData,
384
- msg.serverSignature
448
+ // 4. 验证 payload 哈希
449
+ const { sha256 } = await import("@noble/hashes/sha256");
450
+ const { bytesToHex } = await import("@noble/hashes/utils");
451
+ const canonicalPayload = canonicalizeJson(payload);
452
+ const computedHash = "sha256:" +
453
+ bytesToHex(sha256(new TextEncoder().encode(canonicalPayload)));
454
+ // DEBUG: 打印调试信息
455
+ /*console.log("=== WTS Hash Verification Debug ===");
456
+ console.log("Stored hash:", meta.hash);
457
+ console.log("Computed hash:", computedHash);
458
+ console.log(
459
+ "Canonical payload:",
460
+ canonicalPayload.substring(0, 500) + "...",
385
461
  );
386
- if (!signatureValid2) {
387
- return {
388
- valid: false,
389
- error: `Message ${i}: Server signature verification failed`
390
- };
462
+ console.log("Payload keys:", Object.keys(payload));
463
+ console.log("Messages count:", payload.messages.length);
464
+ if (payload.messages.length > 0) {
465
+ console.log(
466
+ "First message keys:",
467
+ Object.keys(payload.messages[0]),
468
+ );
469
+ console.log(
470
+ "First message:",
471
+ JSON.stringify(payload.messages[0], null, 2).substring(0, 500),
472
+ );
473
+ }*/
474
+ if (computedHash !== meta.hash) {
475
+ return {
476
+ valid: false,
477
+ error: "Hash mismatch - content has been tampered",
478
+ hashValid: false,
479
+ hasSignature: !!meta.signature,
480
+ };
391
481
  }
392
- }
393
- }
394
- const { sha256 } = await import("@noble/hashes/sha256");
395
- const { bytesToHex } = await import("@noble/hashes/utils");
396
- const canonicalPayload = canonicalizeJson(payload);
397
- const computedHash = "sha256:" + bytesToHex(sha256(new TextEncoder().encode(canonicalPayload)));
398
- if (computedHash !== meta.hash) {
399
- return {
400
- valid: false,
401
- error: "Hash mismatch - content has been tampered",
402
- hashValid: false,
403
- hasSignature: !!meta.signature
404
- };
405
- }
406
- const signatures = [];
407
- let signatureValid;
408
- if (meta.signature) {
409
- const { Ed25519PublicKey } = await import("../../keypairs/ed25519/publickey.js");
410
- const sigArray = Array.isArray(meta.signature) ? meta.signature : [meta.signature];
411
- let allValid = true;
412
- for (const sig of sigArray) {
413
- let pkToUse;
414
- const pk = sig.publicKey;
415
- if (pk.startsWith("0x")) {
416
- const buffer = Buffer.from(pk.slice(2), "hex");
417
- if (buffer.length === 33) {
418
- pkToUse = buffer.slice(1).toString("base64");
419
- } else if (buffer.length === 32) {
420
- pkToUse = buffer.toString("base64");
421
- } else {
422
- let address;
423
- try {
424
- const pubKey = new Ed25519PublicKey(pk.slice(2));
425
- address = pubKey.toWAddress();
426
- } catch {
482
+ // 5. 验证数字签名(如果存在)
483
+ const signatures = [];
484
+ let signatureValid;
485
+ if (meta.signature) {
486
+ const { Ed25519PublicKey } = await import("../../keypairs/ed25519/publickey.js");
487
+ // 支持多签名验证
488
+ const sigArray = Array.isArray(meta.signature)
489
+ ? meta.signature
490
+ : [meta.signature];
491
+ let allValid = true;
492
+ for (const sig of sigArray) {
493
+ let pkToUse;
494
+ const pk = sig.publicKey;
495
+ if (pk.startsWith("0x")) {
496
+ // 16进制格式,转换为base64
497
+ const buffer = Buffer.from(pk.slice(2), "hex");
498
+ if (buffer.length === 33) {
499
+ pkToUse = buffer.slice(1).toString("base64");
500
+ }
501
+ else if (buffer.length === 32) {
502
+ pkToUse = buffer.toString("base64");
503
+ }
504
+ else {
505
+ // 尝试推导地址
506
+ let address;
507
+ try {
508
+ const pubKey = new Ed25519PublicKey(pk.slice(2));
509
+ address = pubKey.toWAddress();
510
+ }
511
+ catch {
512
+ // 推导失败不影响
513
+ }
514
+ signatures.push({
515
+ publicKey: pk,
516
+ address,
517
+ valid: false,
518
+ });
519
+ allValid = false;
520
+ continue;
521
+ }
522
+ }
523
+ else {
524
+ // 假设是base64格式,但需要确保是32字节
525
+ try {
526
+ const buffer = Buffer.from(pk, "base64");
527
+ if (buffer.length === 33) {
528
+ pkToUse = buffer.slice(1).toString("base64");
529
+ }
530
+ else if (buffer.length === 32) {
531
+ pkToUse = buffer.toString("base64");
532
+ }
533
+ else {
534
+ // 尝试推导地址
535
+ let address;
536
+ try {
537
+ const pubKey = new Ed25519PublicKey(pk);
538
+ address = pubKey.toWAddress();
539
+ }
540
+ catch {
541
+ // 推导失败不影响
542
+ }
543
+ signatures.push({
544
+ publicKey: pk,
545
+ address,
546
+ valid: false,
547
+ });
548
+ allValid = false;
549
+ continue;
550
+ }
551
+ }
552
+ catch {
553
+ // 如果解码失败,直接使用原始值
554
+ pkToUse = pk;
555
+ }
556
+ }
557
+ try {
558
+ const pubKey = new Ed25519PublicKey(pkToUse);
559
+ const signatureBytes = Uint8Array.from(Buffer.from(sig.value, "base64"));
560
+ const signValid = await pubKey.verify(new TextEncoder().encode(meta.hash), signatureBytes);
561
+ // 通过公钥推导地址
562
+ let address;
563
+ try {
564
+ address = pubKey.toWAddress();
565
+ }
566
+ catch {
567
+ // 推导失败不影响验证
568
+ }
569
+ signatures.push({
570
+ publicKey: pk,
571
+ address,
572
+ valid: signValid,
573
+ });
574
+ if (!signValid) {
575
+ allValid = false;
576
+ }
577
+ }
578
+ catch {
579
+ // 尝试推导地址
580
+ let address;
581
+ try {
582
+ const pubKey = new Ed25519PublicKey(pkToUse);
583
+ address = pubKey.toWAddress();
584
+ }
585
+ catch {
586
+ // 推导失败不影响
587
+ }
588
+ signatures.push({ publicKey: pk, address, valid: false });
589
+ allValid = false;
590
+ }
427
591
  }
428
- signatures.push({
429
- publicKey: pk,
430
- address,
431
- valid: false
432
- });
433
- allValid = false;
434
- continue;
435
- }
436
- } else {
437
- try {
438
- const buffer = Buffer.from(pk, "base64");
439
- if (buffer.length === 33) {
440
- pkToUse = buffer.slice(1).toString("base64");
441
- } else if (buffer.length === 32) {
442
- pkToUse = buffer.toString("base64");
443
- } else {
444
- let address;
445
- try {
446
- const pubKey = new Ed25519PublicKey(pk);
447
- address = pubKey.toWAddress();
448
- } catch {
449
- }
450
- signatures.push({
451
- publicKey: pk,
452
- address,
453
- valid: false
454
- });
455
- allValid = false;
456
- continue;
592
+ signatureValid = allValid;
593
+ if (!signatureValid) {
594
+ // 收集失败的地址
595
+ const failedAddresses = signatures
596
+ .filter((s) => !s.valid && s.address)
597
+ .map((s) => s.address);
598
+ return {
599
+ valid: false,
600
+ error: `Signatures from the following addresses are invalid: ${failedAddresses.join(", ")}`,
601
+ hashValid: true,
602
+ hasSignature: true,
603
+ signatureValid: false,
604
+ signatures,
605
+ };
457
606
  }
458
- } catch {
459
- pkToUse = pk;
460
- }
461
- }
462
- try {
463
- const pubKey = new Ed25519PublicKey(pkToUse);
464
- const signatureBytes = Uint8Array.from(
465
- Buffer.from(sig.value, "base64")
466
- );
467
- const signValid = await pubKey.verify(
468
- new TextEncoder().encode(meta.hash),
469
- signatureBytes
470
- );
471
- let address;
472
- try {
473
- address = pubKey.toWAddress();
474
- } catch {
475
- }
476
- signatures.push({
477
- publicKey: pk,
478
- address,
479
- valid: signValid
480
- });
481
- if (!signValid) {
482
- allValid = false;
483
- }
484
- } catch {
485
- let address;
486
- try {
487
- const pubKey = new Ed25519PublicKey(pkToUse);
488
- address = pubKey.toWAddress();
489
- } catch {
490
- }
491
- signatures.push({ publicKey: pk, address, valid: false });
492
- allValid = false;
493
607
  }
494
- }
495
- signatureValid = allValid;
496
- if (!signatureValid) {
497
- const failedAddresses = signatures.filter((s) => !s.valid && s.address).map((s) => s.address);
498
608
  return {
499
- valid: false,
500
- error: `Signatures from the following addresses are invalid: ${failedAddresses.join(", ")}`,
501
- hashValid: true,
502
- hasSignature: true,
503
- signatureValid: false,
504
- signatures
609
+ valid: true,
610
+ hashValid: true,
611
+ hasSignature: !!meta.signature,
612
+ signatureValid,
613
+ signatures: signatures.length > 0 ? signatures : undefined,
614
+ };
615
+ }
616
+ catch (error) {
617
+ return {
618
+ valid: false,
619
+ error: `Verification error: ${error}`,
620
+ hashValid: false,
621
+ hasSignature: false,
505
622
  };
506
- }
507
623
  }
508
- return {
509
- valid: true,
510
- hashValid: true,
511
- hasSignature: !!meta.signature,
512
- signatureValid,
513
- signatures: signatures.length > 0 ? signatures : void 0
514
- };
515
- } catch (error) {
516
- return {
517
- valid: false,
518
- error: `Verification error: ${error}`,
519
- hashValid: false,
520
- hasSignature: false
521
- };
522
- }
523
624
  }
524
- async function sign_wts(wtsFilePath, account, outputPath) {
525
- const verifyResult = await verify_wts(wtsFilePath);
526
- if (!verifyResult.valid) {
527
- throw new MessengerError(
528
- MessengerErrorCode.INVALID_INPUT,
529
- `WTS file verification failed: ${verifyResult.error}`
530
- );
531
- }
532
- const wtsFile = load_wts(wtsFilePath);
533
- const address = await Account.Instance().get_address(account);
534
- if (!address) {
535
- W_ERROR(WErrors.AccountNotFound, `sign_wts.account ${account}`);
536
- }
537
- const signResult = await Account.Instance().signData(
538
- address,
539
- wtsFile.meta.hash
540
- );
541
- let publicKeyBase64;
542
- const pk = signResult.publicKey;
543
- if (pk.startsWith("0x")) {
544
- const buffer = Buffer.from(pk.slice(2), "hex");
545
- if (buffer.length === 33) {
546
- publicKeyBase64 = buffer.slice(1).toString("base64");
547
- } else if (buffer.length === 32) {
548
- publicKeyBase64 = buffer.toString("base64");
549
- } else {
550
- throw new MessengerError(
551
- MessengerErrorCode.INVALID_INPUT,
552
- `Invalid public key length: ${buffer.length}, expected 32 or 33 bytes`
553
- );
625
+ /**
626
+ * 使用账号签名 WTS 文件
627
+ *
628
+ * 此函数会自动加载 WTS 文件、验证格式、签名并保存。
629
+ *
630
+ * @param wtsFilePath WTS 文件路径(本地或网络文件)
631
+ * @param account 签名账号
632
+ * @param outputPath 输出文件路径(可选,默认覆盖原文件)
633
+ * @returns 签名后的 WTS 文件路径
634
+ */
635
+ export async function sign_wts(wtsFilePath, account, outputPath) {
636
+ // 1. 验证 WTS 文件格式(内部会加载文件)
637
+ const verifyResult = await verify_wts(wtsFilePath);
638
+ if (!verifyResult.valid) {
639
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `WTS file verification failed: ${verifyResult.error}`);
554
640
  }
555
- } else {
556
- publicKeyBase64 = pk;
557
- }
558
- const newSignature = {
559
- value: Buffer.from(signResult.signature.slice(2), "hex").toString(
560
- "base64"
561
- ),
562
- publicKey: publicKeyBase64,
563
- algorithm: "Ed25519",
564
- address: signResult.address
565
- };
566
- let signatures;
567
- if (wtsFile.meta.signature) {
568
- const existingSigs = Array.isArray(wtsFile.meta.signature) ? [...wtsFile.meta.signature] : [wtsFile.meta.signature];
569
- const existingIndex = existingSigs.findIndex(
570
- (sig) => sig.publicKey === publicKeyBase64
571
- );
572
- if (existingIndex >= 0) {
573
- existingSigs[existingIndex] = newSignature;
574
- signatures = existingSigs;
575
- } else {
576
- signatures = [...existingSigs, newSignature];
641
+ // 2. 加载 WTS 文件
642
+ const wtsFile = load_wts(wtsFilePath);
643
+ // 3. 获取签名者地址
644
+ const address = await Account.Instance().get_address(account);
645
+ if (!address) {
646
+ W_ERROR(WErrors.AccountNotFound, `sign_wts.account ${account}`);
577
647
  }
578
- } else {
579
- signatures = [newSignature];
580
- }
581
- const signedWtsFile = {
582
- ...wtsFile,
583
- meta: {
584
- ...wtsFile.meta,
585
- signature: signatures
648
+ // 4. 使用 Account 签名(同时获取公钥)
649
+ const signResult = await Account.Instance().signData(address, wtsFile.meta.hash);
650
+ // 6. 转换公钥格式为 base64 (32字节)
651
+ let publicKeyBase64;
652
+ const pk = signResult.publicKey;
653
+ if (pk.startsWith("0x")) {
654
+ const buffer = Buffer.from(pk.slice(2), "hex");
655
+ if (buffer.length === 33) {
656
+ // 去掉第一个字节(通常是压缩标志)
657
+ publicKeyBase64 = buffer.slice(1).toString("base64");
658
+ }
659
+ else if (buffer.length === 32) {
660
+ publicKeyBase64 = buffer.toString("base64");
661
+ }
662
+ else {
663
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `Invalid public key length: ${buffer.length}, expected 32 or 33 bytes`);
664
+ }
586
665
  }
587
- };
588
- let savePath;
589
- if (outputPath) {
590
- savePath = outputPath;
591
- } else {
592
- const dir = path.dirname(wtsFilePath);
593
- const ext = path.extname(wtsFilePath);
594
- const baseName = path.basename(wtsFilePath, ext);
595
- savePath = path.join(dir, `signed_${baseName}${ext}`);
596
- }
597
- save_wts(signedWtsFile, savePath);
598
- return savePath;
599
- }
600
- async function wts2html(wtsPath, options = {}) {
601
- const fs2 = await import("fs");
602
- const path2 = await import("path");
603
- const stats = fs2.statSync(wtsPath);
604
- if (stats.isDirectory()) {
605
- const files = fs2.readdirSync(wtsPath);
606
- const wtsFiles = files.filter((f) => f.endsWith(".wts"));
607
- if (wtsFiles.length === 0) {
608
- throw new MessengerError(
609
- MessengerErrorCode.INVALID_INPUT,
610
- `No .wts files found in directory: ${wtsPath}`
611
- );
666
+ else {
667
+ // 假设已经是 base64 格式
668
+ publicKeyBase64 = pk;
612
669
  }
613
- const results = [];
614
- for (const file of wtsFiles) {
615
- const filePath = path2.join(wtsPath, file);
616
- const html = await convertWtsToHtml(filePath, options);
617
- const outputFileName = file.replace(".wts", ".html");
618
- const outputFilePath = options.outputPath ? path2.join(options.outputPath, outputFileName) : path2.join(wtsPath, outputFileName);
619
- const outputDir = path2.dirname(outputFilePath);
620
- if (!fs2.existsSync(outputDir)) {
621
- fs2.mkdirSync(outputDir, { recursive: true });
622
- }
623
- fs2.writeFileSync(outputFilePath, html, "utf-8");
624
- results.push(outputFilePath);
670
+ // 7. 构建新签名
671
+ const newSignature = {
672
+ value: Buffer.from(signResult.signature.slice(2), "hex").toString("base64"),
673
+ publicKey: publicKeyBase64,
674
+ algorithm: "Ed25519",
675
+ address: signResult.address,
676
+ };
677
+ // 8. 处理多签名:相同公钥只能有一个签名(替换已有签名)
678
+ let signatures;
679
+ if (wtsFile.meta.signature) {
680
+ // 将已有签名转换为数组
681
+ const existingSigs = Array.isArray(wtsFile.meta.signature)
682
+ ? [...wtsFile.meta.signature]
683
+ : [wtsFile.meta.signature];
684
+ // 检查是否已存在相同公钥的签名
685
+ const existingIndex = existingSigs.findIndex((sig) => sig.publicKey === publicKeyBase64);
686
+ if (existingIndex >= 0) {
687
+ // 替换已有签名
688
+ existingSigs[existingIndex] = newSignature;
689
+ signatures = existingSigs;
690
+ }
691
+ else {
692
+ // 追加新签名
693
+ signatures = [...existingSigs, newSignature];
694
+ }
625
695
  }
626
- return results;
627
- }
628
- return convertWtsToHtml(wtsPath, options);
696
+ else {
697
+ signatures = [newSignature];
698
+ }
699
+ // 9. 添加签名到 meta
700
+ const signedWtsFile = {
701
+ ...wtsFile,
702
+ meta: {
703
+ ...wtsFile.meta,
704
+ signature: signatures,
705
+ },
706
+ };
707
+ // 8. 确定保存路径
708
+ let savePath;
709
+ if (outputPath) {
710
+ savePath = outputPath;
711
+ }
712
+ else {
713
+ // 在原文件名前添加 signed_ 前缀
714
+ const dir = path.dirname(wtsFilePath);
715
+ const ext = path.extname(wtsFilePath);
716
+ const baseName = path.basename(wtsFilePath, ext);
717
+ savePath = path.join(dir, `signed_${baseName}${ext}`);
718
+ }
719
+ save_wts(signedWtsFile, savePath);
720
+ return savePath;
629
721
  }
630
- async function convertWtsToHtml(wtsFilePath, options = {}) {
631
- const fs2 = await import("fs");
632
- const path2 = await import("path");
633
- const { title = "WTS Document", theme = "light" } = options;
634
- const verifyResult = await verify_wts(wtsFilePath);
635
- const wtsFile = load_wts(wtsFilePath);
636
- const { payload, meta } = wtsFile;
637
- const bgColor = theme === "dark" ? "#1a1a1a" : "#ffffff";
638
- const textColor = theme === "dark" ? "#e0e0e0" : "#333333";
639
- const borderColor = theme === "dark" ? "#444444" : "#e0e0e0";
640
- const escapeHtml = (text) => {
641
- return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
642
- };
643
- const isNonTextMessage = (msg) => {
644
- return !!msg.zipMetadata;
645
- };
646
- const getFileTypeLabel = (msg) => {
647
- if (msg.zipMetadata?.contentType) {
648
- return msg.zipMetadata.contentType.toUpperCase();
722
+ export async function wts2html(wtsPath, options = {}) {
723
+ const fs = await import("fs");
724
+ const path = await import("path");
725
+ // 检查是文件还是文件夹
726
+ const stats = fs.statSync(wtsPath);
727
+ if (stats.isDirectory()) {
728
+ // 处理文件夹中的所有 .wts 文件
729
+ const files = fs.readdirSync(wtsPath);
730
+ const wtsFiles = files.filter((f) => f.endsWith(".wts"));
731
+ if (wtsFiles.length === 0) {
732
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `No .wts files found in directory: ${wtsPath}`);
733
+ }
734
+ const results = [];
735
+ for (const file of wtsFiles) {
736
+ const filePath = path.join(wtsPath, file);
737
+ const html = await convertWtsToHtml(filePath, options);
738
+ // 生成输出文件名
739
+ const outputFileName = file.replace(".wts", ".html");
740
+ const outputFilePath = options.outputPath
741
+ ? path.join(options.outputPath, outputFileName)
742
+ : path.join(wtsPath, outputFileName);
743
+ // 确保输出目录存在
744
+ const outputDir = path.dirname(outputFilePath);
745
+ if (!fs.existsSync(outputDir)) {
746
+ fs.mkdirSync(outputDir, { recursive: true });
747
+ }
748
+ fs.writeFileSync(outputFilePath, html, "utf-8");
749
+ results.push(outputFilePath);
750
+ }
751
+ return results;
649
752
  }
650
- const fileName = msg.zipMetadata?.fileName || "";
651
- if (fileName.endsWith(".wts")) return "WTS";
652
- if (fileName.endsWith(".wip")) return "WIP";
653
- if (fileName.endsWith(".zip")) return "ZIP";
654
- if (fileName.endsWith(".json")) return "JSON";
655
- if (fileName.endsWith(".txt")) return "TXT";
656
- if (msg.zipMetadata) return "ZIP";
657
- return "FILE";
658
- };
659
- const generateSaveButton = (msg, index) => {
660
- const fileType = getFileTypeLabel(msg);
661
- const fileName = msg.zipMetadata?.fileName || `message_${index}.${fileType.toLowerCase()}`;
662
- const fileData = msg.plaintext || "";
663
- return `
753
+ // 处理单个文件
754
+ return convertWtsToHtml(wtsPath, options);
755
+ }
756
+ /**
757
+ * 将单个 WTS 文件转换为 HTML
758
+ */
759
+ async function convertWtsToHtml(wtsFilePath, options = {}) {
760
+ const fs = await import("fs");
761
+ const path = await import("path");
762
+ const { title = "WTS Document", theme = "light" } = options;
763
+ // 1. 验证文件
764
+ const verifyResult = await verify_wts(wtsFilePath);
765
+ // 2. 加载 WTS 文件
766
+ const wtsFile = load_wts(wtsFilePath);
767
+ const { payload, meta } = wtsFile;
768
+ const bgColor = theme === "dark" ? "#1a1a1a" : "#ffffff";
769
+ const textColor = theme === "dark" ? "#e0e0e0" : "#333333";
770
+ const borderColor = theme === "dark" ? "#444444" : "#e0e0e0";
771
+ const escapeHtml = (text) => {
772
+ return text
773
+ .replace(/&/g, "&amp;")
774
+ .replace(/</g, "&lt;")
775
+ .replace(/>/g, "&gt;")
776
+ .replace(/"/g, "&quot;")
777
+ .replace(/'/g, "&#039;");
778
+ };
779
+ // 判断是否为非文本消息(ZIP/WTS/WIP)
780
+ const isNonTextMessage = (msg) => {
781
+ return !!msg.zipMetadata;
782
+ };
783
+ // 获取文件类型标签
784
+ const getFileTypeLabel = (msg) => {
785
+ // 首先检查 contentType
786
+ if (msg.zipMetadata?.contentType) {
787
+ return msg.zipMetadata.contentType.toUpperCase();
788
+ }
789
+ // 根据文件名推断类型
790
+ const fileName = msg.zipMetadata?.fileName || "";
791
+ if (fileName.endsWith(".wts"))
792
+ return "WTS";
793
+ if (fileName.endsWith(".wip"))
794
+ return "WIP";
795
+ if (fileName.endsWith(".zip"))
796
+ return "ZIP";
797
+ if (fileName.endsWith(".json"))
798
+ return "JSON";
799
+ if (fileName.endsWith(".txt"))
800
+ return "TXT";
801
+ // 根据 zipMetadata 推断
802
+ if (msg.zipMetadata)
803
+ return "ZIP";
804
+ return "FILE";
805
+ };
806
+ // 生成保存按钮的 HTML
807
+ const generateSaveButton = (msg, index) => {
808
+ const fileType = getFileTypeLabel(msg);
809
+ const fileName = msg.zipMetadata?.fileName ||
810
+ `message_${index}.${fileType.toLowerCase()}`;
811
+ // 对于非文本消息,plaintext 是 base64 编码的文件内容
812
+ const fileData = msg.plaintext || "";
813
+ return `
664
814
  <div style="margin: 12px 0; padding: 16px; background: ${theme === "dark" ? "#2a3f2a" : "#e8f5e9"}; border: 1px solid ${theme === "dark" ? "#4caf50" : "#81c784"}; border-radius: 8px; text-align: center;">
665
815
  <div style="font-size: 14px; color: ${theme === "dark" ? "#81c784" : "#2e7d32"}; margin-bottom: 8px;">
666
- \u{1F4CE} ${fileType} File
816
+ 📎 ${fileType} File
667
817
  ${msg.zipMetadata ? `<span style="font-size: 12px; color: #666;">(${formatFileSize(msg.zipMetadata.fileSize)})</span>` : ""}
668
818
  </div>
669
819
  <button
@@ -672,13 +822,13 @@ async function convertWtsToHtml(wtsFilePath, options = {}) {
672
822
  onmouseover="this.style.background='#45a049'"
673
823
  onmouseout="this.style.background='#4caf50'"
674
824
  >
675
- \u{1F4BE} Save ${escapeHtml(fileName)}
825
+ 💾 Save ${escapeHtml(fileName)}
676
826
  </button>
677
827
  </div>
678
828
  <script>
679
829
  function saveFile${index}() {
680
830
  try {
681
- // Base64 \u89E3\u7801
831
+ // Base64 解码
682
832
  const base64Data = "${escapeHtml(fileData)}";
683
833
  const byteCharacters = atob(base64Data);
684
834
  const byteNumbers = new Array(byteCharacters.length);
@@ -687,7 +837,7 @@ async function convertWtsToHtml(wtsFilePath, options = {}) {
687
837
  }
688
838
  const byteArray = new Uint8Array(byteNumbers);
689
839
 
690
- // \u6839\u636E\u6587\u4EF6\u7C7B\u578B\u8BBE\u7F6E MIME \u7C7B\u578B
840
+ // 根据文件类型设置 MIME 类型
691
841
  let mimeType = "application/octet-stream";
692
842
  const fileName = "${escapeHtml(fileName)}";
693
843
  if (fileName.endsWith('.json')) mimeType = "application/json";
@@ -704,26 +854,34 @@ async function convertWtsToHtml(wtsFilePath, options = {}) {
704
854
  document.body.removeChild(a);
705
855
  URL.revokeObjectURL(url);
706
856
  } catch (e) {
707
- alert('\u4FDD\u5B58\u6587\u4EF6\u5931\u8D25: ' + e.message);
857
+ alert('保存文件失败: ' + e.message);
708
858
  }
709
859
  }
710
- <\/script>
860
+ </script>
711
861
  `;
712
- };
713
- const formatFileSize = (bytes) => {
714
- if (bytes < 1024) return bytes + " B";
715
- if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB";
716
- return (bytes / (1024 * 1024)).toFixed(1) + " MB";
717
- };
718
- const messagesHtml = payload.messages.map((msg, index) => {
719
- const isNonText = isNonTextMessage(msg);
720
- return `
862
+ };
863
+ // 格式化文件大小
864
+ const formatFileSize = (bytes) => {
865
+ if (bytes < 1024)
866
+ return bytes + " B";
867
+ if (bytes < 1024 * 1024)
868
+ return (bytes / 1024).toFixed(1) + " KB";
869
+ return (bytes / (1024 * 1024)).toFixed(1) + " MB";
870
+ };
871
+ const messagesHtml = payload.messages
872
+ .map((msg, index) => {
873
+ const isNonText = isNonTextMessage(msg);
874
+ return `
721
875
  <div style="margin: 16px 0; padding: 16px; border: 1px solid ${borderColor}; border-radius: 8px; background: ${theme === "dark" ? "#2a2a2a" : "#f9f9f9"};">
722
876
  <div style="display: flex; justify-content: space-between; margin-bottom: 8px; font-size: 12px; color: #666;">
723
877
  <span>From: ${escapeHtml(msg.from.slice(0, 20))}... To: ${escapeHtml(msg.to.slice(0, 20))}...</span>
724
878
  <span>${new Date(msg.timestamp).toLocaleString()}</span>
725
879
  </div>
726
- ${isNonText ? generateSaveButton(msg, index) : msg.plaintext ? `<div style="margin: 12px 0; padding: 12px; background: ${theme === "dark" ? "#333333" : "#ffffff"}; border: 1px solid ${borderColor}; border-radius: 4px; font-size: 14px; line-height: 1.6; max-height: calc(1.6em * 6); overflow-y: auto; white-space: pre-wrap; word-break: break-word;">${escapeHtml(msg.plaintext)}</div>` : ""}
880
+ ${isNonText
881
+ ? generateSaveButton(msg, index)
882
+ : msg.plaintext
883
+ ? `<div style="margin: 12px 0; padding: 12px; background: ${theme === "dark" ? "#333333" : "#ffffff"}; border: 1px solid ${borderColor}; border-radius: 4px; font-size: 14px; line-height: 1.6; max-height: calc(1.6em * 6); overflow-y: auto; white-space: pre-wrap; word-break: break-word;">${escapeHtml(msg.plaintext)}</div>`
884
+ : ""}
727
885
  <div style="margin: 8px 0; font-size: 11px; color: #666;">
728
886
  <div>Plaintext Hash: ${escapeHtml(msg.plaintextHash)}</div>
729
887
  ${msg.arkConfirmed ? `<div>ARK Confirmed: ${escapeHtml(msg.arkConfirmed.recipient)} at ${new Date(msg.arkConfirmed.timestamp).toLocaleString()}</div>` : ""}
@@ -737,9 +895,11 @@ async function convertWtsToHtml(wtsFilePath, options = {}) {
737
895
  </div>
738
896
  </div>
739
897
  `;
740
- }).join("");
741
- const signatureHtml = "";
742
- const html = `<!DOCTYPE html>
898
+ })
899
+ .join("");
900
+ // 签名信息不再在 HTML 中显示(根据安全设计)
901
+ const signatureHtml = "";
902
+ const html = `<!DOCTYPE html>
743
903
  <html lang="en">
744
904
  <head>
745
905
  <meta charset="UTF-8">
@@ -783,25 +943,29 @@ async function convertWtsToHtml(wtsFilePath, options = {}) {
783
943
  </div>
784
944
  <div style="font-size: 14px; color: #666; margin-top: 4px;">
785
945
  ${new Date(meta.startTime).toLocaleDateString()} - ${new Date(meta.endTime).toLocaleDateString()}
786
- ${verifyResult.valid ? `<span style="color: #4caf50; margin-left: 8px;">\u2713 The accuracy, sequentiality, and integrity of the messages are verified without tampering</span>` : `<span style="color: #ff9800; margin-left: 8px;">\u26A0 ${verifyResult.error || "Hash mismatch - content has been tampered"}</span>`}
946
+ ${verifyResult.valid
947
+ ? `<span style="color: #4caf50; margin-left: 8px;">✓ The accuracy, sequentiality, and integrity of the messages are verified without tampering</span>`
948
+ : `<span style="color: #ff9800; margin-left: 8px;">⚠ ${verifyResult.error || "Hash mismatch - content has been tampered"}</span>`}
787
949
  </div>
788
950
  <div class="meta">
789
951
  <div>Session: ${escapeHtml(payload.session.id)}</div>
790
952
  <div>Participants: ${payload.session.participants.map((p) => escapeHtml(p.slice(0, 20)) + "...").join(", ")}</div>
791
953
  <div>Messages: ${meta.messageCount} | Time: ${new Date(meta.startTime).toLocaleString()} - ${new Date(meta.endTime).toLocaleString()}</div>
792
954
  <div style="word-break: break-all;">Merkle Root: ${escapeHtml(meta.merkleRoot)}</div>
793
- ${verifyResult.signatures && verifyResult.signatures.length > 0 ? `
955
+ ${verifyResult.signatures && verifyResult.signatures.length > 0
956
+ ? `
794
957
  <div style="margin-top: 8px; padding: 8px; background: ${theme === "dark" ? "#2a3f2a" : "#e8f5e9"}; border-radius: 4px;">
795
- <div style="font-size: 11px; color: ${theme === "dark" ? "#81c784" : "#2e7d32"}; margin-bottom: 4px;">\u2713 Signature Verification (${verifyResult.signatures.length} signature${verifyResult.signatures.length > 1 ? "s" : ""})</div>
796
- ${verifyResult.signatures.map(
797
- (s, idx) => `
958
+ <div style="font-size: 11px; color: ${theme === "dark" ? "#81c784" : "#2e7d32"}; margin-bottom: 4px;">✓ Signature Verification (${verifyResult.signatures.length} signature${verifyResult.signatures.length > 1 ? "s" : ""})</div>
959
+ ${verifyResult.signatures
960
+ .map((s, idx) => `
798
961
  <div style="font-size: 10px; color: ${textColor}; margin-left: 8px;">
799
- ${idx + 1}. ${s.address ? escapeHtml(s.address.slice(0, 20)) + "..." : "Unknown"}: ${s.valid ? '<span style="color: #4caf50;">\u2713 Valid</span>' : '<span style="color: #f44336;">\u2717 Invalid</span>'}
962
+ ${idx + 1}. ${s.address ? escapeHtml(s.address.slice(0, 20)) + "..." : "Unknown"}: ${s.valid ? '<span style="color: #4caf50;">✓ Valid</span>' : '<span style="color: #f44336;">✗ Invalid</span>'}
800
963
  </div>
801
- `
802
- ).join("")}
964
+ `)
965
+ .join("")}
803
966
  </div>
804
- ` : ""}
967
+ `
968
+ : ""}
805
969
  </div>
806
970
  </div>
807
971
  <div class="messages">
@@ -810,419 +974,349 @@ async function convertWtsToHtml(wtsFilePath, options = {}) {
810
974
  ${signatureHtml}
811
975
  </body>
812
976
  </html>`;
813
- if (options.outputPath) {
814
- const dir = path2.dirname(options.outputPath);
815
- if (!fs2.existsSync(dir)) {
816
- fs2.mkdirSync(dir, { recursive: true });
817
- }
818
- fs2.writeFileSync(options.outputPath, html, "utf-8");
819
- return options.outputPath;
820
- }
821
- return html;
822
- }
823
- async function proof_message(account, messageId, network) {
824
- const address = await Account.Instance().get_address(account);
825
- if (!address) {
826
- W_ERROR(WErrors.AccountNotFound, `proof_message.account ${account}`);
827
- }
828
- const messageStorage = new MessageStorage(address);
829
- const message = messageStorage.getMessageById(messageId);
830
- if (!message) {
831
- throw new MessengerError(
832
- MessengerErrorCode.INVALID_INPUT,
833
- `Message not found: ${messageId}`
834
- );
835
- }
836
- if (message.fromAddress.toLowerCase() !== address.toLowerCase() && message.toAddress.toLowerCase() !== address.toLowerCase()) {
837
- throw new MessengerError(
838
- MessengerErrorCode.INVALID_INPUT,
839
- `Message does not belong to account ${address}`
840
- );
841
- }
842
- if (!message.serverSignature) {
843
- throw new MessengerError(
844
- MessengerErrorCode.INVALID_PROOF,
845
- `Message does not have server signature`
846
- );
847
- }
848
- if (!message.serverPublicKey) {
849
- throw new MessengerError(
850
- MessengerErrorCode.INVALID_PROOF,
851
- `Message does not have server public key`
852
- );
853
- }
854
- if (!message.plaintext) {
855
- throw new MessengerError(
856
- MessengerErrorCode.INVALID_PROOF,
857
- `Message does not have plaintext`
858
- );
859
- }
860
- const { verifyMessage } = await import("./crypto.js");
861
- const verifyParams = {
862
- messageId: message.messageId,
863
- plaintext: message.plaintext,
864
- plaintextHash: message.plaintextHash,
865
- createdAt: message.createdAt,
866
- guardAddress: message.guardAddress,
867
- passportAddress: message.passportAddress,
868
- serverSignature: message.serverSignature,
869
- serverPublicKey: message.serverPublicKey
870
- };
871
- if (message.newRoot && message.leafIndex !== void 0) {
872
- if (!message.serverTimestamp) {
873
- throw new MessengerError(
874
- MessengerErrorCode.INVALID_PROOF,
875
- `Message ${message.messageId} missing server timestamp for verification`
876
- );
977
+ // 如果指定了输出路径,保存到文件
978
+ if (options.outputPath) {
979
+ const dir = path.dirname(options.outputPath);
980
+ if (!fs.existsSync(dir)) {
981
+ fs.mkdirSync(dir, { recursive: true });
982
+ }
983
+ fs.writeFileSync(options.outputPath, html, "utf-8");
984
+ return options.outputPath;
877
985
  }
878
- verifyParams.merkleMetadata = {
879
- newRoot: message.newRoot,
880
- prevRoot: message.prevRoot,
881
- leafIndex: message.leafIndex,
882
- serverTimestamp: message.serverTimestamp
883
- // 必须使用服务器时间戳
884
- // 注意:proofSiblings 和 proofIndices 从服务器拉取时不提供
885
- // verifyMessage 会跳过 Merkle Proof 验证,只验证 Root 计算
886
- };
887
- }
888
- const verifyResult = verifyMessage(verifyParams);
889
- if (!verifyResult.valid) {
890
- throw new MessengerError(
891
- MessengerErrorCode.INVALID_PROOF,
892
- `Message verification failed: ${verifyResult.error}`
893
- );
894
- }
895
- if (!message.serverPublicKey) {
896
- throw new MessengerError(
897
- MessengerErrorCode.INVALID_PROOF,
898
- `Message does not have server public key`
899
- );
900
- }
901
- const { CallProof } = await import("../call/proof.js");
902
- const callProof = new CallProof({
903
- proof: message.newRoot,
904
- // 证明root存在
905
- server_pubkey: message.serverPublicKey,
906
- server_signature: message.serverSignature,
907
- proof_type: CHAIN_PROOF_TYPE,
908
- // 消息证明类型
909
- description: `Message proof for ${messageId}`,
910
- item_count: message.leafIndex ?? 1,
911
- about_address: message.fromAddress.toLowerCase() === address.toLowerCase() ? message.toAddress : message.fromAddress
912
- });
913
- const env = {
914
- network,
915
- account: address
916
- };
917
- const result = await callProof.call(env);
918
- const { ResponseData: extractResponseData } = await import("../call/base.js");
919
- const responseData = extractResponseData(result);
920
- const proofResult = responseData.find((item) => item.type === "Proof");
921
- if (!proofResult || !proofResult.object) {
922
- throw new MessengerError(
923
- MessengerErrorCode.INVALID_PROOF,
924
- `Failed to get proof address from transaction result`
925
- );
926
- }
927
- message.proof = proofResult.object;
928
- messageStorage.saveMessage(message);
929
- return { proofAddress: proofResult.object };
986
+ return html;
930
987
  }
931
- const MIN_PASSPORT_VALIDITY = 10;
932
- const MAX_PASSPORT_VALIDITY = 10 * 365 * 24 * 60 * 60;
933
- const MAX_BLACKLIST_SIZE_ONCE = 100;
934
- const MAX_FRIENDS_SIZE_ONCE = 100;
935
- const MAX_GUARDS_SIZE_ONCE = 10;
936
- async function blacklist(request) {
937
- const acc = await Account.Instance().get_address(request.account);
938
- if (!acc) {
939
- W_ERROR(
940
- WErrors.AccountNotFound,
941
- `blacklist.account ${request.account}`
942
- );
943
- }
944
- const manager = getMessengerManager();
945
- switch (request.op) {
946
- case "add": {
947
- let addresses = await GetManyAccountOrMark_Address(request.users);
948
- if (addresses.length === 0) {
949
- W_ERROR(
950
- WErrors.InvalidParam,
951
- `blacklist.add.users ${request.users} have not valid addresses`
952
- );
953
- }
954
- addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
955
- if (addresses.length > MAX_BLACKLIST_SIZE_ONCE) {
956
- W_ERROR(
957
- WErrors.InvalidParam,
958
- `blacklist.add.users ${request.users} have too many addresses, max ${MAX_BLACKLIST_SIZE_ONCE}`
959
- );
960
- }
961
- const result = await manager.addToBlacklist(acc, addresses);
962
- return { op: "add", result };
988
+ /**
989
+ * 提交消息链上证明
990
+ *
991
+ * 将消息的 Merkle 证明提交到链上,创建不可篡改的证明记录。
992
+ * 此函数会先验证消息的完整性和合法性。
993
+ *
994
+ * @param account 账号名称或地址
995
+ * @param messageId 消息ID
996
+ * @param env 调用环境(包含网络、签名账号等)
997
+ * @returns 证明对象地址
998
+ */
999
+ export async function proof_message(account, messageId, network) {
1000
+ // 1. 解析账号地址
1001
+ const address = await Account.Instance().get_address(account);
1002
+ if (!address) {
1003
+ W_ERROR(WErrors.AccountNotFound, `proof_message.account ${account}`);
963
1004
  }
964
- case "remove": {
965
- let addresses = await GetManyAccountOrMark_Address(request.users);
966
- if (addresses.length === 0) {
967
- W_ERROR(
968
- WErrors.InvalidParam,
969
- `blacklist.remove.users ${request.users} have not valid addresses`
970
- );
971
- }
972
- addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
973
- if (addresses.length > MAX_BLACKLIST_SIZE_ONCE) {
974
- W_ERROR(
975
- WErrors.InvalidParam,
976
- `blacklist.remove.users ${request.users} have too many addresses, max ${MAX_BLACKLIST_SIZE_ONCE}`
977
- );
978
- }
979
- const result = await manager.removeFromBlacklist(acc, addresses);
980
- return { op: "remove", result };
1005
+ // 2. 获取消息
1006
+ const messageStorage = new MessageStorage(address);
1007
+ const message = messageStorage.getMessageById(messageId);
1008
+ if (!message) {
1009
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `Message not found: ${messageId}`);
981
1010
  }
982
- case "clear": {
983
- const result = await manager.clearBlacklist(acc);
984
- return { op: "clear", result };
1011
+ // 3. 验证消息属于该账号
1012
+ if (message.fromAddress.toLowerCase() !== address.toLowerCase() &&
1013
+ message.toAddress.toLowerCase() !== address.toLowerCase()) {
1014
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `Message does not belong to account ${address}`);
985
1015
  }
986
- case "get": {
987
- const result = await manager.getBlacklist(acc);
988
- return { op: "get", result };
1016
+ // 4. 验证服务器签名存在
1017
+ if (!message.serverSignature) {
1018
+ throw new MessengerError(MessengerErrorCode.INVALID_PROOF, `Message does not have server signature`);
989
1019
  }
990
- case "exist": {
991
- let addresses = await GetManyAccountOrMark_Address(request.users);
992
- if (addresses.length === 0) {
993
- W_ERROR(
994
- WErrors.InvalidParam,
995
- `blacklist.exist.users ${request.users} have not valid addresses`
996
- );
997
- }
998
- addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
999
- if (addresses.length > MAX_BLACKLIST_SIZE_ONCE) {
1000
- W_ERROR(
1001
- WErrors.InvalidParam,
1002
- `blacklist.exist.users ${request.users} have too many addresses, max ${MAX_BLACKLIST_SIZE_ONCE}`
1003
- );
1004
- }
1005
- const result = await manager.existInBlacklist(acc, addresses);
1006
- return { op: "exist", result };
1020
+ if (!message.serverPublicKey) {
1021
+ throw new MessengerError(MessengerErrorCode.INVALID_PROOF, `Message does not have server public key`);
1007
1022
  }
1008
- default:
1009
- throw new MessengerError(
1010
- MessengerErrorCode.INVALID_INPUT,
1011
- `blacklist.unknown op: ${request}`
1012
- );
1013
- }
1014
- }
1015
- async function friendslist(request) {
1016
- const acc = await Account.Instance().get_address(request.account);
1017
- if (!acc) {
1018
- W_ERROR(
1019
- WErrors.AccountNotFound,
1020
- `friendslist.account ${request.account}`
1021
- );
1022
- }
1023
- const manager = getMessengerManager();
1024
- switch (request.op) {
1025
- case "add": {
1026
- let addresses = await GetManyAccountOrMark_Address(request.users);
1027
- if (addresses.length === 0) {
1028
- W_ERROR(
1029
- WErrors.InvalidParam,
1030
- `friendslist.add.users ${request.users} have not valid addresses`
1031
- );
1032
- }
1033
- addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1034
- const result = await manager.addToFriendsList(acc, addresses);
1035
- return { op: "add", result };
1023
+ // 5. 使用 verifyMessage 验证消息完整性(包含服务器签名验证)
1024
+ if (!message.plaintext) {
1025
+ throw new MessengerError(MessengerErrorCode.INVALID_PROOF, `Message does not have plaintext`);
1036
1026
  }
1037
- case "remove": {
1038
- let addresses = await GetManyAccountOrMark_Address(request.users);
1039
- if (addresses.length === 0) {
1040
- W_ERROR(
1041
- WErrors.InvalidParam,
1042
- `friendslist.remove.users ${request.users} have not valid addresses`
1043
- );
1044
- }
1045
- addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1046
- if (addresses.length > MAX_FRIENDS_SIZE_ONCE) {
1047
- W_ERROR(
1048
- WErrors.InvalidParam,
1049
- `friendslist.remove.users ${request.users} have too many addresses, max ${MAX_FRIENDS_SIZE_ONCE}`
1050
- );
1051
- }
1052
- const result = await manager.removeFromFriendsList(acc, addresses);
1053
- return { op: "remove", result };
1027
+ const { verifyMessage } = await import("./crypto.js");
1028
+ // 构造验证参数
1029
+ const verifyParams = {
1030
+ messageId: message.messageId,
1031
+ plaintext: message.plaintext,
1032
+ plaintextHash: message.plaintextHash,
1033
+ createdAt: message.createdAt,
1034
+ guardAddress: message.guardAddress,
1035
+ passportAddress: message.passportAddress,
1036
+ serverSignature: message.serverSignature,
1037
+ serverPublicKey: message.serverPublicKey,
1038
+ };
1039
+ // 如果消息有完整的 Merkle 证明数据,则添加 merkleMetadata
1040
+ if (message.newRoot && message.leafIndex !== undefined) {
1041
+ // 检查服务器时间戳是否存在
1042
+ if (!message.serverTimestamp) {
1043
+ throw new MessengerError(MessengerErrorCode.INVALID_PROOF, `Message ${message.messageId} missing server timestamp for verification`);
1044
+ }
1045
+ verifyParams.merkleMetadata = {
1046
+ newRoot: message.newRoot,
1047
+ prevRoot: message.prevRoot,
1048
+ leafIndex: message.leafIndex,
1049
+ serverTimestamp: message.serverTimestamp, // 必须使用服务器时间戳
1050
+ // 注意:proofSiblings 和 proofIndices 从服务器拉取时不提供
1051
+ // verifyMessage 会跳过 Merkle Proof 验证,只验证 Root 计算
1052
+ };
1054
1053
  }
1055
- case "clear": {
1056
- const result = await manager.clearFriendsList(acc);
1057
- return { op: "clear", result };
1054
+ const verifyResult = verifyMessage(verifyParams);
1055
+ if (!verifyResult.valid) {
1056
+ throw new MessengerError(MessengerErrorCode.INVALID_PROOF, `Message verification failed: ${verifyResult.error}`);
1058
1057
  }
1059
- case "get": {
1060
- const result = await manager.getFriendsList(acc);
1061
- return { op: "get", result };
1058
+ // 6. 从消息中获取服务器公钥
1059
+ if (!message.serverPublicKey) {
1060
+ throw new MessengerError(MessengerErrorCode.INVALID_PROOF, `Message does not have server public key`);
1062
1061
  }
1063
- case "exist": {
1064
- let addresses = await GetManyAccountOrMark_Address(request.users);
1065
- if (addresses.length === 0) {
1066
- W_ERROR(
1067
- WErrors.InvalidParam,
1068
- `friendslist.exist.users ${request.users} have not valid addresses`
1069
- );
1070
- }
1071
- addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1072
- if (addresses.length > MAX_FRIENDS_SIZE_ONCE) {
1073
- W_ERROR(
1074
- WErrors.InvalidParam,
1075
- `friendslist.exist.users ${request.users} have too many addresses, max ${MAX_FRIENDS_SIZE_ONCE}`
1076
- );
1077
- }
1078
- const result = await manager.existInFriendsList(acc, addresses);
1079
- return { op: "exist", result };
1062
+ // 7. 创建链上证明
1063
+ const { CallProof } = await import("../call/proof.js");
1064
+ const callProof = new CallProof({
1065
+ proof: message.newRoot, // 证明root存在
1066
+ server_pubkey: message.serverPublicKey,
1067
+ server_signature: message.serverSignature,
1068
+ proof_type: CHAIN_PROOF_TYPE, // 消息证明类型
1069
+ description: `Message proof for ${messageId}`,
1070
+ item_count: message.leafIndex ?? 1,
1071
+ about_address: message.fromAddress.toLowerCase() === address.toLowerCase()
1072
+ ? message.toAddress
1073
+ : message.fromAddress,
1074
+ });
1075
+ // 8. 构造调用环境并执行
1076
+ const env = {
1077
+ network,
1078
+ account: address,
1079
+ };
1080
+ const result = await callProof.call(env);
1081
+ // 9. 使用 ResponseData 提取 Proof 对象地址
1082
+ const { ResponseData: extractResponseData } = await import("../call/base.js");
1083
+ const responseData = extractResponseData(result);
1084
+ // 查找 Proof 类型的对象
1085
+ const proofResult = responseData.find((item) => item.type === "Proof");
1086
+ if (!proofResult || !proofResult.object) {
1087
+ throw new MessengerError(MessengerErrorCode.INVALID_PROOF, `Failed to get proof address from transaction result`);
1080
1088
  }
1081
- default:
1082
- throw new MessengerError(
1083
- MessengerErrorCode.INVALID_INPUT,
1084
- `friendslist.unknown op: ${request}`
1085
- );
1086
- }
1089
+ message.proof = proofResult.object;
1090
+ messageStorage.saveMessage(message);
1091
+ return { proofAddress: proofResult.object };
1087
1092
  }
1088
- async function guardlist(request) {
1089
- const acc = await Account.Instance().get_address(request.account);
1090
- if (!acc) {
1091
- W_ERROR(
1092
- WErrors.AccountNotFound,
1093
- `guardlist.account ${request.account}`
1094
- );
1095
- }
1096
- const manager = getMessengerManager();
1097
- switch (request.op) {
1098
- case "add": {
1099
- const uniqueGuardsMap = /* @__PURE__ */ new Map();
1100
- for (const g of request.guards) {
1101
- uniqueGuardsMap.set(g.guard.toLowerCase(), g);
1102
- }
1103
- const guards = Array.from(uniqueGuardsMap.values());
1104
- if (guards.length === 0) {
1105
- W_ERROR(
1106
- WErrors.InvalidParam,
1107
- `guardlist.add.guards ${request.guards} have not valid guards`
1108
- );
1109
- }
1110
- if (guards.length > MAX_GUARDS_SIZE_ONCE) {
1111
- W_ERROR(
1112
- WErrors.InvalidParam,
1113
- `guardlist.add.guards ${request.guards} have too many guards, max ${MAX_GUARDS_SIZE_ONCE}`
1114
- );
1115
- }
1116
- for (const g of guards) {
1117
- if (!isValidU64(g.passportValiditySeconds) || g.passportValiditySeconds < MIN_PASSPORT_VALIDITY || g.passportValiditySeconds > MAX_PASSPORT_VALIDITY) {
1118
- W_ERROR(
1119
- WErrors.InvalidParam,
1120
- `Guard ${g.guard}: passport validity ${g.passportValiditySeconds} must be between ${MIN_PASSPORT_VALIDITY} and ${MAX_PASSPORT_VALIDITY} seconds`
1121
- );
1093
+ const MIN_PASSPORT_VALIDITY = 10; // 10 seconds
1094
+ const MAX_PASSPORT_VALIDITY = 10 * 365 * 24 * 60 * 60; // 10 years in seconds
1095
+ const MAX_BLACKLIST_SIZE_ONCE = 100;
1096
+ const MAX_FRIENDS_SIZE_ONCE = 100;
1097
+ const MAX_GUARDS_SIZE_ONCE = 10;
1098
+ /**
1099
+ * 黑名单管理 - 统一入口
1100
+ * @param request 操作请求
1101
+ * @returns 操作结果
1102
+ */
1103
+ export async function blacklist(request) {
1104
+ const acc = await Account.Instance().get_address(request.account);
1105
+ if (!acc) {
1106
+ W_ERROR(WErrors.AccountNotFound, `blacklist.account ${request.account}`);
1107
+ }
1108
+ const manager = getMessengerManager();
1109
+ switch (request.op) {
1110
+ case "add": {
1111
+ let addresses = await GetManyAccountOrMark_Address(request.users);
1112
+ if (addresses.length === 0) {
1113
+ W_ERROR(WErrors.InvalidParam, `blacklist.add.users ${request.users} have not valid addresses`);
1114
+ }
1115
+ // 去重
1116
+ addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1117
+ if (addresses.length > MAX_BLACKLIST_SIZE_ONCE) {
1118
+ W_ERROR(WErrors.InvalidParam, `blacklist.add.users ${request.users} have too many addresses, max ${MAX_BLACKLIST_SIZE_ONCE}`);
1119
+ }
1120
+ const result = await manager.addToBlacklist(acc, addresses);
1121
+ return { op: "add", result };
1122
1122
  }
1123
- }
1124
- const addresses = await LocalMark.Instance().get_many_address(
1125
- guards.map((g) => g.guard)
1126
- );
1127
- if (addresses.length !== guards.length) {
1128
- const foundAddresses = new Set(addresses);
1129
- const missingGuards = [];
1130
- for (const g of guards) {
1131
- if (!foundAddresses.has(g.guard) && !g.guard.startsWith("0x")) {
1132
- missingGuards.push(g.guard);
1133
- }
1123
+ case "remove": {
1124
+ let addresses = await GetManyAccountOrMark_Address(request.users);
1125
+ if (addresses.length === 0) {
1126
+ W_ERROR(WErrors.InvalidParam, `blacklist.remove.users ${request.users} have not valid addresses`);
1127
+ }
1128
+ // 去重
1129
+ addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1130
+ if (addresses.length > MAX_BLACKLIST_SIZE_ONCE) {
1131
+ W_ERROR(WErrors.InvalidParam, `blacklist.remove.users ${request.users} have too many addresses, max ${MAX_BLACKLIST_SIZE_ONCE}`);
1132
+ }
1133
+ const result = await manager.removeFromBlacklist(acc, addresses);
1134
+ return { op: "remove", result };
1134
1135
  }
1135
- W_ERROR(
1136
- WErrors.InvalidParam,
1137
- `Guard not found: ${missingGuards.join(", ")}`
1138
- );
1139
- }
1140
- const objs = await query_objects({
1141
- objects: addresses,
1142
- no_cache: false,
1143
- network: manager.getConfig().network
1144
- });
1145
- if (!objs || !objs.objects || objs.objects.length === 0) {
1146
- W_ERROR(
1147
- WErrors.InvalidParam,
1148
- `Guard not found: ${guards.map((g) => g.guard).join(", ")}`
1149
- );
1150
- }
1151
- objs.objects.forEach((obj) => {
1152
- if (obj.type !== "Guard") {
1153
- W_ERROR(
1154
- WErrors.InvalidParam,
1155
- `Guard ${obj.object} is not a Guard`
1156
- );
1136
+ case "clear": {
1137
+ const result = await manager.clearBlacklist(acc);
1138
+ return { op: "clear", result };
1157
1139
  }
1158
- });
1159
- const guardListItems = guards.map((g, index) => ({
1160
- guardAddress: addresses[index],
1161
- passportValiditySeconds: g.passportValiditySeconds
1162
- }));
1163
- const result = await manager.addToGuardList(acc, guardListItems);
1164
- return { op: "add", result };
1140
+ case "get": {
1141
+ const result = await manager.getBlacklist(acc);
1142
+ return { op: "get", result };
1143
+ }
1144
+ case "exist": {
1145
+ let addresses = await GetManyAccountOrMark_Address(request.users);
1146
+ if (addresses.length === 0) {
1147
+ W_ERROR(WErrors.InvalidParam, `blacklist.exist.users ${request.users} have not valid addresses`);
1148
+ }
1149
+ // 去重
1150
+ addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1151
+ if (addresses.length > MAX_BLACKLIST_SIZE_ONCE) {
1152
+ W_ERROR(WErrors.InvalidParam, `blacklist.exist.users ${request.users} have too many addresses, max ${MAX_BLACKLIST_SIZE_ONCE}`);
1153
+ }
1154
+ const result = await manager.existInBlacklist(acc, addresses);
1155
+ return { op: "exist", result };
1156
+ }
1157
+ default:
1158
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `blacklist.unknown op: ${request}`);
1165
1159
  }
1166
- case "remove": {
1167
- const guards = [
1168
- ...new Set(request.guards.map((g) => g.toLowerCase()))
1169
- ];
1170
- if (guards.length === 0) {
1171
- W_ERROR(
1172
- WErrors.InvalidParam,
1173
- `guardlist.remove.guards ${request.guards} have not valid guards`
1174
- );
1175
- }
1176
- if (guards.length > MAX_GUARDS_SIZE_ONCE) {
1177
- W_ERROR(
1178
- WErrors.InvalidParam,
1179
- `guardlist.remove.guards ${request.guards} have too many guards, max ${MAX_GUARDS_SIZE_ONCE}`
1180
- );
1181
- }
1182
- const addresses = await LocalMark.Instance().get_many_address(guards);
1183
- if (addresses.length !== guards.length) {
1184
- const foundAddresses = new Set(addresses);
1185
- const missingGuards = [];
1186
- for (const g of guards) {
1187
- if (!foundAddresses.has(g) && !g.startsWith("0x")) {
1188
- missingGuards.push(g);
1189
- }
1160
+ }
1161
+ /**
1162
+ * 好友列表管理 - 统一入口
1163
+ * @param request 操作请求
1164
+ * @returns 操作结果
1165
+ */
1166
+ export async function friendslist(request) {
1167
+ const acc = await Account.Instance().get_address(request.account);
1168
+ if (!acc) {
1169
+ W_ERROR(WErrors.AccountNotFound, `friendslist.account ${request.account}`);
1170
+ }
1171
+ const manager = getMessengerManager();
1172
+ switch (request.op) {
1173
+ case "add": {
1174
+ let addresses = await GetManyAccountOrMark_Address(request.users);
1175
+ if (addresses.length === 0) {
1176
+ W_ERROR(WErrors.InvalidParam, `friendslist.add.users ${request.users} have not valid addresses`);
1177
+ }
1178
+ // 去重
1179
+ addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1180
+ const result = await manager.addToFriendsList(acc, addresses);
1181
+ return { op: "add", result };
1190
1182
  }
1191
- W_ERROR(
1192
- WErrors.InvalidParam,
1193
- `Guard not found: ${missingGuards.join(", ")}`
1194
- );
1195
- }
1196
- const result = await manager.removeFromGuardList(
1197
- acc,
1198
- addresses
1199
- );
1200
- return { op: "remove", result };
1183
+ case "remove": {
1184
+ let addresses = await GetManyAccountOrMark_Address(request.users);
1185
+ if (addresses.length === 0) {
1186
+ W_ERROR(WErrors.InvalidParam, `friendslist.remove.users ${request.users} have not valid addresses`);
1187
+ }
1188
+ // 去重
1189
+ addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1190
+ if (addresses.length > MAX_FRIENDS_SIZE_ONCE) {
1191
+ W_ERROR(WErrors.InvalidParam, `friendslist.remove.users ${request.users} have too many addresses, max ${MAX_FRIENDS_SIZE_ONCE}`);
1192
+ }
1193
+ const result = await manager.removeFromFriendsList(acc, addresses);
1194
+ return { op: "remove", result };
1195
+ }
1196
+ case "clear": {
1197
+ const result = await manager.clearFriendsList(acc);
1198
+ return { op: "clear", result };
1199
+ }
1200
+ case "get": {
1201
+ const result = await manager.getFriendsList(acc);
1202
+ return { op: "get", result };
1203
+ }
1204
+ case "exist": {
1205
+ let addresses = await GetManyAccountOrMark_Address(request.users);
1206
+ if (addresses.length === 0) {
1207
+ W_ERROR(WErrors.InvalidParam, `friendslist.exist.users ${request.users} have not valid addresses`);
1208
+ }
1209
+ // 去重
1210
+ addresses = [...new Set(addresses.map((a) => a.toLowerCase()))];
1211
+ if (addresses.length > MAX_FRIENDS_SIZE_ONCE) {
1212
+ W_ERROR(WErrors.InvalidParam, `friendslist.exist.users ${request.users} have too many addresses, max ${MAX_FRIENDS_SIZE_ONCE}`);
1213
+ }
1214
+ const result = await manager.existInFriendsList(acc, addresses);
1215
+ return { op: "exist", result };
1216
+ }
1217
+ default:
1218
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `friendslist.unknown op: ${request}`);
1219
+ }
1220
+ }
1221
+ /**
1222
+ * Guard 列表管理 - 统一入口
1223
+ * @param request 操作请求
1224
+ * @returns 操作结果
1225
+ */
1226
+ export async function guardlist(request) {
1227
+ const acc = await Account.Instance().get_address(request.account);
1228
+ if (!acc) {
1229
+ W_ERROR(WErrors.AccountNotFound, `guardlist.account ${request.account}`);
1201
1230
  }
1202
- case "get": {
1203
- const result = await manager.getGuardList(acc);
1204
- return { op: "get", result };
1231
+ const manager = getMessengerManager();
1232
+ switch (request.op) {
1233
+ case "add": {
1234
+ // 按 guard 字段去重,保留最后一个
1235
+ const uniqueGuardsMap = new Map();
1236
+ for (const g of request.guards) {
1237
+ uniqueGuardsMap.set(g.guard.toLowerCase(), g);
1238
+ }
1239
+ const guards = Array.from(uniqueGuardsMap.values());
1240
+ if (guards.length === 0) {
1241
+ W_ERROR(WErrors.InvalidParam, `guardlist.add.guards ${request.guards} have not valid guards`);
1242
+ }
1243
+ // 去重
1244
+ if (guards.length > MAX_GUARDS_SIZE_ONCE) {
1245
+ W_ERROR(WErrors.InvalidParam, `guardlist.add.guards ${request.guards} have too many guards, max ${MAX_GUARDS_SIZE_ONCE}`);
1246
+ }
1247
+ // Validate TTL range
1248
+ for (const g of guards) {
1249
+ if (!isValidU64(g.passportValiditySeconds) ||
1250
+ g.passportValiditySeconds < MIN_PASSPORT_VALIDITY ||
1251
+ g.passportValiditySeconds > MAX_PASSPORT_VALIDITY) {
1252
+ W_ERROR(WErrors.InvalidParam, `Guard ${g.guard}: passport validity ${g.passportValiditySeconds} must be between ${MIN_PASSPORT_VALIDITY} and ${MAX_PASSPORT_VALIDITY} seconds`);
1253
+ }
1254
+ }
1255
+ const addresses = await LocalMark.Instance().get_many_address(guards.map((g) => g.guard));
1256
+ // Validate all addresses were found
1257
+ if (addresses.length !== guards.length) {
1258
+ const foundAddresses = new Set(addresses);
1259
+ const missingGuards = [];
1260
+ for (const g of guards) {
1261
+ if (!foundAddresses.has(g.guard) &&
1262
+ !g.guard.startsWith("0x")) {
1263
+ missingGuards.push(g.guard);
1264
+ }
1265
+ }
1266
+ W_ERROR(WErrors.InvalidParam, `Guard not found: ${missingGuards.join(", ")}`);
1267
+ }
1268
+ // 通过查询检查是不是guard地址
1269
+ const objs = await query_objects({
1270
+ objects: addresses,
1271
+ no_cache: false,
1272
+ network: manager.getConfig().network,
1273
+ });
1274
+ if (!objs || !objs.objects || objs.objects.length === 0) {
1275
+ W_ERROR(WErrors.InvalidParam, `Guard not found: ${guards.map((g) => g.guard).join(", ")}`);
1276
+ }
1277
+ objs.objects.forEach((obj) => {
1278
+ if (obj.type !== "Guard") {
1279
+ W_ERROR(WErrors.InvalidParam, `Guard ${obj.object} is not a Guard`);
1280
+ }
1281
+ });
1282
+ const guardListItems = guards.map((g, index) => ({
1283
+ guardAddress: addresses[index],
1284
+ passportValiditySeconds: g.passportValiditySeconds,
1285
+ }));
1286
+ const result = await manager.addToGuardList(acc, guardListItems);
1287
+ return { op: "add", result };
1288
+ }
1289
+ case "remove": {
1290
+ const guards = [
1291
+ ...new Set(request.guards.map((g) => g.toLowerCase())),
1292
+ ];
1293
+ if (guards.length === 0) {
1294
+ W_ERROR(WErrors.InvalidParam, `guardlist.remove.guards ${request.guards} have not valid guards`);
1295
+ }
1296
+ // 去重
1297
+ if (guards.length > MAX_GUARDS_SIZE_ONCE) {
1298
+ W_ERROR(WErrors.InvalidParam, `guardlist.remove.guards ${request.guards} have too many guards, max ${MAX_GUARDS_SIZE_ONCE}`);
1299
+ }
1300
+ const addresses = await LocalMark.Instance().get_many_address(guards);
1301
+ if (addresses.length !== guards.length) {
1302
+ const foundAddresses = new Set(addresses);
1303
+ const missingGuards = [];
1304
+ for (const g of guards) {
1305
+ if (!foundAddresses.has(g) && !g.startsWith("0x")) {
1306
+ missingGuards.push(g);
1307
+ }
1308
+ }
1309
+ W_ERROR(WErrors.InvalidParam, `Guard not found: ${missingGuards.join(", ")}`);
1310
+ }
1311
+ const result = await manager.removeFromGuardList(acc, addresses);
1312
+ return { op: "remove", result };
1313
+ }
1314
+ case "get": {
1315
+ const result = await manager.getGuardList(acc);
1316
+ return { op: "get", result };
1317
+ }
1318
+ default:
1319
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `guardlist.unknown op: ${request}`);
1205
1320
  }
1206
- default:
1207
- throw new MessengerError(
1208
- MessengerErrorCode.INVALID_INPUT,
1209
- `guardlist.unknown op: ${request}`
1210
- );
1211
- }
1212
1321
  }
1213
- export {
1214
- blacklist,
1215
- extract_zip_messages,
1216
- friendslist,
1217
- generate_wts,
1218
- getMessengerManager,
1219
- guardlist,
1220
- proof_message,
1221
- send_file,
1222
- send_message,
1223
- sign_wts,
1224
- verify_wts,
1225
- watch_conversations,
1226
- watch_messages,
1227
- wts2html
1228
- };
1322
+ //# sourceMappingURL=messenger-api.js.map