fix(signer): percent-encode query params in buildMessage to match server

Server's CanonicalQueryString uses url.QueryEscape on all keys and values,
but buildMessage was using raw string interpolation. Cursor values (base64)
contain +, =, / which diverge under encoding — causing 401 on all paginated
signed requests (e.g. portfolio holdings page 2+).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
David Lau
2026-05-29 19:32:54 +08:00
parent b0b25118aa
commit 412531f04e
+3 -2
View File
@@ -44,11 +44,12 @@ export function buildMessage(
const sortedQs = Object.keys(queryParams)
.sort()
.flatMap((k) => {
const ek = encodeURIComponent(k);
const v = queryParams[k];
if (Array.isArray(v)) {
return [...v].sort().map((item) => `${k}=${item}`);
return [...v].sort().map((item) => `${ek}=${encodeURIComponent(item)}`);
}
return [`${k}=${v}`];
return [`${ek}=${encodeURIComponent(String(v))}`];
})
.join("&");
return `${subPath}:${sortedQs}:${body}:${timestamp}`;