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