From be9e2a62146c9833a00a59e6973d83c26688669f Mon Sep 17 00:00:00 2001 From: Stephan Cilliers Date: Fri, 15 Aug 2025 18:21:44 +0200 Subject: [PATCH 1/4] feat: test data callback wallet_connect --- .../src/pages/auto-sub-account/index.page.tsx | 120 +++++++++++++++++- 1 file changed, 118 insertions(+), 2 deletions(-) diff --git a/examples/testapp/src/pages/auto-sub-account/index.page.tsx b/examples/testapp/src/pages/auto-sub-account/index.page.tsx index dd99ed00..c0f7c121 100644 --- a/examples/testapp/src/pages/auto-sub-account/index.page.tsx +++ b/examples/testapp/src/pages/auto-sub-account/index.page.tsx @@ -47,6 +47,15 @@ export default function AutoSubAccount() { const [walletConnectCapabilities, setWalletConnectCapabilities] = useState({ siwe: false, addSubAccount: false, + dataCallback: false, + }); + const [dataCallbackConfig, setDataCallbackConfig] = useState({ + email: true, + physicalAddress: true, + name: true, + phoneNumber: false, + onchainAddress: false, + callbackURL: 'https://example.com/validate', }); const { subAccountsConfig, setSubAccountsConfig, config, setConfig } = useConfig(); const { provider } = useEIP1193Provider(); @@ -194,7 +203,11 @@ export default function AutoSubAccount() { let params: unknown[] = []; // Build params based on selected capabilities - if (walletConnectCapabilities.siwe || walletConnectCapabilities.addSubAccount) { + if ( + walletConnectCapabilities.siwe || + walletConnectCapabilities.addSubAccount || + walletConnectCapabilities.dataCallback + ) { const capabilities: Record = {}; // Add SIWE capability if selected @@ -221,9 +234,32 @@ export default function AutoSubAccount() { }; } + // Add dataCallback capability if selected + if (walletConnectCapabilities.dataCallback) { + const requests: Array<{ type: string; optional: boolean }> = []; + if (dataCallbackConfig.email) requests.push({ type: 'email', optional: false }); + if (dataCallbackConfig.physicalAddress) + requests.push({ type: 'physicalAddress', optional: false }); + if (dataCallbackConfig.name) requests.push({ type: 'name', optional: false }); + if (dataCallbackConfig.phoneNumber) + requests.push({ type: 'phoneNumber', optional: false }); + if (dataCallbackConfig.onchainAddress) + requests.push({ type: 'onchainAddress', optional: false }); + + if (requests.length > 0) { + capabilities.dataCallback = { + requests, + // Note: callbackURL is ignored during wallet_connect and only used with wallet_sendCalls + ...(dataCallbackConfig.callbackURL?.trim() + ? { callbackURL: dataCallbackConfig.callbackURL.trim() } + : {}), + }; + } + } + params = [ { - ...(walletConnectCapabilities.siwe && { version: '1' }), + version: '1.0.0', capabilities, }, ]; @@ -445,6 +481,86 @@ export default function AutoSubAccount() { > Add Sub Account + + setWalletConnectCapabilities((prev) => ({ + ...prev, + dataCallback: e.target.checked, + })) + } + > + Data Callback + + + {walletConnectCapabilities.dataCallback && ( + + + Select data to request (best-effort at connect time) + + + + setDataCallbackConfig((prev) => ({ ...prev, email: e.target.checked })) + } + > + email + + + setDataCallbackConfig((prev) => ({ ...prev, name: e.target.checked })) + } + > + name + + + setDataCallbackConfig((prev) => ({ + ...prev, + phoneNumber: e.target.checked, + })) + } + > + phoneNumber + + + setDataCallbackConfig((prev) => ({ + ...prev, + physicalAddress: e.target.checked, + })) + } + > + physicalAddress + + + setDataCallbackConfig((prev) => ({ + ...prev, + onchainAddress: e.target.checked, + })) + } + > + onchainAddress + + + + Callback URL (optional) + + setDataCallbackConfig((prev) => ({ ...prev, callbackURL: e.target.value })) + } + /> + + + )} {accounts.length > 0 && ( From 176d7da5517cb32d944b2819831ea56d0316d8b3 Mon Sep 17 00:00:00 2001 From: Stephan Cilliers Date: Tue, 16 Sep 2025 14:29:35 +0200 Subject: [PATCH 2/4] fix: data callback --- .../src/pages/auto-sub-account/index.page.tsx | 46 +------------------ 1 file changed, 2 insertions(+), 44 deletions(-) diff --git a/examples/testapp/src/pages/auto-sub-account/index.page.tsx b/examples/testapp/src/pages/auto-sub-account/index.page.tsx index c0f7c121..d1280ef8 100644 --- a/examples/testapp/src/pages/auto-sub-account/index.page.tsx +++ b/examples/testapp/src/pages/auto-sub-account/index.page.tsx @@ -22,6 +22,7 @@ import { numberToHex, parseEther, parseUnits, + toHex, } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { baseSepolia } from 'viem/chains'; @@ -51,11 +52,8 @@ export default function AutoSubAccount() { }); const [dataCallbackConfig, setDataCallbackConfig] = useState({ email: true, - physicalAddress: true, name: true, phoneNumber: false, - onchainAddress: false, - callbackURL: 'https://example.com/validate', }); const { subAccountsConfig, setSubAccountsConfig, config, setConfig } = useConfig(); const { provider } = useEIP1193Provider(); @@ -213,7 +211,7 @@ export default function AutoSubAccount() { // Add SIWE capability if selected if (walletConnectCapabilities.siwe) { capabilities.signInWithEthereum = { - chainId: 84532, + chainId: toHex(84532), nonce: Math.random().toString(36).substring(2, 15), }; } @@ -238,21 +236,13 @@ export default function AutoSubAccount() { if (walletConnectCapabilities.dataCallback) { const requests: Array<{ type: string; optional: boolean }> = []; if (dataCallbackConfig.email) requests.push({ type: 'email', optional: false }); - if (dataCallbackConfig.physicalAddress) - requests.push({ type: 'physicalAddress', optional: false }); if (dataCallbackConfig.name) requests.push({ type: 'name', optional: false }); if (dataCallbackConfig.phoneNumber) requests.push({ type: 'phoneNumber', optional: false }); - if (dataCallbackConfig.onchainAddress) - requests.push({ type: 'onchainAddress', optional: false }); if (requests.length > 0) { capabilities.dataCallback = { requests, - // Note: callbackURL is ignored during wallet_connect and only used with wallet_sendCalls - ...(dataCallbackConfig.callbackURL?.trim() - ? { callbackURL: dataCallbackConfig.callbackURL.trim() } - : {}), }; } } @@ -526,39 +516,7 @@ export default function AutoSubAccount() { > phoneNumber - - setDataCallbackConfig((prev) => ({ - ...prev, - physicalAddress: e.target.checked, - })) - } - > - physicalAddress - - - setDataCallbackConfig((prev) => ({ - ...prev, - onchainAddress: e.target.checked, - })) - } - > - onchainAddress - - - Callback URL (optional) - - setDataCallbackConfig((prev) => ({ ...prev, callbackURL: e.target.value })) - } - /> - )} From 39dd1e220491900174cb001d4fd37f84707c6f32 Mon Sep 17 00:00:00 2001 From: Stephan Cilliers Date: Tue, 16 Sep 2025 14:35:25 +0200 Subject: [PATCH 3/4] fix: format --- examples/testapp/src/pages/auto-sub-account/index.page.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/testapp/src/pages/auto-sub-account/index.page.tsx b/examples/testapp/src/pages/auto-sub-account/index.page.tsx index d1280ef8..bce712eb 100644 --- a/examples/testapp/src/pages/auto-sub-account/index.page.tsx +++ b/examples/testapp/src/pages/auto-sub-account/index.page.tsx @@ -237,8 +237,7 @@ export default function AutoSubAccount() { const requests: Array<{ type: string; optional: boolean }> = []; if (dataCallbackConfig.email) requests.push({ type: 'email', optional: false }); if (dataCallbackConfig.name) requests.push({ type: 'name', optional: false }); - if (dataCallbackConfig.phoneNumber) - requests.push({ type: 'phoneNumber', optional: false }); + if (dataCallbackConfig.phoneNumber) requests.push({ type: 'phoneNumber', optional: false }); if (requests.length > 0) { capabilities.dataCallback = { From 869beb49005e9b3bcac4ac76162bde2da8cd3e3b Mon Sep 17 00:00:00 2001 From: Stephan Cilliers Date: Wed, 17 Sep 2025 16:08:50 +0200 Subject: [PATCH 4/4] refactor: rename dataCallback to userInfo and update related logic --- .../src/pages/auto-sub-account/index.page.tsx | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/examples/testapp/src/pages/auto-sub-account/index.page.tsx b/examples/testapp/src/pages/auto-sub-account/index.page.tsx index bce712eb..7bff90fc 100644 --- a/examples/testapp/src/pages/auto-sub-account/index.page.tsx +++ b/examples/testapp/src/pages/auto-sub-account/index.page.tsx @@ -48,9 +48,9 @@ export default function AutoSubAccount() { const [walletConnectCapabilities, setWalletConnectCapabilities] = useState({ siwe: false, addSubAccount: false, - dataCallback: false, + userInfo: false, }); - const [dataCallbackConfig, setDataCallbackConfig] = useState({ + const [userInfoConfig, setUserInfoConfig] = useState({ email: true, name: true, phoneNumber: false, @@ -204,7 +204,7 @@ export default function AutoSubAccount() { if ( walletConnectCapabilities.siwe || walletConnectCapabilities.addSubAccount || - walletConnectCapabilities.dataCallback + walletConnectCapabilities.userInfo ) { const capabilities: Record = {}; @@ -232,16 +232,16 @@ export default function AutoSubAccount() { }; } - // Add dataCallback capability if selected - if (walletConnectCapabilities.dataCallback) { - const requests: Array<{ type: string; optional: boolean }> = []; - if (dataCallbackConfig.email) requests.push({ type: 'email', optional: false }); - if (dataCallbackConfig.name) requests.push({ type: 'name', optional: false }); - if (dataCallbackConfig.phoneNumber) requests.push({ type: 'phoneNumber', optional: false }); + // Add userInfo capability if selected + if (walletConnectCapabilities.userInfo) { + const collect: string[] = []; + if (userInfoConfig.email) collect.push('email'); + if (userInfoConfig.name) collect.push('name'); + if (userInfoConfig.phoneNumber) collect.push('phoneNumber'); - if (requests.length > 0) { - capabilities.dataCallback = { - requests, + if (collect.length > 0) { + capabilities.userInfo = { + collect, }; } } @@ -471,43 +471,43 @@ export default function AutoSubAccount() { Add Sub Account setWalletConnectCapabilities((prev) => ({ ...prev, - dataCallback: e.target.checked, + userInfo: e.target.checked, })) } > - Data Callback + User Info - {walletConnectCapabilities.dataCallback && ( + {walletConnectCapabilities.userInfo && ( Select data to request (best-effort at connect time) - setDataCallbackConfig((prev) => ({ ...prev, email: e.target.checked })) + setUserInfoConfig((prev) => ({ ...prev, email: e.target.checked })) } > email - setDataCallbackConfig((prev) => ({ ...prev, name: e.target.checked })) + setUserInfoConfig((prev) => ({ ...prev, name: e.target.checked })) } > name - setDataCallbackConfig((prev) => ({ + setUserInfoConfig((prev) => ({ ...prev, phoneNumber: e.target.checked, }))