@@ -17,6 +17,13 @@ contract BlueprintServiceManagerBaseTest is Test {
1717 address masterBlueprintServiceManager = address (0x2222222222222222222222222222222222222222 );
1818 address blueprintOwner = address (0x3333333333333333333333333333333333333333 );
1919 MockERC20 mockToken;
20+
21+ // Additional tokens for extended tests
22+ MockERC20 mockToken1;
23+ MockERC20 mockToken2;
24+ MockERC20 mockToken3;
25+
26+ uint64 constant TEST_SERVICE_ID = 42 ;
2027
2128 function setUp () public {
2229 // Deploy Mock Blueprint Service Manager
@@ -28,6 +35,16 @@ contract BlueprintServiceManagerBaseTest is Test {
2835 // Deploy a Mock ERC20 token
2936 mockToken = new MockERC20 ();
3037 mockToken.initialize ("MockToken " , "MTK " , 18 );
38+
39+ // Deploy additional Mock ERC20 tokens for extended tests
40+ mockToken1 = new MockERC20 ();
41+ mockToken1.initialize ("MockToken1 " , "MT1 " , 18 );
42+
43+ mockToken2 = new MockERC20 ();
44+ mockToken2.initialize ("MockToken2 " , "MT2 " , 18 );
45+
46+ mockToken3 = new MockERC20 ();
47+ mockToken3.initialize ("MockToken3 " , "MT3 " , 18 );
3148 }
3249
3350 // Utility modifier to simulate calls from root chain
@@ -454,7 +471,7 @@ contract BlueprintServiceManagerBaseTest is Test {
454471 Assets.Asset ({ kind: Assets.Kind.Erc20, data: bytes32 (uint256 (uint160 (address (mockToken)))) });
455472
456473 // Permit the asset
457- manager.permitAsset (serviceId, asset);
474+ manager.exposePermitAsset (serviceId, asset);
458475
459476 bool isAllowed = manager.queryIsPaymentAssetAllowed (serviceId, asset);
460477 assertTrue (isAllowed, "ERC20 asset should be allowed " );
@@ -475,7 +492,7 @@ contract BlueprintServiceManagerBaseTest is Test {
475492 Assets.Asset memory asset = Assets.Asset ({ kind: Assets.Kind.Custom, data: assetId });
476493
477494 // Permit the asset
478- manager.permitAsset (serviceId, asset);
495+ manager.exposePermitAsset (serviceId, asset);
479496
480497 bool isAllowed = manager.queryIsPaymentAssetAllowed (serviceId, asset);
481498 assertTrue (isAllowed, "Custom asset should be allowed " );
@@ -499,20 +516,20 @@ contract BlueprintServiceManagerBaseTest is Test {
499516 Assets.Asset memory customAsset = Assets.Asset ({ kind: Assets.Kind.Custom, data: customAssetId });
500517
501518 // Permit both assets
502- manager.permitAsset (serviceId, erc20Asset);
503- manager.permitAsset (serviceId, customAsset);
519+ manager.exposePermitAsset (serviceId, erc20Asset);
520+ manager.exposePermitAsset (serviceId, customAsset);
504521
505522 // Check if allowed
506523 assertTrue (manager.queryIsPaymentAssetAllowed (serviceId, erc20Asset), "ERC20 asset should be allowed " );
507524 assertTrue (manager.queryIsPaymentAssetAllowed (serviceId, customAsset), "Custom asset should be allowed " );
508525
509526 // Revoke ERC20 asset
510- manager.revokeAsset (serviceId, erc20Asset);
527+ manager.exposeRevokeAsset (serviceId, erc20Asset);
511528 assertFalse (manager.queryIsPaymentAssetAllowed (serviceId, erc20Asset), "ERC20 asset should be revoked " );
512529 assertTrue (manager.queryIsPaymentAssetAllowed (serviceId, customAsset), "Custom asset should still be allowed " );
513530
514531 // Revoke Custom asset
515- manager.revokeAsset (serviceId, customAsset);
532+ manager.exposeRevokeAsset (serviceId, customAsset);
516533 assertFalse (manager.queryIsPaymentAssetAllowed (serviceId, customAsset), "Custom asset should be revoked " );
517534 }
518535
@@ -525,15 +542,15 @@ contract BlueprintServiceManagerBaseTest is Test {
525542 Assets.Asset memory customAsset = Assets.Asset ({ kind: Assets.Kind.Custom, data: customAssetId });
526543
527544 // Permit both assets
528- manager.permitAsset (serviceId, erc20Asset);
529- manager.permitAsset (serviceId, customAsset);
545+ manager.exposePermitAsset (serviceId, erc20Asset);
546+ manager.exposePermitAsset (serviceId, customAsset);
530547
531548 // Verify assets are permitted
532549 assertTrue (manager.queryIsPaymentAssetAllowed (serviceId, erc20Asset), "ERC20 asset should be allowed " );
533550 assertTrue (manager.queryIsPaymentAssetAllowed (serviceId, customAsset), "Custom asset should be allowed " );
534551
535552 // Clear all permitted assets
536- manager.clearPermittedAssets (serviceId);
553+ manager.exposeClearPermittedAssets (serviceId);
537554
538555 // Verify assets are revoked
539556 assertFalse (manager.queryIsPaymentAssetAllowed (serviceId, erc20Asset), "ERC20 asset should be revoked " );
@@ -546,9 +563,9 @@ contract BlueprintServiceManagerBaseTest is Test {
546563 Assets.Asset memory erc20Asset =
547564 Assets.Asset ({ kind: Assets.Kind.Erc20, data: bytes32 (uint256 (uint160 (address (mockToken)))) });
548565
549- manager.permitAsset (serviceId, erc20Asset);
566+ manager.exposePermitAsset (serviceId, erc20Asset);
550567
551- address [] memory permitted = manager.getPermittedAssetsAsAddresses (serviceId);
568+ address [] memory permitted = manager.exposeGetPermittedAssetsAsAddresses (serviceId);
552569 assertEq (permitted.length , 1 , "Should have one permitted asset " );
553570 assertEq (permitted[0 ], address (mockToken), "Permitted asset address mismatch " );
554571 }
@@ -561,10 +578,10 @@ contract BlueprintServiceManagerBaseTest is Test {
561578 bytes32 customAssetId = bytes32 (uint256 (345_678 ));
562579 Assets.Asset memory customAsset = Assets.Asset ({ kind: Assets.Kind.Custom, data: customAssetId });
563580
564- manager.permitAsset (serviceId, erc20Asset);
565- manager.permitAsset (serviceId, customAsset);
581+ manager.exposePermitAsset (serviceId, erc20Asset);
582+ manager.exposePermitAsset (serviceId, customAsset);
566583
567- Assets.Asset[] memory permitted = manager.getPermittedAssets (serviceId);
584+ Assets.Asset[] memory permitted = manager.exposeGetPermittedAssets (serviceId);
568585 assertEq (permitted.length , 2 , "Should have two permitted assets " );
569586
570587 // Verify ERC20 asset
@@ -736,4 +753,49 @@ contract BlueprintServiceManagerBaseTest is Test {
736753 vm.prank (address (0x999 ));
737754 manager.onOperatorLeft (serviceId, operator);
738755 }
756+
757+ // Test native asset permissions
758+ function test_NativeAssetAlwaysPermitted () public onlyMaster {
759+ uint64 serviceId = TEST_SERVICE_ID;
760+
761+ // Test native ERC20 (address(0))
762+ Assets.Asset memory nativeErc20 = Assets.Asset ({
763+ kind: Assets.Kind.Erc20,
764+ data: bytes32 (0 )
765+ });
766+
767+ Assets.Asset memory nativeCustom = Assets.Asset ({
768+ kind: Assets.Kind.Custom,
769+ data: bytes32 (0 )
770+ });
771+
772+ assertTrue (
773+ manager.queryIsPaymentAssetAllowed (serviceId, nativeErc20),
774+ "Native ERC20 should be permitted by default "
775+ );
776+
777+ assertTrue (
778+ manager.queryIsPaymentAssetAllowed (serviceId, nativeCustom),
779+ "Native Custom asset should be permitted by default "
780+ );
781+ }
782+
783+ // Test UnsupportedAssetKind error indirectly to ensure the code path is covered
784+ function test_UnsupportedAssetKind_Coverage () public {
785+ Assets.Asset memory erc20Asset = Assets.Asset ({
786+ kind: Assets.Kind.Erc20,
787+ data: bytes32 (uint256 (uint160 (address (0x1234 ))))
788+ });
789+
790+ Assets.Asset memory customAsset = Assets.Asset ({
791+ kind: Assets.Kind.Custom,
792+ data: bytes32 (uint256 (123456 ))
793+ });
794+
795+ address erc20Address = erc20Asset.toAddress ();
796+ assertEq (erc20Address, address (0x1234 ), "ERC20 asset should convert to correct address " );
797+
798+ address customAddress = customAsset.toAddress ();
799+ assertTrue (customAddress != address (0 ), "Custom asset should convert to non-zero address " );
800+ }
739801}
0 commit comments