diff --git a/docs/classes/_tonconnect_protocol.SessionCrypto.html.orig b/docs/classes/_tonconnect_protocol.SessionCrypto.html.orig new file mode 100644 index 000000000..9c95b0e04 --- /dev/null +++ b/docs/classes/_tonconnect_protocol.SessionCrypto.html.orig @@ -0,0 +1,164 @@ +SessionCrypto | tonconnect
+
+ +
+
+
+
+ +

Class SessionCrypto

+
+

Hierarchy

+
    +
  • SessionCrypto
+======= +
  • Defined in packages/protocol/src/crypto/session-crypto.ts:5
  • +>>>>>>> f1a3583bc6846db2f1b73ebb6a8a7851c4d455e2 +
    +
    +
    + +
    +
    +

    Constructors

    +
    +
    +

    Properties

    +
    +
    +

    Methods

    +
    +
    +

    Constructors

    +
    + +
    +======= +
  • Defined in packages/protocol/src/crypto/session-crypto.ts:12
  • +>>>>>>> f1a3583bc6846db2f1b73ebb6a8a7851c4d455e2 +
    +

    Properties

    +
    + +
    sessionId: string
    +======= +
  • Defined in packages/protocol/src/crypto/session-crypto.ts:10
  • +>>>>>>> f1a3583bc6846db2f1b73ebb6a8a7851c4d455e2 +
    +

    Methods

    +
    + +
    +======= +
  • Defined in packages/protocol/src/crypto/session-crypto.ts:44
  • +>>>>>>> f1a3583bc6846db2f1b73ebb6a8a7851c4d455e2 +
    + +
    +======= +
  • Defined in packages/protocol/src/crypto/session-crypto.ts:32
  • +>>>>>>> f1a3583bc6846db2f1b73ebb6a8a7851c4d455e2 +
    + +
    +======= +
  • Defined in packages/protocol/src/crypto/session-crypto.ts:63
  • +>>>>>>> f1a3583bc6846db2f1b73ebb6a8a7851c4d455e2 + +
    +

    Generated using TypeDoc

    +
    \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 84a1c3ea9..2c865b2ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18102,12 +18102,12 @@ }, "packages/sdk": { "name": "@tonconnect/sdk", - "version": "3.0.3-beta.0", + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { "@tonconnect/isomorphic-eventsource": "^0.0.2", "@tonconnect/isomorphic-fetch": "^0.0.3", - "@tonconnect/protocol": "^2.2.6" + "@tonconnect/protocol": "file:../protocol" }, "devDependencies": { "@rollup/plugin-replace": "5.0.5", @@ -18606,10 +18606,10 @@ }, "packages/ui": { "name": "@tonconnect/ui", - "version": "2.0.3-beta.2", + "version": "2.0.3", "license": "Apache-2.0", "dependencies": { - "@tonconnect/sdk": "3.0.3-beta.0", + "@tonconnect/sdk": "file:./sdk", "classnames": "^2.3.2", "deepmerge": "^4.2.2", "ua-parser-js": "^1.0.35" @@ -18638,10 +18638,10 @@ }, "packages/ui-react": { "name": "@tonconnect/ui-react", - "version": "2.0.3-beta.2", + "version": "2.0.3", "license": "Apache-2.0", "dependencies": { - "@tonconnect/ui": "2.0.3-beta.2" + "@tonconnect/ui": "file:../ui" }, "devDependencies": { "@types/react": "^18.0.26", @@ -22934,7 +22934,7 @@ "@rollup/plugin-typescript": "^11.0.0", "@tonconnect/isomorphic-eventsource": "^0.0.2", "@tonconnect/isomorphic-fetch": "^0.0.3", - "@tonconnect/protocol": "^2.2.6", + "@tonconnect/protocol": "file:../protocol", "rollup": "^3.18.0", "ts-loader": "^9.4.1", "ttypescript": "^1.5.13", @@ -23171,7 +23171,7 @@ "@floating-ui/dom": "^1.0.12", "@rollup/plugin-replace": "5.0.5", "@solid-primitives/i18n": "^1.1.2", - "@tonconnect/sdk": "3.0.3-beta.0", + "@tonconnect/sdk": "file:../sdk", "@types/node": "^18.11.17", "@types/ua-parser-js": "^0.7.36", "classnames": "^2.3.2", @@ -23342,7 +23342,7 @@ "@tonconnect/ui-react": { "version": "file:packages/ui-react", "requires": { - "@tonconnect/ui": "2.0.3-beta.2", + "@tonconnect/ui": "file:../ui", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", "@vitejs/plugin-react": "^3.0.0", diff --git a/packages/protocol/package.json b/packages/protocol/package.json index db994ac97..56989969b 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -28,7 +28,7 @@ "main": "./lib/cjs/index.cjs", "module": "./lib/esm/index.mjs", "types": "./lib/types/index.d.ts", - "exports": { + "export": { ".": { "types": "./lib/types/index.d.ts", "require": "./lib/cjs/index.cjs", diff --git a/packages/protocol/src/models/app-message/request/app-request.ts b/packages/protocol/src/models/app-message/request/app-request.ts index 4b339fd82..dac1171dd 100644 --- a/packages/protocol/src/models/app-message/request/app-request.ts +++ b/packages/protocol/src/models/app-message/request/app-request.ts @@ -2,11 +2,15 @@ import { SendTransactionRpcRequest } from './send-transaction-rpc-request'; import { SignDataRpcRequest } from './sign-data-rpc-request'; import { RpcMethod } from '../../rpc-method'; import { DisconnectRpcRequest } from './disconnect-rpc-request'; +import { EncryptDataRpcRequest } from './encrypt-data-rpc-request'; +import { DecryptDataRpcRequest } from './decrypt-data-rpc-request'; export type RpcRequests = { sendTransaction: SendTransactionRpcRequest; signData: SignDataRpcRequest; disconnect: DisconnectRpcRequest; + encryptData: EncryptDataRpcRequest; + decryptData: DecryptDataRpcRequest; }; export type AppRequest = RpcRequests[T]; diff --git a/packages/protocol/src/models/app-message/request/decrypt-data-rpc-request.ts b/packages/protocol/src/models/app-message/request/decrypt-data-rpc-request.ts new file mode 100644 index 000000000..86e7633ca --- /dev/null +++ b/packages/protocol/src/models/app-message/request/decrypt-data-rpc-request.ts @@ -0,0 +1,13 @@ +export interface DecryptDataRpcRequest { + method: 'decryptData'; + // params: [ + // senderAddress: string, + // data: string, + // ]; + params: string[];//senderAddress, stringToDecrypt + id: string; + //TODO: currently senderAddress is the first parameter in the array, but it shall be passed separately, with array holding the many entries + // senderAddress: string; +} + +//TODO: change to just array in interface with string hex \ No newline at end of file diff --git a/packages/protocol/src/models/app-message/request/encrypt-data-rpc-request.ts b/packages/protocol/src/models/app-message/request/encrypt-data-rpc-request.ts new file mode 100644 index 000000000..3b2525281 --- /dev/null +++ b/packages/protocol/src/models/app-message/request/encrypt-data-rpc-request.ts @@ -0,0 +1,8 @@ +export interface EncryptDataRpcRequest { + method: 'encryptData'; + // data: + // string + // ; + params: string[];//publicKey, stringToEncrypt + id: string; +} diff --git a/packages/protocol/src/models/app-message/request/index.ts b/packages/protocol/src/models/app-message/request/index.ts index e356b635c..649d7a50e 100644 --- a/packages/protocol/src/models/app-message/request/index.ts +++ b/packages/protocol/src/models/app-message/request/index.ts @@ -2,3 +2,5 @@ export { AppRequest, RpcRequests } from './app-request'; export { SendTransactionRpcRequest } from './send-transaction-rpc-request'; export { SignDataRpcRequest } from './sign-data-rpc-request'; export { DisconnectRpcRequest } from './disconnect-rpc-request'; +export { EncryptDataRpcRequest } from './encrypt-data-rpc-request'; +export { DecryptDataRpcRequest } from './decrypt-data-rpc-request'; \ No newline at end of file diff --git a/packages/protocol/src/models/feature.ts b/packages/protocol/src/models/feature.ts index 7bc5832a4..3b5d8edd7 100644 --- a/packages/protocol/src/models/feature.ts +++ b/packages/protocol/src/models/feature.ts @@ -1,5 +1,8 @@ -export type Feature = SendTransactionFeatureDeprecated | SendTransactionFeature | SignDataFeature; +export type Feature = SendTransactionFeatureDeprecated | SendTransactionFeature | SignDataFeature | EncryptDataFeature | DecryptDataFeature; export type SendTransactionFeatureDeprecated = 'SendTransaction'; export type SendTransactionFeature = { name: 'SendTransaction'; maxMessages: number }; export type SignDataFeature = { name: 'SignData' }; + +export type EncryptDataFeature = {name: 'EncryptData'}; +export type DecryptDataFeature = {name: 'DecryptData'} \ No newline at end of file diff --git a/packages/protocol/src/models/index.ts b/packages/protocol/src/models/index.ts index 67f111073..b3bd232f0 100644 --- a/packages/protocol/src/models/index.ts +++ b/packages/protocol/src/models/index.ts @@ -6,6 +6,8 @@ export { Feature, SendTransactionFeatureDeprecated, SendTransactionFeature, - SignDataFeature + SignDataFeature, + EncryptDataFeature, + DecryptDataFeature, } from './feature'; export { CHAIN } from './CHAIN'; diff --git a/packages/protocol/src/models/rpc-method.ts b/packages/protocol/src/models/rpc-method.ts index 07537ae79..29c9d3545 100644 --- a/packages/protocol/src/models/rpc-method.ts +++ b/packages/protocol/src/models/rpc-method.ts @@ -1 +1 @@ -export type RpcMethod = 'disconnect' | 'sendTransaction' | 'signData'; +export type RpcMethod = 'disconnect' | 'sendTransaction' | 'signData' | 'encryptData' | 'decryptData'; diff --git a/packages/protocol/src/models/wallet-message/wallet-response/decrypt-rpc-response.ts b/packages/protocol/src/models/wallet-message/wallet-response/decrypt-rpc-response.ts new file mode 100644 index 000000000..527e98441 --- /dev/null +++ b/packages/protocol/src/models/wallet-message/wallet-response/decrypt-rpc-response.ts @@ -0,0 +1,31 @@ +import { WalletResponseTemplateError, WalletResponseTemplateSuccess } from './wallet-response-template'; +//TODO: make them arrays + +export type DecryptDataRpcResponse = DecryptDataRpcResponseSuccess | DecryptDataRpcResponseError; + +// export interface DecryptDataRpcResponseSuccess { +// id: string; +// // result: { +// // // data: string[]; +// // data: string; +// // }; +// result: string; +// } + +export interface DecryptDataRpcResponseSuccess { + result: string[]; + id: string; +} + +export interface DecryptDataRpcResponseError extends WalletResponseTemplateError { + error: { code: DECRYPT_DATA_ERROR_CODES; message: string; data?: unknown }; + id: string; +} + +export enum DECRYPT_DATA_ERROR_CODES { + UNKNOWN_ERROR = 0, + BAD_REQUEST_ERROR = 1, + UNKNOWN_APP_ERROR = 100, + USER_REJECTS_ERROR = 300, + METHOD_NOT_SUPPORTED = 400 +} diff --git a/packages/protocol/src/models/wallet-message/wallet-response/encrypt-rpc-response.ts b/packages/protocol/src/models/wallet-message/wallet-response/encrypt-rpc-response.ts new file mode 100644 index 000000000..b77697b44 --- /dev/null +++ b/packages/protocol/src/models/wallet-message/wallet-response/encrypt-rpc-response.ts @@ -0,0 +1,27 @@ +import { WalletResponseTemplateError, WalletResponseTemplateSuccess } from './wallet-response-template'; +//TODO: make them arrays + +export type EncryptDataRpcResponse = EncryptDataRpcResponseSuccess | EncryptDataRpcResponseError; + +// export interface EncryptDataRpcResponseSuccess { +// id: string; +// // result: { +// // data: string; +// // }; +// result: string; +// } + +export interface EncryptDataRpcResponseSuccess extends WalletResponseTemplateSuccess {} + +export interface EncryptDataRpcResponseError extends WalletResponseTemplateError { + error: { code: ENCRYPT_DATA_ERROR_CODES; message: string; data?: unknown }; + id: string; +} + +export enum ENCRYPT_DATA_ERROR_CODES { + UNKNOWN_ERROR = 0, + BAD_REQUEST_ERROR = 1, + UNKNOWN_APP_ERROR = 100, + USER_REJECTS_ERROR = 300, + METHOD_NOT_SUPPORTED = 400 +} diff --git a/packages/protocol/src/models/wallet-message/wallet-response/index.ts b/packages/protocol/src/models/wallet-message/wallet-response/index.ts index b07b25dcd..511e1397a 100644 --- a/packages/protocol/src/models/wallet-message/wallet-response/index.ts +++ b/packages/protocol/src/models/wallet-message/wallet-response/index.ts @@ -26,3 +26,15 @@ export { WalletResponseTemplateError, WalletResponseTemplateSuccess } from './wallet-response-template'; +export { + EncryptDataRpcResponse, + EncryptDataRpcResponseSuccess, + EncryptDataRpcResponseError, + ENCRYPT_DATA_ERROR_CODES +} from './encrypt-rpc-response'; +export { + DecryptDataRpcResponse, + DecryptDataRpcResponseSuccess, + DecryptDataRpcResponseError, + DECRYPT_DATA_ERROR_CODES +} from './decrypt-rpc-response'; diff --git a/packages/protocol/src/models/wallet-message/wallet-response/wallet-response.ts b/packages/protocol/src/models/wallet-message/wallet-response/wallet-response.ts index fa81c9932..d4e0c08f1 100644 --- a/packages/protocol/src/models/wallet-message/wallet-response/wallet-response.ts +++ b/packages/protocol/src/models/wallet-message/wallet-response/wallet-response.ts @@ -8,6 +8,8 @@ import { DisconnectRpcResponseError, DisconnectRpcResponseSuccess } from './disconnect-rpc-response'; +import { DecryptDataRpcResponseError, DecryptDataRpcResponseSuccess } from './decrypt-rpc-response'; +import { EncryptDataRpcResponseError, EncryptDataRpcResponseSuccess } from './encrypt-rpc-response'; export type RpcResponses = { sendTransaction: { @@ -24,6 +26,14 @@ export type RpcResponses = { error: DisconnectRpcResponseError; success: DisconnectRpcResponseSuccess; }; + decryptData: { + error: DecryptDataRpcResponseError; + success: DecryptDataRpcResponseSuccess; + }; + encryptData: { + error: EncryptDataRpcResponseError; + success: EncryptDataRpcResponseSuccess; + }; }; export type WalletResponseSuccess = RpcResponses[T]['success']; diff --git a/packages/sdk/package.json b/packages/sdk/package.json index bcf249ed8..b89731a98 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -26,7 +26,7 @@ "dependencies": { "@tonconnect/isomorphic-eventsource": "^0.0.2", "@tonconnect/isomorphic-fetch": "^0.0.3", - "@tonconnect/protocol": "^2.2.6" + "@tonconnect/protocol": "file:../protocol" }, "files": [ "lib", diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index bd04a5e7b..999977ab1 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -23,7 +23,13 @@ export { createTransactionSignedEvent, createRequestVersionEvent, createResponseVersionEvent, - createVersionInfo + createVersionInfo, + createEncryptDataEvent, + createDecryptDataEvent, + createEncryptDataFailedEvent, + createEncryptDataSentEvent, + createDecryptDataSentEvent, + createDecryptDataFailedEvent, } from './tracker/types'; export type { AuthType, @@ -48,7 +54,17 @@ export type { ResponseVersionEvent, VersionEvent, Version, - WithoutVersion + WithoutVersion, + EncryptDataSentEvent, + EncryptDataEvent, + EncryptDataFailedEvent, + EncryptedDataEvent, + EncryptDataInfo, + DecryptDataInfo, + DecryptDataSentEvent, + DecryptDataEvent, + DecryptDataFailedEvent, + DecryptedDataEvent, } from './tracker/types'; export { BrowserEventDispatcher } from './tracker/browser-event-dispatcher'; export type { TonAddressItem, TonProofItem, ConnectItem } from '@tonconnect/protocol'; @@ -58,6 +74,8 @@ export { Feature, SendTransactionFeature, SignDataFeature, + EncryptDataFeature, + DecryptDataFeature, SendTransactionFeatureDeprecated, TonProofItemReply, TonProofItemReplySuccess, @@ -65,7 +83,9 @@ export { ConnectItemReplyError, CONNECT_ITEM_ERROR_CODES, CONNECT_EVENT_ERROR_CODES, - SEND_TRANSACTION_ERROR_CODES + SEND_TRANSACTION_ERROR_CODES, + ENCRYPT_DATA_ERROR_CODES, + DECRYPT_DATA_ERROR_CODES, } from '@tonconnect/protocol'; export { toUserFriendlyAddress } from './utils/address'; export { isTelegramUrl, encodeTelegramUrlParameters } from './utils/url'; diff --git a/packages/sdk/src/models/methods/decrypt-data/decrypt-data-request.ts b/packages/sdk/src/models/methods/decrypt-data/decrypt-data-request.ts new file mode 100644 index 000000000..9b8903def --- /dev/null +++ b/packages/sdk/src/models/methods/decrypt-data/decrypt-data-request.ts @@ -0,0 +1,10 @@ +export interface DecryptData { + senderAddress: string; + data: string; +} + +export interface DecryptDataRequest { + // params: DecryptData[]; + data: string[]; + id: string; +} diff --git a/packages/sdk/src/models/methods/decrypt-data/decrypt-data-response.ts b/packages/sdk/src/models/methods/decrypt-data/decrypt-data-response.ts new file mode 100644 index 000000000..6dae71632 --- /dev/null +++ b/packages/sdk/src/models/methods/decrypt-data/decrypt-data-response.ts @@ -0,0 +1,5 @@ +export interface DecryptDataResponse { + result: string[];//[] + // boc: string + // id: string; +} diff --git a/packages/sdk/src/models/methods/decrypt-data/index.ts b/packages/sdk/src/models/methods/decrypt-data/index.ts new file mode 100644 index 000000000..d7f64a522 --- /dev/null +++ b/packages/sdk/src/models/methods/decrypt-data/index.ts @@ -0,0 +1,2 @@ +export { DecryptDataRequest } from './decrypt-data-request'; +export { DecryptDataResponse } from './decrypt-data-response'; diff --git a/packages/sdk/src/models/methods/encrypt-data/encrypt-data-request.ts b/packages/sdk/src/models/methods/encrypt-data/encrypt-data-request.ts new file mode 100644 index 000000000..0e5823bd3 --- /dev/null +++ b/packages/sdk/src/models/methods/encrypt-data/encrypt-data-request.ts @@ -0,0 +1,6 @@ +export interface EncryptDataRequest { + data: string[];// receiversPublicKey, data + // data: {data: string + // }[]; + id: string; +} diff --git a/packages/sdk/src/models/methods/encrypt-data/encrypt-data-response.ts b/packages/sdk/src/models/methods/encrypt-data/encrypt-data-response.ts new file mode 100644 index 000000000..c3316c9c2 --- /dev/null +++ b/packages/sdk/src/models/methods/encrypt-data/encrypt-data-response.ts @@ -0,0 +1,6 @@ +export interface EncryptDataResponse { + boc: string; + // data: {data: string + // }[]; + // id: string; +} diff --git a/packages/sdk/src/models/methods/encrypt-data/index.ts b/packages/sdk/src/models/methods/encrypt-data/index.ts new file mode 100644 index 000000000..2d024b50c --- /dev/null +++ b/packages/sdk/src/models/methods/encrypt-data/index.ts @@ -0,0 +1,2 @@ +export { EncryptDataRequest } from './encrypt-data-request'; +export { EncryptDataResponse } from './encrypt-data-response'; diff --git a/packages/sdk/src/models/methods/index.ts b/packages/sdk/src/models/methods/index.ts index 9ae22660f..c0e10d404 100644 --- a/packages/sdk/src/models/methods/index.ts +++ b/packages/sdk/src/models/methods/index.ts @@ -1,2 +1,4 @@ export * from './connect'; export * from './send-transaction'; +export * from './decrypt-data'; +export * from './encrypt-data'; \ No newline at end of file diff --git a/packages/sdk/src/parsers/send-transaction-parser.ts b/packages/sdk/src/parsers/send-transaction-parser.ts index e0c5db70f..694b1e44c 100644 --- a/packages/sdk/src/parsers/send-transaction-parser.ts +++ b/packages/sdk/src/parsers/send-transaction-parser.ts @@ -1,5 +1,9 @@ import { CONNECT_EVENT_ERROR_CODES, + DecryptDataRpcRequest, + DecryptDataRpcResponseSuccess, + EncryptDataRpcRequest, + EncryptDataRpcResponseSuccess, SEND_TRANSACTION_ERROR_CODES, SendTransactionRpcRequest, SendTransactionRpcResponseError, @@ -7,7 +11,7 @@ import { } from '@tonconnect/protocol'; import { BadRequestError, TonConnectError, UnknownAppError, UserRejectsError } from 'src/errors'; import { UnknownError } from 'src/errors/unknown.error'; -import { SendTransactionRequest, SendTransactionResponse } from 'src/models/methods'; +import { DecryptDataRequest, DecryptDataResponse, EncryptDataRequest, EncryptDataResponse, SendTransactionRequest, SendTransactionResponse } from 'src/models/methods'; import { RpcParser } from 'src/parsers/rpc-parser'; import { WithoutId } from 'src/utils/types'; @@ -28,6 +32,24 @@ class SendTransactionParser extends RpcParser<'sendTransaction'> { }; } + convertToRpcRequestEncrypt( + request: Omit + ): WithoutId { + return { + method: 'encryptData', + params: [JSON.stringify(request)] + }; + } + + convertToRpcRequestDecrypt( + request: Omit + ): WithoutId { + return { + method: 'decryptData', + params: [JSON.stringify(request)] + }; + } + parseAndThrowError(response: WithoutId): never { let ErrorConstructor: typeof TonConnectError = UnknownError; @@ -45,6 +67,23 @@ class SendTransactionParser extends RpcParser<'sendTransaction'> { boc: rpcResponse.result }; } + + convertFromRpcResponseEncrypt( + rpcResponse: WithoutId + ): EncryptDataResponse { + return { + // rpcResponse.result + boc: rpcResponse.result + }; + } + + convertFromRpcResponseDecrypt( + rpcResponse: WithoutId + ): DecryptDataResponse { + return { + result: rpcResponse.result + }; + } } export const sendTransactionParser = new SendTransactionParser(); diff --git a/packages/sdk/src/provider/bridge/bridge-provider.ts b/packages/sdk/src/provider/bridge/bridge-provider.ts index cfc8213bb..967577a48 100644 --- a/packages/sdk/src/provider/bridge/bridge-provider.ts +++ b/packages/sdk/src/provider/bridge/bridge-provider.ts @@ -130,6 +130,25 @@ export class BridgeProvider implements HTTPProvider { return this.generateUniversalLink(universalLink, message); } + public decrypt( + message: Uint8Array, + senderPublicKey: Uint8Array + ) { + this.session!.sessionCrypto.decrypt( + message, senderPublicKey, + ); + } + + public encrypt( + message: string, + receiverPublicKey: Uint8Array + + ) { + this.session!.sessionCrypto.encrypt( + message, receiverPublicKey + ); + } + public async restoreConnection(options?: { openingDeadlineMS?: number; signal?: AbortSignal; diff --git a/packages/sdk/src/provider/provider.ts b/packages/sdk/src/provider/provider.ts index 0e68ae4c0..5387ecbe6 100644 --- a/packages/sdk/src/provider/provider.ts +++ b/packages/sdk/src/provider/provider.ts @@ -57,4 +57,7 @@ interface BaseProvider { ): Promise>>; listen(eventsCallback: (e: WithoutIdDistributive) => void): void; + + // encrypt(): Promise + // decrypt(): Promise } diff --git a/packages/sdk/src/ton-connect.interface.ts b/packages/sdk/src/ton-connect.interface.ts index 7023ee909..569a51421 100644 --- a/packages/sdk/src/ton-connect.interface.ts +++ b/packages/sdk/src/ton-connect.interface.ts @@ -1,6 +1,6 @@ import { TonConnectError } from 'src/errors'; import { Account, Wallet, WalletConnectionSource, WalletConnectionSourceHTTP } from 'src/models'; -import { SendTransactionRequest, SendTransactionResponse } from 'src/models/methods'; +import { SendTransactionRequest, SendTransactionResponse, EncryptDataRequest, DecryptDataRequest, EncryptDataResponse, DecryptDataResponse } from 'src/models/methods'; import { ConnectAdditionalRequest } from 'src/models/methods/connect/connect-additional-request'; import { WalletInfo } from 'src/models/wallet/wallet-info'; import { WalletConnectionSourceJS } from 'src/models/wallet/wallet-connection-source'; @@ -92,4 +92,30 @@ export interface ITonConnect { transaction: SendTransactionRequest, onRequestSent?: () => void ): Promise; + + /** + * Asks connected wallet to encrypt the message. + * @param receiverPublicKey + * @param data message to encrypt. + * @returns encrypted message boc. + */ + encryptData(receiverPublicKey: string, data: string, + options?: { + onRequestSent?: () => void; + signal?: AbortSignal; + } + ): Promise; + + /** + * Asks connected wallet to decrypt the message. + * @param data message to encrypt. + * @returns encrypted message boc. + * TODO: senderAddress and data is an array, so that decryption of everything is achievable in one step + */ + decryptData(data: string, senderAddress: string, + options?: { + onRequestSent?: () => void; + signal?: AbortSignal; + } + ): Promise; } diff --git a/packages/sdk/src/ton-connect.ts b/packages/sdk/src/ton-connect.ts index 700bc7035..946974ef2 100644 --- a/packages/sdk/src/ton-connect.ts +++ b/packages/sdk/src/ton-connect.ts @@ -6,7 +6,9 @@ import { SendTransactionRpcResponseSuccess, TonAddressItemReply, TonProofItemReply, - WalletEvent + WalletEvent, + EncryptDataRpcResponseSuccess, + DecryptDataRpcResponseSuccess, } from '@tonconnect/protocol'; import { DappMetadataError } from 'src/errors/dapp/dapp-metadata.error'; import { ManifestContentErrorError } from 'src/errors/protocol/events/connect/manifest-content-error.error'; @@ -21,7 +23,7 @@ import { WalletConnectionSourceHTTP, WalletInfo } from 'src/models'; -import { SendTransactionRequest, SendTransactionResponse } from 'src/models/methods'; +import { SendTransactionRequest, SendTransactionResponse, EncryptDataRequest, EncryptDataResponse, DecryptDataRequest, DecryptDataResponse } from 'src/models/methods'; import { ConnectAdditionalRequest } from 'src/models/methods/connect/connect-additional-request'; import { TonConnectOptions } from 'src/models/ton-connect-options'; import { @@ -39,7 +41,7 @@ import { ITonConnect } from 'src/ton-connect.interface'; import { getDocument, getWebPageManifest } from 'src/utils/web-api'; import { WalletsListManager } from 'src/wallets-list-manager'; import { WithoutIdDistributive } from 'src/utils/types'; -import { checkSendTransactionSupport } from 'src/utils/feature-support'; +import { checkDecryptDataSupport, checkEncryptDataSupport, checkSendTransactionSupport } from 'src/utils/feature-support'; import { callForSuccess } from 'src/utils/call-for-success'; import { logDebug, logError } from 'src/utils/log'; import { createAbortController } from 'src/utils/create-abort-controller'; @@ -449,6 +451,105 @@ export class TonConnect implements ITonConnect { return result; } + /** + * Encrypt and decrypt data + */ + + public async encryptData( + data: string, + receiverPublicKey: string, + options?: { + onRequestSent?: () => void; + signal?: AbortSignal; + } + ): Promise { + const abortController = createAbortController(options?.signal); + if (abortController.signal.aborted) { + throw new TonConnectError('Data encryption was aborted'); + } + + this.checkConnection(); + + checkEncryptDataSupport(this.wallet!.device.features); + + this.tracker.trackEncryptDataSent(this.wallet, { data: [receiverPublicKey, data], id: "0" }); + + //TODO: check if wallet supports this method + // checkSendTransactionSupport(this.wallet!.device.features, { + // requiredMessagesNumber: transaction.messages.length + // }); + + const response = await this.provider!.sendRequest( + sendTransactionParser.convertToRpcRequestEncrypt({ + data: [receiverPublicKey, data], + }), + { onRequestSent: options?.onRequestSent, signal: abortController.signal } + ); + + if (sendTransactionParser.isError(response)) { + this.tracker.trackEncryptDataFailed( + this.wallet, + { data: [receiverPublicKey, data], id: "0" }, + response.error.message, + // response.error.code + ); + return sendTransactionParser.parseAndThrowError(response); + } + + const result = sendTransactionParser.convertFromRpcResponseEncrypt( + response as EncryptDataRpcResponseSuccess + ); + + this.tracker.trackEncryptData(this.wallet, { data: [receiverPublicKey, data], id: "0" }, result) + return result; + } + + public async decryptData( + data: string, + senderAddress: string, + options?: { + onRequestSent?: () => void; + signal?: AbortSignal; + } + ): Promise { + const abortController = createAbortController(options?.signal); + if (abortController.signal.aborted) { + throw new TonConnectError('Data encryption was aborted'); + } + + this.checkConnection(); + + checkDecryptDataSupport(this.wallet!.device.features); + + this.tracker.trackDecryptDataSent(this.wallet, { data: [senderAddress, data], id: "0" }); + + const response = await this.provider!.sendRequest( + sendTransactionParser.convertToRpcRequestDecrypt({ + data: [senderAddress, data], + }), + { onRequestSent: options?.onRequestSent, signal: abortController.signal } + ); + + if (sendTransactionParser.isError(response)) { + this.tracker.trackEncryptDataFailed( + this.wallet, + { data: [senderAddress, data], id: "0" }, + response.error.message, + // response.error.code + ); + return sendTransactionParser.parseAndThrowError(response); + } + + + + const result = sendTransactionParser.convertFromRpcResponseDecrypt( + response as DecryptDataRpcResponseSuccess + ); + + this.tracker.trackDecryptData(this.wallet, { data: [senderAddress, data], id: "0" }, result) + return result; + } + /** * Disconnect form thw connected wallet and drop current session. */ diff --git a/packages/sdk/src/tracker/ton-connect-tracker.ts b/packages/sdk/src/tracker/ton-connect-tracker.ts index c0af6ee18..41e8fdfc3 100644 --- a/packages/sdk/src/tracker/ton-connect-tracker.ts +++ b/packages/sdk/src/tracker/ton-connect-tracker.ts @@ -5,7 +5,13 @@ import { createConnectionRestoringErrorEvent, createConnectionRestoringStartedEvent, createConnectionStartedEvent, + createDecryptDataSentEvent, + createDecryptDataEvent, + createDecryptDataFailedEvent, createDisconnectionEvent, + createEncryptDataEvent, + createEncryptDataFailedEvent, + createEncryptDataSentEvent, createRequestVersionEvent, createResponseVersionEvent, createTransactionSentForSignatureEvent, @@ -264,6 +270,24 @@ export class TonConnectTracker { } catch (e) {} } + public trackEncryptDataSent( + ...args: WithoutVersion> + ): void { + try { + const event = createEncryptDataSentEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + + public trackDecryptDataSent( + ...args: WithoutVersion> + ): void { + try { + const event = createDecryptDataSentEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + /** * Track transaction signed event. * @param args @@ -277,6 +301,24 @@ export class TonConnectTracker { } catch (e) {} } + public trackEncryptData( + ...args: WithoutVersion> + ): void { + try { + const event = createEncryptDataEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + + public trackDecryptData( + ...args: WithoutVersion> + ): void { + try { + const event = createDecryptDataEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + /** * Track transaction error event. * @param args @@ -289,4 +331,22 @@ export class TonConnectTracker { this.dispatchUserActionEvent(event); } catch (e) {} } + + public trackEncryptDataFailed( + ...args: WithoutVersion> + ): void { + try { + const event = createEncryptDataFailedEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + + public trackDecryptDataFailed( + ...args: WithoutVersion> + ): void { + try { + const event = createDecryptDataFailedEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } } diff --git a/packages/sdk/src/tracker/types.ts b/packages/sdk/src/tracker/types.ts index a5399be99..cf22c92f2 100644 --- a/packages/sdk/src/tracker/types.ts +++ b/packages/sdk/src/tracker/types.ts @@ -1,5 +1,5 @@ -import { CONNECT_EVENT_ERROR_CODES, ConnectItem, SEND_TRANSACTION_ERROR_CODES } from '@tonconnect/protocol'; -import { SendTransactionRequest, SendTransactionResponse, Wallet } from 'src/models'; +import { CONNECT_EVENT_ERROR_CODES, ConnectItem, DECRYPT_DATA_ERROR_CODES, ENCRYPT_DATA_ERROR_CODES, SEND_TRANSACTION_ERROR_CODES } from '@tonconnect/protocol'; +import { DecryptDataRequest, DecryptDataResponse, EncryptDataRequest, EncryptDataResponse, SendTransactionRequest, SendTransactionResponse, Wallet } from 'src/models'; /** * Request TON Connect UI version. @@ -375,6 +375,31 @@ export type TransactionInfo = { messages: TransactionMessage[]; }; +export type EncryptDataInfo = { + receiverPublicKey: string, + data: string, +} + +export type DecryptDataInfo = { + decryptData: string[], +} + +export type EncryptDataSentEvent = { + /** + * Event type. + */ + type: 'encrypt-data-sent'; +} & ConnectionInfo & + EncryptDataInfo; + +export type DecryptDataSentEvent = { + /** + * Event type. + */ + type: 'decrypt-data-sent'; +} & ConnectionInfo & + DecryptDataInfo; + function createTransactionInfo( wallet: Wallet | null, transaction: SendTransactionRequest @@ -389,6 +414,25 @@ function createTransactionInfo( }; } +function createEncryptDataInfo( + // wallet: Wallet | null, + message: EncryptDataRequest +): EncryptDataInfo { + return { + receiverPublicKey: message.data[0]!, + data: message.data[1]! + }; +} + +function createDecryptDataInfo( + // wallet: Wallet | null, + message: DecryptDataRequest +): DecryptDataInfo { + return { + decryptData: message.data + }; +} + /** * Initial transaction event when a user initiates a transaction. */ @@ -418,6 +462,136 @@ export function createTransactionSentForSignatureEvent( }; } +export function createEncryptDataSentEvent( + version: Version, + wallet: Wallet | null, + message: EncryptDataRequest +): EncryptDataSentEvent { + return { + type: 'encrypt-data-sent', + ...createConnectionInfo(version, wallet), + ...createEncryptDataInfo(message)//todo: add wallet with address of self + }; +} + + +export function createDecryptDataSentEvent( + version: Version, + wallet: Wallet | null, + message: DecryptDataRequest +): DecryptDataSentEvent { + return { + type: 'decrypt-data-sent', + ...createConnectionInfo(version, wallet), + ...createDecryptDataInfo(message) + }; +} + +export function createEncryptDataEvent( + version: Version, + wallet: Wallet | null, + data: EncryptDataRequest, + encryptedData: EncryptDataResponse +): EncryptedDataEvent { + return { + type: 'data-encrypted', + is_success: true, + encrypted_data: encryptedData.boc, + ...createConnectionInfo(version, wallet), + ...createEncryptDataInfo(data),//TODO: add wallet with address of self + // data: data.data[1]!, + }; +} + +export function createDecryptDataEvent( + version: Version, + wallet: Wallet | null, + data: DecryptDataRequest, + decryptedData: DecryptDataResponse +): DecryptedDataEvent { + return { + type: 'data-decrypted', + is_success: true, + // senderAddress: data.params[0]!, + // data: data.params[1]!, + decrypt_data: decryptedData.result, + ...createConnectionInfo(version, wallet), + ...createDecryptDataInfo(data) + }; +} + +export type EncryptedDataEvent = { + /** + * Event type. + */ + type: 'data-encrypted'; + /** + * Connection success flag. + */ + is_success: true; + /** + * Data encrypted + */ + encrypted_data: string; +} & ConnectionInfo & + EncryptDataInfo; + +export type DecryptedDataEvent = { + /** + * Event type. + */ + type: 'data-decrypted'; + /** + * Connection success flag. + */ + is_success: true; + /** + * Data decrypted + */ + decrypt_data: string[]; +} & ConnectionInfo & + DecryptDataInfo; + + +export type EncryptDataFailedEvent = { + /** + * Event type. + */ + type: 'encrypt-data-failed'; + /** + * Connection success flag. + */ + is_success: false; + /** + * Reason for the error. + */ + error_message: string; + /** + * Error code. + */ + error_code: ENCRYPT_DATA_ERROR_CODES | null; +} & ConnectionInfo & + EncryptDataInfo; + +export type DecryptDataFailedEvent = { + /** + * Event type. + */ + type: 'decrypt-data-failed'; + /** + * Connection success flag. + */ + is_success: false; + /** + * Reason for the error. + */ + error_message: string; + /** + * Error code. + */ + error_code: DECRYPT_DATA_ERROR_CODES | null; +} & ConnectionInfo & + DecryptDataInfo; /** * Transaction signed event when a user successfully signed a transaction. */ @@ -507,6 +681,40 @@ export function createTransactionSigningFailedEvent( }; } +export function createEncryptDataFailedEvent( + version: Version, + wallet: Wallet | null, + message: EncryptDataRequest, + errorMessage: string, + errorCode: ENCRYPT_DATA_ERROR_CODES | void +): EncryptDataFailedEvent { + return { + type: 'encrypt-data-failed', + is_success: false, + error_message: errorMessage, + error_code: errorCode ?? null, + ...createConnectionInfo(version, wallet), + ...createEncryptDataInfo(message) + }; +} + +export function createDecryptDataFailedEvent( + version: Version, + wallet: Wallet | null, + message: DecryptDataRequest, + errorMessage: string, + errorCode: DECRYPT_DATA_ERROR_CODES | void +): DecryptDataFailedEvent { + return { + type: 'decrypt-data-failed', + is_success: false, + error_message: errorMessage, + error_code: errorCode ?? null, + ...createConnectionInfo(version, wallet), + ...createDecryptDataInfo(message) + }; +} + /** * Transaction events. */ @@ -515,6 +723,22 @@ export type TransactionSigningEvent = | TransactionSignedEvent | TransactionSigningFailedEvent; +/** + * Decrypt events. + */ +export type DecryptDataEvent = +| DecryptDataSentEvent +| DecryptedDataEvent +| DecryptDataFailedEvent; + +/** + * Encrypt events. + */ +export type EncryptDataEvent = +| EncryptDataSentEvent +| EncryptedDataEvent +| EncryptDataFailedEvent; + /** * Disconnect event when a user initiates a disconnection. */ @@ -556,7 +780,9 @@ export type SdkActionEvent = | ConnectionEvent | ConnectionRestoringEvent | DisconnectionEvent - | TransactionSigningEvent; + | TransactionSigningEvent + | EncryptDataEvent + | DecryptDataEvent /** * Parameters without version field. diff --git a/packages/sdk/src/utils/feature-support.ts b/packages/sdk/src/utils/feature-support.ts index 3c96eeb0d..9ab53d266 100644 --- a/packages/sdk/src/utils/feature-support.ts +++ b/packages/sdk/src/utils/feature-support.ts @@ -1,4 +1,4 @@ -import { Feature, SendTransactionFeature } from '@tonconnect/protocol'; +import { DecryptDataFeature, EncryptDataFeature, Feature, SendTransactionFeature } from '@tonconnect/protocol'; import { logWarning } from 'src/utils/log'; import { WalletNotSupportFeatureError } from 'src/errors/wallet/wallet-not-support-feature.error'; @@ -28,3 +28,55 @@ export function checkSendTransactionSupport( "Connected wallet didn't provide information about max allowed messages in the SendTransaction request. Request may be rejected by the wallet." ); } + +export function checkEncryptDataSupport( + features: Feature[], + // options?: { requiredMessagesNumber: number } +): never | void { + const encryptDataFeature = features.find( + feature => feature && typeof feature === 'object' && feature.name === 'EncryptData' + ) as EncryptDataFeature; + + if (!encryptDataFeature) { + throw new WalletNotSupportFeatureError("Wallet doesn't support EncryptData feature."); + } + + // if (encryptDataFeature && sendTransactionFeature.maxMessages !== undefined) { + // if (sendTransactionFeature.maxMessages < options.requiredMessagesNumber) { + // throw new WalletNotSupportFeatureError( + // `Wallet is not able to handle such SendTransaction request. Max support messages number is ${sendTransactionFeature.maxMessages}, but ${options.requiredMessagesNumber} is required.` + // ); + // } + // return; + // } + + logWarning( + "Connected wallet didn't provide information about max allowed messages in the EncryptData request. Request may be rejected by the wallet." + ); +} + +export function checkDecryptDataSupport( + features: Feature[], + // options?: { requiredMessagesNumber: number } +): never | void { + const decryptDataFeature = features.find( + feature => feature && typeof feature === 'object' && feature.name === 'DecryptData' + ) as DecryptDataFeature; + + if (!decryptDataFeature) { + throw new WalletNotSupportFeatureError("Wallet doesn't support DecryptData feature."); + } + + // if (encryptDataFeature && sendTransactionFeature.maxMessages !== undefined) { + // if (sendTransactionFeature.maxMessages < options.requiredMessagesNumber) { + // throw new WalletNotSupportFeatureError( + // `Wallet is not able to handle such SendTransaction request. Max support messages number is ${sendTransactionFeature.maxMessages}, but ${options.requiredMessagesNumber} is required.` + // ); + // } + // return; + // } + + logWarning( + "Connected wallet didn't provide information about max allowed messages in the DecryptData request. Request may be rejected by the wallet." + ); +} \ No newline at end of file diff --git a/packages/sdk/src/utils/types.ts b/packages/sdk/src/utils/types.ts index fe583c1b3..fb268bd04 100644 --- a/packages/sdk/src/utils/types.ts +++ b/packages/sdk/src/utils/types.ts @@ -1,7 +1,7 @@ export type AsStruct = { [P in keyof T as T[P] extends Function ? never : P]: T[P] }; -export type WithoutId = Omit; export type WithoutIdDistributive = DistributiveOmit; +export type WithoutId = Omit; export type DistributiveOmit = T extends unknown ? Omit : never; diff --git a/packages/ui-react/package.json.rej b/packages/ui-react/package.json.rej new file mode 100644 index 000000000..7eb40d68a --- /dev/null +++ b/packages/ui-react/package.json.rej @@ -0,0 +1,10 @@ +diff a/packages/ui-react/package.json b/packages/ui-react/package.json (rejected hunks) +@@ -52,7 +52,7 @@ + "vite-plugin-dts": "^1.7.1" + }, + "dependencies": { +- "@tonconnect/ui": "2.0.3" ++ "@tonconnect/ui": "file:../ui" + }, + "peerDependencies": { + "react": ">=17.0.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index 3b00186fc..de208d46c 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -47,7 +47,7 @@ } }, "dependencies": { - "@tonconnect/sdk": "3.0.3", + "@tonconnect/sdk": "file:../sdk", "classnames": "^2.3.2", "deepmerge": "^4.2.2", "ua-parser-js": "^1.0.35" diff --git a/packages/ui/src/app/state/modals-state.ts b/packages/ui/src/app/state/modals-state.ts index 3fe257df5..f303f6b29 100644 --- a/packages/ui/src/app/state/modals-state.ts +++ b/packages/ui/src/app/state/modals-state.ts @@ -5,9 +5,9 @@ import { ReturnStrategy } from 'src/models'; import { WalletsModalState } from 'src/models/wallets-modal'; import { SingleWalletModalState } from 'src/models/single-wallet-modal'; -export type ActionName = 'confirm-transaction' | 'transaction-sent' | 'transaction-canceled'; +export type ActionName = 'confirm-transaction' | 'transaction-sent' | 'transaction-canceled' | 'crypt-data'; -export type Action = BasicAction | ConfirmTransactionAction; +export type Action = BasicAction | ConfirmTransactionAction | CryptAction; type BasicAction = { name: ActionName; @@ -22,6 +22,13 @@ export type ConfirmTransactionAction = BasicAction & { sent: boolean; }; +export type CryptAction = BasicAction & { + name: 'crypt-data'; + returnStrategy: ReturnStrategy; + twaReturnUrl: `${string}://${string}`; + sent: boolean; +} + export const [walletsModalState, setWalletsModalState] = createSignal({ status: 'closed', closeReason: null diff --git a/packages/ui/src/ton-connect-ui.ts b/packages/ui/src/ton-connect-ui.ts index d10eff5f2..9fa155c79 100644 --- a/packages/ui/src/ton-connect-ui.ts +++ b/packages/ui/src/ton-connect-ui.ts @@ -1,6 +1,8 @@ import type { Account, ConnectAdditionalRequest, + EncryptDataFeature, + DecryptDataFeature, WalletInfoCurrentlyEmbedded } from '@tonconnect/sdk'; import { @@ -9,6 +11,10 @@ import { ITonConnect, SendTransactionRequest, SendTransactionResponse, + EncryptDataRequest, + DecryptDataRequest, + EncryptDataResponse, + DecryptDataResponse, TonConnect, TonConnectError, Wallet, @@ -44,6 +50,7 @@ import { SingleWalletModalManager } from 'src/managers/single-wallet-modal-manag import { SingleWalletModal, SingleWalletModalState } from 'src/models/single-wallet-modal'; import { TonConnectUITracker } from 'src/tracker/ton-connect-ui-tracker'; import { tonConnectUiVersion } from 'src/constants/version'; +import { DecryptData } from './tracker/types'; export class TonConnectUI { public static getWallets(): Promise { @@ -518,6 +525,254 @@ export class TonConnectUI { } } + /** + * Opens the modal window and handles the message encryption/decryption. + * @param message transaction to send. + * @param publicKey public key to encrypt the message. + * @param options modal and notifications behaviour settings. Default is show only 'before' modal and all notifications. + */ + public async encryptData( //TODO: encryptData as arbitrary data can be encrypted + publicKey: string, + message: string, + options?: ActionConfiguration + ): Promise { + let request: string[] = [publicKey, message]; + const encryptDataRequest: EncryptDataRequest = {data: request, id: "1"}; + + this.tracker.trackEncryptDataInit(this.wallet, encryptDataRequest); + // this.tracker.trackEncryptData(this.wallet, encryptDataRequest ); + + // if (!this.connected) { + // this.tracker.trackEncryptData(this.wallet, encryptDataRequest, 'Wallet was not connected'); + // throw new TonConnectUIError('Connect wallet to send a transaction.'); + // } + + if (isInTMA()) { + sendExpand(); + } + + const { notifications, modals, returnStrategy, twaReturnUrl, skipRedirectToWallet } = + this.getModalsAndNotificationsConfiguration(options); + + //TODO: introduce action + widgetController.setAction({ + name: 'crypt-data', + showNotification: notifications.includes('before'), + openModal: modals.includes('before'), + sent: false + }); + + const onRequestSent = (): void => { + if (abortController.signal.aborted) { + return; + } + //TODO: correct action + widgetController.setAction({ + name: 'crypt-data', + showNotification: notifications.includes('before'), + openModal: modals.includes('before'), + sent: true + }); + + if ( + this.walletInfo && + 'universalLink' in this.walletInfo && + (this.walletInfo.openMethod === 'universal-link' || + this.walletInfo.openMethod === 'custom-deeplink') + ) { + if (isTelegramUrl(this.walletInfo.universalLink)) { + redirectToTelegram(this.walletInfo.universalLink, { + returnStrategy, + twaReturnUrl: twaReturnUrl || appState.twaReturnUrl, + forceRedirect: false + }); + } else { + redirectToWallet( + this.walletInfo.universalLink, + this.walletInfo.deepLink, + { + returnStrategy, + forceRedirect: false + }, + () => {} + ); + } + } + }; + + const abortController = new AbortController(); + + const unsubscribe = this.onTransactionModalStateChange(action => { + if (action?.openModal) { + return; + } + + unsubscribe(); + if (!action) { + abortController.abort(); + } + }); + + //TODO: implement + try { + const result = await this.waitForEnryptData( + { + data: encryptDataRequest, + signal: abortController.signal + }, + onRequestSent + ); + + this.tracker.trackDataEncrypted(this.wallet, encryptDataRequest, result); + + widgetController.setAction({ + name: 'transaction-sent', + showNotification: notifications.includes('success'), + openModal: modals.includes('success') + }); + + return result; + } catch (e) { + widgetController.setAction({ + name: 'transaction-canceled', + showNotification: notifications.includes('error'), + openModal: modals.includes('error') + }); + + if (e instanceof TonConnectError) { + throw e; + } else { + console.error(e); + throw new TonConnectUIError('Unhandled error:' + e); + } + } finally { + unsubscribe(); + } + } + + public async decryptData( + data: string, + senderAddress: string, + options?: ActionConfiguration +): Promise { + // const flattened = data.reduce((acc, data) => { + // acc.push(data.senderAddress, data.data); + // return acc; + // }, [] as (string)[]); + let request: string[] = [data, senderAddress] + const decryptDataRequest: DecryptDataRequest = {data: request, id: "1"}; + + this.tracker.trackDecryptDataInit(this.wallet, decryptDataRequest); + // this.tracker.trackEncryptData(this.wallet, encryptDataRequest ); + + //TODO: check + // if (!this.connected) { + // this.tracker.trackEncryptData(this.wallet, encryptDataRequest, 'Wallet was not connected'); + // throw new TonConnectUIError('Connect wallet to send a transaction.'); + // } + + if (isInTMA()) { + sendExpand(); + } + + const { notifications, modals, returnStrategy, twaReturnUrl, skipRedirectToWallet } = + this.getModalsAndNotificationsConfiguration(options); + + //TODO: introduce action + widgetController.setAction({ + name: 'crypt-data', + showNotification: notifications.includes('before'), + openModal: modals.includes('before'), + sent: false + }); + + const onRequestSent = (): void => { + if (abortController.signal.aborted) { + return; + } + //TODO: correct action + widgetController.setAction({ + name: 'crypt-data', + showNotification: notifications.includes('before'), + openModal: modals.includes('before'), + sent: true + }); + + if ( + this.walletInfo && + 'universalLink' in this.walletInfo && + (this.walletInfo.openMethod === 'universal-link' || + this.walletInfo.openMethod === 'custom-deeplink') + ) { + if (isTelegramUrl(this.walletInfo.universalLink)) { + redirectToTelegram(this.walletInfo.universalLink, { + returnStrategy, + twaReturnUrl: twaReturnUrl || appState.twaReturnUrl, + forceRedirect: false + }); + } else { + redirectToWallet( + this.walletInfo.universalLink, + this.walletInfo.deepLink, + { + returnStrategy, + forceRedirect: false + }, + () => {} + ); + } + } + }; + + const abortController = new AbortController(); + + const unsubscribe = this.onTransactionModalStateChange(action => { + if (action?.openModal) { + return; + } + + unsubscribe(); + if (!action) { + abortController.abort(); + } + }); + + try { + const result = await this.waitForDecryptData( + { + data: decryptDataRequest, + signal: abortController.signal + }, + onRequestSent + ); + + this.tracker.trackDataDecrypted(this.wallet, decryptDataRequest, result); + + widgetController.setAction({ + name: 'transaction-sent',//TODO: change + showNotification: notifications.includes('success'), + openModal: modals.includes('success') + }); + + return result; + } catch (e) { + widgetController.setAction({ + name: 'transaction-canceled', + showNotification: notifications.includes('error'), + openModal: modals.includes('error') + }); + + if (e instanceof TonConnectError) { + throw e; + } else { + console.error(e); + throw new TonConnectUIError('Unhandled error:' + e); + } + } finally { + unsubscribe(); + } +} + /** * TODO: remove in the next major version. * Initiates a connection with an embedded wallet, awaits its completion, and returns the connected wallet information. @@ -705,6 +960,106 @@ export class TonConnectUI { }); } + private async waitForEnryptData( + options: WaitEncryptDataOptions, + onRequestSent?: () => void + ): Promise { + return new Promise((resolve, reject) => { + const { data, signal } = options; + + // if (signal.aborted) { + // this.tracker.trackTransactionSigningFailed( + // this.wallet, + // transaction, + // 'Transaction was cancelled' + // ); + // return reject(new TonConnectUIError('Transaction was not sent')); + // } + + const onTransactionHandler = async ( + data: EncryptDataResponse + ): Promise => { + resolve(data); + }; + + const onErrorsHandler = (reason: TonConnectError): void => { + reject(reason); + }; + + const onCanceledHandler = (): void => { + this.tracker.trackEncryptDataFailed( + this.wallet, + data, + 'EncryptData was cancelled' + ); + reject(new TonConnectUIError('Message was not encrypted')); + }; + + signal.addEventListener('abort', onCanceledHandler, { once: true }); + + this.connector + .encryptData(data.data[0]!, data.data[1]!, { onRequestSent: onRequestSent, signal: signal }) + .then(result => { + signal.removeEventListener('abort', onCanceledHandler); + return onTransactionHandler(result); + }) + .catch(reason => { + signal.removeEventListener('abort', onCanceledHandler); + return onErrorsHandler(reason); + }); + }); + } + + private async waitForDecryptData( + options: WaitDecryptDataOptions, + onRequestSent?: () => void + ): Promise { + return new Promise((resolve, reject) => { + const { data, signal } = options; + + // if (signal.aborted) { + // this.tracker.trackTransactionSigningFailed( + // this.wallet, + // transaction, + // 'Transaction was cancelled' + // ); + // return reject(new TonConnectUIError('Transaction was not sent')); + // } + + const onTransactionHandler = async ( + data: DecryptDataResponse + ): Promise => { + resolve(data); + }; + + const onErrorsHandler = (reason: TonConnectError): void => { + reject(reason); + }; + + const onCanceledHandler = (): void => { + this.tracker.trackDecryptDataFailed( + this.wallet, + data, + 'DecryptData was cancelled' + ); + reject(new TonConnectUIError('Message was not decrypted')); + }; + + signal.addEventListener('abort', onCanceledHandler, { once: true }); + + this.connector + .decryptData(data.data[0]!, data.data[1]!, { onRequestSent: onRequestSent, signal: signal }) + .then(result => { + signal.removeEventListener('abort', onCanceledHandler); + return onTransactionHandler(result); + }) + .catch(reason => { + signal.removeEventListener('abort', onCanceledHandler); + return onErrorsHandler(reason); + }); + }); + } + /** * Subscribe to the transaction modal window state changes, returns a function which has to be called to unsubscribe. * @internal @@ -878,3 +1233,13 @@ type WaitSendTransactionOptions = { transaction: SendTransactionRequest; signal: AbortSignal; }; + +type WaitEncryptDataOptions = { + data: EncryptDataRequest; + signal: AbortSignal; +}; + +type WaitDecryptDataOptions = { + data: DecryptDataRequest; + signal: AbortSignal; +}; diff --git a/packages/ui/src/tracker/ton-connect-ui-tracker.ts b/packages/ui/src/tracker/ton-connect-ui-tracker.ts index 71c79210e..256f4a7cd 100644 --- a/packages/ui/src/tracker/ton-connect-ui-tracker.ts +++ b/packages/ui/src/tracker/ton-connect-ui-tracker.ts @@ -11,10 +11,17 @@ import { createTransactionSentForSignatureEvent, createTransactionSignedEvent, createTransactionSigningFailedEvent, + createEncryptDataFailedEvent, + createEncryptDataSentEvent, + UserActionEvent } from './types'; import { BrowserEventDispatcher, + createDecryptDataEvent, + createDecryptDataFailedEvent, + createDecryptDataSentEvent, + createEncryptDataEvent, createVersionInfo, EventDispatcher, ResponseVersionEvent, @@ -262,6 +269,49 @@ export class TonConnectUITracker { } catch (e) {} } + public trackEncryptDataInit( + ...args: WithoutVersion> + ): void { + try { + const event = createEncryptDataSentEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + + public trackDecryptDataInit( + ...args: WithoutVersion> + ): void { + try { + const event = createDecryptDataSentEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + /** + * Track encrypt message event. + * @param args + */ + public trackEncryptData( + ...args: WithoutVersion> + ): void { + try { + const event = createEncryptDataEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + + /** + * Track encrypt message event. + * @param args + */ + public trackDecryptData( + ...args: WithoutVersion> + ): void { + try { + const event = createDecryptDataEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + /** * Track transaction signed event. * @param args @@ -275,6 +325,23 @@ export class TonConnectUITracker { } catch (e) {} } + public trackDataEncrypted( + ...args: WithoutVersion> + ): void { + try { + const event = createEncryptDataEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + + public trackDataDecrypted( + ...args: WithoutVersion> + ): void { + try { + const event = createDecryptDataEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } /** * Track transaction error event. * @param args @@ -287,4 +354,22 @@ export class TonConnectUITracker { this.dispatchUserActionEvent(event); } catch (e) {} } + + public trackEncryptDataFailed( + ...args: WithoutVersion> + ): void { + try { + const event = createEncryptDataFailedEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } + + public trackDecryptDataFailed( + ...args: WithoutVersion> + ): void { + try { + const event = createDecryptDataFailedEvent(this.version, ...args); + this.dispatchUserActionEvent(event); + } catch (e) {} + } } diff --git a/packages/ui/src/tracker/types.ts b/packages/ui/src/tracker/types.ts index 184ced5ff..3047d0789 100644 --- a/packages/ui/src/tracker/types.ts +++ b/packages/ui/src/tracker/types.ts @@ -3,7 +3,9 @@ import { ConnectionRestoringEvent, DisconnectionEvent, TransactionSigningEvent, - VersionEvent + VersionEvent, + EncryptDataEvent, + DecryptDataEvent, } from '@tonconnect/sdk'; /** @@ -14,7 +16,9 @@ export type UserActionEvent = | ConnectionEvent | ConnectionRestoringEvent | DisconnectionEvent - | TransactionSigningEvent; + | TransactionSigningEvent + | EncryptDataEvent + | DecryptDataEvent; export { createRequestVersionEvent, @@ -28,5 +32,16 @@ export { createDisconnectionEvent, createTransactionSentForSignatureEvent, createTransactionSigningFailedEvent, - createTransactionSignedEvent + createTransactionSignedEvent, + createDecryptDataEvent, + createEncryptDataEvent, + createEncryptDataFailedEvent, + createEncryptDataSentEvent, + createDecryptDataSentEvent, + createDecryptDataFailedEvent, } from '@tonconnect/sdk'; + +export interface DecryptData { + senderAddress: string; + data: string; + }; \ No newline at end of file diff --git a/temp/types-dist/crypto/index.d.ts b/temp/types-dist/crypto/index.d.ts new file mode 100644 index 000000000..f890e10cd --- /dev/null +++ b/temp/types-dist/crypto/index.d.ts @@ -0,0 +1,2 @@ +export { KeyPair } from './key-pair'; +export { SessionCrypto } from './session-crypto'; diff --git a/temp/types-dist/crypto/key-pair.d.ts b/temp/types-dist/crypto/key-pair.d.ts new file mode 100644 index 000000000..4adb6f49d --- /dev/null +++ b/temp/types-dist/crypto/key-pair.d.ts @@ -0,0 +1,4 @@ +export interface KeyPair { + publicKey: string; + secretKey: string; +} diff --git a/temp/types-dist/crypto/session-crypto.d.ts b/temp/types-dist/crypto/session-crypto.d.ts new file mode 100644 index 000000000..008d40ae6 --- /dev/null +++ b/temp/types-dist/crypto/session-crypto.d.ts @@ -0,0 +1,13 @@ +import { KeyPair } from './key-pair'; +export declare class SessionCrypto { + private readonly nonceLength; + private readonly keyPair; + readonly sessionId: string; + constructor(keyPair?: KeyPair); + private createKeypair; + private createKeypairFromString; + private createNonce; + encrypt(message: string, receiverPublicKey: Uint8Array): Uint8Array; + decrypt(message: Uint8Array, senderPublicKey: Uint8Array): string; + stringifyKeypair(): KeyPair; +} diff --git a/temp/types-dist/index.d.ts b/temp/types-dist/index.d.ts new file mode 100644 index 000000000..c4bfa4114 --- /dev/null +++ b/temp/types-dist/index.d.ts @@ -0,0 +1,3 @@ +export * from './models'; +export * from './crypto'; +export * from './utils'; diff --git a/temp/types-dist/models/CHAIN.d.ts b/temp/types-dist/models/CHAIN.d.ts new file mode 100644 index 000000000..438ddd519 --- /dev/null +++ b/temp/types-dist/models/CHAIN.d.ts @@ -0,0 +1,4 @@ +export declare enum CHAIN { + MAINNET = "-239", + TESTNET = "-3" +} diff --git a/temp/types-dist/models/app-message/app-message.d.ts b/temp/types-dist/models/app-message/app-message.d.ts new file mode 100644 index 000000000..a2d54bfd1 --- /dev/null +++ b/temp/types-dist/models/app-message/app-message.d.ts @@ -0,0 +1,3 @@ +import { AppRequest, RpcRequests } from './request'; +import { ConnectRequest } from './connect-request'; +export declare type AppMessage = ConnectRequest | AppRequest; diff --git a/temp/types-dist/models/app-message/connect-request/connect-item.d.ts b/temp/types-dist/models/app-message/connect-request/connect-item.d.ts new file mode 100644 index 000000000..9e0c9adb5 --- /dev/null +++ b/temp/types-dist/models/app-message/connect-request/connect-item.d.ts @@ -0,0 +1,8 @@ +export declare type ConnectItem = TonAddressItem | TonProofItem; +export interface TonAddressItem { + name: 'ton_addr'; +} +export interface TonProofItem { + name: 'ton_proof'; + payload: string; +} diff --git a/temp/types-dist/models/app-message/connect-request/connect-request.d.ts b/temp/types-dist/models/app-message/connect-request/connect-request.d.ts new file mode 100644 index 000000000..18c24f0ee --- /dev/null +++ b/temp/types-dist/models/app-message/connect-request/connect-request.d.ts @@ -0,0 +1,5 @@ +import { ConnectItem } from './connect-item'; +export interface ConnectRequest { + manifestUrl: string; + items: ConnectItem[]; +} diff --git a/temp/types-dist/models/app-message/connect-request/index.d.ts b/temp/types-dist/models/app-message/connect-request/index.d.ts new file mode 100644 index 000000000..b7642df62 --- /dev/null +++ b/temp/types-dist/models/app-message/connect-request/index.d.ts @@ -0,0 +1,2 @@ +export { ConnectRequest } from './connect-request'; +export { ConnectItem, TonAddressItem, TonProofItem } from './connect-item'; diff --git a/temp/types-dist/models/app-message/index.d.ts b/temp/types-dist/models/app-message/index.d.ts new file mode 100644 index 000000000..858faf5ff --- /dev/null +++ b/temp/types-dist/models/app-message/index.d.ts @@ -0,0 +1,3 @@ +export { AppMessage } from './app-message'; +export * from './request'; +export * from './connect-request'; diff --git a/temp/types-dist/models/app-message/request/app-request.d.ts b/temp/types-dist/models/app-message/request/app-request.d.ts new file mode 100644 index 000000000..ca0a27e97 --- /dev/null +++ b/temp/types-dist/models/app-message/request/app-request.d.ts @@ -0,0 +1,14 @@ +import { SendTransactionRpcRequest } from './send-transaction-rpc-request'; +import { SignDataRpcRequest } from './sign-data-rpc-request'; +import { RpcMethod } from '../../rpc-method'; +import { DisconnectRpcRequest } from './disconnect-rpc-request'; +import { EncryptDataRpcRequest } from './encrypt-data-rpc-request'; +import { DecryptDataRpcRequest } from './decrypt-data-rpc-request'; +export declare type RpcRequests = { + sendTransaction: SendTransactionRpcRequest; + signData: SignDataRpcRequest; + disconnect: DisconnectRpcRequest; + encryptData: EncryptDataRpcRequest; + decryptData: DecryptDataRpcRequest; +}; +export declare type AppRequest = RpcRequests[T]; diff --git a/temp/types-dist/models/app-message/request/decrypt-data-rpc-request.d.ts b/temp/types-dist/models/app-message/request/decrypt-data-rpc-request.d.ts new file mode 100644 index 000000000..c60549055 --- /dev/null +++ b/temp/types-dist/models/app-message/request/decrypt-data-rpc-request.d.ts @@ -0,0 +1,10 @@ +export interface DecryptDataRpcRequest { + method: 'decryptData'; + params: [ + { + schema_crc: number; + cell: string; + } + ]; + id: string; +} diff --git a/temp/types-dist/models/app-message/request/disconnect-rpc-request.d.ts b/temp/types-dist/models/app-message/request/disconnect-rpc-request.d.ts new file mode 100644 index 000000000..69553c117 --- /dev/null +++ b/temp/types-dist/models/app-message/request/disconnect-rpc-request.d.ts @@ -0,0 +1,5 @@ +export interface DisconnectRpcRequest { + method: 'disconnect'; + params: []; + id: string; +} diff --git a/temp/types-dist/models/app-message/request/encrypt-data-rpc-request.d.ts b/temp/types-dist/models/app-message/request/encrypt-data-rpc-request.d.ts new file mode 100644 index 000000000..f3b8b5c13 --- /dev/null +++ b/temp/types-dist/models/app-message/request/encrypt-data-rpc-request.d.ts @@ -0,0 +1,10 @@ +export interface EncryptDataRpcRequest { + method: 'encryptData'; + params: [ + { + schema_crc: number; + cell: string; + } + ]; + id: string; +} diff --git a/temp/types-dist/models/app-message/request/index.d.ts b/temp/types-dist/models/app-message/request/index.d.ts new file mode 100644 index 000000000..e356b635c --- /dev/null +++ b/temp/types-dist/models/app-message/request/index.d.ts @@ -0,0 +1,4 @@ +export { AppRequest, RpcRequests } from './app-request'; +export { SendTransactionRpcRequest } from './send-transaction-rpc-request'; +export { SignDataRpcRequest } from './sign-data-rpc-request'; +export { DisconnectRpcRequest } from './disconnect-rpc-request'; diff --git a/temp/types-dist/models/app-message/request/send-transaction-rpc-request.d.ts b/temp/types-dist/models/app-message/request/send-transaction-rpc-request.d.ts new file mode 100644 index 000000000..9280efe5f --- /dev/null +++ b/temp/types-dist/models/app-message/request/send-transaction-rpc-request.d.ts @@ -0,0 +1,5 @@ +export interface SendTransactionRpcRequest { + method: 'sendTransaction'; + params: [string]; + id: string; +} diff --git a/temp/types-dist/models/app-message/request/sign-data-rpc-request.d.ts b/temp/types-dist/models/app-message/request/sign-data-rpc-request.d.ts new file mode 100644 index 000000000..a31da7d71 --- /dev/null +++ b/temp/types-dist/models/app-message/request/sign-data-rpc-request.d.ts @@ -0,0 +1,10 @@ +export interface SignDataRpcRequest { + method: 'signData'; + params: [ + { + schema_crc: number; + cell: string; + } + ]; + id: string; +} diff --git a/temp/types-dist/models/device-info.d.ts b/temp/types-dist/models/device-info.d.ts new file mode 100644 index 000000000..bfb6a0f5f --- /dev/null +++ b/temp/types-dist/models/device-info.d.ts @@ -0,0 +1,8 @@ +import { Feature } from './feature'; +export interface DeviceInfo { + platform: 'iphone' | 'ipad' | 'android' | 'windows' | 'mac' | 'linux' | 'browser'; + appName: string; + appVersion: string; + maxProtocolVersion: number; + features: Feature[]; +} diff --git a/temp/types-dist/models/feature.d.ts b/temp/types-dist/models/feature.d.ts new file mode 100644 index 000000000..f4808f464 --- /dev/null +++ b/temp/types-dist/models/feature.d.ts @@ -0,0 +1,15 @@ +export declare type Feature = SendTransactionFeatureDeprecated | SendTransactionFeature | SignDataFeature | EncryptDataFeature | DecryptDataFeature; +export declare type SendTransactionFeatureDeprecated = 'SendTransaction'; +export declare type SendTransactionFeature = { + name: 'SendTransaction'; + maxMessages: number; +}; +export declare type SignDataFeature = { + name: 'SignData'; +}; +export declare type EncryptDataFeature = { + name: 'EncryptData'; +}; +export declare type DecryptDataFeature = { + name: 'DecryptData'; +}; diff --git a/temp/types-dist/models/index.d.ts b/temp/types-dist/models/index.d.ts new file mode 100644 index 000000000..df7d08849 --- /dev/null +++ b/temp/types-dist/models/index.d.ts @@ -0,0 +1,6 @@ +export * from './app-message'; +export * from './wallet-message'; +export { RpcMethod } from './rpc-method'; +export { DeviceInfo } from './device-info'; +export { Feature, SendTransactionFeatureDeprecated, SendTransactionFeature, SignDataFeature, EncryptDataFeature, DecryptDataFeature, } from './feature'; +export { CHAIN } from './CHAIN'; diff --git a/temp/types-dist/models/rpc-method.d.ts b/temp/types-dist/models/rpc-method.d.ts new file mode 100644 index 000000000..faf525c60 --- /dev/null +++ b/temp/types-dist/models/rpc-method.d.ts @@ -0,0 +1 @@ +export declare type RpcMethod = 'disconnect' | 'sendTransaction' | 'signData' | 'encryptData' | 'decryptData'; diff --git a/temp/types-dist/models/wallet-message/index.d.ts b/temp/types-dist/models/wallet-message/index.d.ts new file mode 100644 index 000000000..08017e3f8 --- /dev/null +++ b/temp/types-dist/models/wallet-message/index.d.ts @@ -0,0 +1,3 @@ +export * from './wallet-event'; +export * from './wallet-response'; +export { WalletMessage } from './wallet-message'; diff --git a/temp/types-dist/models/wallet-message/wallet-event/connect-event.d.ts b/temp/types-dist/models/wallet-message/wallet-event/connect-event.d.ts new file mode 100644 index 000000000..ecf9a4a51 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-event/connect-event.d.ts @@ -0,0 +1,61 @@ +import { CHAIN } from '../../CHAIN'; +import { DeviceInfo } from '../../device-info'; +export declare type ConnectEvent = ConnectEventSuccess | ConnectEventError; +export interface ConnectEventSuccess { + event: 'connect'; + id: number; + payload: { + items: ConnectItemReply[]; + device: DeviceInfo; + }; +} +export interface ConnectEventError { + event: 'connect_error'; + id: number; + payload: { + code: CONNECT_EVENT_ERROR_CODES; + message: string; + }; +} +export declare enum CONNECT_EVENT_ERROR_CODES { + UNKNOWN_ERROR = 0, + BAD_REQUEST_ERROR = 1, + MANIFEST_NOT_FOUND_ERROR = 2, + MANIFEST_CONTENT_ERROR = 3, + UNKNOWN_APP_ERROR = 100, + USER_REJECTS_ERROR = 300, + METHOD_NOT_SUPPORTED = 400 +} +export declare type ConnectItemReply = TonAddressItemReply | TonProofItemReply; +export interface TonAddressItemReply { + name: 'ton_addr'; + address: string; + network: CHAIN; + walletStateInit: string; + publicKey: string; +} +export declare type TonProofItemReply = TonProofItemReplySuccess | TonProofItemReplyError; +export interface TonProofItemReplySuccess { + name: 'ton_proof'; + proof: { + timestamp: number; + domain: { + lengthBytes: number; + value: string; + }; + payload: string; + signature: string; + }; +} +export declare type TonProofItemReplyError = ConnectItemReplyError; +export declare enum CONNECT_ITEM_ERROR_CODES { + UNKNOWN_ERROR = 0, + METHOD_NOT_SUPPORTED = 400 +} +export declare type ConnectItemReplyError = { + name: T; + error: { + code: CONNECT_ITEM_ERROR_CODES; + message?: string; + }; +}; diff --git a/temp/types-dist/models/wallet-message/wallet-event/disconnect-event.d.ts b/temp/types-dist/models/wallet-message/wallet-event/disconnect-event.d.ts new file mode 100644 index 000000000..268471ca1 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-event/disconnect-event.d.ts @@ -0,0 +1,5 @@ +export interface DisconnectEvent { + event: 'disconnect'; + id: number; + payload: {}; +} diff --git a/temp/types-dist/models/wallet-message/wallet-event/index.d.ts b/temp/types-dist/models/wallet-message/wallet-event/index.d.ts new file mode 100644 index 000000000..edabf7192 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-event/index.d.ts @@ -0,0 +1,3 @@ +export { ConnectEvent, ConnectEventSuccess, ConnectEventError, CONNECT_EVENT_ERROR_CODES, ConnectItemReply, ConnectItemReplyError, TonProofItemReply, TonProofItemReplySuccess, TonProofItemReplyError, TonAddressItemReply, CONNECT_ITEM_ERROR_CODES } from './connect-event'; +export { DisconnectEvent } from './disconnect-event'; +export { WalletEvent } from './wallet-event'; diff --git a/temp/types-dist/models/wallet-message/wallet-event/wallet-event.d.ts b/temp/types-dist/models/wallet-message/wallet-event/wallet-event.d.ts new file mode 100644 index 000000000..0250d9bc6 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-event/wallet-event.d.ts @@ -0,0 +1,3 @@ +import { ConnectEvent } from './connect-event'; +import { DisconnectEvent } from './disconnect-event'; +export declare type WalletEvent = ConnectEvent | DisconnectEvent; diff --git a/temp/types-dist/models/wallet-message/wallet-message.d.ts b/temp/types-dist/models/wallet-message/wallet-message.d.ts new file mode 100644 index 000000000..d8dcd1f6d --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-message.d.ts @@ -0,0 +1,4 @@ +import { RpcMethod } from '../rpc-method'; +import { WalletEvent } from './wallet-event'; +import { WalletResponse } from './wallet-response'; +export declare type WalletMessage = WalletEvent | WalletResponse; diff --git a/temp/types-dist/models/wallet-message/wallet-response/decrypt-rpc-response.d.ts b/temp/types-dist/models/wallet-message/wallet-response/decrypt-rpc-response.d.ts new file mode 100644 index 000000000..2c066a7e7 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-response/decrypt-rpc-response.d.ts @@ -0,0 +1,23 @@ +import { WalletResponseTemplateError } from './wallet-response-template'; +export declare type DecryptDataRpcResponse = DecryptDataRpcResponseSuccess | DecryptDataRpcResponseError; +export interface DecryptDataRpcResponseSuccess { + id: string; + result: { + decrypted_data: string; + }; +} +export interface DecryptDataRpcResponseError extends WalletResponseTemplateError { + error: { + code: DECRYPT_DATA_ERROR_CODES; + message: string; + data?: unknown; + }; + id: string; +} +export declare enum DECRYPT_DATA_ERROR_CODES { + UNKNOWN_ERROR = 0, + BAD_REQUEST_ERROR = 1, + UNKNOWN_APP_ERROR = 100, + USER_REJECTS_ERROR = 300, + METHOD_NOT_SUPPORTED = 400 +} diff --git a/temp/types-dist/models/wallet-message/wallet-response/disconnect-rpc-response.d.ts b/temp/types-dist/models/wallet-message/wallet-response/disconnect-rpc-response.d.ts new file mode 100644 index 000000000..a88239405 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-response/disconnect-rpc-response.d.ts @@ -0,0 +1,20 @@ +import { WalletResponseTemplateError } from './wallet-response-template'; +export declare type DisconnectRpcResponse = DisconnectRpcResponseSuccess | DisconnectRpcResponseError; +export interface DisconnectRpcResponseSuccess { + id: string; + result: {}; +} +export interface DisconnectRpcResponseError extends WalletResponseTemplateError { + error: { + code: DISCONNECT_ERROR_CODES; + message: string; + data?: unknown; + }; + id: string; +} +export declare enum DISCONNECT_ERROR_CODES { + UNKNOWN_ERROR = 0, + BAD_REQUEST_ERROR = 1, + UNKNOWN_APP_ERROR = 100, + METHOD_NOT_SUPPORTED = 400 +} diff --git a/temp/types-dist/models/wallet-message/wallet-response/encrypt-rpc-response.d.ts b/temp/types-dist/models/wallet-message/wallet-response/encrypt-rpc-response.d.ts new file mode 100644 index 000000000..8d4f7abf6 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-response/encrypt-rpc-response.d.ts @@ -0,0 +1,23 @@ +import { WalletResponseTemplateError } from './wallet-response-template'; +export declare type EncryptDataRpcResponse = EncryptDataRpcResponseSuccess | EncryptDataRpcResponseError; +export interface EncryptDataRpcResponseSuccess { + id: string; + result: { + encrypted_data: string; + }; +} +export interface EncryptDataRpcResponseError extends WalletResponseTemplateError { + error: { + code: ENCRYPT_DATA_ERROR_CODES; + message: string; + data?: unknown; + }; + id: string; +} +export declare enum ENCRYPT_DATA_ERROR_CODES { + UNKNOWN_ERROR = 0, + BAD_REQUEST_ERROR = 1, + UNKNOWN_APP_ERROR = 100, + USER_REJECTS_ERROR = 300, + METHOD_NOT_SUPPORTED = 400 +} diff --git a/temp/types-dist/models/wallet-message/wallet-response/index.d.ts b/temp/types-dist/models/wallet-message/wallet-response/index.d.ts new file mode 100644 index 000000000..a65c5be77 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-response/index.d.ts @@ -0,0 +1,7 @@ +export { WalletResponse, WalletResponseSuccess, WalletResponseError, RpcResponses } from './wallet-response'; +export { SendTransactionRpcResponse, SendTransactionRpcResponseSuccess, SendTransactionRpcResponseError, SEND_TRANSACTION_ERROR_CODES } from './send-transaction-rpc-response'; +export { SignDataRpcResponse, SignDataRpcResponseSuccess, SignDataRpcResponseError, SIGN_DATA_ERROR_CODES } from './sign-data-rpc-response'; +export { DisconnectRpcResponse, DisconnectRpcResponseSuccess, DisconnectRpcResponseError, DISCONNECT_ERROR_CODES } from './disconnect-rpc-response'; +export { WalletResponseTemplateError, WalletResponseTemplateSuccess } from './wallet-response-template'; +export { EncryptDataRpcResponse, EncryptDataRpcResponseSuccess, EncryptDataRpcResponseError, ENCRYPT_DATA_ERROR_CODES } from './encrypt-rpc-response'; +export { DecryptDataRpcResponse, DecryptDataRpcResponseSuccess, DecryptDataRpcResponseError, DECRYPT_DATA_ERROR_CODES } from './decrypt-rpc-response'; diff --git a/temp/types-dist/models/wallet-message/wallet-response/send-transaction-rpc-response.d.ts b/temp/types-dist/models/wallet-message/wallet-response/send-transaction-rpc-response.d.ts new file mode 100644 index 000000000..a61158869 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-response/send-transaction-rpc-response.d.ts @@ -0,0 +1,19 @@ +import { WalletResponseTemplateError, WalletResponseTemplateSuccess } from './wallet-response-template'; +export declare type SendTransactionRpcResponse = SendTransactionRpcResponseSuccess | SendTransactionRpcResponseError; +export interface SendTransactionRpcResponseSuccess extends WalletResponseTemplateSuccess { +} +export interface SendTransactionRpcResponseError extends WalletResponseTemplateError { + error: { + code: SEND_TRANSACTION_ERROR_CODES; + message: string; + data?: unknown; + }; + id: string; +} +export declare enum SEND_TRANSACTION_ERROR_CODES { + UNKNOWN_ERROR = 0, + BAD_REQUEST_ERROR = 1, + UNKNOWN_APP_ERROR = 100, + USER_REJECTS_ERROR = 300, + METHOD_NOT_SUPPORTED = 400 +} diff --git a/temp/types-dist/models/wallet-message/wallet-response/sign-data-rpc-response.d.ts b/temp/types-dist/models/wallet-message/wallet-response/sign-data-rpc-response.d.ts new file mode 100644 index 000000000..92a45d206 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-response/sign-data-rpc-response.d.ts @@ -0,0 +1,24 @@ +import { WalletResponseTemplateError } from './wallet-response-template'; +export declare type SignDataRpcResponse = SignDataRpcResponseSuccess | SignDataRpcResponseError; +export interface SignDataRpcResponseSuccess { + id: string; + result: { + signature: string; + timestamp: string; + }; +} +export interface SignDataRpcResponseError extends WalletResponseTemplateError { + error: { + code: SIGN_DATA_ERROR_CODES; + message: string; + data?: unknown; + }; + id: string; +} +export declare enum SIGN_DATA_ERROR_CODES { + UNKNOWN_ERROR = 0, + BAD_REQUEST_ERROR = 1, + UNKNOWN_APP_ERROR = 100, + USER_REJECTS_ERROR = 300, + METHOD_NOT_SUPPORTED = 400 +} diff --git a/temp/types-dist/models/wallet-message/wallet-response/wallet-response-template.d.ts b/temp/types-dist/models/wallet-message/wallet-response/wallet-response-template.d.ts new file mode 100644 index 000000000..2eb7e1938 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-response/wallet-response-template.d.ts @@ -0,0 +1,13 @@ +export declare type WalletResponseTemplate = WalletResponseTemplateSuccess | WalletResponseTemplateError; +export interface WalletResponseTemplateSuccess { + result: string; + id: string; +} +export interface WalletResponseTemplateError { + error: { + code: number; + message: string; + data?: unknown; + }; + id: string; +} diff --git a/temp/types-dist/models/wallet-message/wallet-response/wallet-response.d.ts b/temp/types-dist/models/wallet-message/wallet-response/wallet-response.d.ts new file mode 100644 index 000000000..aed5d8ae4 --- /dev/null +++ b/temp/types-dist/models/wallet-message/wallet-response/wallet-response.d.ts @@ -0,0 +1,31 @@ +import { RpcMethod } from '../../rpc-method'; +import { SendTransactionRpcResponseError, SendTransactionRpcResponseSuccess } from './send-transaction-rpc-response'; +import { SignDataRpcResponseError, SignDataRpcResponseSuccess } from './sign-data-rpc-response'; +import { DisconnectRpcResponseError, DisconnectRpcResponseSuccess } from './disconnect-rpc-response'; +import { DecryptDataRpcResponseError, DecryptDataRpcResponseSuccess } from './decrypt-rpc-response'; +import { EncryptDataRpcResponseError, EncryptDataRpcResponseSuccess } from './encrypt-rpc-response'; +export declare type RpcResponses = { + sendTransaction: { + error: SendTransactionRpcResponseError; + success: SendTransactionRpcResponseSuccess; + }; + signData: { + error: SignDataRpcResponseError; + success: SignDataRpcResponseSuccess; + }; + disconnect: { + error: DisconnectRpcResponseError; + success: DisconnectRpcResponseSuccess; + }; + decryptData: { + error: DecryptDataRpcResponseError; + success: DecryptDataRpcResponseSuccess; + }; + encryptData: { + error: EncryptDataRpcResponseError; + success: EncryptDataRpcResponseSuccess; + }; +}; +export declare type WalletResponseSuccess = RpcResponses[T]['success']; +export declare type WalletResponseError = RpcResponses[T]['error']; +export declare type WalletResponse = WalletResponseSuccess | WalletResponseError; diff --git a/temp/types-dist/utils/base64.d.ts b/temp/types-dist/utils/base64.d.ts new file mode 100644 index 000000000..54102a5d4 --- /dev/null +++ b/temp/types-dist/utils/base64.d.ts @@ -0,0 +1,11 @@ +declare function encode(value: string | object | Uint8Array, urlSafe?: boolean): string; +declare function decode(value: string, urlSafe?: boolean): { + toString(): string; + toObject(): T | null; + toUint8Array(): Uint8Array; +}; +export declare const Base64: { + encode: typeof encode; + decode: typeof decode; +}; +export type { encode, decode }; diff --git a/temp/types-dist/utils/binary.d.ts b/temp/types-dist/utils/binary.d.ts new file mode 100644 index 000000000..cfcf2c1ed --- /dev/null +++ b/temp/types-dist/utils/binary.d.ts @@ -0,0 +1,4 @@ +export declare function concatUint8Arrays(buffer1: Uint8Array, buffer2: Uint8Array): Uint8Array; +export declare function splitToUint8Arrays(array: Uint8Array, index: number): [Uint8Array, Uint8Array]; +export declare function toHexString(byteArray: Uint8Array): string; +export declare function hexToByteArray(hexString: string): Uint8Array; diff --git a/temp/types-dist/utils/index.d.ts b/temp/types-dist/utils/index.d.ts new file mode 100644 index 000000000..7d81b9987 --- /dev/null +++ b/temp/types-dist/utils/index.d.ts @@ -0,0 +1,4 @@ +export { Base64 } from './base64'; +export type { encode, decode } from './base64'; +export { concatUint8Arrays, splitToUint8Arrays, toHexString, hexToByteArray } from './binary'; +export { isNode } from './web-api'; diff --git a/temp/types-dist/utils/web-api.d.ts b/temp/types-dist/utils/web-api.d.ts new file mode 100644 index 000000000..c3d98977b --- /dev/null +++ b/temp/types-dist/utils/web-api.d.ts @@ -0,0 +1 @@ +export declare function isNode(): boolean;