From 41b77f2f8ae9dfc1179e7c6ff218109a82b5139b Mon Sep 17 00:00:00 2001 From: Vladislav Kibenko <34907325+heyqbnk@users.noreply.github.com> Date: Thu, 4 Dec 2025 18:35:41 +0500 Subject: [PATCH 1/2] fix(init-data-node): optionally allow specifying signature --- packages/init-data-node/src/entries/node.test.ts | 2 +- packages/init-data-node/src/entries/web.test.ts | 2 +- packages/init-data-node/src/signFp.ts | 10 ++++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/init-data-node/src/entries/node.test.ts b/packages/init-data-node/src/entries/node.test.ts index aad71d412..c2c453215 100644 --- a/packages/init-data-node/src/entries/node.test.ts +++ b/packages/init-data-node/src/entries/node.test.ts @@ -164,7 +164,7 @@ describe('sign', () => { '5768337691:AAH5YkoiEuPk8-FZa32hStHTqXiLPtAEhx8', new Date(1000), ), - ).toBe('can_send_after=10000&chat=%7B%22id%22%3A1%2C%22type%22%3A%22group%22%2C%22username%22%3A%22my-chat%22%2C%22title%22%3A%22chat-title%22%2C%22photo_url%22%3A%22chat-photo%22%7D&chat_instance=888&chat_type=sender&query_id=QUERY&receiver=%7B%22added_to_attachment_menu%22%3Afalse%2C%22allows_write_to_pm%22%3Atrue%2C%22first_name%22%3A%22receiver-first-name%22%2C%22id%22%3A991%2C%22is_bot%22%3Afalse%2C%22is_premium%22%3Atrue%2C%22language_code%22%3A%22ru%22%2C%22last_name%22%3A%22receiver-last-name%22%2C%22photo_url%22%3A%22receiver-photo%22%2C%22username%22%3A%22receiver-username%22%7D&start_param=debug&user=%7B%22added_to_attachment_menu%22%3Afalse%2C%22allows_write_to_pm%22%3Afalse%2C%22first_name%22%3A%22user-first-name%22%2C%22id%22%3A222%2C%22is_bot%22%3Atrue%2C%22is_premium%22%3Afalse%2C%22language_code%22%3A%22en%22%2C%22last_name%22%3A%22user-last-name%22%2C%22photo_url%22%3A%22user-photo%22%2C%22username%22%3A%22user-username%22%7D&auth_date=1&hash=d7dc6972a8d2e8e3280caf2e69080f632f1ac562f24ab72cb44ec10c8e671771'); + ).toBe('can_send_after=10000&chat=%7B%22id%22%3A1%2C%22type%22%3A%22group%22%2C%22username%22%3A%22my-chat%22%2C%22title%22%3A%22chat-title%22%2C%22photo_url%22%3A%22chat-photo%22%7D&chat_instance=888&chat_type=sender&query_id=QUERY&receiver=%7B%22added_to_attachment_menu%22%3Afalse%2C%22allows_write_to_pm%22%3Atrue%2C%22first_name%22%3A%22receiver-first-name%22%2C%22id%22%3A991%2C%22is_bot%22%3Afalse%2C%22is_premium%22%3Atrue%2C%22language_code%22%3A%22ru%22%2C%22last_name%22%3A%22receiver-last-name%22%2C%22photo_url%22%3A%22receiver-photo%22%2C%22username%22%3A%22receiver-username%22%7D&start_param=debug&user=%7B%22added_to_attachment_menu%22%3Afalse%2C%22allows_write_to_pm%22%3Afalse%2C%22first_name%22%3A%22user-first-name%22%2C%22id%22%3A222%2C%22is_bot%22%3Atrue%2C%22is_premium%22%3Afalse%2C%22language_code%22%3A%22en%22%2C%22last_name%22%3A%22user-last-name%22%2C%22photo_url%22%3A%22user-photo%22%2C%22username%22%3A%22user-username%22%7D&auth_date=1&signature=&hash=cc10443c8ae0ee6c7b97bac5db17c64ed07ef0755627b1ca70a72ac5c39d89e9'); }); }); diff --git a/packages/init-data-node/src/entries/web.test.ts b/packages/init-data-node/src/entries/web.test.ts index d0ad38a8c..fc07036bb 100644 --- a/packages/init-data-node/src/entries/web.test.ts +++ b/packages/init-data-node/src/entries/web.test.ts @@ -162,7 +162,7 @@ describe('sign', () => { '5768337691:AAH5YkoiEuPk8-FZa32hStHTqXiLPtAEhx8', new Date(1000), ), - ).toBe('can_send_after=10000&chat=%7B%22id%22%3A1%2C%22type%22%3A%22group%22%2C%22username%22%3A%22my-chat%22%2C%22title%22%3A%22chat-title%22%2C%22photo_url%22%3A%22chat-photo%22%7D&chat_instance=888&chat_type=sender&query_id=QUERY&receiver=%7B%22added_to_attachment_menu%22%3Afalse%2C%22allows_write_to_pm%22%3Atrue%2C%22first_name%22%3A%22receiver-first-name%22%2C%22id%22%3A991%2C%22is_bot%22%3Afalse%2C%22is_premium%22%3Atrue%2C%22language_code%22%3A%22ru%22%2C%22last_name%22%3A%22receiver-last-name%22%2C%22photo_url%22%3A%22receiver-photo%22%2C%22username%22%3A%22receiver-username%22%7D&start_param=debug&user=%7B%22added_to_attachment_menu%22%3Afalse%2C%22allows_write_to_pm%22%3Afalse%2C%22first_name%22%3A%22user-first-name%22%2C%22id%22%3A222%2C%22is_bot%22%3Atrue%2C%22is_premium%22%3Afalse%2C%22language_code%22%3A%22en%22%2C%22last_name%22%3A%22user-last-name%22%2C%22photo_url%22%3A%22user-photo%22%2C%22username%22%3A%22user-username%22%7D&auth_date=1&hash=d7dc6972a8d2e8e3280caf2e69080f632f1ac562f24ab72cb44ec10c8e671771'); + ).toBe('can_send_after=10000&chat=%7B%22id%22%3A1%2C%22type%22%3A%22group%22%2C%22username%22%3A%22my-chat%22%2C%22title%22%3A%22chat-title%22%2C%22photo_url%22%3A%22chat-photo%22%7D&chat_instance=888&chat_type=sender&query_id=QUERY&receiver=%7B%22added_to_attachment_menu%22%3Afalse%2C%22allows_write_to_pm%22%3Atrue%2C%22first_name%22%3A%22receiver-first-name%22%2C%22id%22%3A991%2C%22is_bot%22%3Afalse%2C%22is_premium%22%3Atrue%2C%22language_code%22%3A%22ru%22%2C%22last_name%22%3A%22receiver-last-name%22%2C%22photo_url%22%3A%22receiver-photo%22%2C%22username%22%3A%22receiver-username%22%7D&start_param=debug&user=%7B%22added_to_attachment_menu%22%3Afalse%2C%22allows_write_to_pm%22%3Afalse%2C%22first_name%22%3A%22user-first-name%22%2C%22id%22%3A222%2C%22is_bot%22%3Atrue%2C%22is_premium%22%3Afalse%2C%22language_code%22%3A%22en%22%2C%22last_name%22%3A%22user-last-name%22%2C%22photo_url%22%3A%22user-photo%22%2C%22username%22%3A%22user-username%22%7D&auth_date=1&signature=&hash=cc10443c8ae0ee6c7b97bac5db17c64ed07ef0755627b1ca70a72ac5c39d89e9'); }); }); diff --git a/packages/init-data-node/src/signFp.ts b/packages/init-data-node/src/signFp.ts index 5703e6b08..f78cb44ee 100644 --- a/packages/init-data-node/src/signFp.ts +++ b/packages/init-data-node/src/signFp.ts @@ -5,7 +5,9 @@ import { pipe } from 'fp-ts/lib/function.js'; import type { Text } from './types.js'; -export type SignableData = Omit; +export type SignableData = + & Omit + & { signature?: string }; export interface SignOptions { /** @@ -61,7 +63,11 @@ export function signFp( signData: SignDataFpArg, options?: SignOptions, ): E.Either | TE.TaskEither { - const query = new URLSearchParams(serializeInitDataQuery({ ...data, auth_date: authDate })); + const query = new URLSearchParams(serializeInitDataQuery({ + ...data, + auth_date: authDate, + signature: data.signature || '', + })); // Convert search params to pairs and sort the final array. const pairs = [...query.entries()] From 8316bda871b54006a3aec137ef7b9f8499dd886e Mon Sep 17 00:00:00 2001 From: Vladislav Kibenko <34907325+heyqbnk@users.noreply.github.com> Date: Thu, 4 Dec 2025 18:36:36 +0500 Subject: [PATCH 2/2] docs(changeset): Optionally allow specifying `signature` field when signing. As a default, set an empty value. --- .changeset/perfect-lizards-double.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/perfect-lizards-double.md diff --git a/.changeset/perfect-lizards-double.md b/.changeset/perfect-lizards-double.md new file mode 100644 index 000000000..6277f5b34 --- /dev/null +++ b/.changeset/perfect-lizards-double.md @@ -0,0 +1,5 @@ +--- +"@tma.js/init-data-node": patch +--- + +Optionally allow specifying `signature` field when signing. As a default, set an empty value.