@@ -123,6 +123,10 @@ struct BridgeRequestPayload {
123123
124124 /// Environment for the bridge request
125125 environment : Environment ,
126+
127+ /// Optional deep-link callback URL for the World App to redirect to after verification.
128+ #[ serde( skip_serializing_if = "Option::is_none" , rename = "return_to_url" ) ]
129+ return_to : Option < String > ,
126130}
127131
128132/// Encrypted payload sent to/from the bridge
@@ -549,6 +553,7 @@ pub fn build_request_payload(
549553 timestamp,
550554 allow_legacy_proofs : params. allow_legacy_proofs ,
551555 environment : params. environment . unwrap_or_default ( ) ,
556+ return_to : params. return_to . clone ( ) ,
552557 } ;
553558
554559 serde_json:: to_value ( & payload) . map_err ( Into :: into)
@@ -1793,6 +1798,7 @@ mod tests {
17931798 identity_attributes : None ,
17941799 allow_legacy_proofs : false ,
17951800 environment : Environment :: Production ,
1801+ return_to : None ,
17961802 } ;
17971803
17981804 let json = serde_json:: to_string ( & payload) . unwrap ( ) ;
@@ -2411,6 +2417,77 @@ mod tests {
24112417 assert ! ( payload_bridge. get( "timestamp" ) . is_none( ) ) ;
24122418 }
24132419
2420+ #[ test]
2421+ fn test_build_request_payload_includes_return_to_when_provided ( ) {
2422+ let app_id = AppId :: new ( "app_test" ) . unwrap ( ) ;
2423+ let sig = "0x" . to_string ( ) + & "00" . repeat ( 64 ) + "1b" ;
2424+ let rp_context = RpContext :: new (
2425+ "rp_1234567890abcdef" ,
2426+ "0x0000000000000000000000000000000000000000000000000000000000000001" ,
2427+ 1_700_000_000 ,
2428+ 1_700_003_600 ,
2429+ & sig,
2430+ )
2431+ . unwrap ( ) ;
2432+
2433+ let params = BridgeConnectionParams {
2434+ app_id,
2435+ kind : RequestKind :: Uniqueness {
2436+ action : "my-action" . to_string ( ) ,
2437+ } ,
2438+ constraints : None ,
2439+ rp_context,
2440+ action_description : None ,
2441+ legacy_verification_level : VerificationLevel :: Orb ,
2442+ legacy_signal : "test-signal" . to_string ( ) ,
2443+ bridge_url : None ,
2444+ allow_legacy_proofs : false ,
2445+ override_connect_base_url : None ,
2446+ return_to : Some ( "idkitsample://callback" . to_string ( ) ) ,
2447+ environment : None ,
2448+ identity_attributes : None ,
2449+ } ;
2450+
2451+ let payload = build_request_payload ( & params, false ) . unwrap ( ) ;
2452+ assert_eq ! ( payload[ "return_to_url" ] , "idkitsample://callback" ) ;
2453+ assert ! ( payload. get( "return_to" ) . is_none( ) ) ;
2454+ }
2455+
2456+ #[ test]
2457+ fn test_build_request_payload_omits_return_to_when_none ( ) {
2458+ let app_id = AppId :: new ( "app_test" ) . unwrap ( ) ;
2459+ let sig = "0x" . to_string ( ) + & "00" . repeat ( 64 ) + "1b" ;
2460+ let rp_context = RpContext :: new (
2461+ "rp_1234567890abcdef" ,
2462+ "0x0000000000000000000000000000000000000000000000000000000000000001" ,
2463+ 1_700_000_000 ,
2464+ 1_700_003_600 ,
2465+ & sig,
2466+ )
2467+ . unwrap ( ) ;
2468+
2469+ let params = BridgeConnectionParams {
2470+ app_id,
2471+ kind : RequestKind :: Uniqueness {
2472+ action : "my-action" . to_string ( ) ,
2473+ } ,
2474+ constraints : None ,
2475+ rp_context,
2476+ action_description : None ,
2477+ legacy_verification_level : VerificationLevel :: Orb ,
2478+ legacy_signal : "test-signal" . to_string ( ) ,
2479+ bridge_url : None ,
2480+ allow_legacy_proofs : false ,
2481+ override_connect_base_url : None ,
2482+ return_to : None ,
2483+ environment : None ,
2484+ identity_attributes : None ,
2485+ } ;
2486+
2487+ let payload = build_request_payload ( & params, false ) . unwrap ( ) ;
2488+ assert ! ( payload. get( "return_to_url" ) . is_none( ) ) ;
2489+ }
2490+
24142491 #[ test]
24152492 fn test_legacy_payload_hashes_address_shaped_signal_as_raw_bytes ( ) {
24162493 let address = "0x3df41d9d0ba00d8fbe5a9896bb01efc4b3787b7c" ;
0 commit comments