@@ -345,19 +345,28 @@ func TestExtractDiscoveryInfo_FullFlow(t *testing.T) {
345345 X402Version : 2 ,
346346 Accepted : requirements ,
347347 Payload : map [string ]interface {}{},
348+ Resource : & x402.ResourceInfo {
349+ URL : "https://api.example.com/data" ,
350+ },
348351 Extensions : map [string ]interface {}{
349352 bazaar .BAZAAR : extension ,
350353 },
351354 }
352355
353- info , err := bazaar .ExtractDiscoveryInfo (paymentPayload , map [string ]interface {}{}, true )
356+ // Marshal to bytes (new signature)
357+ payloadBytes , _ := json .Marshal (paymentPayload )
358+ requirementsBytes , _ := json .Marshal (requirements )
359+
360+ info , err := bazaar .ExtractDiscoveryInfo (payloadBytes , requirementsBytes , true )
354361 require .NoError (t , err )
355362 require .NotNil (t , info )
356363
357364 bodyInput , ok := info .DiscoveryInfo .Input .(bazaar.BodyInput )
358365 require .True (t , ok )
359366 assert .Equal (t , bazaar .MethodPOST , bodyInput .Method )
360367 assert .Equal (t , "http" , bodyInput .Type )
368+ assert .Equal (t , "https://api.example.com/data" , info .ResourceURL )
369+ assert .Equal (t , 2 , info .X402Version )
361370 })
362371
363372 t .Run ("should extract info from v1 PaymentRequirements" , func (t * testing.T ) {
@@ -381,28 +390,29 @@ func TestExtractDiscoveryInfo_FullFlow(t *testing.T) {
381390 "payTo" : "0x..." ,
382391 "maxTimeoutSeconds" : 300 ,
383392 "asset" : "0x..." ,
384- "extra" : map [string ]interface {}{},
385393 }
386394
387- v1ReqStruct := x402.PaymentRequirements {
388- Scheme : "exact" ,
389- Network : "eip155:8453" ,
395+ v1Payload := map [string ]interface {}{
396+ "x402Version" : 1 ,
397+ "scheme" : "exact" ,
398+ "network" : "eip155:8453" ,
399+ "payload" : map [string ]interface {}{},
390400 }
391401
392- v1Payload := x402.PaymentPayload {
393- X402Version : 1 ,
394- Accepted : v1ReqStruct ,
395- Payload : map [string ]interface {}{},
396- }
402+ // Marshal to bytes (new signature)
403+ payloadBytes , _ := json .Marshal (v1Payload )
404+ requirementsBytes , _ := json .Marshal (v1Requirements )
397405
398- info , err := bazaar .ExtractDiscoveryInfo (v1Payload , v1Requirements , true )
406+ info , err := bazaar .ExtractDiscoveryInfo (payloadBytes , requirementsBytes , true )
399407 require .NoError (t , err )
400408 require .NotNil (t , info )
401409
402410 queryInput , ok := info .DiscoveryInfo .Input .(bazaar.QueryInput )
403411 require .True (t , ok )
404412 assert .Equal (t , bazaar .MethodGET , queryInput .Method )
405413 assert .Equal (t , "http" , queryInput .Type )
414+ assert .Equal (t , "https://api.example.com/data" , info .ResourceURL )
415+ assert .Equal (t , 1 , info .X402Version )
406416 })
407417
408418 t .Run ("should return nil when no discovery info is present" , func (t * testing.T ) {
@@ -417,10 +427,33 @@ func TestExtractDiscoveryInfo_FullFlow(t *testing.T) {
417427 Payload : map [string ]interface {}{},
418428 }
419429
420- info , err := bazaar .ExtractDiscoveryInfo (paymentPayload , map [string ]interface {}{}, true )
430+ // Marshal to bytes (new signature)
431+ payloadBytes , _ := json .Marshal (paymentPayload )
432+ requirementsBytes , _ := json .Marshal (requirements )
433+
434+ info , err := bazaar .ExtractDiscoveryInfo (payloadBytes , requirementsBytes , true )
421435 require .NoError (t , err )
422436 assert .Nil (t , info )
423437 })
438+
439+ t .Run ("should return error for invalid json" , func (t * testing.T ) {
440+ info , err := bazaar .ExtractDiscoveryInfo ([]byte ("invalid" ), []byte ("{}" ), true )
441+ require .Error (t , err )
442+ assert .Nil (t , info )
443+ assert .Contains (t , err .Error (), "failed to parse version" )
444+ })
445+
446+ t .Run ("should return error for unsupported version" , func (t * testing.T ) {
447+ payload := map [string ]interface {}{
448+ "x402Version" : 99 ,
449+ }
450+ payloadBytes , _ := json .Marshal (payload )
451+
452+ info , err := bazaar .ExtractDiscoveryInfo (payloadBytes , []byte ("{}" ), true )
453+ require .Error (t , err )
454+ assert .Nil (t , info )
455+ assert .Contains (t , err .Error (), "unsupported version" )
456+ })
424457}
425458
426459func TestValidateAndExtract (t * testing.T ) {
@@ -837,19 +870,19 @@ func TestIntegration_FullWorkflow(t *testing.T) {
837870 "extra" : map [string ]interface {}{},
838871 }
839872
840- v1ReqStruct := x402.PaymentRequirements {
841- Scheme : "exact" ,
842- Network : "eip155:8453" ,
873+ v1Payload := map [string ]interface {}{
874+ "x402Version" : 1 ,
875+ "scheme" : "exact" ,
876+ "network" : "eip155:8453" ,
877+ "payload" : map [string ]interface {}{},
843878 }
844879
845- v1Payload := x402.PaymentPayload {
846- X402Version : 1 ,
847- Accepted : v1ReqStruct ,
848- Payload : map [string ]interface {}{},
849- }
880+ // Marshal to bytes (new signature)
881+ payloadBytes , _ := json .Marshal (v1Payload )
882+ requirementsBytes , _ := json .Marshal (v1Requirements )
850883
851884 // Facilitator extracts v1 info and transforms to v2
852- info , err := bazaar .ExtractDiscoveryInfo (v1Payload , v1Requirements , true )
885+ info , err := bazaar .ExtractDiscoveryInfo (payloadBytes , requirementsBytes , true )
853886 require .NoError (t , err )
854887 require .NotNil (t , info )
855888
@@ -864,6 +897,10 @@ func TestIntegration_FullWorkflow(t *testing.T) {
864897 assert .NotNil (t , bodyMap ["query" ])
865898 assert .NotNil (t , bodyMap ["chain" ])
866899 assert .NotNil (t , bodyMap ["type_hint" ])
900+
901+ // Verify resource URL extracted correctly
902+ assert .Equal (t , "https://mesh.heurist.xyz/x402/agents/TokenResolverAgent/search" , info .ResourceURL )
903+ assert .Equal (t , 1 , info .X402Version )
867904 })
868905
869906 t .Run ("should handle unified extraction for both v1 and v2" , func (t * testing.T ) {
@@ -889,21 +926,30 @@ func TestIntegration_FullWorkflow(t *testing.T) {
889926 X402Version : 2 ,
890927 Accepted : v2Requirements ,
891928 Payload : map [string ]interface {}{},
929+ Resource : & x402.ResourceInfo {
930+ URL : "https://api.example.com/items" ,
931+ },
892932 Extensions : map [string ]interface {}{
893933 bazaar .BAZAAR : v2Extension ,
894934 },
895935 }
896936
897- v2Info , err := bazaar .ExtractDiscoveryInfo (v2Payload , map [string ]interface {}{}, true )
937+ // Marshal to bytes (new signature)
938+ v2PayloadBytes , _ := json .Marshal (v2Payload )
939+ v2RequirementsBytes , _ := json .Marshal (v2Requirements )
940+
941+ v2Info , err := bazaar .ExtractDiscoveryInfo (v2PayloadBytes , v2RequirementsBytes , true )
898942 require .NoError (t , err )
899943 require .NotNil (t , v2Info )
900944
901945 queryInput , ok := v2Info .DiscoveryInfo .Input .(bazaar.QueryInput )
902946 require .True (t , ok )
903947 assert .Equal (t , bazaar .MethodGET , queryInput .Method )
948+ assert .Equal (t , 2 , v2Info .X402Version )
904949
905950 // V1 case - discovery info is in PaymentRequirements.outputSchema
906951 v1Requirements := map [string ]interface {}{
952+ "resource" : "https://api.example.com/search" ,
907953 "outputSchema" : map [string ]interface {}{
908954 "input" : map [string ]interface {}{
909955 "discoverable" : true ,
@@ -914,24 +960,25 @@ func TestIntegration_FullWorkflow(t *testing.T) {
914960 },
915961 }
916962
917- v1ReqStructSecond := x402.PaymentRequirements {
918- Scheme : "exact" ,
919- Network : "eip155:8453" ,
963+ v1Payload := map [string ]interface {}{
964+ "x402Version" : 1 ,
965+ "scheme" : "exact" ,
966+ "network" : "eip155:8453" ,
967+ "payload" : map [string ]interface {}{},
920968 }
921969
922- v1Payload := x402.PaymentPayload {
923- X402Version : 1 ,
924- Accepted : v1ReqStructSecond ,
925- Payload : map [string ]interface {}{},
926- }
970+ // Marshal to bytes (new signature)
971+ v1PayloadBytes , _ := json .Marshal (v1Payload )
972+ v1RequirementsBytes , _ := json .Marshal (v1Requirements )
927973
928- v1Info , err := bazaar .ExtractDiscoveryInfo (v1Payload , v1Requirements , true )
974+ v1Info , err := bazaar .ExtractDiscoveryInfo (v1PayloadBytes , v1RequirementsBytes , true )
929975 require .NoError (t , err )
930976 require .NotNil (t , v1Info )
931977
932978 queryInput2 , ok := v1Info .DiscoveryInfo .Input .(bazaar.QueryInput )
933979 require .True (t , ok )
934980 assert .Equal (t , bazaar .MethodGET , queryInput2 .Method )
981+ assert .Equal (t , 1 , v1Info .X402Version )
935982
936983 // Both v1 and v2 return the same DiscoveryInfo structure
937984 assert .IsType (t , v2Info .DiscoveryInfo .Input , v1Info .DiscoveryInfo .Input )
0 commit comments