From b13668d338ab0d32fd03db47ffc5fcf633e21813 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Thu, 25 Sep 2025 16:54:52 +0200 Subject: [PATCH 01/31] Modify payment rails and add methods for usage-based payments - Remove validator from cdn payment rails - Add fixed lockup during cdn payment rail creation - Add methods for FilBeam operator contract to settle cdn payment rails - Add method for increasing fixed lockup on cdn payment rails - Cleanup variables, errors and events related to cdn service termination - Remove handling of cdn payment rail termination from `railTerminated` method --- service_contracts/src/Errors.sol | 7 +- .../src/FilecoinWarmStorageService.sol | 201 +- ...WarmStorageServiceStateInternalLibrary.sol | 1 - ...FilecoinWarmStorageServiceStateLibrary.sol | 1 - .../test/FilecoinWarmStorageService.t.sol | 138 +- subgraph/package-lock.json | 5080 +++++++++++++++++ subgraph/schema.graphql | 1 - subgraph/src/filecoin-warm-storage-service.ts | 2 - 8 files changed, 5299 insertions(+), 132 deletions(-) create mode 100644 subgraph/package-lock.json diff --git a/service_contracts/src/Errors.sol b/service_contracts/src/Errors.sol index 224e03db..71dbf923 100644 --- a/service_contracts/src/Errors.sol +++ b/service_contracts/src/Errors.sol @@ -246,13 +246,8 @@ library Errors { /// @param actual The caller address error OnlyFilCDNControllerAllowed(address expected, address actual); - /// @notice CDN payment is already terminated - /// @param dataSetId The data set ID - error FilCDNPaymentAlreadyTerminated(uint256 dataSetId); - /// @notice Payment rails have not finalized yet, so the data set can't be deleted /// @param dataSetId The data set ID /// @param pdpEndEpoch The end epoch when the PDP payment rail will finalize - /// @param cdnEndEpoch The end epoch when the CDN payment rail will finalize (0 if no CDN) - error PaymentRailsNotFinalized(uint256 dataSetId, uint256 pdpEndEpoch, uint256 cdnEndEpoch); + error PaymentRailsNotFinalized(uint256 dataSetId, uint256 pdpEndEpoch); } diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index f9a03df3..5ed0bfea 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -79,8 +79,6 @@ contract FilecoinWarmStorageService is event PDPPaymentTerminated(uint256 indexed dataSetId, uint256 endEpoch, uint256 pdpRailId); - event CDNPaymentTerminated(uint256 indexed dataSetId, uint256 endEpoch, uint256 cacheMissRailId, uint256 cdnRailId); - event FilCDNControllerChanged(address oldController, address newController); event ViewContractSet(address indexed viewContract); @@ -109,7 +107,6 @@ contract FilecoinWarmStorageService is uint256 clientDataSetId; // ClientDataSetID uint256 pdpEndEpoch; // 0 if PDP rail are not terminated uint256 providerId; // Provider ID from the ServiceProviderRegistry - uint256 cdnEndEpoch; // 0 if CDN rails are not terminated } // Decode structure for data set creation extra data @@ -146,6 +143,8 @@ contract FilecoinWarmStorageService is // Metadata key constants string private constant METADATA_KEY_WITH_CDN = "withCDN"; + string private constant METADATA_KEY_CACHE_MISS_PAYMENT_RAIL_LOCKUP_RATIO = "cacheMissPaymentRailLockupRatio"; + string private constant METADATA_KEY_CDN_PAYMENT_RAIL_LOCKUP_RATIO = "cdnPaymentRailLockupRatio"; // Pricing constants uint256 private immutable STORAGE_PRICE_PER_TIB_PER_MONTH; // 5 USDFC per TiB per month without CDN with correct decimals @@ -575,29 +574,54 @@ contract FilecoinWarmStorageService is uint256 cdnRailId = 0; if (hasMetadataKey(createData.metadataKeys, METADATA_KEY_WITH_CDN)) { + // Get cache-miss and CDN ratios from metadata (as percentages 0-100) + string memory cacheMissPaymentRailLockupRatioStr = getMetadataValue( + createData.metadataKeys, createData.metadataValues, METADATA_KEY_CACHE_MISS_PAYMENT_RAIL_LOCKUP_RATIO + ); + string memory cdnPaymentRailLockupRatioStr = getMetadataValue( + createData.metadataKeys, createData.metadataValues, METADATA_KEY_CDN_PAYMENT_RAIL_LOCKUP_RATIO + ); + + uint256 cacheMissPaymentRailLockupRatio = stringToUint(cacheMissPaymentRailLockupRatioStr); + uint256 cdnPaymentRailLockupRatio = stringToUint(cdnPaymentRailLockupRatioStr); + + // Validate ratios are provided and sum to 100% + require( + cacheMissPaymentRailLockupRatio > 0 && cdnPaymentRailLockupRatio > 0, + "Cache-miss and CDN lockup ratios must be provided" + ); + require( + cacheMissPaymentRailLockupRatio + cdnPaymentRailLockupRatio == 100, + "Cache-miss and CDN lockup ratios must sum to 100%" + ); + cacheMissRailId = payments.createRail( usdfcTokenAddress, // token address createData.payer, // from (payer) payee, // payee address from registry - address(this), // this contract acts as the arbiter + address(0), // no validator 0, // no service commission - address(this) + address(this) // controller ); info.cacheMissRailId = cacheMissRailId; railToDataSet[cacheMissRailId] = dataSetId; - payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, 0); + // Set lockup based on cache-miss ratio percentage of monthly usage estimate + uint256 cacheMissLockup = (CACHE_MISS_PRICE_PER_TIB_PER_MONTH * cacheMissPaymentRailLockupRatio) / 100; + payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, cacheMissLockup); cdnRailId = payments.createRail( usdfcTokenAddress, // token address createData.payer, // from (payer) filCDNBeneficiaryAddress, // to FilCDN beneficiary - address(this), // this contract acts as the arbiter + address(0), // no validator 0, // no service commission - address(this) + address(this) // controller ); info.cdnRailId = cdnRailId; railToDataSet[cdnRailId] = dataSetId; - payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, 0); + // Set lockup based on CDN ratio percentage of monthly usage estimate + uint256 cdnLockup = (CDN_PRICE_PER_TIB_PER_MONTH * cdnPaymentRailLockupRatio) / 100; + payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnLockup); } // Emit event for tracking @@ -640,13 +664,7 @@ contract FilecoinWarmStorageService is // Check if the data set's payment rails have finalized require( info.pdpEndEpoch != 0 && block.number > info.pdpEndEpoch, - Errors.PaymentRailsNotFinalized(dataSetId, info.pdpEndEpoch, info.cdnEndEpoch) - ); - - // Check CDN payment rail: either no CDN configured (cdnEndEpoch == 0) or past CDN end epoch - require( - info.cdnEndEpoch == 0 || block.number > info.cdnEndEpoch, - Errors.PaymentRailsNotFinalized(dataSetId, info.pdpEndEpoch, info.cdnEndEpoch) + Errors.PaymentRailsNotFinalized(dataSetId, info.pdpEndEpoch) ); // Complete cleanup - remove the dataset from all mappings @@ -981,10 +999,73 @@ contract FilecoinWarmStorageService is emit ServiceTerminated(msg.sender, dataSetId, info.pdpRailId, info.cacheMissRailId, info.cdnRailId); } - function terminateCDNService(uint256 dataSetId) external onlyFilCDNController { - // Check if already terminated + /** + * @notice Settles CDN payment rails with specified amounts + * @dev Only callable by FilCDN (Operator) contract + * @param dataSetId The ID of the data set + * @param cdnAmount Amount to settle for CDN rail + */ + function settleCDNPaymentRail(uint256 dataSetId, uint256 cdnAmount) external onlyFilCDNController { + DataSetInfo storage info = dataSetInfo[dataSetId]; + require(info.pdpRailId != 0, Errors.InvalidDataSetId(dataSetId)); + + // Check if CDN service is configured + require( + hasMetadataKey(dataSetMetadataKeys[dataSetId], METADATA_KEY_WITH_CDN), + Errors.FilCDNServiceNotConfigured(dataSetId) + ); + + // Check if CDN rails is configured + require(info.cdnRailId != 0, Errors.InvalidDataSetId(dataSetId)); + + Payments payments = Payments(paymentsContractAddress); + + if (cdnAmount > 0) { + payments.modifyRailPayment(info.cdnRailId, 0, cdnAmount); + } + } + + /** + * @notice Settles CDN payment rails with specified amounts + * @dev Only callable by FilCDN (Operator) contract + * @param dataSetId The ID of the data set + * @param cacheMissAmount Amount to settle for cache miss rail + */ + function settleCacheMissPaymentRail(uint256 dataSetId, uint256 cacheMissAmount) external onlyFilCDNController { + DataSetInfo storage info = dataSetInfo[dataSetId]; + require(info.pdpRailId != 0, Errors.InvalidDataSetId(dataSetId)); + + // Check if CDN service is configured + require( + hasMetadataKey(dataSetMetadataKeys[dataSetId], METADATA_KEY_WITH_CDN), + Errors.FilCDNServiceNotConfigured(dataSetId) + ); + + // Check if cache miss rail is configured + require(info.cacheMissRailId != 0, Errors.InvalidDataSetId(dataSetId)); + + Payments payments = Payments(paymentsContractAddress); + + if (cacheMissAmount > 0) { + payments.modifyRailPayment(info.cacheMissRailId, 0, cacheMissAmount); + } + } + + /** + * @notice Allows users to add funds to their CDN-related payment rails + * @param dataSetId The ID of the data set + * @param cdnAmount Amount to add to CDN rail lockup + * @param cacheMissAmount Amount to add to cache miss rail lockup + */ + function topUpCDNPaymentRails(uint256 dataSetId, uint256 cdnAmount, uint256 cacheMissAmount) external { DataSetInfo storage info = dataSetInfo[dataSetId]; - require(info.cdnEndEpoch == 0, Errors.FilCDNPaymentAlreadyTerminated(dataSetId)); + require(info.pdpRailId != 0, Errors.InvalidDataSetId(dataSetId)); + + // Check authorization - only payer can top up + require( + msg.sender == info.payer, + Errors.CallerNotPayerOrPayee(dataSetId, info.payer, info.serviceProvider, msg.sender) + ); // Check if CDN service is configured require( @@ -995,6 +1076,35 @@ contract FilecoinWarmStorageService is // Check if cache miss and CDN rails are configured require(info.cacheMissRailId != 0, Errors.InvalidDataSetId(dataSetId)); require(info.cdnRailId != 0, Errors.InvalidDataSetId(dataSetId)); + + Payments payments = Payments(paymentsContractAddress); + + if (cacheMissAmount > 0) { + // Get current lockup and increment by the passed amount + Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); + payments.modifyRailLockup( + info.cacheMissRailId, DEFAULT_LOCKUP_PERIOD, cacheMissRail.lockupFixed + cacheMissAmount + ); + } + + if (cdnAmount > 0) { + // Get current lockup and increment by the passed amount + Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); + payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnRail.lockupFixed + cdnAmount); + } + } + + function terminateCDNService(uint256 dataSetId) external onlyFilCDNController { + // Check if CDN service is configured + require( + hasMetadataKey(dataSetMetadataKeys[dataSetId], METADATA_KEY_WITH_CDN), + Errors.FilCDNServiceNotConfigured(dataSetId) + ); + + // Check if cache miss and CDN rails are configured + DataSetInfo storage info = dataSetInfo[dataSetId]; + require(info.cacheMissRailId != 0, Errors.InvalidDataSetId(dataSetId)); + require(info.cdnRailId != 0, Errors.InvalidDataSetId(dataSetId)); Payments payments = Payments(paymentsContractAddress); payments.terminateRail(info.cacheMissRailId); payments.terminateRail(info.cdnRailId); @@ -1230,6 +1340,56 @@ contract FilecoinWarmStorageService is return false; } + /** + * @notice Gets the value for a given metadata key + * @param metadataKeys The array of metadata keys + * @param metadataValues The array of metadata values + * @param key The metadata key to look up + * @return The value associated with the key, or empty string if not found + */ + function getMetadataValue(string[] memory metadataKeys, string[] memory metadataValues, string memory key) + internal + pure + returns (string memory) + { + bytes memory keyBytes = bytes(key); + uint256 keyLength = keyBytes.length; + bytes32 keyHash = keccak256(keyBytes); + + for (uint256 i = 0; i < metadataKeys.length; i++) { + bytes memory currentKeyBytes = bytes(metadataKeys[i]); + if (currentKeyBytes.length == keyLength && keccak256(currentKeyBytes) == keyHash) { + return metadataValues[i]; + } + } + + return ""; + } + + /** + * @notice Converts a string to uint256, returns 0 if conversion fails + * @param str The string to convert + * @return The converted uint256 value + */ + function stringToUint(string memory str) internal pure returns (uint256) { + bytes memory strBytes = bytes(str); + if (strBytes.length == 0) { + return 0; + } + + uint256 result = 0; + for (uint256 i = 0; i < strBytes.length; i++) { + uint8 digit = uint8(strBytes[i]); + if (digit >= 48 && digit <= 57) { + // '0' to '9' + result = result * 10 + (digit - 48); + } else { + return 0; // Invalid character, return 0 + } + } + return result; + } + /** * @notice Deletes `key` if it exists in `metadataKeys`. * @param metadataKeys The array of metadata keys @@ -1624,9 +1784,6 @@ contract FilecoinWarmStorageService is if (info.pdpEndEpoch == 0 && railId == info.pdpRailId) { info.pdpEndEpoch = endEpoch; emit PDPPaymentTerminated(dataSetId, endEpoch, info.pdpRailId); - } else if (info.cdnEndEpoch == 0 && (railId == info.cacheMissRailId || railId == info.cdnRailId)) { - info.cdnEndEpoch = endEpoch; - emit CDNPaymentTerminated(dataSetId, endEpoch, info.cacheMissRailId, info.cdnRailId); } } } diff --git a/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol b/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol index 1be48dd1..87630283 100644 --- a/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol +++ b/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol @@ -103,7 +103,6 @@ library FilecoinWarmStorageServiceStateInternalLibrary { info.clientDataSetId = uint256(info11[7]); info.pdpEndEpoch = uint256(info11[8]); info.providerId = uint256(info11[9]); - info.cdnEndEpoch = uint256(info11[10]); } function clientDataSets(FilecoinWarmStorageService service, address payer) diff --git a/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol b/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol index 4402a832..31a27d59 100644 --- a/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol +++ b/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol @@ -99,7 +99,6 @@ library FilecoinWarmStorageServiceStateLibrary { info.clientDataSetId = uint256(info11[7]); info.pdpEndEpoch = uint256(info11[8]); info.providerId = uint256(info11[9]); - info.cdnEndEpoch = uint256(info11[10]); } function clientDataSets(FilecoinWarmStorageService service, address payer) diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index a3818516..f9a80c50 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -465,9 +465,25 @@ contract FilecoinWarmStorageServiceTest is Test { return (keys, values); } + function _getCDNMetadataKV(string memory cdnValue, string memory cacheMissRatio, string memory cdnRatio) + internal + pure + returns (string[] memory, string[] memory) + { + string[] memory keys = new string[](3); + string[] memory values = new string[](3); + keys[0] = "withCDN"; + values[0] = cdnValue; + keys[1] = "cacheMissPaymentRailLockupRatio"; + values[1] = cacheMissRatio; + keys[2] = "cdnPaymentRailLockupRatio"; + values[2] = cdnRatio; + return (keys, values); + } + function testCreateDataSetCreatesRailAndChargesFee() public { // Prepare ExtraData - withCDN key presence means CDN is enabled - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "80", "20"); // Prepare ExtraData FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -567,20 +583,20 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cacheMissRail.from, client, "From address should be client"); assertEq(cacheMissRail.to, serviceProvider, "To address should be service provider"); assertEq(cacheMissRail.operator, address(pdpServiceWithPayments), "Operator should be the PDP service"); - assertEq(cacheMissRail.validator, address(pdpServiceWithPayments), "Validator should be the PDP service"); + assertEq(cacheMissRail.validator, address(0), "Validator should be empty"); assertEq(cacheMissRail.commissionRateBps, 0, "No commission"); - assertEq(cacheMissRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); - assertEq(cacheMissRail.paymentRate, 0, "Initial payment rate should be 0"); + // assertEq(cacheMissRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); + // assertEq(cacheMissRail.paymentRate, 0, "Initial payment rate should be 0"); Payments.RailView memory cdnRail = payments.getRail(cdnRailId); assertEq(address(cdnRail.token), address(mockUSDFC), "Token should be USDFC"); assertEq(cdnRail.from, client, "From address should be client"); assertEq(cdnRail.to, filCDNBeneficiary, "To address should be FilCDNBeneficiary"); assertEq(cdnRail.operator, address(pdpServiceWithPayments), "Operator should be the PDP service"); - assertEq(cdnRail.validator, address(pdpServiceWithPayments), "Validator should be the PDP service"); + assertEq(cdnRail.validator, address(0), "Validator should be empty"); assertEq(cdnRail.commissionRateBps, 0, "No commission"); - assertEq(cdnRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); - assertEq(cdnRail.paymentRate, 0, "Initial payment rate should be 0"); + // assertEq(cdnRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); + // assertEq(cdnRail.paymentRate, 0, "Initial payment rate should be 0"); // Get account balances after creating data set (uint256 clientFundsAfter,) = getAccountInfo(mockUSDFC, client); @@ -1183,7 +1199,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "80", "20"); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1259,9 +1275,6 @@ contract FilecoinWarmStorageServiceTest is Test { FilecoinWarmStorageService.DataSetInfo memory info = viewContract.getDataSet(dataSetId); assertTrue(info.pdpEndEpoch > 0, "pdpEndEpoch should be set after termination"); console.log("PDP termination successful. PDP end epoch:", info.pdpEndEpoch); - // Check cdnEndEpoch is set - assertTrue(info.cdnEndEpoch > 0, "cdnEndEpoch should be set after termination"); - console.log("CDN termination successful. CDN end epoch:", info.cdnEndEpoch); // Check withCDN metadata is cleared (bool exists, string memory withCDN) = viewContract.getDataSetMetadata(dataSetId, "withCDN"); assertFalse(exists, "withCDN metadata should not exist after termination"); @@ -1336,7 +1349,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "80", "20"); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1429,13 +1442,8 @@ contract FilecoinWarmStorageServiceTest is Test { (bool exists, string memory withCDN) = viewContract.getDataSetMetadata(dataSetId, "withCDN"); assertFalse(exists, "withCDN metadata should not exist after termination"); assertEq(withCDN, "", "withCDN value should be cleared for dataset"); - assertTrue(info.cdnEndEpoch > 0, "cdnEndEpoch should be set after termination"); console.log("CDN service termination successful. Flag `withCDN` is cleared"); - (metadataKeys, metadataValues) = viewContract.getAllDataSetMetadata(dataSetId); - assertTrue(metadataKeys.length == 0, "Metadata keys should be empty after termination"); - assertTrue(metadataValues.length == 0, "Metadata values should be empty after termination"); - Payments.RailView memory pdpRail = payments.getRail(info.pdpRailId); Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); @@ -1446,7 +1454,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Ensure future CDN service termination reverts vm.prank(filCDNController); - vm.expectRevert(abi.encodeWithSelector(Errors.FilCDNPaymentAlreadyTerminated.selector, dataSetId)); + vm.expectRevert(abi.encodeWithSelector(Errors.FilCDNServiceNotConfigured.selector, dataSetId)); pdpServiceWithPayments.terminateCDNService(dataSetId); console.log("\n=== Test completed successfully! ==="); @@ -1456,7 +1464,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "80", "20"); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1678,10 +1686,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId1 = createDataSetForClient(sp1, client, emptyKeys, emptyValues); // Test 2: Dataset with CDN metadata - string[] memory cdnKeys = new string[](1); - string[] memory cdnValues = new string[](1); - cdnKeys[0] = "withCDN"; - cdnValues[0] = "true"; + (string[] memory cdnKeys, string[] memory cdnValues) = _getCDNMetadataKV("true", "80", "20"); uint256 dataSetId2 = createDataSetForClient(sp1, client, cdnKeys, cdnValues); // Test 3: Dataset with regular metadata @@ -1692,12 +1697,15 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId3 = createDataSetForClient(sp1, client, metaKeys, metaValues); // Test 4: Dataset with multiple metadata including CDN - string[] memory bothKeys = new string[](2); - string[] memory bothValues = new string[](2); + (string[] memory cdnKeysTemp, string[] memory cdnValuesTemp) = _getCDNMetadataKV("true", "80", "20"); + string[] memory bothKeys = new string[](cdnKeysTemp.length + 1); + string[] memory bothValues = new string[](cdnValuesTemp.length + 1); bothKeys[0] = "label"; bothValues[0] = "test"; - bothKeys[1] = "withCDN"; - bothValues[1] = "true"; + for (uint256 i = 0; i < cdnKeysTemp.length; i++) { + bothKeys[i + 1] = cdnKeysTemp[i]; + bothValues[i + 1] = cdnValuesTemp[i]; + } uint256 dataSetId4 = createDataSetForClient(sp1, client, bothKeys, bothValues); // Verify dataset with multiple metadata keys @@ -2459,14 +2467,8 @@ contract FilecoinWarmStorageServiceTest is Test { } function testEmptyStringMetadata() public { - // Create data set with empty string metadata - string[] memory metadataKeys = new string[](2); - metadataKeys[0] = "withCDN"; - metadataKeys[1] = "description"; - - string[] memory metadataValues = new string[](2); - metadataValues[0] = ""; // Empty string for withCDN - metadataValues[1] = "Test dataset"; // Non-empty for description + // Empty string for withCDN + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "80", "20"); // Create dataset using the helper function uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2634,7 +2636,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testRailTerminated_SetsPdpEndEpochAndEmitsEvent() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "80", "20"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfo memory info = viewContract.getDataSet(dataSetId); @@ -2645,41 +2647,10 @@ contract FilecoinWarmStorageServiceTest is Test { info = viewContract.getDataSet(dataSetId); assertEq(info.pdpEndEpoch, 123); - assertEq(info.cdnEndEpoch, 0); - } - - function testRailTerminated_SetsCdnEndEpochAndEmitsEvent_CdnRail() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfo memory info = viewContract.getDataSet(dataSetId); - - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.CDNPaymentTerminated(dataSetId, 123, info.cacheMissRailId, info.cdnRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.cdnRailId, address(pdpServiceWithPayments), 123); - - info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 0); - assertEq(info.cdnEndEpoch, 123); - } - - function testRailTerminated_SetsCdnEndEpochAndEmitsEvent_CacheMissRail() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfo memory info = viewContract.getDataSet(dataSetId); - - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.CDNPaymentTerminated(dataSetId, 123, info.cacheMissRailId, info.cdnRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.cacheMissRailId, address(pdpServiceWithPayments), 123); - - info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 0); - assertEq(info.cdnEndEpoch, 123); } function testRailTerminated_DoesNotOverwritePdpEndEpoch() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "80", "20"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfo memory info = viewContract.getDataSet(dataSetId); @@ -2690,40 +2661,9 @@ contract FilecoinWarmStorageServiceTest is Test { info = viewContract.getDataSet(dataSetId); assertEq(info.pdpEndEpoch, 123); - assertEq(info.cdnEndEpoch, 0); - - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.CDNPaymentTerminated(dataSetId, 321, info.cacheMissRailId, info.cdnRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.cacheMissRailId, address(pdpServiceWithPayments), 321); - - info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 123); - assertEq(info.cdnEndEpoch, 321); - } - - function testRailTerminated_DoesNotOverwriteCdnEndEpoch() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfo memory info = viewContract.getDataSet(dataSetId); - - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.CDNPaymentTerminated(dataSetId, 321, info.cacheMissRailId, info.cdnRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.cacheMissRailId, address(pdpServiceWithPayments), 321); - - info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 0); - assertEq(info.cdnEndEpoch, 321); - - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.PDPPaymentTerminated(dataSetId, 123, info.pdpRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.pdpRailId, address(pdpServiceWithPayments), 123); info = viewContract.getDataSet(dataSetId); assertEq(info.pdpEndEpoch, 123); - assertEq(info.cdnEndEpoch, 321); } // Utility diff --git a/subgraph/package-lock.json b/subgraph/package-lock.json new file mode 100644 index 00000000..96b9e166 --- /dev/null +++ b/subgraph/package-lock.json @@ -0,0 +1,5080 @@ +{ + "name": "synapse-m1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "synapse-m1", + "license": "UNLICENSED", + "dependencies": { + "@graphprotocol/graph-cli": "0.97.0", + "@graphprotocol/graph-ts": "0.37.0" + }, + "devDependencies": { + "matchstick-as": "0.6.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@chainsafe/is-ip": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.1.0.tgz", + "integrity": "sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==", + "license": "MIT" + }, + "node_modules/@chainsafe/netmask": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", + "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", + "license": "MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", + "license": "MIT" + }, + "node_modules/@float-capital/float-subgraph-uncrashable": { + "version": "0.0.0-internal-testing.5", + "resolved": "https://registry.npmjs.org/@float-capital/float-subgraph-uncrashable/-/float-subgraph-uncrashable-0.0.0-internal-testing.5.tgz", + "integrity": "sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA==", + "license": "MIT", + "dependencies": { + "@rescript/std": "9.0.0", + "graphql": "^16.6.0", + "graphql-import-node": "^0.0.5", + "js-yaml": "^4.1.0" + }, + "bin": { + "uncrashable": "bin/uncrashable" + } + }, + "node_modules/@graphprotocol/graph-cli": { + "version": "0.97.0", + "resolved": "https://registry.npmjs.org/@graphprotocol/graph-cli/-/graph-cli-0.97.0.tgz", + "integrity": "sha512-SvijthiWbQEL3HdRDf2ydc4uAUwWJfTKyiXKXkXTtimk/hXNgzf4DuqxZPVQOOq4yx5U18iOCc/TKkTI7xCNjw==", + "license": "(Apache-2.0 OR MIT)", + "dependencies": { + "@float-capital/float-subgraph-uncrashable": "0.0.0-internal-testing.5", + "@oclif/core": "4.2.8", + "@oclif/plugin-autocomplete": "^3.2.11", + "@oclif/plugin-not-found": "^3.2.29", + "@oclif/plugin-warn-if-update-available": "^3.1.24", + "@pinax/graph-networks-registry": "^0.6.5", + "@whatwg-node/fetch": "^0.10.1", + "assemblyscript": "0.19.23", + "chokidar": "4.0.3", + "debug": "4.4.0", + "docker-compose": "1.1.1", + "fs-extra": "11.3.0", + "glob": "11.0.1", + "gluegun": "5.2.0", + "graphql": "16.10.0", + "immutable": "5.0.3", + "jayson": "4.1.3", + "js-yaml": "4.1.0", + "kubo-rpc-client": "^5.0.2", + "open": "10.1.0", + "prettier": "3.5.3", + "semver": "7.7.1", + "tmp-promise": "3.0.3", + "undici": "7.4.0", + "web3-eth-abi": "4.4.1", + "yaml": "2.7.0" + }, + "bin": { + "graph": "bin/run.js" + }, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/@graphprotocol/graph-ts": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@graphprotocol/graph-ts/-/graph-ts-0.37.0.tgz", + "integrity": "sha512-3xp/sO8zFDBkX44ydGB87ow5Cyrfr/SAm/cWzIRzUVL7ROw0KUyFBG1xj4KKlMnAod7/RL99zChYquC15H4Oqg==", + "dependencies": { + "assemblyscript": "0.27.31" + } + }, + "node_modules/@graphprotocol/graph-ts/node_modules/assemblyscript": { + "version": "0.27.31", + "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.27.31.tgz", + "integrity": "sha512-Ra8kiGhgJQGZcBxjtMcyVRxOEJZX64kd+XGpjWzjcjgxWJVv+CAQO0aDBk4GQVhjYbOkATarC83mHjAVGtwPBQ==", + "license": "Apache-2.0", + "dependencies": { + "binaryen": "116.0.0-nightly.20240114", + "long": "^5.2.1" + }, + "bin": { + "asc": "bin/asc.js", + "asinit": "bin/asinit.js" + }, + "engines": { + "node": ">=16", + "npm": ">=7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/assemblyscript" + } + }, + "node_modules/@graphprotocol/graph-ts/node_modules/binaryen": { + "version": "116.0.0-nightly.20240114", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-116.0.0-nightly.20240114.tgz", + "integrity": "sha512-0GZrojJnuhoe+hiwji7QFaL3tBlJoA+KFUN7ouYSDGZLSo9CKM8swQX8n/UcbR0d1VuZKU+nhogNzv423JEu5A==", + "license": "Apache-2.0", + "bin": { + "wasm-opt": "bin/wasm-opt", + "wasm2js": "bin/wasm2js" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.2.tgz", + "integrity": "sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.16.tgz", + "integrity": "sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.0.tgz", + "integrity": "sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@inquirer/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.18.tgz", + "integrity": "sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/external-editor": "^1.0.1", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.18.tgz", + "integrity": "sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", + "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.6.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.2.tgz", + "integrity": "sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.18.tgz", + "integrity": "sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.18.tgz", + "integrity": "sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.4.tgz", + "integrity": "sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.2.2", + "@inquirer/confirm": "^5.1.16", + "@inquirer/editor": "^4.2.18", + "@inquirer/expand": "^4.0.18", + "@inquirer/input": "^4.2.2", + "@inquirer/number": "^3.0.18", + "@inquirer/password": "^4.0.18", + "@inquirer/rawlist": "^4.1.6", + "@inquirer/search": "^3.1.1", + "@inquirer/select": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.6.tgz", + "integrity": "sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.1.tgz", + "integrity": "sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.2.tgz", + "integrity": "sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", + "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@ipld/dag-cbor": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.2.4.tgz", + "integrity": "sha512-GbDWYl2fdJgkYtIJN0HY9oO0o50d1nB4EQb7uYWKUd2ztxCjxiEW3PjwGG0nqUpN1G4Cug6LX8NzbA7fKT+zfA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "cborg": "^4.0.0", + "multiformats": "^13.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-json": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.5.tgz", + "integrity": "sha512-Q4Fr3IBDEN8gkpgNefynJ4U/ZO5Kwr7WSUMBDbZx0c37t0+IwQCTM9yJh8l5L4SRFjm31MuHwniZ/kM+P7GQ3Q==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "cborg": "^4.0.0", + "multiformats": "^13.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-pb": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.5.tgz", + "integrity": "sha512-w4PZ2yPqvNmlAir7/2hsCRMqny1EY5jj26iZcSgxREJexmbAc2FI21jp26MqiNdfgAxvkCnf2N/TJI18GaDNwA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@libp2p/crypto": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.1.8.tgz", + "integrity": "sha512-zkfWd2x12E0NbSRU52Wb0A5I9v5a1uLgCauR8uuTqnC21OVznXUGkMg4A2Xoj90M98lReDHo+Khc/hlQFbJ5Vw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^2.11.0", + "@noble/curves": "^1.9.1", + "@noble/hashes": "^1.8.0", + "multiformats": "^13.3.6", + "protons-runtime": "^5.5.0", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/@libp2p/interface": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.11.0.tgz", + "integrity": "sha512-0MUFKoXWHTQW3oWIgSHApmYMUKWO/Y02+7Hpyp+n3z+geD4Xo2Rku2gYWmxcq+Pyjkz6Q9YjDWz3Yb2SoV2E8Q==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@multiformats/dns": "^1.0.6", + "@multiformats/multiaddr": "^12.4.4", + "it-pushable": "^3.2.3", + "it-stream-types": "^2.0.2", + "main-event": "^1.0.1", + "multiformats": "^13.3.6", + "progress-events": "^1.0.1", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/@libp2p/logger": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.2.0.tgz", + "integrity": "sha512-OEFS529CnIKfbWEHmuCNESw9q0D0hL8cQ8klQfjIVPur15RcgAEgc1buQ7Y6l0B6tCYg120bp55+e9tGvn8c0g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^2.11.0", + "@multiformats/multiaddr": "^12.4.4", + "interface-datastore": "^8.3.1", + "multiformats": "^13.3.6", + "weald": "^1.0.4" + } + }, + "node_modules/@libp2p/peer-id": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.1.9.tgz", + "integrity": "sha512-cVDp7lX187Epmi/zr0Qq2RsEMmueswP9eIxYSFoMcHL/qcvRFhsxOfUGB8361E26s2WJvC9sXZ0oJS9XVueJhQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/crypto": "^5.1.8", + "@libp2p/interface": "^2.11.0", + "multiformats": "^13.3.6", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/@multiformats/dns": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz", + "integrity": "sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@types/dns-packet": "^5.6.5", + "buffer": "^6.0.3", + "dns-packet": "^5.6.1", + "hashlru": "^2.3.0", + "p-queue": "^8.0.1", + "progress-events": "^1.0.0", + "uint8arrays": "^5.0.2" + } + }, + "node_modules/@multiformats/multiaddr": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz", + "integrity": "sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "@chainsafe/netmask": "^2.0.0", + "@multiformats/dns": "^1.0.3", + "abort-error": "^1.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/@multiformats/multiaddr-to-uri": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-11.0.2.tgz", + "integrity": "sha512-SiLFD54zeOJ0qMgo9xv1Tl9O5YktDKAVDP4q4hL16mSq4O4sfFNagNADz8eAofxd6TfQUzGQ3TkRRG9IY2uHRg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@multiformats/multiaddr": "^12.3.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oclif/core": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.2.8.tgz", + "integrity": "sha512-OWv4Va6bERxIhrYcnUGzyhGRqktc64lJO6cZ3UwkzJDpfR8ZrbCxRfKRBBah1i8kzUlOAeAXnpbMBMah3skKwA==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.16.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.0", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-autocomplete": { + "version": "3.2.34", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.34.tgz", + "integrity": "sha512-KhbPcNjitAU7jUojMXJ3l7duWVub0L0pEr3r3bLrpJBNuIJhoIJ7p56Ropcb7OMH2xcaz5B8HGq56cTOe1FHEg==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.16.0", + "debug": "^4.4.1", + "ejs": "^3.1.10" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-autocomplete/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@oclif/plugin-not-found": { + "version": "3.2.66", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.66.tgz", + "integrity": "sha512-f3GmQrq13egIRc8+1aiFGsGUkNCIUv8nxJodmUicCC2BV6dg+KSY/5v3DicDBdni/HisKYt92S+OelAxQiN0EQ==", + "license": "MIT", + "dependencies": { + "@inquirer/prompts": "^7.8.3", + "@oclif/core": "^4.5.2", + "ansis": "^3.17.0", + "fast-levenshtein": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found/node_modules/@oclif/core": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.5.2.tgz", + "integrity": "sha512-eQcKyrEcDYeZJKu4vUWiu0ii/1Gfev6GF4FsLSgNez5/+aQyAUCjg3ZWlurf491WiYZTXCWyKAxyPWk8DKv2MA==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.17.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.0", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "tinyglobby": "^0.2.14", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-warn-if-update-available": { + "version": "3.1.46", + "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.46.tgz", + "integrity": "sha512-YDlr//SHmC80eZrt+0wNFWSo1cOSU60RoWdhSkAoPB3pUGPSNHZDquXDpo7KniinzYPsj1rfetCYk7UVXwYu7A==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.17.0", + "debug": "^4.4.1", + "http-call": "^5.2.2", + "lodash": "^4.17.21", + "registry-auth-token": "^5.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-warn-if-update-available/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@pinax/graph-networks-registry": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@pinax/graph-networks-registry/-/graph-networks-registry-0.6.7.tgz", + "integrity": "sha512-xogeCEZ50XRMxpBwE3TZjJ8RCO8Guv39gDRrrKtlpDEDEMLm0MzD3A0SQObgj7aF7qTZNRTWzsuvQdxgzw25wQ==", + "license": "MIT" + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rescript/std": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@rescript/std/-/std-9.0.0.tgz", + "integrity": "sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==", + "license": "SEE LICENSE IN LICENSE" + }, + "node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.10.10", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.10.tgz", + "integrity": "sha512-watz4i/Vv4HpoJ+GranJ7HH75Pf+OkPQ63NoVmru6Srgc8VezTArB00i/oQlnn0KWh14gM42F22Qcc9SU9mo/w==", + "license": "MIT", + "dependencies": { + "@whatwg-node/node-fetch": "^0.7.25", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.7.25", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.25.tgz", + "integrity": "sha512-szCTESNJV+Xd56zU6ShOi/JWROxE9IwCic8o5D9z5QECZloas6Ez5tUuKqXTAdu6fHFx1t6C+5gwj8smzOLjtg==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/abitype": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", + "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=4.9.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/abort-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz", + "integrity": "sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/any-signal": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-4.1.1.tgz", + "integrity": "sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==", + "license": "Apache-2.0 OR MIT", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/apisauce": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/apisauce/-/apisauce-2.1.6.tgz", + "integrity": "sha512-MdxR391op/FucS2YQRfB/NMRyCnHEPDd4h17LRIuVYi0BpGmMhpxc0shbOpfs5ahABuBEffNCGal5EcsydbBWg==", + "license": "MIT", + "dependencies": { + "axios": "^0.21.4" + } + }, + "node_modules/app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", + "license": "BSD-2-Clause" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assemblyscript": { + "version": "0.19.23", + "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.19.23.tgz", + "integrity": "sha512-fwOQNZVTMga5KRsfY80g7cpOl4PsFQczMwHzdtgoqLXaYhkhavufKb0sB0l3T1DUxpAufA0KNhlbpuuhZUwxMA==", + "license": "Apache-2.0", + "dependencies": { + "binaryen": "102.0.0-nightly.20211028", + "long": "^5.2.0", + "source-map-support": "^0.5.20" + }, + "bin": { + "asc": "bin/asc", + "asinit": "bin/asinit" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/assemblyscript" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/binaryen": { + "version": "102.0.0-nightly.20211028", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz", + "integrity": "sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w==", + "license": "Apache-2.0", + "bin": { + "wasm-opt": "bin/wasm-opt" + } + }, + "node_modules/blob-to-it": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.10.tgz", + "integrity": "sha512-I39vO57y+LBEIcAV7fif0sn96fYOYVqrPiOD+53MxQGv4DBgt1/HHZh0BHheWx2hVe24q5LTSXxqeV1Y3Nzkgg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "browser-readablestream-to-it": "^2.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-readablestream-to-it": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.10.tgz", + "integrity": "sha512-I/9hEcRtjct8CzD9sVo9Mm4ntn0D+7tOVrjbPl69XAoOfgJ8NBdOQU+WX+5SHhcELJDb14mWt7zuvyqha+MEAQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cborg": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.2.14.tgz", + "integrity": "sha512-VwDKj4eWvoOBtMReabfiGyMh/bNFk8aXZRlMis1tTuMjN9R6VQdyrOwyQb0/aqYHk7r88a6xTWvnsJEC2Cw66Q==", + "license": "Apache-2.0", + "bin": { + "cborg": "lib/bin.js" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dag-jose": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-5.1.1.tgz", + "integrity": "sha512-9alfZ8Wh1XOOMel8bMpDqWsDT72ojFQCJPtwZSev9qh4f8GoCV9qrJW8jcOUhcstO8Kfm09FHGo//jqiZq3z9w==", + "license": "(Apache-2.0 OR MIT)", + "dependencies": { + "@ipld/dag-cbor": "^9.0.0", + "multiformats": "~13.1.3" + } + }, + "node_modules/dag-jose/node_modules/multiformats": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.3.tgz", + "integrity": "sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/docker-compose": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-1.1.1.tgz", + "integrity": "sha512-UkIUz0LtzuO17Ijm6SXMGtfZMs7IvbNwvuJBiBuN93PIhr/n9/sbJMqpvYFaCBGfwu1ZM4PPPDgQzeeke4lEoA==", + "license": "MIT", + "dependencies": { + "yaml": "^2.2.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-fetch": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", + "integrity": "sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==", + "license": "MIT", + "dependencies": { + "encoding": "^0.1.13" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-jetpack": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-4.3.1.tgz", + "integrity": "sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.2", + "rimraf": "^2.6.3" + } + }, + "node_modules/fs-jetpack/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fs-jetpack/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", + "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==", + "license": "MIT" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gluegun": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/gluegun/-/gluegun-5.2.0.tgz", + "integrity": "sha512-jSUM5xUy2ztYFQANne17OUm/oAd7qSX7EBksS9bQDt9UvLPqcEkeWUebmaposb8Tx7eTTD8uJVWGRe6PYSsYkg==", + "license": "MIT", + "dependencies": { + "apisauce": "^2.1.5", + "app-module-path": "^2.2.0", + "cli-table3": "0.6.0", + "colors": "1.4.0", + "cosmiconfig": "7.0.1", + "cross-spawn": "7.0.3", + "ejs": "3.1.8", + "enquirer": "2.3.6", + "execa": "5.1.1", + "fs-jetpack": "4.3.1", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.lowercase": "^4.3.0", + "lodash.lowerfirst": "^4.3.1", + "lodash.pad": "^4.5.1", + "lodash.padend": "^4.6.1", + "lodash.padstart": "^4.6.1", + "lodash.repeat": "^4.1.0", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.trim": "^4.5.1", + "lodash.trimend": "^4.5.1", + "lodash.trimstart": "^4.5.1", + "lodash.uppercase": "^4.3.0", + "lodash.upperfirst": "^4.3.1", + "ora": "4.0.2", + "pluralize": "^8.0.0", + "semver": "7.3.5", + "which": "2.0.2", + "yargs-parser": "^21.0.0" + }, + "bin": { + "gluegun": "bin/gluegun" + } + }, + "node_modules/gluegun/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/gluegun/node_modules/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gluegun/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gluegun/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphql": { + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", + "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-import-node": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/graphql-import-node/-/graphql-import-node-0.0.5.tgz", + "integrity": "sha512-OXbou9fqh9/Lm7vwXT0XoRN9J5+WCYKnbiTalgFDvkQERITRmcfncZs6aVABedd5B85yQU5EULS4a5pnbpuI0Q==", + "license": "MIT", + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hashlru": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", + "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-call": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.3.0.tgz", + "integrity": "sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==", + "license": "ISC", + "dependencies": { + "content-type": "^1.0.4", + "debug": "^4.1.1", + "is-retry-allowed": "^1.1.0", + "is-stream": "^2.0.0", + "parse-json": "^4.0.0", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-call/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/interface-datastore": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.2.tgz", + "integrity": "sha512-R3NLts7pRbJKc3qFdQf+u40hK8XWc0w4Qkx3OFEstC80VoaDUABY/dXA2EJPhtNC+bsrf41Ehvqb6+pnIclyRA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "interface-store": "^6.0.0", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/interface-store": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.3.tgz", + "integrity": "sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/ipfs-unixfs": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.5.tgz", + "integrity": "sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "protons-runtime": "^5.5.0", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-electron": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iso-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz", + "integrity": "sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/it-all": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.9.tgz", + "integrity": "sha512-fz1oJJ36ciGnu2LntAlE6SA97bFZpW7Rnt0uEc1yazzR2nKokZLr8lIRtgnpex4NsmaBcvHF+Z9krljWFy/mmg==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-first": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.9.tgz", + "integrity": "sha512-ZWYun273Gbl7CwiF6kK5xBtIKR56H1NoRaiJek2QzDirgen24u8XZ0Nk+jdnJSuCTPxC2ul1TuXKxu/7eK6NuA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-3.0.4.tgz", + "integrity": "sha512-73PbGBTK/dHp5PX4l8pkQH1ozCONP0U+PB3qMqltxPonRJQNomINE3Hn9p02m2GOu95VoeVvSZdHI2N+qub0pw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "fast-glob": "^3.3.3" + } + }, + "node_modules/it-last": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.9.tgz", + "integrity": "sha512-AtfUEnGDBHBEwa1LjrpGHsJMzJAWDipD6zilvhakzJcm+BCvNX8zlX2BsHClHJLLTrsY4lY9JUjc+TQV4W7m1w==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-map": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.4.tgz", + "integrity": "sha512-QB9PYQdE9fUfpVFYfSxBIyvKynUCgblb143c+ktTK6ZuKSKkp7iH58uYFzagqcJ5HcqIfn1xbfaralHWam+3fg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-peekable": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.8.tgz", + "integrity": "sha512-7IDBQKSp/dtBxXV3Fj0v3qM1jftJ9y9XrWLRIuU1X6RdKqWiN60syNwP0fiDxZD97b8SYM58dD3uklIk1TTQAw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-pushable": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", + "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-stream-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", + "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-to-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz", + "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "fast-fifo": "^1.0.0", + "get-iterator": "^1.0.2", + "p-defer": "^3.0.0", + "p-fifo": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/it-to-stream/node_modules/p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jayson": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.3.tgz", + "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", + "license": "MIT", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "uuid": "^8.3.2", + "ws": "^7.5.10" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/kubo-rpc-client": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/kubo-rpc-client/-/kubo-rpc-client-5.2.0.tgz", + "integrity": "sha512-J3ppL1xf7f27NDI9jUPGkr1QiExXLyxUTUwHUMMB1a4AZR4s6113SVXPHRYwe1pFIO3hRb5G+0SuHaxYSfhzBA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@ipld/dag-cbor": "^9.0.0", + "@ipld/dag-json": "^10.0.0", + "@ipld/dag-pb": "^4.0.0", + "@libp2p/crypto": "^5.0.0", + "@libp2p/interface": "^2.0.0", + "@libp2p/logger": "^5.0.0", + "@libp2p/peer-id": "^5.0.0", + "@multiformats/multiaddr": "^12.2.1", + "@multiformats/multiaddr-to-uri": "^11.0.0", + "any-signal": "^4.1.1", + "blob-to-it": "^2.0.5", + "browser-readablestream-to-it": "^2.0.5", + "dag-jose": "^5.0.0", + "electron-fetch": "^1.9.1", + "err-code": "^3.0.1", + "ipfs-unixfs": "^11.1.4", + "iso-url": "^1.2.1", + "it-all": "^3.0.4", + "it-first": "^3.0.4", + "it-glob": "^3.0.1", + "it-last": "^3.0.4", + "it-map": "^3.0.5", + "it-peekable": "^3.0.3", + "it-to-stream": "^1.0.0", + "merge-options": "^3.0.4", + "multiformats": "^13.1.0", + "nanoid": "^5.0.7", + "native-fetch": "^4.0.2", + "parse-duration": "^2.1.2", + "react-native-fetch-api": "^3.0.0", + "stream-to-it": "^1.0.1", + "uint8arrays": "^5.0.3", + "wherearewe": "^2.0.1" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "license": "MIT" + }, + "node_modules/lodash.lowercase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.lowercase/-/lodash.lowercase-4.3.0.tgz", + "integrity": "sha512-UcvP1IZYyDKyEL64mmrwoA1AbFu5ahojhTtkOUr1K9dbuxzS9ev8i4TxMMGCqRC9TE8uDaSoufNAXxRPNTseVA==", + "license": "MIT" + }, + "node_modules/lodash.lowerfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz", + "integrity": "sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w==", + "license": "MIT" + }, + "node_modules/lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", + "license": "MIT" + }, + "node_modules/lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", + "license": "MIT" + }, + "node_modules/lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", + "license": "MIT" + }, + "node_modules/lodash.repeat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-4.1.0.tgz", + "integrity": "sha512-eWsgQW89IewS95ZOcr15HHCX6FVDxq3f2PNUIng3fyzsPev9imFQxIYdFZ6crl8L56UR6ZlGDLcEb3RZsCSSqw==", + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "license": "MIT" + }, + "node_modules/lodash.trim": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz", + "integrity": "sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==", + "license": "MIT" + }, + "node_modules/lodash.trimend": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", + "integrity": "sha512-lsD+k73XztDsMBKPKvzHXRKFNMohTjoTKIIo4ADLn5dA65LZ1BqlAvSXhR2rPEC3BgAUQnzMnorqDtqn2z4IHA==", + "license": "MIT" + }, + "node_modules/lodash.trimstart": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz", + "integrity": "sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==", + "license": "MIT" + }, + "node_modules/lodash.uppercase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.uppercase/-/lodash.uppercase-4.3.0.tgz", + "integrity": "sha512-+Nbnxkj7s8K5U8z6KnEYPGUOGp3woZbB7Ecs7v3LkkjLQSm2kP9SKIILitN1ktn2mB/tmM9oSlku06I+/lH7QA==", + "license": "MIT" + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/main-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/main-event/-/main-event-1.0.1.tgz", + "integrity": "sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/matchstick-as": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/matchstick-as/-/matchstick-as-0.6.0.tgz", + "integrity": "sha512-E36fWsC1AbCkBFt05VsDDRoFvGSdcZg6oZJrtIe/YDBbuFh8SKbR5FcoqDhNWqSN+F7bN/iS2u8Md0SM+4pUpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "wabt": "1.0.24" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multiformats": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.0.tgz", + "integrity": "sha512-Mkb/QcclrJxKC+vrcIFl297h52QcKh2Az/9A5vbWytbQt4225UWWWmIuSsKksdww9NkIeYcA7DkfftyLuC/JSg==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/native-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", + "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", + "license": "MIT", + "peerDependencies": { + "undici": "*" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz", + "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-defer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-fifo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", + "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.0.0", + "p-defer": "^3.0.0" + } + }, + "node_modules/p-fifo/node_modules/p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-queue": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-duration": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", + "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/progress-events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", + "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/protons-runtime": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.6.0.tgz", + "integrity": "sha512-/Kde+sB9DsMFrddJT/UZWe6XqvL7SL5dbag/DBCElFKhkwDj7XKt53S+mzLyaDP5OqS0wXjV5SA572uWDaT0Hg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8-varint": "^2.0.2", + "uint8arraylist": "^2.4.3", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-native-fetch-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz", + "integrity": "sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==", + "license": "MIT", + "dependencies": { + "p-defer": "^3.0.0" + } + }, + "node_modules/react-native-fetch-api/node_modules/p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stream-to-it": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-1.0.1.tgz", + "integrity": "sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-stream-types": "^2.0.1" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uint8-varint": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/uint8arraylist": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", + "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^5.0.1" + } + }, + "node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/undici": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.4.0.tgz", + "integrity": "sha512-PUQM3/es3noM24oUn10u3kNNap0AbxESOmnssmW+dOi9yGwlUSi5nTNYl3bNbTkWOF8YZDkx2tCmj9OtQ3iGGw==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "license": "MIT" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/wabt": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/wabt/-/wabt-1.0.24.tgz", + "integrity": "sha512-8l7sIOd3i5GWfTWciPL0+ff/FK/deVK2Q6FN+MPz4vfUcD78i2M/49XJTwF6aml91uIiuXJEsLKWMB2cw/mtKg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "wasm-decompile": "bin/wasm-decompile", + "wasm-interp": "bin/wasm-interp", + "wasm-objdump": "bin/wasm-objdump", + "wasm-opcodecnt": "bin/wasm-opcodecnt", + "wasm-strip": "bin/wasm-strip", + "wasm-validate": "bin/wasm-validate", + "wasm2c": "bin/wasm2c", + "wasm2wat": "bin/wasm2wat", + "wat2wasm": "bin/wat2wasm" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/weald": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.6.tgz", + "integrity": "sha512-sX1PzkcMJZUJ848JbFzB6aKHHglTxqACEnq2KgI75b7vWYvfXFBNbOuDKqFKwCT44CrP6c5r+L4+5GmPnb5/SQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "ms": "^3.0.0-canary.1", + "supports-color": "^10.0.0" + } + }, + "node_modules/weald/node_modules/ms": { + "version": "3.0.0-canary.202508261828", + "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.202508261828.tgz", + "integrity": "sha512-NotsCoUCIUkojWCzQff4ttdCfIPoA1UGZsyQbi7KmqkNRfKCrvga8JJi2PknHymHOuor0cJSn/ylj52Cbt2IrQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/weald/node_modules/supports-color": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.0.tgz", + "integrity": "sha512-5eG9FQjEjDbAlI5+kdpdyPIBMRH4GfTVDGREVupaZHmVoppknhM29b/S9BkQz7cathp85BVgRi/As3Siln7e0Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/web3-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.1.tgz", + "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-types": "^1.10.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.1.tgz", + "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", + "license": "LGPL-3.0", + "dependencies": { + "abitype": "0.7.1", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-types": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.10.0.tgz", + "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.3.tgz", + "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", + "license": "LGPL-3.0", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "eventemitter3": "^5.0.1", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", + "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", + "license": "LGPL-3.0", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "util": "^0.12.5", + "web3-errors": "^1.2.0", + "web3-types": "^1.6.0", + "zod": "^3.21.4" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/wherearewe": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-2.0.1.tgz", + "integrity": "sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "is-electron": "^2.2.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/subgraph/schema.graphql b/subgraph/schema.graphql index 5af3e3fb..982ba891 100644 --- a/subgraph/schema.graphql +++ b/subgraph/schema.graphql @@ -8,7 +8,6 @@ type DataSet @entity(immutable: false) { serviceProvider: Provider! # address withCDN: Boolean! pdpEndEpoch: BigInt! - cdnEndEpoch: BigInt! leafCount: BigInt! # uint256 challengeRange: BigInt! # uint256 isActive: Boolean! diff --git a/subgraph/src/filecoin-warm-storage-service.ts b/subgraph/src/filecoin-warm-storage-service.ts index 4041a590..48b62b5f 100644 --- a/subgraph/src/filecoin-warm-storage-service.ts +++ b/subgraph/src/filecoin-warm-storage-service.ts @@ -290,7 +290,6 @@ export function handleDataSetCreated(event: DataSetCreatedEvent): void { dataSet.withCDN = withCDN; dataSet.isActive = true; dataSet.pdpEndEpoch = BIGINT_ZERO; - dataSet.cdnEndEpoch = BIGINT_ZERO; dataSet.leafCount = BIGINT_ZERO; dataSet.challengeRange = BIGINT_ZERO; dataSet.lastProvenEpoch = BIGINT_ZERO; @@ -625,7 +624,6 @@ export function handleCDNPaymentTerminated(event: CDNPaymentTerminatedEvent): vo } if (dataSet) { dataSet.isActive = false; - dataSet.cdnEndEpoch = endEpoch; dataSet.save(); } } From a605965a02aa525b9275dece930c7c97579a8356 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Mon, 29 Sep 2025 13:42:47 +0200 Subject: [PATCH 02/31] Update CDN payment rail configuration to use absolute lockup values - Replace percentage-based lockup ratios with absolute lockup values - Remove cdnEndEpoch field from DataSetInfo as CDN rails don't track termination - Update metadata keys from ratio to value naming convention - Modify lockup calculation to use provided values directly instead of percentage calculations - Update test cases to use absolute values instead of percentages - Add validation for empty lockup value strings - Support asymmetric and zero lockup values for flexible CDN configuration --- service_contracts/foundry.lock | 20 ++ .../src/FilecoinWarmStorageService.sol | 39 ++-- ...WarmStorageServiceStateInternalLibrary.sol | 2 +- ...FilecoinWarmStorageServiceStateLibrary.sol | 2 +- .../test/FilecoinWarmStorageService.t.sol | 212 ++++++++++++------ 5 files changed, 184 insertions(+), 91 deletions(-) create mode 100644 service_contracts/foundry.lock diff --git a/service_contracts/foundry.lock b/service_contracts/foundry.lock new file mode 100644 index 00000000..4c0c802c --- /dev/null +++ b/service_contracts/foundry.lock @@ -0,0 +1,20 @@ +{ + "lib/forge-std": { + "rev": "f46d8301cf732f4f83846565aa475628265e51e0" + }, + "lib/fws-payments": { + "rev": "477228d2d1e93bf7b2aa7e24018e88994806ddba" + }, + "lib/openzeppelin-contracts": { + "rev": "a6ae04acf8e38ed49a70fdce5389df2752e3ecc4" + }, + "lib/openzeppelin-contracts-upgradeable": { + "rev": "3bfc52f2fbf5be95de632f346169dac6a669bd57" + }, + "lib/pdp": { + "rev": "61681392933926fbccb142ab7767e037680850b4" + }, + "lib/session-key-registry": { + "rev": "e472ca2b525fb2396832216182b64a0c165cb49c" + } +} \ No newline at end of file diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index d4700d46..161d920b 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -120,7 +120,6 @@ contract FilecoinWarmStorageService is uint256 clientDataSetId; // ClientDataSetID uint256 pdpEndEpoch; // 0 if PDP rail are not terminated uint256 providerId; // Provider ID from the ServiceProviderRegistry - uint256 cdnEndEpoch; // 0 if CDN rails are not terminated uint256 dataSetId; // DataSet ID } @@ -158,8 +157,8 @@ contract FilecoinWarmStorageService is // Metadata key constants string private constant METADATA_KEY_WITH_CDN = "withCDN"; - string private constant METADATA_KEY_CACHE_MISS_PAYMENT_RAIL_LOCKUP_RATIO = "cacheMissPaymentRailLockupRatio"; - string private constant METADATA_KEY_CDN_PAYMENT_RAIL_LOCKUP_RATIO = "cdnPaymentRailLockupRatio"; + string private constant METADATA_KEY_CACHE_MISS_PAYMENT_RAIL_LOCKUP_VALUE = "cacheMissPaymentRailLockupValue"; + string private constant METADATA_KEY_CDN_PAYMENT_RAIL_LOCKUP_VALUE = "cdnPaymentRailLockupValue"; // Pricing constants uint256 private immutable STORAGE_PRICE_PER_TIB_PER_MONTH; // 2.5 USDFC per TiB per month without CDN with correct decimals @@ -589,25 +588,21 @@ contract FilecoinWarmStorageService is uint256 cdnRailId = 0; if (hasMetadataKey(createData.metadataKeys, METADATA_KEY_WITH_CDN)) { - // Get cache-miss and CDN ratios from metadata (as percentages 0-100) - string memory cacheMissPaymentRailLockupRatioStr = getMetadataValue( - createData.metadataKeys, createData.metadataValues, METADATA_KEY_CACHE_MISS_PAYMENT_RAIL_LOCKUP_RATIO + // Get cache-miss and CDN lockup values from metadata + string memory cacheMissPaymentRailLockupValueStr = getMetadataValue( + createData.metadataKeys, createData.metadataValues, METADATA_KEY_CACHE_MISS_PAYMENT_RAIL_LOCKUP_VALUE ); - string memory cdnPaymentRailLockupRatioStr = getMetadataValue( - createData.metadataKeys, createData.metadataValues, METADATA_KEY_CDN_PAYMENT_RAIL_LOCKUP_RATIO + string memory cdnPaymentRailLockupValueStr = getMetadataValue( + createData.metadataKeys, createData.metadataValues, METADATA_KEY_CDN_PAYMENT_RAIL_LOCKUP_VALUE ); - uint256 cacheMissPaymentRailLockupRatio = stringToUint(cacheMissPaymentRailLockupRatioStr); - uint256 cdnPaymentRailLockupRatio = stringToUint(cdnPaymentRailLockupRatioStr); + uint256 cacheMissPaymentRailLockupValue = stringToUint(cacheMissPaymentRailLockupValueStr); + uint256 cdnPaymentRailLockupValue = stringToUint(cdnPaymentRailLockupValueStr); - // Validate ratios are provided and sum to 100% + // Validate lockup values are provided require( - cacheMissPaymentRailLockupRatio > 0 && cdnPaymentRailLockupRatio > 0, - "Cache-miss and CDN lockup ratios must be provided" - ); - require( - cacheMissPaymentRailLockupRatio + cdnPaymentRailLockupRatio == 100, - "Cache-miss and CDN lockup ratios must sum to 100%" + bytes(cacheMissPaymentRailLockupValueStr).length > 0 && bytes(cdnPaymentRailLockupValueStr).length > 0, + "Cache-miss and CDN lockup values must be provided" ); cacheMissRailId = payments.createRail( @@ -620,9 +615,8 @@ contract FilecoinWarmStorageService is ); info.cacheMissRailId = cacheMissRailId; railToDataSet[cacheMissRailId] = dataSetId; - // Set lockup based on cache-miss ratio percentage of monthly usage estimate - uint256 cacheMissLockup = (CACHE_MISS_PRICE_PER_TIB_PER_MONTH * cacheMissPaymentRailLockupRatio) / 100; - payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, cacheMissLockup); + // Set lockup using the provided cache-miss lockup value + payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, cacheMissPaymentRailLockupValue); cdnRailId = payments.createRail( usdfcTokenAddress, // token address @@ -634,9 +628,8 @@ contract FilecoinWarmStorageService is ); info.cdnRailId = cdnRailId; railToDataSet[cdnRailId] = dataSetId; - // Set lockup based on CDN ratio percentage of monthly usage estimate - uint256 cdnLockup = (CDN_PRICE_PER_TIB_PER_MONTH * cdnPaymentRailLockupRatio) / 100; - payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnLockup); + // Set lockup using the provided CDN lockup value + payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnPaymentRailLockupValue); } // Emit event for tracking diff --git a/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol b/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol index 313741be..aa4aae85 100644 --- a/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol +++ b/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol @@ -108,7 +108,7 @@ library FilecoinWarmStorageServiceStateInternalLibrary { info.clientDataSetId = uint256(info11[7]); info.pdpEndEpoch = uint256(info11[8]); info.providerId = uint256(info11[9]); - info.cdnEndEpoch = uint256(info11[10]); + // cdnEndEpoch field removed - CDN rails don't track endEpoch info.dataSetId = dataSetId; } diff --git a/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol b/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol index bfb43a9e..6a03ba34 100644 --- a/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol +++ b/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol @@ -104,7 +104,7 @@ library FilecoinWarmStorageServiceStateLibrary { info.clientDataSetId = uint256(info11[7]); info.pdpEndEpoch = uint256(info11[8]); info.providerId = uint256(info11[9]); - info.cdnEndEpoch = uint256(info11[10]); + // cdnEndEpoch field removed - CDN rails don't track endEpoch info.dataSetId = dataSetId; } diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index f151f3ae..eae78b47 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -462,7 +462,7 @@ contract FilecoinWarmStorageServiceTest is Test { return (keys, values); } - function _getCDNMetadataKV(string memory cdnValue, string memory cacheMissRatio, string memory cdnRatio) + function _getCDNMetadataKV(string memory cdnValue, string memory cacheMissLockupValue, string memory cdnLockupValue) internal pure returns (string[] memory, string[] memory) @@ -471,16 +471,16 @@ contract FilecoinWarmStorageServiceTest is Test { string[] memory values = new string[](3); keys[0] = "withCDN"; values[0] = cdnValue; - keys[1] = "cacheMissPaymentRailLockupRatio"; - values[1] = cacheMissRatio; - keys[2] = "cdnPaymentRailLockupRatio"; - values[2] = cdnRatio; + keys[1] = "cacheMissPaymentRailLockupValue"; + values[1] = cacheMissLockupValue; + keys[2] = "cdnPaymentRailLockupValue"; + values[2] = cdnLockupValue; return (keys, values); } function testCreateDataSetCreatesRailAndChargesFee() public { // Prepare ExtraData - withCDN key presence means CDN is enabled - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "80", "20"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); // Prepare ExtraData FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1196,7 +1196,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "80", "20"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1346,7 +1346,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "80", "20"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "400000", "100000"); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1461,7 +1461,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "80", "20"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "400000", "100000"); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1683,7 +1683,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId1 = createDataSetForClient(sp1, client, emptyKeys, emptyValues); // Test 2: Dataset with CDN metadata - (string[] memory cdnKeys, string[] memory cdnValues) = _getCDNMetadataKV("true", "80", "20"); + (string[] memory cdnKeys, string[] memory cdnValues) = _getCDNMetadataKV("true", "400000", "100000"); uint256 dataSetId2 = createDataSetForClient(sp1, client, cdnKeys, cdnValues); // Test 3: Dataset with regular metadata @@ -1694,7 +1694,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId3 = createDataSetForClient(sp1, client, metaKeys, metaValues); // Test 4: Dataset with multiple metadata including CDN - (string[] memory cdnKeysTemp, string[] memory cdnValuesTemp) = _getCDNMetadataKV("true", "80", "20"); + (string[] memory cdnKeysTemp, string[] memory cdnValuesTemp) = _getCDNMetadataKV("true", "400000", "100000"); string[] memory bothKeys = new string[](cdnKeysTemp.length + 1); string[] memory bothValues = new string[](cdnValuesTemp.length + 1); bothKeys[0] = "label"; @@ -2465,7 +2465,7 @@ contract FilecoinWarmStorageServiceTest is Test { function testEmptyStringMetadata() public { // Empty string for withCDN - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "80", "20"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "400000", "100000"); // Create dataset using the helper function uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2633,7 +2633,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testRailTerminated_SetsPdpEndEpochAndEmitsEvent() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "80", "20"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2644,84 +2644,164 @@ contract FilecoinWarmStorageServiceTest is Test { info = viewContract.getDataSet(dataSetId); assertEq(info.pdpEndEpoch, 123); - assertEq(info.cdnEndEpoch, 0); + // CDN rails don't track endEpoch in DataSetInfo } - function testRailTerminated_SetsCdnEndEpochAndEmitsEvent_CdnRail() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + function testRailTerminated_DoesNotOverwritePdpEndEpoch() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.CDNPaymentTerminated(dataSetId, 123, info.cacheMissRailId, info.cdnRailId); + emit FilecoinWarmStorageService.PDPPaymentTerminated(dataSetId, 123, info.pdpRailId); vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.cdnRailId, address(pdpServiceWithPayments), 123); + pdpServiceWithPayments.railTerminated(info.pdpRailId, address(pdpServiceWithPayments), 123); info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 0); - assertEq(info.cdnEndEpoch, 123); - } - - function testRailTerminated_SetsCdnEndEpochAndEmitsEvent_CacheMissRail() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + assertEq(info.pdpEndEpoch, 123); - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.CDNPaymentTerminated(dataSetId, 123, info.cacheMissRailId, info.cdnRailId); vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.cacheMissRailId, address(pdpServiceWithPayments), 123); + pdpServiceWithPayments.railTerminated(info.pdpRailId, address(pdpServiceWithPayments), 321); info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 0); - assertEq(info.cdnEndEpoch, 123); + assertEq(info.pdpEndEpoch, 123); } - function testRailTerminated_DoesNotOverwritePdpEndEpoch() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "80", "20"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + function testCreateDataSetWithCDN_EmptyLockupValues() public { + // Test with empty lockup values should fail + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "", "100000"); - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.PDPPaymentTerminated(dataSetId, 123, info.pdpRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.pdpRailId, address(pdpServiceWithPayments), 123); + FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ + payer: client, + metadataKeys: metadataKeys, + metadataValues: metadataValues, + signature: FAKE_SIGNATURE + }); - info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 123); - assertEq(info.cdnEndEpoch, 0); + extraData = + abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.CDNPaymentTerminated(dataSetId, 321, info.cacheMissRailId, info.cdnRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.cacheMissRailId, address(pdpServiceWithPayments), 321); + vm.startPrank(client); + payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 1000e6, 1000e6, 365 days); + uint256 depositAmount = 1e6; + mockUSDFC.approve(address(payments), depositAmount); + payments.deposit(mockUSDFC, client, depositAmount); + vm.stopPrank(); - info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 123); - assertEq(info.cdnEndEpoch, 321); + makeSignaturePass(client); + vm.startPrank(serviceProvider); + vm.expectRevert("Cache-miss and CDN lockup values must be provided"); + mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); + vm.stopPrank(); } - function testRailTerminated_DoesNotOverwriteCdnEndEpoch() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + function testCreateDataSetWithCDN_ZeroLockupValues() public { + // Test with zero lockup values (should be allowed) + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "0", "0"); - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.CDNPaymentTerminated(dataSetId, 321, info.cacheMissRailId, info.cdnRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.cacheMissRailId, address(pdpServiceWithPayments), 321); + FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ + payer: client, + metadataKeys: metadataKeys, + metadataValues: metadataValues, + signature: FAKE_SIGNATURE + }); - info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 0); - assertEq(info.cdnEndEpoch, 321); + extraData = + abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); - vm.expectEmit(true, true, true, true); - emit FilecoinWarmStorageService.PDPPaymentTerminated(dataSetId, 123, info.pdpRailId); - vm.prank(address(payments)); - pdpServiceWithPayments.railTerminated(info.pdpRailId, address(pdpServiceWithPayments), 123); + vm.startPrank(client); + payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 1000e6, 1000e6, 365 days); + uint256 depositAmount = 1e6; + mockUSDFC.approve(address(payments), depositAmount); + payments.deposit(mockUSDFC, client, depositAmount); + vm.stopPrank(); - info = viewContract.getDataSet(dataSetId); - assertEq(info.pdpEndEpoch, 123); + makeSignaturePass(client); + vm.startPrank(serviceProvider); + uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); + vm.stopPrank(); + + // Verify CDN rails were created with zero lockup + FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); + assertTrue(dataSet.cacheMissRailId > 0, "Cache Miss Rail ID should be non-zero"); + assertTrue(dataSet.cdnRailId > 0, "CDN Rail ID should be non-zero"); + + // Verify lockup amounts are set to zero + Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); + Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); + assertEq(cacheMissRail.lockupFixed, 0, "Cache miss lockup should be zero"); + assertEq(cdnRail.lockupFixed, 0, "CDN lockup should be zero"); + } + + function testCreateDataSetWithCDN_LargeAsymmetricLockupValues() public { + // Test with very different lockup values (should be allowed) + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "1000000", "50000"); + + FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ + payer: client, + metadataKeys: metadataKeys, + metadataValues: metadataValues, + signature: FAKE_SIGNATURE + }); + + extraData = + abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); + + vm.startPrank(client); + payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 2000e6, 2000e6, 365 days); + uint256 depositAmount = 2e6; + mockUSDFC.approve(address(payments), depositAmount); + payments.deposit(mockUSDFC, client, depositAmount); + vm.stopPrank(); + + makeSignaturePass(client); + vm.startPrank(serviceProvider); + uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); + vm.stopPrank(); + + // Verify CDN rails were created with specified lockup values + FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); + Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); + Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); + assertEq(cacheMissRail.lockupFixed, 1000000, "Cache miss lockup should match specified value"); + assertEq(cdnRail.lockupFixed, 50000, "CDN lockup should match specified value"); + } + + function testCreateDataSetWithCDN_VerifyPaymentRailValidatorConfiguration() public { + // Test that CDN payment rails are created with no validator (address(0)) + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + + FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ + payer: client, + metadataKeys: metadataKeys, + metadataValues: metadataValues, + signature: FAKE_SIGNATURE + }); + + extraData = + abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); + + vm.startPrank(client); + payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 1000e6, 1000e6, 365 days); + uint256 depositAmount = 1e6; + mockUSDFC.approve(address(payments), depositAmount); + payments.deposit(mockUSDFC, client, depositAmount); + vm.stopPrank(); + + makeSignaturePass(client); + vm.startPrank(serviceProvider); + uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); + vm.stopPrank(); + + // Verify PDP rail has validator (this contract) while CDN rails have no validator + FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); + Payments.RailView memory pdpRail = payments.getRail(dataSet.pdpRailId); + Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); + Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); + + assertEq(pdpRail.validator, address(pdpServiceWithPayments), "PDP rail should have this contract as validator"); + assertEq(cacheMissRail.validator, address(0), "Cache miss rail should have no validator"); + assertEq(cdnRail.validator, address(0), "CDN rail should have no validator"); } // Utility From 95e7c49fa90ae092d617e3f7ab262ab91a322a01 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Mon, 29 Sep 2025 14:02:45 +0200 Subject: [PATCH 03/31] Merge settleCDNPaymentRail and settleCacheMissPaymentRail into single settleCDNPaymentRails method - Combine two separate settlement methods into one with signature: settleCDNPaymentRails(uint256 dataSetId, uint256 cdnAmount, uint256 cacheMissAmount) - Consolidates validation logic and reduces code duplication - Maintains all access control and validation requirements - Add comprehensive test coverage with 13 test cases covering success scenarios, access control, validation errors, event emission, and payment processing --- .../src/FilecoinWarmStorageService.sol | 32 +-- .../test/FilecoinWarmStorageService.t.sol | 183 ++++++++++++++++++ 2 files changed, 190 insertions(+), 25 deletions(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 161d920b..fb5c6978 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -1012,8 +1012,12 @@ contract FilecoinWarmStorageService is * @dev Only callable by FilCDN (Operator) contract * @param dataSetId The ID of the data set * @param cdnAmount Amount to settle for CDN rail + * @param cacheMissAmount Amount to settle for cache miss rail */ - function settleCDNPaymentRail(uint256 dataSetId, uint256 cdnAmount) external onlyFilCDNController { + function settleCDNPaymentRails(uint256 dataSetId, uint256 cdnAmount, uint256 cacheMissAmount) + external + onlyFilCDNController + { DataSetInfo storage info = dataSetInfo[dataSetId]; require(info.pdpRailId != 0, Errors.InvalidDataSetId(dataSetId)); @@ -1023,36 +1027,14 @@ contract FilecoinWarmStorageService is Errors.FilCDNServiceNotConfigured(dataSetId) ); - // Check if CDN rails is configured - require(info.cdnRailId != 0, Errors.InvalidDataSetId(dataSetId)); + // Check if CDN rails are configured + require(info.cdnRailId != 0 && info.cacheMissRailId != 0, Errors.InvalidDataSetId(dataSetId)); Payments payments = Payments(paymentsContractAddress); if (cdnAmount > 0) { payments.modifyRailPayment(info.cdnRailId, 0, cdnAmount); } - } - - /** - * @notice Settles CDN payment rails with specified amounts - * @dev Only callable by FilCDN (Operator) contract - * @param dataSetId The ID of the data set - * @param cacheMissAmount Amount to settle for cache miss rail - */ - function settleCacheMissPaymentRail(uint256 dataSetId, uint256 cacheMissAmount) external onlyFilCDNController { - DataSetInfo storage info = dataSetInfo[dataSetId]; - require(info.pdpRailId != 0, Errors.InvalidDataSetId(dataSetId)); - - // Check if CDN service is configured - require( - hasMetadataKey(dataSetMetadataKeys[dataSetId], METADATA_KEY_WITH_CDN), - Errors.FilCDNServiceNotConfigured(dataSetId) - ); - - // Check if cache miss rail is configured - require(info.cacheMissRailId != 0, Errors.InvalidDataSetId(dataSetId)); - - Payments payments = Payments(paymentsContractAddress); if (cacheMissAmount > 0) { payments.modifyRailPayment(info.cacheMissRailId, 0, cacheMissAmount); diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index eae78b47..cce32fa3 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -96,6 +96,8 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 commissionRateBps ); + event RailOneTimePaymentProcessed(uint256 indexed railId, uint256 netPayeeAmount, uint256 operatorCommission); + // Service provider change event to verify event DataSetServiceProviderChanged( uint256 indexed dataSetId, address indexed oldServiceProvider, address indexed newServiceProvider @@ -2804,6 +2806,187 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cdnRail.validator, address(0), "CDN rail should have no validator"); } + // Tests for settleCDNPaymentRails function + function testSettleCDNPaymentRails_BothAmounts() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); + + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_OnlyCdnAmount() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + uint256 cdnAmount = 75000; + uint256 cacheMissAmount = 0; + + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); + + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_OnlyCacheMissAmount() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + uint256 cdnAmount = 0; + uint256 cacheMissAmount = 30000; + + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); + + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_ZeroAmounts() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 0, 0); + } + + function testSettleCDNPaymentRails_OnlyFilCDNController() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + } + + function testSettleCDNPaymentRails_RevertIfNotController() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + vm.expectRevert(abi.encodeWithSelector(Errors.OnlyFilCDNControllerAllowed.selector, filCDNController, client)); + vm.prank(client); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + + vm.expectRevert(abi.encodeWithSelector(Errors.OnlyFilCDNControllerAllowed.selector, filCDNController, sp1)); + vm.prank(sp1); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + } + + function testSettleCDNPaymentRails_InvalidDataSetId() public { + uint256 invalidDataSetId = 999999; + + vm.expectRevert(abi.encodeWithSelector(Errors.InvalidDataSetId.selector, invalidDataSetId)); + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(invalidDataSetId, 50000, 25000); + } + + function testSettleCDNPaymentRails_DataSetWithoutCDN() public { + string[] memory emptyKeys = new string[](0); + string[] memory emptyValues = new string[](0); + uint256 dataSetId = createDataSetForClient(sp1, client, emptyKeys, emptyValues); + + vm.expectRevert(abi.encodeWithSelector(Errors.FilCDNServiceNotConfigured.selector, dataSetId)); + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + } + + function testSettleCDNPaymentRails_DataSetWithEmptyCDNMetadata() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + // Empty CDN metadata still creates CDN rails, so this should succeed + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + } + + function testSettleCDNPaymentRails_EmitsCorrectEvents() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + uint256 cdnAmount = 100000; + uint256 cacheMissAmount = 50000; + + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); + + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_NoEventsForZeroAmounts() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + vm.recordLogs(); + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 0, 0); + + Vm.Log[] memory logs = vm.getRecordedLogs(); + for (uint256 i = 0; i < logs.length; i++) { + assertFalse( + logs[i].topics[0] == keccak256("RailOneTimePaymentProcessed(uint256,uint256,uint256)"), + "RailOneTimePaymentProcessed should not be emitted for zero amounts" + ); + } + } + + function testSettleCDNPaymentRails_ProcessesPaymentsCorrectly() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + uint256 cdnAmount = 75000; + uint256 cacheMissAmount = 35000; + + Payments.RailView memory cdnRailBefore = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRailBefore = payments.getRail(info.cacheMissRailId); + + assertEq(cdnRailBefore.paymentRate, 0, "CDN rail payment rate should be 0"); + assertEq(cacheMissRailBefore.paymentRate, 0, "Cache miss rail payment rate should be 0"); + + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + + Payments.RailView memory cdnRailAfter = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRailAfter = payments.getRail(info.cacheMissRailId); + + assertEq(cdnRailAfter.paymentRate, 0, "CDN rail payment rate should remain 0 after settlement"); + assertEq(cacheMissRailAfter.paymentRate, 0, "Cache miss rail payment rate should remain 0 after settlement"); + } + + function testSettleCDNPaymentRails_HandlesMaxLockupAmounts() public { + // Create dataset with large lockup values to test larger settlements + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + // Use amounts that don't exceed the lockup values (400000 and 100000) + uint256 maxCacheMissAmount = 400000; // Matches cache miss lockup value + uint256 maxCdnAmount = 100000; // Matches CDN lockup value + + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cdnRailId, maxCdnAmount, 0); + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cacheMissRailId, maxCacheMissAmount, 0); + + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, maxCdnAmount, maxCacheMissAmount); + } + // Utility function _makeStringOfLength(uint256 len) internal pure returns (string memory s) { s = string(_makeBytesOfLength(len)); From f420cd269191bccb90820ec62859715074d7a0ec Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Mon, 29 Sep 2025 14:30:04 +0200 Subject: [PATCH 04/31] Update ABI --- .../abi/FilecoinWarmStorageService.abi.json | 93 +++++++++---------- ...oinWarmStorageServiceStateLibrary.abi.json | 10 -- ...lecoinWarmStorageServiceStateView.abi.json | 10 -- 3 files changed, 46 insertions(+), 67 deletions(-) diff --git a/service_contracts/abi/FilecoinWarmStorageService.abi.json b/service_contracts/abi/FilecoinWarmStorageService.abi.json index 558478d6..4194d24d 100644 --- a/service_contracts/abi/FilecoinWarmStorageService.abi.json +++ b/service_contracts/abi/FilecoinWarmStorageService.abi.json @@ -679,6 +679,29 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "settleCDNPaymentRails", + "inputs": [ + { + "name": "dataSetId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "cdnAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "cacheMissAmount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "storageProviderChanged", @@ -733,6 +756,29 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "topUpCDNPaymentRails", + "inputs": [ + { + "name": "dataSetId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "cdnAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "cacheMissAmount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "transferFilCDNController", @@ -872,37 +918,6 @@ ], "stateMutability": "view" }, - { - "type": "event", - "name": "CDNPaymentTerminated", - "inputs": [ - { - "name": "dataSetId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "endEpoch", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "cacheMissRailId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "cdnRailId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, { "type": "event", "name": "CDNServiceTerminated", @@ -1562,17 +1577,6 @@ "name": "FailedCall", "inputs": [] }, - { - "type": "error", - "name": "FilCDNPaymentAlreadyTerminated", - "inputs": [ - { - "name": "dataSetId", - "type": "uint256", - "internalType": "uint256" - } - ] - }, { "type": "error", "name": "FilCDNServiceNotConfigured", @@ -1931,11 +1935,6 @@ "name": "pdpEndEpoch", "type": "uint256", "internalType": "uint256" - }, - { - "name": "cdnEndEpoch", - "type": "uint256", - "internalType": "uint256" } ] }, diff --git a/service_contracts/abi/FilecoinWarmStorageServiceStateLibrary.abi.json b/service_contracts/abi/FilecoinWarmStorageServiceStateLibrary.abi.json index 387caaad..62930520 100644 --- a/service_contracts/abi/FilecoinWarmStorageServiceStateLibrary.abi.json +++ b/service_contracts/abi/FilecoinWarmStorageServiceStateLibrary.abi.json @@ -251,11 +251,6 @@ "type": "uint256", "internalType": "uint256" }, - { - "name": "cdnEndEpoch", - "type": "uint256", - "internalType": "uint256" - }, { "name": "dataSetId", "type": "uint256", @@ -337,11 +332,6 @@ "type": "uint256", "internalType": "uint256" }, - { - "name": "cdnEndEpoch", - "type": "uint256", - "internalType": "uint256" - }, { "name": "dataSetId", "type": "uint256", diff --git a/service_contracts/abi/FilecoinWarmStorageServiceStateView.abi.json b/service_contracts/abi/FilecoinWarmStorageServiceStateView.abi.json index 66d3dbe1..49720afb 100644 --- a/service_contracts/abi/FilecoinWarmStorageServiceStateView.abi.json +++ b/service_contracts/abi/FilecoinWarmStorageServiceStateView.abi.json @@ -219,11 +219,6 @@ "type": "uint256", "internalType": "uint256" }, - { - "name": "cdnEndEpoch", - "type": "uint256", - "internalType": "uint256" - }, { "name": "dataSetId", "type": "uint256", @@ -300,11 +295,6 @@ "type": "uint256", "internalType": "uint256" }, - { - "name": "cdnEndEpoch", - "type": "uint256", - "internalType": "uint256" - }, { "name": "dataSetId", "type": "uint256", From 89dd069e9c487e079ca76e61789602388a205fc9 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Mon, 29 Sep 2025 14:33:13 +0200 Subject: [PATCH 05/31] Check cdn lockup numeric values instead of stings --- service_contracts/src/FilecoinWarmStorageService.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index fb5c6978..3f3d9084 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -601,7 +601,7 @@ contract FilecoinWarmStorageService is // Validate lockup values are provided require( - bytes(cacheMissPaymentRailLockupValueStr).length > 0 && bytes(cdnPaymentRailLockupValueStr).length > 0, + cacheMissPaymentRailLockupValue > 0 && cdnPaymentRailLockupValue > 0, "Cache-miss and CDN lockup values must be provided" ); From 39a3d029cb28e16810e3fd700e5b869ccd52dab2 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Tue, 30 Sep 2025 16:39:25 +0200 Subject: [PATCH 06/31] Remove CDN lockup metadata keys and set default lockup to 0 --- .../src/FilecoinWarmStorageService.sol | 79 +---- .../test/FilecoinWarmStorageService.t.sol | 334 +++++++++++++----- 2 files changed, 250 insertions(+), 163 deletions(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 3f3d9084..55c36d3e 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -157,8 +157,6 @@ contract FilecoinWarmStorageService is // Metadata key constants string private constant METADATA_KEY_WITH_CDN = "withCDN"; - string private constant METADATA_KEY_CACHE_MISS_PAYMENT_RAIL_LOCKUP_VALUE = "cacheMissPaymentRailLockupValue"; - string private constant METADATA_KEY_CDN_PAYMENT_RAIL_LOCKUP_VALUE = "cdnPaymentRailLockupValue"; // Pricing constants uint256 private immutable STORAGE_PRICE_PER_TIB_PER_MONTH; // 2.5 USDFC per TiB per month without CDN with correct decimals @@ -588,23 +586,7 @@ contract FilecoinWarmStorageService is uint256 cdnRailId = 0; if (hasMetadataKey(createData.metadataKeys, METADATA_KEY_WITH_CDN)) { - // Get cache-miss and CDN lockup values from metadata - string memory cacheMissPaymentRailLockupValueStr = getMetadataValue( - createData.metadataKeys, createData.metadataValues, METADATA_KEY_CACHE_MISS_PAYMENT_RAIL_LOCKUP_VALUE - ); - string memory cdnPaymentRailLockupValueStr = getMetadataValue( - createData.metadataKeys, createData.metadataValues, METADATA_KEY_CDN_PAYMENT_RAIL_LOCKUP_VALUE - ); - - uint256 cacheMissPaymentRailLockupValue = stringToUint(cacheMissPaymentRailLockupValueStr); - uint256 cdnPaymentRailLockupValue = stringToUint(cdnPaymentRailLockupValueStr); - - // Validate lockup values are provided - require( - cacheMissPaymentRailLockupValue > 0 && cdnPaymentRailLockupValue > 0, - "Cache-miss and CDN lockup values must be provided" - ); - + // Create cache-miss payment rail with default lockup value of 0 cacheMissRailId = payments.createRail( usdfcTokenAddress, // token address createData.payer, // from (payer) @@ -615,9 +597,10 @@ contract FilecoinWarmStorageService is ); info.cacheMissRailId = cacheMissRailId; railToDataSet[cacheMissRailId] = dataSetId; - // Set lockup using the provided cache-miss lockup value - payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, cacheMissPaymentRailLockupValue); + // Set lockup with default value of 0 + payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, 0); + // Create CDN payment rail with default lockup value of 0 cdnRailId = payments.createRail( usdfcTokenAddress, // token address createData.payer, // from (payer) @@ -628,8 +611,8 @@ contract FilecoinWarmStorageService is ); info.cdnRailId = cdnRailId; railToDataSet[cdnRailId] = dataSetId; - // Set lockup using the provided CDN lockup value - payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnPaymentRailLockupValue); + // Set lockup with default value of 0 + payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, 0); } // Emit event for tracking @@ -1330,56 +1313,6 @@ contract FilecoinWarmStorageService is return false; } - /** - * @notice Gets the value for a given metadata key - * @param metadataKeys The array of metadata keys - * @param metadataValues The array of metadata values - * @param key The metadata key to look up - * @return The value associated with the key, or empty string if not found - */ - function getMetadataValue(string[] memory metadataKeys, string[] memory metadataValues, string memory key) - internal - pure - returns (string memory) - { - bytes memory keyBytes = bytes(key); - uint256 keyLength = keyBytes.length; - bytes32 keyHash = keccak256(keyBytes); - - for (uint256 i = 0; i < metadataKeys.length; i++) { - bytes memory currentKeyBytes = bytes(metadataKeys[i]); - if (currentKeyBytes.length == keyLength && keccak256(currentKeyBytes) == keyHash) { - return metadataValues[i]; - } - } - - return ""; - } - - /** - * @notice Converts a string to uint256, returns 0 if conversion fails - * @param str The string to convert - * @return The converted uint256 value - */ - function stringToUint(string memory str) internal pure returns (uint256) { - bytes memory strBytes = bytes(str); - if (strBytes.length == 0) { - return 0; - } - - uint256 result = 0; - for (uint256 i = 0; i < strBytes.length; i++) { - uint8 digit = uint8(strBytes[i]); - if (digit >= 48 && digit <= 57) { - // '0' to '9' - result = result * 10 + (digit - 48); - } else { - return 0; // Invalid character, return 0 - } - } - return result; - } - /** * @notice Deletes `key` if it exists in `metadataKeys`. * @param metadataKeys The array of metadata keys diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index cce32fa3..03b578db 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -464,25 +464,17 @@ contract FilecoinWarmStorageServiceTest is Test { return (keys, values); } - function _getCDNMetadataKV(string memory cdnValue, string memory cacheMissLockupValue, string memory cdnLockupValue) - internal - pure - returns (string[] memory, string[] memory) - { - string[] memory keys = new string[](3); - string[] memory values = new string[](3); + function _getCDNMetadataKV(string memory cdnValue) internal pure returns (string[] memory, string[] memory) { + string[] memory keys = new string[](1); + string[] memory values = new string[](1); keys[0] = "withCDN"; values[0] = cdnValue; - keys[1] = "cacheMissPaymentRailLockupValue"; - values[1] = cacheMissLockupValue; - keys[2] = "cdnPaymentRailLockupValue"; - values[2] = cdnLockupValue; return (keys, values); } function testCreateDataSetCreatesRailAndChargesFee() public { // Prepare ExtraData - withCDN key presence means CDN is enabled - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); // Prepare ExtraData FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -518,7 +510,7 @@ contract FilecoinWarmStorageServiceTest is Test { (uint256 clientFundsBefore,) = getAccountInfo(mockUSDFC, client); (uint256 spFundsBefore,) = getAccountInfo(mockUSDFC, serviceProvider); - // Expect DataSetCreated event when creating the data set + // Expect DataSetCreated event when creating the data set (with CDN rails) vm.expectEmit(true, true, true, true); emit FilecoinWarmStorageService.DataSetCreated( 1, 1, 1, 2, 3, client, serviceProvider, serviceProvider, createData.metadataKeys, createData.metadataValues @@ -645,7 +637,7 @@ contract FilecoinWarmStorageServiceTest is Test { payments.deposit(mockUSDFC, client, depositAmount); vm.stopPrank(); - // Expect DataSetCreated event when creating the data set + // Expect DataSetCreated event when creating the data set (no CDN rails) vm.expectEmit(true, true, true, true); emit FilecoinWarmStorageService.DataSetCreated( 1, 1, 1, 0, 0, client, serviceProvider, serviceProvider, createData.metadataKeys, createData.metadataValues @@ -1198,7 +1190,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1348,7 +1340,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV(""); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1463,7 +1455,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV(""); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1685,7 +1677,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId1 = createDataSetForClient(sp1, client, emptyKeys, emptyValues); // Test 2: Dataset with CDN metadata - (string[] memory cdnKeys, string[] memory cdnValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory cdnKeys, string[] memory cdnValues) = _getCDNMetadataKV("true"); uint256 dataSetId2 = createDataSetForClient(sp1, client, cdnKeys, cdnValues); // Test 3: Dataset with regular metadata @@ -1696,7 +1688,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId3 = createDataSetForClient(sp1, client, metaKeys, metaValues); // Test 4: Dataset with multiple metadata including CDN - (string[] memory cdnKeysTemp, string[] memory cdnValuesTemp) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory cdnKeysTemp, string[] memory cdnValuesTemp) = _getCDNMetadataKV("true"); string[] memory bothKeys = new string[](cdnKeysTemp.length + 1); string[] memory bothValues = new string[](cdnValuesTemp.length + 1); bothKeys[0] = "label"; @@ -2467,7 +2459,7 @@ contract FilecoinWarmStorageServiceTest is Test { function testEmptyStringMetadata() public { // Empty string for withCDN - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV(""); // Create dataset using the helper function uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2635,7 +2627,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testRailTerminated_SetsPdpEndEpochAndEmitsEvent() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2650,7 +2642,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testRailTerminated_DoesNotOverwritePdpEndEpoch() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2669,37 +2661,9 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(info.pdpEndEpoch, 123); } - function testCreateDataSetWithCDN_EmptyLockupValues() public { - // Test with empty lockup values should fail - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "", "100000"); - - FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ - payer: client, - metadataKeys: metadataKeys, - metadataValues: metadataValues, - signature: FAKE_SIGNATURE - }); - - extraData = - abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); - - vm.startPrank(client); - payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 1000e6, 1000e6, 365 days); - uint256 depositAmount = 1e6; - mockUSDFC.approve(address(payments), depositAmount); - payments.deposit(mockUSDFC, client, depositAmount); - vm.stopPrank(); - - makeSignaturePass(client); - vm.startPrank(serviceProvider); - vm.expectRevert("Cache-miss and CDN lockup values must be provided"); - mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); - vm.stopPrank(); - } - - function testCreateDataSetWithCDN_ZeroLockupValues() public { - // Test with zero lockup values (should be allowed) - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "0", "0"); + function testCreateDataSetWithCDN_DefaultLockupValues() public { + // Test that CDN datasets now use default lockup values of 0 + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ payer: client, @@ -2723,21 +2687,21 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); vm.stopPrank(); - // Verify CDN rails were created with zero lockup + // Verify CDN rails were created with default zero lockup FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); assertTrue(dataSet.cacheMissRailId > 0, "Cache Miss Rail ID should be non-zero"); assertTrue(dataSet.cdnRailId > 0, "CDN Rail ID should be non-zero"); - // Verify lockup amounts are set to zero + // Verify lockup amounts are set to zero by default Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); - assertEq(cacheMissRail.lockupFixed, 0, "Cache miss lockup should be zero"); - assertEq(cdnRail.lockupFixed, 0, "CDN lockup should be zero"); + assertEq(cacheMissRail.lockupFixed, 0, "Cache miss lockup should be zero by default"); + assertEq(cdnRail.lockupFixed, 0, "CDN lockup should be zero by default"); } - function testCreateDataSetWithCDN_LargeAsymmetricLockupValues() public { - // Test with very different lockup values (should be allowed) - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "1000000", "50000"); + function testCreateDataSetWithCDN_VerifyDefaultBehavior() public { + // Test that CDN creation works correctly with default lockup values + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ payer: client, @@ -2761,17 +2725,17 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); vm.stopPrank(); - // Verify CDN rails were created with specified lockup values + // Verify CDN rails were created with default zero lockup values FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); - assertEq(cacheMissRail.lockupFixed, 1000000, "Cache miss lockup should match specified value"); - assertEq(cdnRail.lockupFixed, 50000, "CDN lockup should match specified value"); + assertEq(cacheMissRail.lockupFixed, 0, "Cache miss lockup should be zero by default"); + assertEq(cdnRail.lockupFixed, 0, "CDN lockup should be zero by default"); } function testCreateDataSetWithCDN_VerifyPaymentRailValidatorConfiguration() public { // Test that CDN payment rails are created with no validator (address(0)) - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ payer: client, @@ -2808,13 +2772,18 @@ contract FilecoinWarmStorageServiceTest is Test { // Tests for settleCDNPaymentRails function function testSettleCDNPaymentRails_BothAmounts() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); uint256 cdnAmount = 50000; uint256 cacheMissAmount = 25000; + // Top up the rails first to allow for settlement + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + + // Now settle the payments vm.expectEmit(true, false, false, true); emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); vm.expectEmit(true, false, false, true); @@ -2825,13 +2794,18 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_OnlyCdnAmount() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); uint256 cdnAmount = 75000; uint256 cacheMissAmount = 0; + // Top up only the CDN rail + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + + // Now settle only the CDN payment vm.expectEmit(true, false, false, true); emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); @@ -2840,13 +2814,18 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_OnlyCacheMissAmount() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); uint256 cdnAmount = 0; uint256 cacheMissAmount = 30000; + // Top up only the cache miss rail + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + + // Now settle only the cache miss payment vm.expectEmit(true, false, false, true); emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); @@ -2855,7 +2834,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_ZeroAmounts() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); vm.prank(filCDNController); @@ -2863,15 +2842,17 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_OnlyFilCDNController() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + // Expecting the payment to fail due to insufficient lockup (OneTimePaymentExceedsLockup error) + vm.expectRevert(); vm.prank(filCDNController); pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); } function testSettleCDNPaymentRails_RevertIfNotController() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); vm.expectRevert(abi.encodeWithSelector(Errors.OnlyFilCDNControllerAllowed.selector, filCDNController, client)); @@ -2902,22 +2883,34 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_DataSetWithEmptyCDNMetadata() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV(""); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - // Empty CDN metadata still creates CDN rails, so this should succeed + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + // Top up the rails first + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + + // Empty CDN metadata still creates CDN rails and can be settled after top-up vm.prank(filCDNController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_EmitsCorrectEvents() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); uint256 cdnAmount = 100000; uint256 cacheMissAmount = 50000; + // Top up the rails first + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + + // Verify correct events are emitted vm.expectEmit(true, false, false, true); emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); vm.expectEmit(true, false, false, true); @@ -2928,7 +2921,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_NoEventsForZeroAmounts() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); vm.recordLogs(); @@ -2945,48 +2938,209 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_ProcessesPaymentsCorrectly() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); uint256 cdnAmount = 75000; uint256 cacheMissAmount = 35000; + // Top up the rails first + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + + // Verify rails have correct lockup before settlement Payments.RailView memory cdnRailBefore = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRailBefore = payments.getRail(info.cacheMissRailId); + assertEq(cdnRailBefore.lockupFixed, cdnAmount, "CDN rail should have lockup equal to amount"); + assertEq(cacheMissRailBefore.lockupFixed, cacheMissAmount, "Cache miss rail should have lockup equal to amount"); - assertEq(cdnRailBefore.paymentRate, 0, "CDN rail payment rate should be 0"); - assertEq(cacheMissRailBefore.paymentRate, 0, "Cache miss rail payment rate should be 0"); - + // Process the payments vm.prank(filCDNController); pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); - - Payments.RailView memory cdnRailAfter = payments.getRail(info.cdnRailId); - Payments.RailView memory cacheMissRailAfter = payments.getRail(info.cacheMissRailId); - - assertEq(cdnRailAfter.paymentRate, 0, "CDN rail payment rate should remain 0 after settlement"); - assertEq(cacheMissRailAfter.paymentRate, 0, "Cache miss rail payment rate should remain 0 after settlement"); } function testSettleCDNPaymentRails_HandlesMaxLockupAmounts() public { - // Create dataset with large lockup values to test larger settlements - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true", "400000", "100000"); + // Create dataset with default zero lockup values + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); - // Use amounts that don't exceed the lockup values (400000 and 100000) - uint256 maxCacheMissAmount = 400000; // Matches cache miss lockup value - uint256 maxCdnAmount = 100000; // Matches CDN lockup value + // Test with large amounts + uint256 maxCacheMissAmount = 400000; + uint256 maxCdnAmount = 100000; + + // Top up rails with these large amounts + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, maxCdnAmount, maxCacheMissAmount); + // Verify events for large payments vm.expectEmit(true, false, false, true); emit RailOneTimePaymentProcessed(info.cdnRailId, maxCdnAmount, 0); vm.expectEmit(true, false, false, true); emit RailOneTimePaymentProcessed(info.cacheMissRailId, maxCacheMissAmount, 0); + // Process the large payments vm.prank(filCDNController); pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, maxCdnAmount, maxCacheMissAmount); } + // Tests for topUpCDNPaymentRails function + function testTopUpCDNPaymentRails_Success() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + uint256 cdnTopUp = 100000; + uint256 cacheMissTopUp = 50000; + + // Verify initial lockup is 0 + Payments.RailView memory cdnRailBefore = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRailBefore = payments.getRail(info.cacheMissRailId); + assertEq(cdnRailBefore.lockupFixed, 0, "CDN rail should start with 0 lockup"); + assertEq(cacheMissRailBefore.lockupFixed, 0, "Cache miss rail should start with 0 lockup"); + + // Top up the rails + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); + + // Verify lockup increased + Payments.RailView memory cdnRailAfter = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRailAfter = payments.getRail(info.cacheMissRailId); + assertEq(cdnRailAfter.lockupFixed, cdnTopUp, "CDN rail lockup should equal top-up amount"); + assertEq(cacheMissRailAfter.lockupFixed, cacheMissTopUp, "Cache miss rail lockup should equal top-up amount"); + } + + function testTopUpCDNPaymentRails_OnlyPayerCanTopUp() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + // Try to top up as non-payer + vm.expectRevert(); + vm.prank(sp1); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 1000); + + // Try to top up as another random address + vm.expectRevert(); + vm.prank(address(0x123)); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 1000); + + // Should work as payer + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 1000); + } + + function testTopUpCDNPaymentRails_RequiresCDNEnabled() public { + // Create dataset without CDN + string[] memory emptyKeys = new string[](0); + string[] memory emptyValues = new string[](0); + uint256 dataSetId = createDataSetForClient(sp1, client, emptyKeys, emptyValues); + + // Should fail because CDN is not enabled + vm.expectRevert(); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 1000); + } + + function testTopUpCDNPaymentRails_IncrementalTopUps() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + // First top-up + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 500); + + Payments.RailView memory cdnRail1 = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRail1 = payments.getRail(info.cacheMissRailId); + assertEq(cdnRail1.lockupFixed, 1000); + assertEq(cacheMissRail1.lockupFixed, 500); + + // Second top-up (should be additive) + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 2000, 1500); + + Payments.RailView memory cdnRail2 = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRail2 = payments.getRail(info.cacheMissRailId); + assertEq(cdnRail2.lockupFixed, 3000, "CDN lockup should be cumulative"); + assertEq(cacheMissRail2.lockupFixed, 2000, "Cache miss lockup should be cumulative"); + } + + function testTopUpCDNPaymentRails_ZeroAmounts() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + // Top up with zero amounts (should not revert) + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, 0); + + // Verify lockup remains 0 + Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); + assertEq(cdnRail.lockupFixed, 0); + assertEq(cacheMissRail.lockupFixed, 0); + } + + function testTopUpCDNPaymentRails_InvalidDataSetId() public { + uint256 invalidDataSetId = 999999; + + vm.expectRevert(); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(invalidDataSetId, 1000, 1000); + } + + // Tests for insufficient lockup failures + function testSettleCDNPaymentRails_FailsWithInsufficientLockup() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + // Attempt to settle without topping up (lockup is 0) + // Expecting OneTimePaymentExceedsLockup error + vm.expectRevert(); + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_FailsWhenLockupLessThanSettlement() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + // Top up with smaller amounts than we'll try to settle + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 10000, 5000); + + // Try to settle with larger amounts + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + // Should fail due to insufficient lockup + vm.expectRevert(); + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_PartialLockupFailure() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + // Top up only the CDN rail + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 50000, 0); + + // Try to settle both rails + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + // Should fail because cache miss rail has insufficient lockup + vm.expectRevert(); + vm.prank(filCDNController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + // Utility function _makeStringOfLength(uint256 len) internal pure returns (string memory s) { s = string(_makeBytesOfLength(len)); From 3d0d0e8d509e5503f4b5e7260b99a1b7e8185219 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Tue, 30 Sep 2025 17:02:37 +0200 Subject: [PATCH 07/31] Remove foundry.lock --- service_contracts/foundry.lock | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 service_contracts/foundry.lock diff --git a/service_contracts/foundry.lock b/service_contracts/foundry.lock deleted file mode 100644 index 4c0c802c..00000000 --- a/service_contracts/foundry.lock +++ /dev/null @@ -1,20 +0,0 @@ -{ - "lib/forge-std": { - "rev": "f46d8301cf732f4f83846565aa475628265e51e0" - }, - "lib/fws-payments": { - "rev": "477228d2d1e93bf7b2aa7e24018e88994806ddba" - }, - "lib/openzeppelin-contracts": { - "rev": "a6ae04acf8e38ed49a70fdce5389df2752e3ecc4" - }, - "lib/openzeppelin-contracts-upgradeable": { - "rev": "3bfc52f2fbf5be95de632f346169dac6a669bd57" - }, - "lib/pdp": { - "rev": "61681392933926fbccb142ab7767e037680850b4" - }, - "lib/session-key-registry": { - "rev": "e472ca2b525fb2396832216182b64a0c165cb49c" - } -} \ No newline at end of file From 138bd28cd0e8a6d4cf57c289aa555a93585c4758 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Tue, 30 Sep 2025 17:22:27 +0200 Subject: [PATCH 08/31] Don't track package-lock.json --- subgraph/package-lock.json | 5080 ------------------------------------ 1 file changed, 5080 deletions(-) delete mode 100644 subgraph/package-lock.json diff --git a/subgraph/package-lock.json b/subgraph/package-lock.json deleted file mode 100644 index 96b9e166..00000000 --- a/subgraph/package-lock.json +++ /dev/null @@ -1,5080 +0,0 @@ -{ - "name": "synapse-m1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "synapse-m1", - "license": "UNLICENSED", - "dependencies": { - "@graphprotocol/graph-cli": "0.97.0", - "@graphprotocol/graph-ts": "0.37.0" - }, - "devDependencies": { - "matchstick-as": "0.6.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@chainsafe/is-ip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.1.0.tgz", - "integrity": "sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==", - "license": "MIT" - }, - "node_modules/@chainsafe/netmask": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", - "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", - "license": "MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1" - } - }, - "node_modules/@fastify/busboy": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", - "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", - "license": "MIT" - }, - "node_modules/@float-capital/float-subgraph-uncrashable": { - "version": "0.0.0-internal-testing.5", - "resolved": "https://registry.npmjs.org/@float-capital/float-subgraph-uncrashable/-/float-subgraph-uncrashable-0.0.0-internal-testing.5.tgz", - "integrity": "sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA==", - "license": "MIT", - "dependencies": { - "@rescript/std": "9.0.0", - "graphql": "^16.6.0", - "graphql-import-node": "^0.0.5", - "js-yaml": "^4.1.0" - }, - "bin": { - "uncrashable": "bin/uncrashable" - } - }, - "node_modules/@graphprotocol/graph-cli": { - "version": "0.97.0", - "resolved": "https://registry.npmjs.org/@graphprotocol/graph-cli/-/graph-cli-0.97.0.tgz", - "integrity": "sha512-SvijthiWbQEL3HdRDf2ydc4uAUwWJfTKyiXKXkXTtimk/hXNgzf4DuqxZPVQOOq4yx5U18iOCc/TKkTI7xCNjw==", - "license": "(Apache-2.0 OR MIT)", - "dependencies": { - "@float-capital/float-subgraph-uncrashable": "0.0.0-internal-testing.5", - "@oclif/core": "4.2.8", - "@oclif/plugin-autocomplete": "^3.2.11", - "@oclif/plugin-not-found": "^3.2.29", - "@oclif/plugin-warn-if-update-available": "^3.1.24", - "@pinax/graph-networks-registry": "^0.6.5", - "@whatwg-node/fetch": "^0.10.1", - "assemblyscript": "0.19.23", - "chokidar": "4.0.3", - "debug": "4.4.0", - "docker-compose": "1.1.1", - "fs-extra": "11.3.0", - "glob": "11.0.1", - "gluegun": "5.2.0", - "graphql": "16.10.0", - "immutable": "5.0.3", - "jayson": "4.1.3", - "js-yaml": "4.1.0", - "kubo-rpc-client": "^5.0.2", - "open": "10.1.0", - "prettier": "3.5.3", - "semver": "7.7.1", - "tmp-promise": "3.0.3", - "undici": "7.4.0", - "web3-eth-abi": "4.4.1", - "yaml": "2.7.0" - }, - "bin": { - "graph": "bin/run.js" - }, - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/@graphprotocol/graph-ts": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@graphprotocol/graph-ts/-/graph-ts-0.37.0.tgz", - "integrity": "sha512-3xp/sO8zFDBkX44ydGB87ow5Cyrfr/SAm/cWzIRzUVL7ROw0KUyFBG1xj4KKlMnAod7/RL99zChYquC15H4Oqg==", - "dependencies": { - "assemblyscript": "0.27.31" - } - }, - "node_modules/@graphprotocol/graph-ts/node_modules/assemblyscript": { - "version": "0.27.31", - "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.27.31.tgz", - "integrity": "sha512-Ra8kiGhgJQGZcBxjtMcyVRxOEJZX64kd+XGpjWzjcjgxWJVv+CAQO0aDBk4GQVhjYbOkATarC83mHjAVGtwPBQ==", - "license": "Apache-2.0", - "dependencies": { - "binaryen": "116.0.0-nightly.20240114", - "long": "^5.2.1" - }, - "bin": { - "asc": "bin/asc.js", - "asinit": "bin/asinit.js" - }, - "engines": { - "node": ">=16", - "npm": ">=7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/assemblyscript" - } - }, - "node_modules/@graphprotocol/graph-ts/node_modules/binaryen": { - "version": "116.0.0-nightly.20240114", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-116.0.0-nightly.20240114.tgz", - "integrity": "sha512-0GZrojJnuhoe+hiwji7QFaL3tBlJoA+KFUN7ouYSDGZLSo9CKM8swQX8n/UcbR0d1VuZKU+nhogNzv423JEu5A==", - "license": "Apache-2.0", - "bin": { - "wasm-opt": "bin/wasm-opt", - "wasm2js": "bin/wasm2js" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.2.tgz", - "integrity": "sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.16", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.16.tgz", - "integrity": "sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.0.tgz", - "integrity": "sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==", - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@inquirer/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@inquirer/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/@inquirer/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/editor": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.18.tgz", - "integrity": "sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/external-editor": "^1.0.1", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/expand": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.18.tgz", - "integrity": "sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", - "license": "MIT", - "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.2.tgz", - "integrity": "sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.18.tgz", - "integrity": "sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.18.tgz", - "integrity": "sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.4.tgz", - "integrity": "sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==", - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.2.2", - "@inquirer/confirm": "^5.1.16", - "@inquirer/editor": "^4.2.18", - "@inquirer/expand": "^4.0.18", - "@inquirer/input": "^4.2.2", - "@inquirer/number": "^3.0.18", - "@inquirer/password": "^4.0.18", - "@inquirer/rawlist": "^4.1.6", - "@inquirer/search": "^3.1.1", - "@inquirer/select": "^4.3.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.6.tgz", - "integrity": "sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.1.tgz", - "integrity": "sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.2.tgz", - "integrity": "sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@ipld/dag-cbor": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.2.4.tgz", - "integrity": "sha512-GbDWYl2fdJgkYtIJN0HY9oO0o50d1nB4EQb7uYWKUd2ztxCjxiEW3PjwGG0nqUpN1G4Cug6LX8NzbA7fKT+zfA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "cborg": "^4.0.0", - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-json": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.5.tgz", - "integrity": "sha512-Q4Fr3IBDEN8gkpgNefynJ4U/ZO5Kwr7WSUMBDbZx0c37t0+IwQCTM9yJh8l5L4SRFjm31MuHwniZ/kM+P7GQ3Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "cborg": "^4.0.0", - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.5.tgz", - "integrity": "sha512-w4PZ2yPqvNmlAir7/2hsCRMqny1EY5jj26iZcSgxREJexmbAc2FI21jp26MqiNdfgAxvkCnf2N/TJI18GaDNwA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@libp2p/crypto": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.1.8.tgz", - "integrity": "sha512-zkfWd2x12E0NbSRU52Wb0A5I9v5a1uLgCauR8uuTqnC21OVznXUGkMg4A2Xoj90M98lReDHo+Khc/hlQFbJ5Vw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^2.11.0", - "@noble/curves": "^1.9.1", - "@noble/hashes": "^1.8.0", - "multiformats": "^13.3.6", - "protons-runtime": "^5.5.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/interface": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.11.0.tgz", - "integrity": "sha512-0MUFKoXWHTQW3oWIgSHApmYMUKWO/Y02+7Hpyp+n3z+geD4Xo2Rku2gYWmxcq+Pyjkz6Q9YjDWz3Yb2SoV2E8Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/dns": "^1.0.6", - "@multiformats/multiaddr": "^12.4.4", - "it-pushable": "^3.2.3", - "it-stream-types": "^2.0.2", - "main-event": "^1.0.1", - "multiformats": "^13.3.6", - "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/logger": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.2.0.tgz", - "integrity": "sha512-OEFS529CnIKfbWEHmuCNESw9q0D0hL8cQ8klQfjIVPur15RcgAEgc1buQ7Y6l0B6tCYg120bp55+e9tGvn8c0g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^2.11.0", - "@multiformats/multiaddr": "^12.4.4", - "interface-datastore": "^8.3.1", - "multiformats": "^13.3.6", - "weald": "^1.0.4" - } - }, - "node_modules/@libp2p/peer-id": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.1.9.tgz", - "integrity": "sha512-cVDp7lX187Epmi/zr0Qq2RsEMmueswP9eIxYSFoMcHL/qcvRFhsxOfUGB8361E26s2WJvC9sXZ0oJS9XVueJhQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/crypto": "^5.1.8", - "@libp2p/interface": "^2.11.0", - "multiformats": "^13.3.6", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@multiformats/dns": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz", - "integrity": "sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@types/dns-packet": "^5.6.5", - "buffer": "^6.0.3", - "dns-packet": "^5.6.1", - "hashlru": "^2.3.0", - "p-queue": "^8.0.1", - "progress-events": "^1.0.0", - "uint8arrays": "^5.0.2" - } - }, - "node_modules/@multiformats/multiaddr": { - "version": "12.5.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz", - "integrity": "sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@multiformats/dns": "^1.0.3", - "abort-error": "^1.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/multiaddr-to-uri": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-11.0.2.tgz", - "integrity": "sha512-SiLFD54zeOJ0qMgo9xv1Tl9O5YktDKAVDP4q4hL16mSq4O4sfFNagNADz8eAofxd6TfQUzGQ3TkRRG9IY2uHRg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/multiaddr": "^12.3.0" - } - }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@oclif/core": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.2.8.tgz", - "integrity": "sha512-OWv4Va6bERxIhrYcnUGzyhGRqktc64lJO6cZ3UwkzJDpfR8ZrbCxRfKRBBah1i8kzUlOAeAXnpbMBMah3skKwA==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "ansis": "^3.16.0", - "clean-stack": "^3.0.1", - "cli-spinners": "^2.9.2", - "debug": "^4.4.0", - "ejs": "^3.1.10", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "lilconfig": "^3.1.3", - "minimatch": "^9.0.5", - "semver": "^7.6.3", - "string-width": "^4.2.3", - "supports-color": "^8", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-autocomplete": { - "version": "3.2.34", - "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.34.tgz", - "integrity": "sha512-KhbPcNjitAU7jUojMXJ3l7duWVub0L0pEr3r3bLrpJBNuIJhoIJ7p56Ropcb7OMH2xcaz5B8HGq56cTOe1FHEg==", - "license": "MIT", - "dependencies": { - "@oclif/core": "^4", - "ansis": "^3.16.0", - "debug": "^4.4.1", - "ejs": "^3.1.10" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-autocomplete/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@oclif/plugin-not-found": { - "version": "3.2.66", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.66.tgz", - "integrity": "sha512-f3GmQrq13egIRc8+1aiFGsGUkNCIUv8nxJodmUicCC2BV6dg+KSY/5v3DicDBdni/HisKYt92S+OelAxQiN0EQ==", - "license": "MIT", - "dependencies": { - "@inquirer/prompts": "^7.8.3", - "@oclif/core": "^4.5.2", - "ansis": "^3.17.0", - "fast-levenshtein": "^3.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-not-found/node_modules/@oclif/core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.5.2.tgz", - "integrity": "sha512-eQcKyrEcDYeZJKu4vUWiu0ii/1Gfev6GF4FsLSgNez5/+aQyAUCjg3ZWlurf491WiYZTXCWyKAxyPWk8DKv2MA==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "ansis": "^3.17.0", - "clean-stack": "^3.0.1", - "cli-spinners": "^2.9.2", - "debug": "^4.4.0", - "ejs": "^3.1.10", - "get-package-type": "^0.1.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "lilconfig": "^3.1.3", - "minimatch": "^9.0.5", - "semver": "^7.6.3", - "string-width": "^4.2.3", - "supports-color": "^8", - "tinyglobby": "^0.2.14", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-warn-if-update-available": { - "version": "3.1.46", - "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.46.tgz", - "integrity": "sha512-YDlr//SHmC80eZrt+0wNFWSo1cOSU60RoWdhSkAoPB3pUGPSNHZDquXDpo7KniinzYPsj1rfetCYk7UVXwYu7A==", - "license": "MIT", - "dependencies": { - "@oclif/core": "^4", - "ansis": "^3.17.0", - "debug": "^4.4.1", - "http-call": "^5.2.2", - "lodash": "^4.17.21", - "registry-auth-token": "^5.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-warn-if-update-available/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@pinax/graph-networks-registry": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@pinax/graph-networks-registry/-/graph-networks-registry-0.6.7.tgz", - "integrity": "sha512-xogeCEZ50XRMxpBwE3TZjJ8RCO8Guv39gDRrrKtlpDEDEMLm0MzD3A0SQObgj7aF7qTZNRTWzsuvQdxgzw25wQ==", - "license": "MIT" - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@rescript/std": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@rescript/std/-/std-9.0.0.tgz", - "integrity": "sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ==", - "license": "SEE LICENSE IN LICENSE" - }, - "node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/dns-packet": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", - "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@whatwg-node/disposablestack": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", - "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", - "license": "MIT", - "dependencies": { - "@whatwg-node/promise-helpers": "^1.0.0", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@whatwg-node/fetch": { - "version": "0.10.10", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.10.tgz", - "integrity": "sha512-watz4i/Vv4HpoJ+GranJ7HH75Pf+OkPQ63NoVmru6Srgc8VezTArB00i/oQlnn0KWh14gM42F22Qcc9SU9mo/w==", - "license": "MIT", - "dependencies": { - "@whatwg-node/node-fetch": "^0.7.25", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@whatwg-node/node-fetch": { - "version": "0.7.25", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.25.tgz", - "integrity": "sha512-szCTESNJV+Xd56zU6ShOi/JWROxE9IwCic8o5D9z5QECZloas6Ez5tUuKqXTAdu6fHFx1t6C+5gwj8smzOLjtg==", - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^3.1.1", - "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/promise-helpers": "^1.3.2", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@whatwg-node/promise-helpers": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", - "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/abitype": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", - "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", - "license": "MIT", - "peerDependencies": { - "typescript": ">=4.9.4", - "zod": "^3 >=3.19.1" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/abort-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz", - "integrity": "sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansis": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/any-signal": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-4.1.1.tgz", - "integrity": "sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/apisauce": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/apisauce/-/apisauce-2.1.6.tgz", - "integrity": "sha512-MdxR391op/FucS2YQRfB/NMRyCnHEPDd4h17LRIuVYi0BpGmMhpxc0shbOpfs5ahABuBEffNCGal5EcsydbBWg==", - "license": "MIT", - "dependencies": { - "axios": "^0.21.4" - } - }, - "node_modules/app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", - "license": "BSD-2-Clause" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/assemblyscript": { - "version": "0.19.23", - "resolved": "https://registry.npmjs.org/assemblyscript/-/assemblyscript-0.19.23.tgz", - "integrity": "sha512-fwOQNZVTMga5KRsfY80g7cpOl4PsFQczMwHzdtgoqLXaYhkhavufKb0sB0l3T1DUxpAufA0KNhlbpuuhZUwxMA==", - "license": "Apache-2.0", - "dependencies": { - "binaryen": "102.0.0-nightly.20211028", - "long": "^5.2.0", - "source-map-support": "^0.5.20" - }, - "bin": { - "asc": "bin/asc", - "asinit": "bin/asinit" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/assemblyscript" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/binaryen": { - "version": "102.0.0-nightly.20211028", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz", - "integrity": "sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w==", - "license": "Apache-2.0", - "bin": { - "wasm-opt": "bin/wasm-opt" - } - }, - "node_modules/blob-to-it": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.10.tgz", - "integrity": "sha512-I39vO57y+LBEIcAV7fif0sn96fYOYVqrPiOD+53MxQGv4DBgt1/HHZh0BHheWx2hVe24q5LTSXxqeV1Y3Nzkgg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "browser-readablestream-to-it": "^2.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-readablestream-to-it": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.10.tgz", - "integrity": "sha512-I/9hEcRtjct8CzD9sVo9Mm4ntn0D+7tOVrjbPl69XAoOfgJ8NBdOQU+WX+5SHhcELJDb14mWt7zuvyqha+MEAQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cborg": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.2.14.tgz", - "integrity": "sha512-VwDKj4eWvoOBtMReabfiGyMh/bNFk8aXZRlMis1tTuMjN9R6VQdyrOwyQb0/aqYHk7r88a6xTWvnsJEC2Cw66Q==", - "license": "Apache-2.0", - "bin": { - "cborg": "lib/bin.js" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/dag-jose": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-5.1.1.tgz", - "integrity": "sha512-9alfZ8Wh1XOOMel8bMpDqWsDT72ojFQCJPtwZSev9qh4f8GoCV9qrJW8jcOUhcstO8Kfm09FHGo//jqiZq3z9w==", - "license": "(Apache-2.0 OR MIT)", - "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "multiformats": "~13.1.3" - } - }, - "node_modules/dag-jose/node_modules/multiformats": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.3.tgz", - "integrity": "sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/docker-compose": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-1.1.1.tgz", - "integrity": "sha512-UkIUz0LtzuO17Ijm6SXMGtfZMs7IvbNwvuJBiBuN93PIhr/n9/sbJMqpvYFaCBGfwu1ZM4PPPDgQzeeke4lEoA==", - "license": "MIT", - "dependencies": { - "yaml": "^2.2.2" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-fetch": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", - "integrity": "sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==", - "license": "MIT", - "dependencies": { - "encoding": "^0.1.13" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "license": "MIT" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", - "license": "MIT", - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "node_modules/ethereum-cryptography/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", - "engines": { - "node": "> 0.1.90" - } - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-levenshtein": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", - "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", - "license": "MIT", - "dependencies": { - "fastest-levenshtein": "^1.0.7" - } - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-jetpack": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-4.3.1.tgz", - "integrity": "sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ==", - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.2", - "rimraf": "^2.6.3" - } - }, - "node_modules/fs-jetpack/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/fs-jetpack/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", - "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==", - "license": "MIT" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gluegun": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/gluegun/-/gluegun-5.2.0.tgz", - "integrity": "sha512-jSUM5xUy2ztYFQANne17OUm/oAd7qSX7EBksS9bQDt9UvLPqcEkeWUebmaposb8Tx7eTTD8uJVWGRe6PYSsYkg==", - "license": "MIT", - "dependencies": { - "apisauce": "^2.1.5", - "app-module-path": "^2.2.0", - "cli-table3": "0.6.0", - "colors": "1.4.0", - "cosmiconfig": "7.0.1", - "cross-spawn": "7.0.3", - "ejs": "3.1.8", - "enquirer": "2.3.6", - "execa": "5.1.1", - "fs-jetpack": "4.3.1", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.lowercase": "^4.3.0", - "lodash.lowerfirst": "^4.3.1", - "lodash.pad": "^4.5.1", - "lodash.padend": "^4.6.1", - "lodash.padstart": "^4.6.1", - "lodash.repeat": "^4.1.0", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.trim": "^4.5.1", - "lodash.trimend": "^4.5.1", - "lodash.trimstart": "^4.5.1", - "lodash.uppercase": "^4.3.0", - "lodash.upperfirst": "^4.3.1", - "ora": "4.0.2", - "pluralize": "^8.0.0", - "semver": "7.3.5", - "which": "2.0.2", - "yargs-parser": "^21.0.0" - }, - "bin": { - "gluegun": "bin/gluegun" - } - }, - "node_modules/gluegun/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/gluegun/node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gluegun/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gluegun/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/graphql": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", - "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/graphql-import-node": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/graphql-import-node/-/graphql-import-node-0.0.5.tgz", - "integrity": "sha512-OXbou9fqh9/Lm7vwXT0XoRN9J5+WCYKnbiTalgFDvkQERITRmcfncZs6aVABedd5B85yQU5EULS4a5pnbpuI0Q==", - "license": "MIT", - "peerDependencies": { - "graphql": "*" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hashlru": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", - "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", - "license": "MIT" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-call": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.3.0.tgz", - "integrity": "sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==", - "license": "ISC", - "dependencies": { - "content-type": "^1.0.4", - "debug": "^4.1.1", - "is-retry-allowed": "^1.1.0", - "is-stream": "^2.0.0", - "parse-json": "^4.0.0", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-call/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/interface-datastore": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.2.tgz", - "integrity": "sha512-R3NLts7pRbJKc3qFdQf+u40hK8XWc0w4Qkx3OFEstC80VoaDUABY/dXA2EJPhtNC+bsrf41Ehvqb6+pnIclyRA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "interface-store": "^6.0.0", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/interface-store": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.3.tgz", - "integrity": "sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/ipfs-unixfs": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.5.tgz", - "integrity": "sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "protons-runtime": "^5.5.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/iso-url": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz", - "integrity": "sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/it-all": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.9.tgz", - "integrity": "sha512-fz1oJJ36ciGnu2LntAlE6SA97bFZpW7Rnt0uEc1yazzR2nKokZLr8lIRtgnpex4NsmaBcvHF+Z9krljWFy/mmg==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-first": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.9.tgz", - "integrity": "sha512-ZWYun273Gbl7CwiF6kK5xBtIKR56H1NoRaiJek2QzDirgen24u8XZ0Nk+jdnJSuCTPxC2ul1TuXKxu/7eK6NuA==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-3.0.4.tgz", - "integrity": "sha512-73PbGBTK/dHp5PX4l8pkQH1ozCONP0U+PB3qMqltxPonRJQNomINE3Hn9p02m2GOu95VoeVvSZdHI2N+qub0pw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "fast-glob": "^3.3.3" - } - }, - "node_modules/it-last": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.9.tgz", - "integrity": "sha512-AtfUEnGDBHBEwa1LjrpGHsJMzJAWDipD6zilvhakzJcm+BCvNX8zlX2BsHClHJLLTrsY4lY9JUjc+TQV4W7m1w==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-map": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.4.tgz", - "integrity": "sha512-QB9PYQdE9fUfpVFYfSxBIyvKynUCgblb143c+ktTK6ZuKSKkp7iH58uYFzagqcJ5HcqIfn1xbfaralHWam+3fg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-peekable": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.8.tgz", - "integrity": "sha512-7IDBQKSp/dtBxXV3Fj0v3qM1jftJ9y9XrWLRIuU1X6RdKqWiN60syNwP0fiDxZD97b8SYM58dD3uklIk1TTQAw==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-stream-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", - "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-to-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz", - "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "fast-fifo": "^1.0.0", - "get-iterator": "^1.0.2", - "p-defer": "^3.0.0", - "p-fifo": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/it-to-stream/node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jayson": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.3.tgz", - "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", - "license": "MIT", - "dependencies": { - "@types/connect": "^3.4.33", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "JSONStream": "^1.3.5", - "uuid": "^8.3.2", - "ws": "^7.5.10" - }, - "bin": { - "jayson": "bin/jayson.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/kubo-rpc-client": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/kubo-rpc-client/-/kubo-rpc-client-5.2.0.tgz", - "integrity": "sha512-J3ppL1xf7f27NDI9jUPGkr1QiExXLyxUTUwHUMMB1a4AZR4s6113SVXPHRYwe1pFIO3hRb5G+0SuHaxYSfhzBA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "@ipld/dag-json": "^10.0.0", - "@ipld/dag-pb": "^4.0.0", - "@libp2p/crypto": "^5.0.0", - "@libp2p/interface": "^2.0.0", - "@libp2p/logger": "^5.0.0", - "@libp2p/peer-id": "^5.0.0", - "@multiformats/multiaddr": "^12.2.1", - "@multiformats/multiaddr-to-uri": "^11.0.0", - "any-signal": "^4.1.1", - "blob-to-it": "^2.0.5", - "browser-readablestream-to-it": "^2.0.5", - "dag-jose": "^5.0.0", - "electron-fetch": "^1.9.1", - "err-code": "^3.0.1", - "ipfs-unixfs": "^11.1.4", - "iso-url": "^1.2.1", - "it-all": "^3.0.4", - "it-first": "^3.0.4", - "it-glob": "^3.0.1", - "it-last": "^3.0.4", - "it-map": "^3.0.5", - "it-peekable": "^3.0.3", - "it-to-stream": "^1.0.0", - "merge-options": "^3.0.4", - "multiformats": "^13.1.0", - "nanoid": "^5.0.7", - "native-fetch": "^4.0.2", - "parse-duration": "^2.1.2", - "react-native-fetch-api": "^3.0.0", - "stream-to-it": "^1.0.1", - "uint8arrays": "^5.0.3", - "wherearewe": "^2.0.1" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "license": "MIT" - }, - "node_modules/lodash.lowercase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.lowercase/-/lodash.lowercase-4.3.0.tgz", - "integrity": "sha512-UcvP1IZYyDKyEL64mmrwoA1AbFu5ahojhTtkOUr1K9dbuxzS9ev8i4TxMMGCqRC9TE8uDaSoufNAXxRPNTseVA==", - "license": "MIT" - }, - "node_modules/lodash.lowerfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz", - "integrity": "sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w==", - "license": "MIT" - }, - "node_modules/lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", - "license": "MIT" - }, - "node_modules/lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", - "license": "MIT" - }, - "node_modules/lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", - "license": "MIT" - }, - "node_modules/lodash.repeat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-4.1.0.tgz", - "integrity": "sha512-eWsgQW89IewS95ZOcr15HHCX6FVDxq3f2PNUIng3fyzsPev9imFQxIYdFZ6crl8L56UR6ZlGDLcEb3RZsCSSqw==", - "license": "MIT" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "license": "MIT" - }, - "node_modules/lodash.trim": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.trim/-/lodash.trim-4.5.1.tgz", - "integrity": "sha512-nJAlRl/K+eiOehWKDzoBVrSMhK0K3A3YQsUNXHQa5yIrKBAhsZgSu3KoAFoFT+mEgiyBHddZ0pRk1ITpIp90Wg==", - "license": "MIT" - }, - "node_modules/lodash.trimend": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", - "integrity": "sha512-lsD+k73XztDsMBKPKvzHXRKFNMohTjoTKIIo4ADLn5dA65LZ1BqlAvSXhR2rPEC3BgAUQnzMnorqDtqn2z4IHA==", - "license": "MIT" - }, - "node_modules/lodash.trimstart": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz", - "integrity": "sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==", - "license": "MIT" - }, - "node_modules/lodash.uppercase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.uppercase/-/lodash.uppercase-4.3.0.tgz", - "integrity": "sha512-+Nbnxkj7s8K5U8z6KnEYPGUOGp3woZbB7Ecs7v3LkkjLQSm2kP9SKIILitN1ktn2mB/tmM9oSlku06I+/lH7QA==", - "license": "MIT" - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/main-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/main-event/-/main-event-1.0.1.tgz", - "integrity": "sha512-NWtdGrAca/69fm6DIVd8T9rtfDII4Q8NQbIbsKQq2VzS9eqOGYs8uaNQjcuaCq/d9H/o625aOTJX2Qoxzqw0Pw==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/matchstick-as": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/matchstick-as/-/matchstick-as-0.6.0.tgz", - "integrity": "sha512-E36fWsC1AbCkBFt05VsDDRoFvGSdcZg6oZJrtIe/YDBbuFh8SKbR5FcoqDhNWqSN+F7bN/iS2u8Md0SM+4pUpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "wabt": "1.0.24" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", - "license": "MIT", - "dependencies": { - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multiformats": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.0.tgz", - "integrity": "sha512-Mkb/QcclrJxKC+vrcIFl297h52QcKh2Az/9A5vbWytbQt4225UWWWmIuSsKksdww9NkIeYcA7DkfftyLuC/JSg==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nanoid": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", - "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/native-fetch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", - "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", - "license": "MIT", - "peerDependencies": { - "undici": "*" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz", - "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==", - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.2.0", - "is-interactive": "^1.0.0", - "log-symbols": "^3.0.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-defer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", - "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-fifo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", - "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.0.0", - "p-defer": "^3.0.0" - } - }, - "node_modules/p-fifo/node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-queue": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", - "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-duration": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/progress-events": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", - "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" - }, - "node_modules/protons-runtime": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.6.0.tgz", - "integrity": "sha512-/Kde+sB9DsMFrddJT/UZWe6XqvL7SL5dbag/DBCElFKhkwDj7XKt53S+mzLyaDP5OqS0wXjV5SA572uWDaT0Hg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8-varint": "^2.0.2", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^5.0.1" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react-native-fetch-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz", - "integrity": "sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==", - "license": "MIT", - "dependencies": { - "p-defer": "^3.0.0" - } - }, - "node_modules/react-native-fetch-api/node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/stream-to-it": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-1.0.1.tgz", - "integrity": "sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-stream-types": "^2.0.1" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "license": "MIT", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uint8-varint": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", - "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8arraylist": "^2.0.0", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/uint8arraylist": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", - "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8arrays": "^5.0.1" - } - }, - "node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/undici": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.4.0.tgz", - "integrity": "sha512-PUQM3/es3noM24oUn10u3kNNap0AbxESOmnssmW+dOi9yGwlUSi5nTNYl3bNbTkWOF8YZDkx2tCmj9OtQ3iGGw==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", - "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", - "license": "MIT" - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/wabt": { - "version": "1.0.24", - "resolved": "https://registry.npmjs.org/wabt/-/wabt-1.0.24.tgz", - "integrity": "sha512-8l7sIOd3i5GWfTWciPL0+ff/FK/deVK2Q6FN+MPz4vfUcD78i2M/49XJTwF6aml91uIiuXJEsLKWMB2cw/mtKg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "wasm-decompile": "bin/wasm-decompile", - "wasm-interp": "bin/wasm-interp", - "wasm-objdump": "bin/wasm-objdump", - "wasm-opcodecnt": "bin/wasm-opcodecnt", - "wasm-strip": "bin/wasm-strip", - "wasm-validate": "bin/wasm-validate", - "wasm2c": "bin/wasm2c", - "wasm2wat": "bin/wasm2wat", - "wat2wasm": "bin/wat2wasm" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/weald": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.6.tgz", - "integrity": "sha512-sX1PzkcMJZUJ848JbFzB6aKHHglTxqACEnq2KgI75b7vWYvfXFBNbOuDKqFKwCT44CrP6c5r+L4+5GmPnb5/SQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "ms": "^3.0.0-canary.1", - "supports-color": "^10.0.0" - } - }, - "node_modules/weald/node_modules/ms": { - "version": "3.0.0-canary.202508261828", - "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.202508261828.tgz", - "integrity": "sha512-NotsCoUCIUkojWCzQff4ttdCfIPoA1UGZsyQbi7KmqkNRfKCrvga8JJi2PknHymHOuor0cJSn/ylj52Cbt2IrQ==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/weald/node_modules/supports-color": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.0.tgz", - "integrity": "sha512-5eG9FQjEjDbAlI5+kdpdyPIBMRH4GfTVDGREVupaZHmVoppknhM29b/S9BkQz7cathp85BVgRi/As3Siln7e0Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/web3-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.1.tgz", - "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-types": "^1.10.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-abi": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.1.tgz", - "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", - "license": "LGPL-3.0", - "dependencies": { - "abitype": "0.7.1", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.10.0.tgz", - "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", - "license": "LGPL-3.0", - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.3.tgz", - "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", - "license": "LGPL-3.0", - "dependencies": { - "ethereum-cryptography": "^2.0.0", - "eventemitter3": "^5.0.1", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", - "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", - "license": "LGPL-3.0", - "dependencies": { - "ethereum-cryptography": "^2.0.0", - "util": "^0.12.5", - "web3-errors": "^1.2.0", - "web3-types": "^1.6.0", - "zod": "^3.21.4" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/wherearewe": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-2.0.1.tgz", - "integrity": "sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "is-electron": "^2.2.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} From 2d47ba198d760d5cb16dd2ddd12d29fa0e7e157a Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Tue, 30 Sep 2025 17:29:39 +0200 Subject: [PATCH 09/31] refactor: replace _getCDNMetadataKV with _getSingleMetadataKV - Remove specialized _getCDNMetadataKV helper function - Replace all calls with the more general _getSingleMetadataKV("withCDN", value) - Simplifies codebase by using existing generic metadata helper --- ...WarmStorageServiceStateInternalLibrary.sol | 1 - ...FilecoinWarmStorageServiceStateLibrary.sol | 1 - .../test/FilecoinWarmStorageService.t.sol | 108 +++++------------- 3 files changed, 31 insertions(+), 79 deletions(-) diff --git a/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol b/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol index 7b543c13..3885aae6 100644 --- a/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol +++ b/service_contracts/src/lib/FilecoinWarmStorageServiceStateInternalLibrary.sol @@ -108,7 +108,6 @@ library FilecoinWarmStorageServiceStateInternalLibrary { info.clientDataSetId = uint256(info11[7]); info.pdpEndEpoch = uint256(info11[8]); info.providerId = uint256(info11[9]); - // cdnEndEpoch field removed - CDN rails don't track endEpoch info.dataSetId = dataSetId; } diff --git a/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol b/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol index 92ed618e..16234d4f 100644 --- a/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol +++ b/service_contracts/src/lib/FilecoinWarmStorageServiceStateLibrary.sol @@ -104,7 +104,6 @@ library FilecoinWarmStorageServiceStateLibrary { info.clientDataSetId = uint256(info11[7]); info.pdpEndEpoch = uint256(info11[8]); info.providerId = uint256(info11[9]); - // cdnEndEpoch field removed - CDN rails don't track endEpoch info.dataSetId = dataSetId; } diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index dfac8a64..e8836247 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -464,17 +464,9 @@ contract FilecoinWarmStorageServiceTest is Test { return (keys, values); } - function _getCDNMetadataKV(string memory cdnValue) internal pure returns (string[] memory, string[] memory) { - string[] memory keys = new string[](1); - string[] memory values = new string[](1); - keys[0] = "withCDN"; - values[0] = cdnValue; - return (keys, values); - } - function testCreateDataSetCreatesRailAndChargesFee() public { // Prepare ExtraData - withCDN key presence means CDN is enabled - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); // Prepare ExtraData FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -576,8 +568,8 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cacheMissRail.operator, address(pdpServiceWithPayments), "Operator should be the PDP service"); assertEq(cacheMissRail.validator, address(0), "Validator should be empty"); assertEq(cacheMissRail.commissionRateBps, 0, "No commission"); - // assertEq(cacheMissRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); - // assertEq(cacheMissRail.paymentRate, 0, "Initial payment rate should be 0"); + assertEq(cacheMissRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); + assertEq(cacheMissRail.paymentRate, 0, "Initial payment rate should be 0"); Payments.RailView memory cdnRail = payments.getRail(cdnRailId); assertEq(address(cdnRail.token), address(mockUSDFC), "Token should be USDFC"); @@ -588,19 +580,6 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cdnRail.commissionRateBps, 0, "No commission"); assertEq(cdnRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); assertEq(cdnRail.paymentRate, 0, "Initial payment rate should be 0"); - - // Get account balances after creating data set - (uint256 clientFundsAfter,) = getAccountInfo(mockUSDFC, client); - (uint256 spFundsAfter,) = getAccountInfo(mockUSDFC, serviceProvider); - - // Calculate expected client balance - uint256 expectedClientFundsAfter = clientFundsBefore - 1e5; - - // Verify balances changed correctly (one-time fee transferred) - assertEq( - clientFundsAfter, expectedClientFundsAfter, "Client funds should decrease by the data set creation fee" - ); - assertTrue(spFundsAfter > spFundsBefore, "Service provider funds should increase"); } function testCreateDataSetNoCDN() public { @@ -1190,7 +1169,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1340,7 +1319,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV(""); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1455,7 +1434,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV(""); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -1677,7 +1656,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId1 = createDataSetForClient(sp1, client, emptyKeys, emptyValues); // Test 2: Dataset with CDN metadata - (string[] memory cdnKeys, string[] memory cdnValues) = _getCDNMetadataKV("true"); + (string[] memory cdnKeys, string[] memory cdnValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId2 = createDataSetForClient(sp1, client, cdnKeys, cdnValues); // Test 3: Dataset with regular metadata @@ -1688,7 +1667,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId3 = createDataSetForClient(sp1, client, metaKeys, metaValues); // Test 4: Dataset with multiple metadata including CDN - (string[] memory cdnKeysTemp, string[] memory cdnValuesTemp) = _getCDNMetadataKV("true"); + (string[] memory cdnKeysTemp, string[] memory cdnValuesTemp) = _getSingleMetadataKV("withCDN", "true"); string[] memory bothKeys = new string[](cdnKeysTemp.length + 1); string[] memory bothValues = new string[](cdnValuesTemp.length + 1); bothKeys[0] = "label"; @@ -2459,7 +2438,7 @@ contract FilecoinWarmStorageServiceTest is Test { function testEmptyStringMetadata() public { // Empty string for withCDN - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV(""); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); // Create dataset using the helper function uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2627,7 +2606,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testRailTerminated_SetsPdpEndEpochAndEmitsEvent() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2642,7 +2621,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testRailTerminated_DoesNotOverwritePdpEndEpoch() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2663,7 +2642,7 @@ contract FilecoinWarmStorageServiceTest is Test { function testCreateDataSetWithCDN_DefaultLockupValues() public { // Test that CDN datasets now use default lockup values of 0 - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ payer: client, @@ -2701,7 +2680,7 @@ contract FilecoinWarmStorageServiceTest is Test { function testCreateDataSetWithCDN_VerifyDefaultBehavior() public { // Test that CDN creation works correctly with default lockup values - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ payer: client, @@ -2735,7 +2714,7 @@ contract FilecoinWarmStorageServiceTest is Test { function testCreateDataSetWithCDN_VerifyPaymentRailValidatorConfiguration() public { // Test that CDN payment rails are created with no validator (address(0)) - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ payer: client, @@ -2772,7 +2751,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Tests for settleCDNPaymentRails function function testSettleCDNPaymentRails_BothAmounts() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2794,7 +2773,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_OnlyCdnAmount() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2814,7 +2793,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_OnlyCacheMissAmount() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2834,7 +2813,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_ZeroAmounts() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); vm.prank(filBeamController); @@ -2842,7 +2821,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_OnlyfilBeamController() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); // Expecting the payment to fail due to insufficient lockup (OneTimePaymentExceedsLockup error) @@ -2852,7 +2831,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_RevertIfNotController() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); vm.expectRevert(abi.encodeWithSelector(Errors.OnlyFilBeamControllerAllowed.selector, filBeamController, client)); @@ -2883,7 +2862,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_DataSetWithEmptyCDNMetadata() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV(""); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); uint256 cdnAmount = 50000; @@ -2899,7 +2878,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_EmitsCorrectEvents() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2921,7 +2900,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_NoEventsForZeroAmounts() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); vm.recordLogs(); @@ -2938,7 +2917,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_ProcessesPaymentsCorrectly() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2960,34 +2939,9 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_HandlesMaxLockupAmounts() public { - // Create dataset with default zero lockup values - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); - - // Test with large amounts - uint256 maxCacheMissAmount = 400000; - uint256 maxCdnAmount = 100000; - - // Top up rails with these large amounts - vm.prank(client); - pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, maxCdnAmount, maxCacheMissAmount); - - // Verify events for large payments - vm.expectEmit(true, false, false, true); - emit RailOneTimePaymentProcessed(info.cdnRailId, maxCdnAmount, 0); - vm.expectEmit(true, false, false, true); - emit RailOneTimePaymentProcessed(info.cacheMissRailId, maxCacheMissAmount, 0); - - // Process the large payments - vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, maxCdnAmount, maxCacheMissAmount); - } - // Tests for topUpCDNPaymentRails function function testTopUpCDNPaymentRails_Success() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -3012,7 +2966,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testTopUpCDNPaymentRails_OnlyPayerCanTopUp() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); // Try to top up as non-payer @@ -3043,7 +2997,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testTopUpCDNPaymentRails_IncrementalTopUps() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -3067,7 +3021,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testTopUpCDNPaymentRails_ZeroAmounts() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -3092,7 +3046,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Tests for insufficient lockup failures function testSettleCDNPaymentRails_FailsWithInsufficientLockup() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); uint256 cdnAmount = 50000; @@ -3106,7 +3060,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_FailsWhenLockupLessThanSettlement() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); // Top up with smaller amounts than we'll try to settle @@ -3124,7 +3078,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testSettleCDNPaymentRails_PartialLockupFailure() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getCDNMetadataKV("true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); // Top up only the CDN rail From 1261123075937864b545ef81a673a847c0f79482 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Wed, 1 Oct 2025 11:35:13 +0200 Subject: [PATCH 10/31] Rollback tests related to data set metadata --- .../test/FilecoinWarmStorageService.t.sol | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index e8836247..83cf614f 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -1667,15 +1667,12 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId3 = createDataSetForClient(sp1, client, metaKeys, metaValues); // Test 4: Dataset with multiple metadata including CDN - (string[] memory cdnKeysTemp, string[] memory cdnValuesTemp) = _getSingleMetadataKV("withCDN", "true"); - string[] memory bothKeys = new string[](cdnKeysTemp.length + 1); - string[] memory bothValues = new string[](cdnValuesTemp.length + 1); + string[] memory bothKeys = new string[](2); + string[] memory bothValues = new string[](2); bothKeys[0] = "label"; bothValues[0] = "test"; - for (uint256 i = 0; i < cdnKeysTemp.length; i++) { - bothKeys[i + 1] = cdnKeysTemp[i]; - bothValues[i + 1] = cdnValuesTemp[i]; - } + bothKeys[1] = "withCDN"; + bothValues[1] = "true"; uint256 dataSetId4 = createDataSetForClient(sp1, client, bothKeys, bothValues); // Verify dataset with multiple metadata keys @@ -2437,8 +2434,14 @@ contract FilecoinWarmStorageServiceTest is Test { } function testEmptyStringMetadata() public { - // Empty string for withCDN - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); + // Create data set with empty string metadata + string[] memory metadataKeys = new string[](2); + metadataKeys[0] = "withCDN"; + metadataKeys[1] = "description"; + + string[] memory metadataValues = new string[](2); + metadataValues[0] = ""; // Empty string for withCDN + metadataValues[1] = "Test dataset"; // Non-empty for description // Create dataset using the helper function uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); From e6c94468f6de3129cf1e7adc1f53c6b9f53b51f3 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Wed, 1 Oct 2025 11:36:37 +0200 Subject: [PATCH 11/31] Cleanup tests --- service_contracts/test/FilecoinWarmStorageService.t.sol | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index 83cf614f..c90809a7 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -498,10 +498,6 @@ contract FilecoinWarmStorageServiceTest is Test { payments.deposit(mockUSDFC, client, depositAmount); vm.stopPrank(); - // Get account balances before creating data set - (uint256 clientFundsBefore,) = getAccountInfo(mockUSDFC, client); - (uint256 spFundsBefore,) = getAccountInfo(mockUSDFC, serviceProvider); - // Expect DataSetCreated event when creating the data set (with CDN rails) vm.expectEmit(true, true, true, true); emit FilecoinWarmStorageService.DataSetCreated( @@ -1169,7 +1165,7 @@ contract FilecoinWarmStorageServiceTest is Test { // 1. Setup: Create a dataset with CDN enabled. console.log("1. Setting up: Creating dataset with service provider"); - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); // Prepare data set creation data FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ From 2b3029cf96633c5b5a77f157689ad1cddedab153 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Wed, 1 Oct 2025 11:37:47 +0200 Subject: [PATCH 12/31] Rename test back from testCreateDataSetCreatesRailAndChargesFee to testCreateDataSetCreatesRail --- service_contracts/test/FilecoinWarmStorageService.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index c90809a7..a1b5d663 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -464,7 +464,7 @@ contract FilecoinWarmStorageServiceTest is Test { return (keys, values); } - function testCreateDataSetCreatesRailAndChargesFee() public { + function testCreateDataSetCreatesRail() public { // Prepare ExtraData - withCDN key presence means CDN is enabled (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); From 1268de7e99b3cb6b90a5fe7765e281805b198d13 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Wed, 1 Oct 2025 11:55:54 +0200 Subject: [PATCH 13/31] chore: Emit CDNPaymentRailsToppedUp when CDN payment rail is topped up - Remove redundant tests - Add CDNPaymentRailsToppedUp event and modify top-up tests --- .../abi/FilecoinWarmStorageService.abi.json | 25 ++++ .../src/FilecoinWarmStorageService.sol | 6 + .../test/FilecoinWarmStorageService.t.sol | 129 +++++------------- 3 files changed, 67 insertions(+), 93 deletions(-) diff --git a/service_contracts/abi/FilecoinWarmStorageService.abi.json b/service_contracts/abi/FilecoinWarmStorageService.abi.json index 5d1aa398..416cf5ff 100644 --- a/service_contracts/abi/FilecoinWarmStorageService.abi.json +++ b/service_contracts/abi/FilecoinWarmStorageService.abi.json @@ -918,6 +918,31 @@ ], "stateMutability": "view" }, + { + "type": "event", + "name": "CDNPaymentRailsToppedUp", + "inputs": [ + { + "name": "dataSetId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "cdnAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "cacheMissAmount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, { "type": "event", "name": "CDNPaymentTerminated", diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index f1cf45d9..6b3b8be7 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -83,6 +83,8 @@ contract FilecoinWarmStorageService is event ViewContractSet(address indexed viewContract); + event CDNPaymentRailsToppedUp(uint256 indexed dataSetId, uint256 cdnAmount, uint256 cacheMissAmount); + // Events for provider management event ProviderApproved(uint256 indexed providerId); event ProviderUnapproved(uint256 indexed providerId); @@ -1049,6 +1051,10 @@ contract FilecoinWarmStorageService is Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnRail.lockupFixed + cdnAmount); } + + if (cdnAmount > 0 || cacheMissAmount > 0) { + emit CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); + } } function terminateCDNService(uint256 dataSetId) external onlyFilBeamController { diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index a1b5d663..f9fbe87a 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -2639,7 +2639,7 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(info.pdpEndEpoch, 123); } - function testCreateDataSetWithCDN_DefaultLockupValues() public { + function testCreateDataSetWithCDN_VerifyDefaultBehavior() public { // Test that CDN datasets now use default lockup values of 0 (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); @@ -2675,75 +2675,7 @@ contract FilecoinWarmStorageServiceTest is Test { Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); assertEq(cacheMissRail.lockupFixed, 0, "Cache miss lockup should be zero by default"); assertEq(cdnRail.lockupFixed, 0, "CDN lockup should be zero by default"); - } - - function testCreateDataSetWithCDN_VerifyDefaultBehavior() public { - // Test that CDN creation works correctly with default lockup values - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - - FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ - payer: client, - metadataKeys: metadataKeys, - metadataValues: metadataValues, - signature: FAKE_SIGNATURE - }); - - extraData = - abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); - - vm.startPrank(client); - payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 2000e6, 2000e6, 365 days); - uint256 depositAmount = 2e6; - mockUSDFC.approve(address(payments), depositAmount); - payments.deposit(mockUSDFC, client, depositAmount); - vm.stopPrank(); - - makeSignaturePass(client); - vm.startPrank(serviceProvider); - uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); - vm.stopPrank(); - - // Verify CDN rails were created with default zero lockup values - FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); - Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); - Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); - assertEq(cacheMissRail.lockupFixed, 0, "Cache miss lockup should be zero by default"); - assertEq(cdnRail.lockupFixed, 0, "CDN lockup should be zero by default"); - } - - function testCreateDataSetWithCDN_VerifyPaymentRailValidatorConfiguration() public { - // Test that CDN payment rails are created with no validator (address(0)) - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - - FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ - payer: client, - metadataKeys: metadataKeys, - metadataValues: metadataValues, - signature: FAKE_SIGNATURE - }); - - extraData = - abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); - - vm.startPrank(client); - payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 1000e6, 1000e6, 365 days); - uint256 depositAmount = 1e6; - mockUSDFC.approve(address(payments), depositAmount); - payments.deposit(mockUSDFC, client, depositAmount); - vm.stopPrank(); - - makeSignaturePass(client); - vm.startPrank(serviceProvider); - uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); - vm.stopPrank(); - - // Verify PDP rail has validator (this contract) while CDN rails have no validator - FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); - Payments.RailView memory pdpRail = payments.getRail(dataSet.pdpRailId); - Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); - Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); - - assertEq(pdpRail.validator, address(pdpServiceWithPayments), "PDP rail should have this contract as validator"); + // Verify that CDN rails have no validator assertEq(cacheMissRail.validator, address(0), "Cache miss rail should have no validator"); assertEq(cdnRail.validator, address(0), "CDN rail should have no validator"); } @@ -2758,6 +2690,8 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissAmount = 25000; // Top up the rails first to allow for settlement + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2780,6 +2714,8 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissAmount = 0; // Top up only the CDN rail + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2800,6 +2736,8 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissAmount = 30000; // Top up only the cache miss rail + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2868,6 +2806,8 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissAmount = 25000; // Top up the rails first + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2885,6 +2825,8 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissAmount = 50000; // Top up the rails first + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2924,6 +2866,8 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissAmount = 35000; // Top up the rails first + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2954,6 +2898,8 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cacheMissRailBefore.lockupFixed, 0, "Cache miss rail should start with 0 lockup"); // Top up the rails + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -2979,6 +2925,8 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 1000); // Should work as payer + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, 1000, 1000); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 1000); } @@ -3001,6 +2949,8 @@ contract FilecoinWarmStorageServiceTest is Test { FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); // First top-up + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, 1000, 500); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 500); @@ -3010,6 +2960,8 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cacheMissRail1.lockupFixed, 500); // Second top-up (should be additive) + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, 2000, 1500); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 2000, 1500); @@ -3024,10 +2976,20 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); - // Top up with zero amounts (should not revert) + // Top up with zero amounts (should not revert and should not emit event) + vm.recordLogs(); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, 0); + // Verify no CDNPaymentRailsToppedUp event was emitted + Vm.Log[] memory logs = vm.getRecordedLogs(); + for (uint256 i = 0; i < logs.length; i++) { + assertFalse( + logs[i].topics[0] == keccak256("CDNPaymentRailsToppedUp(uint256,uint256,uint256)"), + "CDNPaymentRailsToppedUp should not be emitted for zero amounts" + ); + } + // Verify lockup remains 0 Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); @@ -3036,7 +2998,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testTopUpCDNPaymentRails_InvalidDataSetId() public { - uint256 invalidDataSetId = 999999; + uint256 invalidDataSetId = 99999999999999999; vm.expectRevert(); vm.prank(client); @@ -3049,7 +3011,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); uint256 cdnAmount = 50000; - uint256 cacheMissAmount = 25000; + uint256 cacheMissAmount = 0; // Attempt to settle without topping up (lockup is 0) // Expecting OneTimePaymentExceedsLockup error @@ -3068,7 +3030,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Try to settle with larger amounts uint256 cdnAmount = 50000; - uint256 cacheMissAmount = 25000; + uint256 cacheMissAmount = 0; // Should fail due to insufficient lockup vm.expectRevert(); @@ -3076,25 +3038,6 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_PartialLockupFailure() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - - // Top up only the CDN rail - vm.prank(client); - pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 50000, 0); - - // Try to settle both rails - uint256 cdnAmount = 50000; - uint256 cacheMissAmount = 25000; - - // Should fail because cache miss rail has insufficient lockup - vm.expectRevert(); - vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); - } - - // Utility function _makeStringOfLength(uint256 len) internal pure returns (string memory s) { s = string(_makeBytesOfLength(len)); } From 1681be185f1f426b7656d1763aa22eb16cbd3f12 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Wed, 1 Oct 2025 15:11:04 +0200 Subject: [PATCH 14/31] chore: Enable cdn rail settlement after termination --- .../src/FilecoinWarmStorageService.sol | 8 +-- .../test/FilecoinWarmStorageService.t.sol | 66 ++++++++++++++++++- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 6b3b8be7..95bce523 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -990,13 +990,7 @@ contract FilecoinWarmStorageService is DataSetInfo storage info = dataSetInfo[dataSetId]; require(info.pdpRailId != 0, Errors.InvalidDataSetId(dataSetId)); - // Check if CDN service is configured - require( - hasMetadataKey(dataSetMetadataKeys[dataSetId], METADATA_KEY_WITH_CDN), - Errors.FilBeamServiceNotConfigured(dataSetId) - ); - - // Check if CDN rails are configured + // Check if CDN rails are configured (presence of rails indicates CDN was set up) require(info.cdnRailId != 0 && info.cacheMissRailId != 0, Errors.InvalidDataSetId(dataSetId)); Payments payments = Payments(paymentsContractAddress); diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index f9fbe87a..ee813977 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -2793,7 +2793,7 @@ contract FilecoinWarmStorageServiceTest is Test { string[] memory emptyValues = new string[](0); uint256 dataSetId = createDataSetForClient(sp1, client, emptyKeys, emptyValues); - vm.expectRevert(abi.encodeWithSelector(Errors.FilBeamServiceNotConfigured.selector, dataSetId)); + vm.expectRevert(abi.encodeWithSelector(Errors.InvalidDataSetId.selector, dataSetId)); vm.prank(filBeamController); pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); } @@ -3038,6 +3038,70 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } + function testSettleCDNPaymentRails_AfterTermination() public { + // Create dataset with CDN enabled + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + // Top up CDN rails with sufficient funds + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 100000, 50000); + + // Terminate the CDN service (this removes withCDN metadata) + vm.prank(filBeamController); + pdpServiceWithPayments.terminateCDNService(dataSetId); + + // Verify withCDN metadata is removed + (bool exists,) = viewContract.getDataSetMetadata(dataSetId, "withCDN"); + assertFalse(exists, "withCDN metadata should be removed after termination"); + + // Should still be able to settle CDN payment rails after termination + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + // Expect the correct events to be emitted for successful settlement + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); + + vm.prank(filBeamController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_AfterServiceTermination() public { + // Create dataset with CDN enabled + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + // Top up CDN rails with sufficient funds + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 100000, 50000); + + // Terminate the entire service (this also removes withCDN metadata and terminates CDN rails) + vm.prank(client); + pdpServiceWithPayments.terminateService(dataSetId); + + // Verify withCDN metadata is removed + (bool exists,) = viewContract.getDataSetMetadata(dataSetId, "withCDN"); + assertFalse(exists, "withCDN metadata should be removed after service termination"); + + // Should still be able to settle CDN payment rails after termination + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + // Expect the correct events to be emitted for successful settlement + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); + + vm.prank(filBeamController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + function _makeStringOfLength(uint256 len) internal pure returns (string memory s) { s = string(_makeBytesOfLength(len)); } From 5c92d57165c2d812160ee97b7618d2c7646b5ae3 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Wed, 1 Oct 2025 16:52:48 +0200 Subject: [PATCH 15/31] chore: Add CallerNotPayer error --- service_contracts/src/Errors.sol | 6 ++++++ service_contracts/src/FilecoinWarmStorageService.sol | 5 +---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/service_contracts/src/Errors.sol b/service_contracts/src/Errors.sol index 7ad1cf31..cd7e0e33 100644 --- a/service_contracts/src/Errors.sol +++ b/service_contracts/src/Errors.sol @@ -139,6 +139,12 @@ library Errors { /// @param caller The actual caller error CallerNotPayerOrPayee(uint256 dataSetId, address expectedPayer, address expectedPayee, address caller); + /// @notice Only payer can top-up CDN payment rail balance + /// @param dataSetId The data set ID + /// @param expectedPayer The payer address + /// @param caller The actual caller + error CallerNotPayer(uint256 dataSetId, address expectedPayer, address caller); + /// @notice Data set is beyond its payment end epoch /// @param dataSetId The data set ID /// @param pdpEndEpoch The payment end epoch for the data set diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 95bce523..185507db 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -1015,10 +1015,7 @@ contract FilecoinWarmStorageService is require(info.pdpRailId != 0, Errors.InvalidDataSetId(dataSetId)); // Check authorization - only payer can top up - require( - msg.sender == info.payer, - Errors.CallerNotPayerOrPayee(dataSetId, info.payer, info.serviceProvider, msg.sender) - ); + require(msg.sender == info.payer, Errors.CallerNotPayer(dataSetId, info.payer, msg.sender)); // Check if CDN service is configured require( From 2c8918a1c23bf191731a5e9141cf976f20c92e78 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Wed, 1 Oct 2025 17:21:54 +0200 Subject: [PATCH 16/31] fix: prevent top-up for terminated cdn rails --- .../abi/FilecoinWarmStorageService.abi.json | 43 ++++++ service_contracts/src/Errors.sol | 8 + .../src/FilecoinWarmStorageService.sol | 16 +- .../test/FilecoinWarmStorageService.t.sol | 137 ++++++++++++++++++ 4 files changed, 198 insertions(+), 6 deletions(-) diff --git a/service_contracts/abi/FilecoinWarmStorageService.abi.json b/service_contracts/abi/FilecoinWarmStorageService.abi.json index 416cf5ff..3b02f3f4 100644 --- a/service_contracts/abi/FilecoinWarmStorageService.abi.json +++ b/service_contracts/abi/FilecoinWarmStorageService.abi.json @@ -1448,6 +1448,49 @@ } ] }, + { + "type": "error", + "name": "CDNPaymentAlreadyTerminated", + "inputs": [ + { + "name": "dataSetId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "CacheMissPaymentAlreadyTerminated", + "inputs": [ + { + "name": "dataSetId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "CallerNotPayer", + "inputs": [ + { + "name": "dataSetId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expectedPayer", + "type": "address", + "internalType": "address" + }, + { + "name": "caller", + "type": "address", + "internalType": "address" + } + ] + }, { "type": "error", "name": "CallerNotPayerOrPayee", diff --git a/service_contracts/src/Errors.sol b/service_contracts/src/Errors.sol index cd7e0e33..c99830be 100644 --- a/service_contracts/src/Errors.sol +++ b/service_contracts/src/Errors.sol @@ -128,6 +128,14 @@ library Errors { /// @param dataSetId The data set ID error DataSetPaymentAlreadyTerminated(uint256 dataSetId); + /// @notice CDN payment is already terminated + /// @param dataSetId The data set ID + error CDNPaymentAlreadyTerminated(uint256 dataSetId); + + /// @notice Cache-miss payment is already terminated + /// @param dataSetId The data set ID + error CacheMissPaymentAlreadyTerminated(uint256 dataSetId); + /// @notice The specified data set does not exist or is not valid /// @param dataSetId The data set ID that was invalid or unregistered error InvalidDataSetId(uint256 dataSetId); diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 185507db..201b9330 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -1029,20 +1029,24 @@ contract FilecoinWarmStorageService is Payments payments = Payments(paymentsContractAddress); + if (cdnAmount > 0) { + // Get current lockup and increment by the passed amount + Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); + // Ensure the rail is not terminated + require(cdnRail.endEpoch == 0, Errors.CDNPaymentAlreadyTerminated(dataSetId)); + payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnRail.lockupFixed + cdnAmount); + } + if (cacheMissAmount > 0) { // Get current lockup and increment by the passed amount Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); + // Ensure the rail is not terminated + require(cacheMissRail.endEpoch == 0, Errors.CacheMissPaymentAlreadyTerminated(dataSetId)); payments.modifyRailLockup( info.cacheMissRailId, DEFAULT_LOCKUP_PERIOD, cacheMissRail.lockupFixed + cacheMissAmount ); } - if (cdnAmount > 0) { - // Get current lockup and increment by the passed amount - Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); - payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnRail.lockupFixed + cdnAmount); - } - if (cdnAmount > 0 || cacheMissAmount > 0) { emit CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); } diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index ee813977..f780e0f3 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -3005,6 +3005,143 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.topUpCDNPaymentRails(invalidDataSetId, 1000, 1000); } + function testTopUpCDNPaymentRails_RevertsAfterCDNTermination() public { + // Create dataset with CDN enabled + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + // Top up initially (should succeed) + uint256 cdnTopUp = 100000; + uint256 cacheMissTopUp = 50000; + + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); + + // Terminate CDN service + vm.prank(filBeamController); + pdpServiceWithPayments.terminateCDNService(dataSetId); + + // Attempt to top up again (should fail because withCDN metadata was removed) + vm.expectRevert(abi.encodeWithSelector(Errors.FilBeamServiceNotConfigured.selector, dataSetId)); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); + } + + function testTopUpCDNPaymentRails_RevertsAfterServiceTermination() public { + // Create dataset with CDN enabled + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + // Top up initially (should succeed) + uint256 cdnTopUp = 100000; + uint256 cacheMissTopUp = 50000; + + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); + + // Terminate entire service (including CDN rails) + vm.prank(client); + pdpServiceWithPayments.terminateService(dataSetId); + + // Attempt to top up again (should fail because withCDN metadata was removed) + vm.expectRevert(abi.encodeWithSelector(Errors.FilBeamServiceNotConfigured.selector, dataSetId)); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); + } + + function testTopUpCDNPaymentRails_RevertsForIndividuallyTerminatedRails() public { + // Create dataset with CDN enabled + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + // Top up initially (should succeed) + uint256 cdnTopUp = 100000; + uint256 cacheMissTopUp = 50000; + + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); + + // Directly terminate CDN rail through Payments contract (simulating edge case) + // Note: The service contract is the controller of the rails + vm.prank(address(pdpServiceWithPayments)); + payments.terminateRail(info.cdnRailId); + + // Attempt to top up CDN rail (should fail with our new validation) + vm.expectRevert(abi.encodeWithSelector(Errors.CDNPaymentAlreadyTerminated.selector, dataSetId)); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, 0); + + // Now terminate cache miss rail too + vm.prank(address(pdpServiceWithPayments)); + payments.terminateRail(info.cacheMissRailId); + + // Attempt to top up cache miss rail (should also fail) + vm.expectRevert(abi.encodeWithSelector(Errors.CacheMissPaymentAlreadyTerminated.selector, dataSetId)); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, cacheMissTopUp); + + // Attempt to top up both (should fail on first check) + vm.expectRevert(abi.encodeWithSelector(Errors.CDNPaymentAlreadyTerminated.selector, dataSetId)); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); + } + + function testTopUpCDNPaymentRails_SucceedsBeforeTermination() public { + // Positive test to ensure normal functionality still works + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + uint256 cdnTopUp = 100000; + uint256 cacheMissTopUp = 50000; + + // Multiple top-ups should all succeed before termination + vm.startPrank(client); + + // First top-up + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); + + // Second top-up + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp * 2, cacheMissTopUp * 2); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp * 2, cacheMissTopUp * 2); + + // Third top-up (only CDN) + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, 0); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, 0); + + // Fourth top-up (only cache miss) + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, 0, cacheMissTopUp); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, cacheMissTopUp); + + vm.stopPrank(); + + // Verify rails are still active and have correct lockup amounts + Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); + + // Rails should not be terminated + assertEq(cdnRail.endEpoch, 0, "CDN rail should not be terminated"); + assertEq(cacheMissRail.endEpoch, 0, "Cache miss rail should not be terminated"); + + // Verify lockup amounts (sum of all top-ups) + uint256 expectedCdnLockup = cdnTopUp * 4; // 1 + 2 + 1 + 0 = 4x + uint256 expectedCacheMissLockup = cacheMissTopUp * 4; // 1 + 2 + 0 + 1 = 4x + assertEq(cdnRail.lockupFixed, expectedCdnLockup, "CDN rail lockup incorrect"); + assertEq(cacheMissRail.lockupFixed, expectedCacheMissLockup, "Cache miss rail lockup incorrect"); + } + // Tests for insufficient lockup failures function testSettleCDNPaymentRails_FailsWithInsufficientLockup() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); From 15211473341a22a972f061aa561e8af10525dc05 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Thu, 2 Oct 2025 15:13:13 +0200 Subject: [PATCH 17/31] feat: Set initial lockup to CDN payment rails equal to 1 USDFC --- .../src/FilecoinWarmStorageService.sol | 20 ++- .../test/FilecoinWarmStorageService.t.sol | 117 ++++++++++++------ 2 files changed, 93 insertions(+), 44 deletions(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 201b9330..91a8e816 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -166,6 +166,10 @@ contract FilecoinWarmStorageService is uint256 private immutable CACHE_MISS_PRICE_PER_TIB_PER_MONTH; // .5 USDFC per TiB per month for CDN with correct decimals uint256 private immutable CDN_PRICE_PER_TIB_PER_MONTH; // .5 USDFC per TiB per month for CDN with correct decimals + // Fixed lockup amounts for CDN rails + uint256 private immutable DEFAULT_CDN_LOCKUP_AMOUNT; // 0.7 USDFC + uint256 private immutable DEFAULT_CACHE_MISS_LOCKUP_AMOUNT; // 0.3 USDFC + // Burn Address address payable private constant BURN_ADDRESS = payable(0xff00000000000000000000000000000000000063); @@ -313,6 +317,10 @@ contract FilecoinWarmStorageService is STORAGE_PRICE_PER_TIB_PER_MONTH = (5 * 10 ** TOKEN_DECIMALS) / 2; // 2.5 USDFC CACHE_MISS_PRICE_PER_TIB_PER_MONTH = (1 * 10 ** TOKEN_DECIMALS) / 2; // 0.5 USDFC CDN_PRICE_PER_TIB_PER_MONTH = (1 * 10 ** TOKEN_DECIMALS) / 2; // 0.5 USDFC + + // Initialize the lockup constants based on the actual token decimals + DEFAULT_CDN_LOCKUP_AMOUNT = (7 * 10 ** TOKEN_DECIMALS) / 10; // 0.7 USDFC + DEFAULT_CACHE_MISS_LOCKUP_AMOUNT = (3 * 10 ** TOKEN_DECIMALS) / 10; // 0.3 USDFC } /** @@ -572,7 +580,7 @@ contract FilecoinWarmStorageService is uint256 cdnRailId = 0; if (hasMetadataKey(createData.metadataKeys, METADATA_KEY_WITH_CDN)) { - // Create cache-miss payment rail with default lockup value of 0 + // Create cache-miss payment rail with 0.3 USDFC lockup cacheMissRailId = payments.createRail( usdfcTokenAddress, // token address createData.payer, // from (payer) @@ -583,10 +591,10 @@ contract FilecoinWarmStorageService is ); info.cacheMissRailId = cacheMissRailId; railToDataSet[cacheMissRailId] = dataSetId; - // Set lockup with default value of 0 - payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, 0); + // Set lockup with 0.3 USDFC + payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, DEFAULT_CACHE_MISS_LOCKUP_AMOUNT); - // Create CDN payment rail with default lockup value of 0 + // Create CDN payment rail with 0.7 USDFC lockup cdnRailId = payments.createRail( usdfcTokenAddress, // token address createData.payer, // from (payer) @@ -597,8 +605,8 @@ contract FilecoinWarmStorageService is ); info.cdnRailId = cdnRailId; railToDataSet[cdnRailId] = dataSetId; - // Set lockup with default value of 0 - payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, 0); + // Set lockup with 0.7 USDFC + payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, DEFAULT_CDN_LOCKUP_AMOUNT); } // Emit event for tracking diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index f780e0f3..f30418c0 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -76,6 +76,11 @@ contract FilecoinWarmStorageServiceTest is Test { bytes32 private constant DELETE_DATA_SET_TYPEHASH = keccak256("DeleteDataSet(uint256 clientDataSetId)"); + // Expected lockup amounts for CDN rails + uint256 expectedCDNLockup; + uint256 expectedCacheMissLockup; + uint256 totalCDNInitialLockup; + // Structs struct PieceMetadataSetup { uint256 dataSetId; @@ -242,6 +247,11 @@ contract FilecoinWarmStorageServiceTest is Test { // Transfer tokens to client for payment mockUSDFC.safeTransfer(client, 10000 * 10 ** mockUSDFC.decimals()); + // Initialize expected lockup amounts based on token decimals + expectedCDNLockup = (7 * 10 ** mockUSDFC.decimals()) / 10; // 0.7 USDFC + expectedCacheMissLockup = (3 * 10 ** mockUSDFC.decimals()) / 10; // 0.3 USDFC + totalCDNInitialLockup = 10 ** mockUSDFC.decimals(); // 1.0 USDFC + // Deploy FilecoinWarmStorageService with proxy FilecoinWarmStorageService pdpServiceImpl = new FilecoinWarmStorageService( address(mockPDPVerifier), @@ -493,7 +503,7 @@ contract FilecoinWarmStorageServiceTest is Test { ); // Client deposits funds to the Payments contract for future payments - uint256 depositAmount = 1e5; // Sufficient funds for future operations + uint256 depositAmount = 10e6; // Sufficient funds for initial lockup and future operations mockUSDFC.approve(address(payments), depositAmount); payments.deposit(mockUSDFC, client, depositAmount); vm.stopPrank(); @@ -564,7 +574,7 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cacheMissRail.operator, address(pdpServiceWithPayments), "Operator should be the PDP service"); assertEq(cacheMissRail.validator, address(0), "Validator should be empty"); assertEq(cacheMissRail.commissionRateBps, 0, "No commission"); - assertEq(cacheMissRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); + assertEq(cacheMissRail.lockupFixed, expectedCacheMissLockup, "Cache miss lockup should be 0.3 USDFC"); assertEq(cacheMissRail.paymentRate, 0, "Initial payment rate should be 0"); Payments.RailView memory cdnRail = payments.getRail(cdnRailId); @@ -574,7 +584,7 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cdnRail.operator, address(pdpServiceWithPayments), "Operator should be the PDP service"); assertEq(cdnRail.validator, address(0), "Validator should be empty"); assertEq(cdnRail.commissionRateBps, 0, "No commission"); - assertEq(cdnRail.lockupFixed, 0, "Lockup fixed should be 0 after one-time payment"); + assertEq(cdnRail.lockupFixed, expectedCDNLockup, "CDN lockup should be 0.7 USDFC"); assertEq(cdnRail.paymentRate, 0, "Initial payment rate should be 0"); } @@ -607,7 +617,7 @@ contract FilecoinWarmStorageServiceTest is Test { ); // Client deposits funds to the Payments contract for future payments - uint256 depositAmount = 1e5; // Sufficient funds for future operations + uint256 depositAmount = 10e6; // Sufficient funds for initial lockup and future operations mockUSDFC.approve(address(payments), depositAmount); payments.deposit(mockUSDFC, client, depositAmount); vm.stopPrank(); @@ -685,7 +695,7 @@ contract FilecoinWarmStorageServiceTest is Test { 1000e6, // lockup allowance (1000 USDFC) 365 days // max lockup period ); - uint256 depositAmount = 1e5; + uint256 depositAmount = 10e6; // Sufficient funds for initial lockup and future operations mockUSDFC.approve(address(payments), depositAmount); payments.deposit(mockUSDFC, client, depositAmount); vm.stopPrank(); @@ -2640,7 +2650,7 @@ contract FilecoinWarmStorageServiceTest is Test { } function testCreateDataSetWithCDN_VerifyDefaultBehavior() public { - // Test that CDN datasets now use default lockup values of 0 + // Test that CDN datasets now have lockup values: 0.7 USDFC for CDN, 0.3 USDFC for cache-miss (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ @@ -2670,11 +2680,11 @@ contract FilecoinWarmStorageServiceTest is Test { assertTrue(dataSet.cacheMissRailId > 0, "Cache Miss Rail ID should be non-zero"); assertTrue(dataSet.cdnRailId > 0, "CDN Rail ID should be non-zero"); - // Verify lockup amounts are set to zero by default + // Verify lockup amounts are set to the expected values Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); - assertEq(cacheMissRail.lockupFixed, 0, "Cache miss lockup should be zero by default"); - assertEq(cdnRail.lockupFixed, 0, "CDN lockup should be zero by default"); + assertEq(cacheMissRail.lockupFixed, expectedCacheMissLockup, "Cache miss lockup should be 0.3 USDFC"); + assertEq(cdnRail.lockupFixed, expectedCDNLockup, "CDN lockup should be 0.7 USDFC"); // Verify that CDN rails have no validator assertEq(cacheMissRail.validator, address(0), "Cache miss rail should have no validator"); assertEq(cdnRail.validator, address(0), "CDN rail should have no validator"); @@ -2762,9 +2772,13 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); // Expecting the payment to fail due to insufficient lockup (OneTimePaymentExceedsLockup error) + // Try to settle more than the initial lockup + uint256 cdnAmount = expectedCDNLockup + 50000; // More than initial 0.7 USDFC + uint256 cacheMissAmount = expectedCacheMissLockup + 25000; // More than initial 0.3 USDFC + vm.expectRevert(); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_RevertIfNotController() public { @@ -2871,11 +2885,19 @@ contract FilecoinWarmStorageServiceTest is Test { vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); - // Verify rails have correct lockup before settlement + // Verify rails have correct lockup before settlement (initial + top-up) Payments.RailView memory cdnRailBefore = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRailBefore = payments.getRail(info.cacheMissRailId); - assertEq(cdnRailBefore.lockupFixed, cdnAmount, "CDN rail should have lockup equal to amount"); - assertEq(cacheMissRailBefore.lockupFixed, cacheMissAmount, "Cache miss rail should have lockup equal to amount"); + assertEq( + cdnRailBefore.lockupFixed, + expectedCDNLockup + cdnAmount, + "CDN rail should have lockup equal to initial plus top-up" + ); + assertEq( + cacheMissRailBefore.lockupFixed, + expectedCacheMissLockup + cacheMissAmount, + "Cache miss rail should have lockup equal to initial plus top-up" + ); // Process the payments vm.prank(filBeamController); @@ -2891,11 +2913,15 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cdnTopUp = 100000; uint256 cacheMissTopUp = 50000; - // Verify initial lockup is 0 + // Verify initial lockup matches expected values Payments.RailView memory cdnRailBefore = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRailBefore = payments.getRail(info.cacheMissRailId); - assertEq(cdnRailBefore.lockupFixed, 0, "CDN rail should start with 0 lockup"); - assertEq(cacheMissRailBefore.lockupFixed, 0, "Cache miss rail should start with 0 lockup"); + assertEq(cdnRailBefore.lockupFixed, expectedCDNLockup, "CDN rail should start with 0.7 USDFC lockup"); + assertEq( + cacheMissRailBefore.lockupFixed, + expectedCacheMissLockup, + "Cache miss rail should start with 0.3 USDFC lockup" + ); // Top up the rails vm.expectEmit(true, false, false, true); @@ -2903,11 +2929,17 @@ contract FilecoinWarmStorageServiceTest is Test { vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); - // Verify lockup increased + // Verify lockup increased by top-up amount Payments.RailView memory cdnRailAfter = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRailAfter = payments.getRail(info.cacheMissRailId); - assertEq(cdnRailAfter.lockupFixed, cdnTopUp, "CDN rail lockup should equal top-up amount"); - assertEq(cacheMissRailAfter.lockupFixed, cacheMissTopUp, "Cache miss rail lockup should equal top-up amount"); + assertEq( + cdnRailAfter.lockupFixed, expectedCDNLockup + cdnTopUp, "CDN rail lockup should equal initial plus top-up" + ); + assertEq( + cacheMissRailAfter.lockupFixed, + expectedCacheMissLockup + cacheMissTopUp, + "Cache miss rail lockup should equal initial plus top-up" + ); } function testTopUpCDNPaymentRails_OnlyPayerCanTopUp() public { @@ -2956,8 +2988,8 @@ contract FilecoinWarmStorageServiceTest is Test { Payments.RailView memory cdnRail1 = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRail1 = payments.getRail(info.cacheMissRailId); - assertEq(cdnRail1.lockupFixed, 1000); - assertEq(cacheMissRail1.lockupFixed, 500); + assertEq(cdnRail1.lockupFixed, expectedCDNLockup + 1000); + assertEq(cacheMissRail1.lockupFixed, expectedCacheMissLockup + 500); // Second top-up (should be additive) vm.expectEmit(true, false, false, true); @@ -2967,8 +2999,12 @@ contract FilecoinWarmStorageServiceTest is Test { Payments.RailView memory cdnRail2 = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRail2 = payments.getRail(info.cacheMissRailId); - assertEq(cdnRail2.lockupFixed, 3000, "CDN lockup should be cumulative"); - assertEq(cacheMissRail2.lockupFixed, 2000, "Cache miss lockup should be cumulative"); + assertEq(cdnRail2.lockupFixed, expectedCDNLockup + 3000, "CDN lockup should be initial plus cumulative top-ups"); + assertEq( + cacheMissRail2.lockupFixed, + expectedCacheMissLockup + 2000, + "Cache miss lockup should be initial plus cumulative top-ups" + ); } function testTopUpCDNPaymentRails_ZeroAmounts() public { @@ -2990,11 +3026,13 @@ contract FilecoinWarmStorageServiceTest is Test { ); } - // Verify lockup remains 0 + // Verify lockup remains at initial values Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); - assertEq(cdnRail.lockupFixed, 0); - assertEq(cacheMissRail.lockupFixed, 0); + assertEq(cdnRail.lockupFixed, expectedCDNLockup, "CDN lockup should remain at initial 0.7 USDFC"); + assertEq( + cacheMissRail.lockupFixed, expectedCacheMissLockup, "Cache miss lockup should remain at initial 0.3 USDFC" + ); } function testTopUpCDNPaymentRails_InvalidDataSetId() public { @@ -3135,11 +3173,11 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cdnRail.endEpoch, 0, "CDN rail should not be terminated"); assertEq(cacheMissRail.endEpoch, 0, "Cache miss rail should not be terminated"); - // Verify lockup amounts (sum of all top-ups) - uint256 expectedCdnLockup = cdnTopUp * 4; // 1 + 2 + 1 + 0 = 4x - uint256 expectedCacheMissLockup = cacheMissTopUp * 4; // 1 + 2 + 0 + 1 = 4x - assertEq(cdnRail.lockupFixed, expectedCdnLockup, "CDN rail lockup incorrect"); - assertEq(cacheMissRail.lockupFixed, expectedCacheMissLockup, "Cache miss rail lockup incorrect"); + // Verify lockup amounts (initial lockup plus sum of all top-ups) + uint256 expectedCdnLockupTotal = expectedCDNLockup + (cdnTopUp * 4); // initial + (1 + 2 + 1 + 0 = 4x) + uint256 expectedCacheMissLockupTotal = expectedCacheMissLockup + (cacheMissTopUp * 4); // initial + (1 + 2 + 0 + 1 = 4x) + assertEq(cdnRail.lockupFixed, expectedCdnLockupTotal, "CDN rail lockup incorrect"); + assertEq(cacheMissRail.lockupFixed, expectedCacheMissLockupTotal, "Cache miss rail lockup incorrect"); } // Tests for insufficient lockup failures @@ -3147,10 +3185,11 @@ contract FilecoinWarmStorageServiceTest is Test { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - uint256 cdnAmount = 50000; - uint256 cacheMissAmount = 0; + // Try to settle more than the initial lockup amount + uint256 cdnAmount = expectedCDNLockup + 50000; // More than initial 0.7 USDFC + uint256 cacheMissAmount = expectedCacheMissLockup + 10000; // More than initial 0.3 USDFC - // Attempt to settle without topping up (lockup is 0) + // Attempt to settle without additional top-up (only initial lockup available) // Expecting OneTimePaymentExceedsLockup error vm.expectRevert(); vm.prank(filBeamController); @@ -3162,12 +3201,14 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); // Top up with smaller amounts than we'll try to settle + uint256 topUpCdn = 10000; + uint256 topUpCacheMiss = 5000; vm.prank(client); - pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 10000, 5000); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, topUpCdn, topUpCacheMiss); - // Try to settle with larger amounts - uint256 cdnAmount = 50000; - uint256 cacheMissAmount = 0; + // Try to settle with amounts larger than initial plus top-up + uint256 cdnAmount = expectedCDNLockup + topUpCdn + 50000; // More than available lockup + uint256 cacheMissAmount = expectedCacheMissLockup + topUpCacheMiss + 10000; // More than available lockup // Should fail due to insufficient lockup vm.expectRevert(); From f548006ec7408268026657805dfcb98faad671cd Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Fri, 3 Oct 2025 11:32:50 +0200 Subject: [PATCH 18/31] chore: emit total lockup amount --- .../src/FilecoinWarmStorageService.sol | 36 ++++++---- .../test/FilecoinWarmStorageService.t.sol | 68 ++++++++++++++----- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 91a8e816..87394856 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -83,7 +83,7 @@ contract FilecoinWarmStorageService is event ViewContractSet(address indexed viewContract); - event CDNPaymentRailsToppedUp(uint256 indexed dataSetId, uint256 cdnAmount, uint256 cacheMissAmount); + event CDNPaymentRailsToppedUp(uint256 indexed dataSetId, uint256 totalCdnLockup, uint256 totalCacheMissLockup); // Events for provider management event ProviderApproved(uint256 indexed providerId); @@ -1015,10 +1015,10 @@ contract FilecoinWarmStorageService is /** * @notice Allows users to add funds to their CDN-related payment rails * @param dataSetId The ID of the data set - * @param cdnAmount Amount to add to CDN rail lockup - * @param cacheMissAmount Amount to add to cache miss rail lockup + * @param cdnAmountToAdd Amount to add to CDN rail lockup + * @param cacheMissAmountToAdd Amount to add to cache miss rail lockup */ - function topUpCDNPaymentRails(uint256 dataSetId, uint256 cdnAmount, uint256 cacheMissAmount) external { + function topUpCDNPaymentRails(uint256 dataSetId, uint256 cdnAmountToAdd, uint256 cacheMissAmountToAdd) external { DataSetInfo storage info = dataSetInfo[dataSetId]; require(info.pdpRailId != 0, Errors.InvalidDataSetId(dataSetId)); @@ -1037,26 +1037,38 @@ contract FilecoinWarmStorageService is Payments payments = Payments(paymentsContractAddress); - if (cdnAmount > 0) { + uint256 totalCdnLockup = 0; + uint256 totalCacheMissLockup = 0; + + if (cdnAmountToAdd > 0) { // Get current lockup and increment by the passed amount Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); // Ensure the rail is not terminated require(cdnRail.endEpoch == 0, Errors.CDNPaymentAlreadyTerminated(dataSetId)); - payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, cdnRail.lockupFixed + cdnAmount); + totalCdnLockup = cdnRail.lockupFixed + cdnAmountToAdd; + payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, totalCdnLockup); } - if (cacheMissAmount > 0) { + if (cacheMissAmountToAdd > 0) { // Get current lockup and increment by the passed amount Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); // Ensure the rail is not terminated require(cacheMissRail.endEpoch == 0, Errors.CacheMissPaymentAlreadyTerminated(dataSetId)); - payments.modifyRailLockup( - info.cacheMissRailId, DEFAULT_LOCKUP_PERIOD, cacheMissRail.lockupFixed + cacheMissAmount - ); + totalCacheMissLockup = cacheMissRail.lockupFixed + cacheMissAmountToAdd; + payments.modifyRailLockup(info.cacheMissRailId, DEFAULT_LOCKUP_PERIOD, totalCacheMissLockup); } - if (cdnAmount > 0 || cacheMissAmount > 0) { - emit CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); + if (cdnAmountToAdd > 0 || cacheMissAmountToAdd > 0) { + // If we didn't update one of the rails, we need to get its current total + if (cdnAmountToAdd == 0 && info.cdnRailId != 0) { + Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); + totalCdnLockup = cdnRail.lockupFixed; + } + if (cacheMissAmountToAdd == 0 && info.cacheMissRailId != 0) { + Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); + totalCacheMissLockup = cacheMissRail.lockupFixed; + } + emit CDNPaymentRailsToppedUp(dataSetId, totalCdnLockup, totalCacheMissLockup); } } diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index f30418c0..a7f80343 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -2701,7 +2701,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails first to allow for settlement vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2725,7 +2727,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up only the CDN rail vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2747,7 +2751,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up only the cache miss rail vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2821,7 +2827,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails first vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2840,7 +2848,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails first vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2881,7 +2891,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails first vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnAmount, cacheMissAmount); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2925,7 +2937,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -2958,7 +2972,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Should work as payer vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, 1000, 1000); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + 1000, expectedCacheMissLockup + 1000 + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 1000); } @@ -2982,7 +2998,9 @@ contract FilecoinWarmStorageServiceTest is Test { // First top-up vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, 1000, 500); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + 1000, expectedCacheMissLockup + 500 + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 500); @@ -2993,7 +3011,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Second top-up (should be additive) vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, 2000, 1500); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + 3000, expectedCacheMissLockup + 2000 + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 2000, 1500); @@ -3053,7 +3073,9 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissTopUp = 50000; vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -3077,7 +3099,9 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissTopUp = 50000; vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -3102,7 +3126,9 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 cacheMissTopUp = 50000; vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -3145,22 +3171,30 @@ contract FilecoinWarmStorageServiceTest is Test { // First top-up vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, cacheMissTopUp); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + ); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); // Second top-up vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp * 2, cacheMissTopUp * 2); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnTopUp * 3, expectedCacheMissLockup + cacheMissTopUp * 3 + ); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp * 2, cacheMissTopUp * 2); // Third top-up (only CDN) vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, cdnTopUp, 0); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnTopUp * 4, expectedCacheMissLockup + cacheMissTopUp * 3 + ); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, 0); // Fourth top-up (only cache miss) vm.expectEmit(true, false, false, true); - emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(dataSetId, 0, cacheMissTopUp); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + dataSetId, expectedCDNLockup + cdnTopUp * 4, expectedCacheMissLockup + cacheMissTopUp * 4 + ); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, cacheMissTopUp); vm.stopPrank(); From e0d8f68d5b5878840e12f86fd0f3745de690e744 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Fri, 3 Oct 2025 11:34:50 +0200 Subject: [PATCH 19/31] chore: rename default lockup variables in test --- .../test/FilecoinWarmStorageService.t.sol | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index a7f80343..e9aee07b 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -77,9 +77,9 @@ contract FilecoinWarmStorageServiceTest is Test { bytes32 private constant DELETE_DATA_SET_TYPEHASH = keccak256("DeleteDataSet(uint256 clientDataSetId)"); // Expected lockup amounts for CDN rails - uint256 expectedCDNLockup; - uint256 expectedCacheMissLockup; - uint256 totalCDNInitialLockup; + uint256 defaultCDNLockup; + uint256 defaultCacheMissLockup; + uint256 defaultTotalCDNLockup; // Structs struct PieceMetadataSetup { @@ -248,9 +248,9 @@ contract FilecoinWarmStorageServiceTest is Test { mockUSDFC.safeTransfer(client, 10000 * 10 ** mockUSDFC.decimals()); // Initialize expected lockup amounts based on token decimals - expectedCDNLockup = (7 * 10 ** mockUSDFC.decimals()) / 10; // 0.7 USDFC - expectedCacheMissLockup = (3 * 10 ** mockUSDFC.decimals()) / 10; // 0.3 USDFC - totalCDNInitialLockup = 10 ** mockUSDFC.decimals(); // 1.0 USDFC + defaultCDNLockup = (7 * 10 ** mockUSDFC.decimals()) / 10; // 0.7 USDFC + defaultCacheMissLockup = (3 * 10 ** mockUSDFC.decimals()) / 10; // 0.3 USDFC + defaultTotalCDNLockup = 10 ** mockUSDFC.decimals(); // 1.0 USDFC // Deploy FilecoinWarmStorageService with proxy FilecoinWarmStorageService pdpServiceImpl = new FilecoinWarmStorageService( @@ -574,7 +574,7 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cacheMissRail.operator, address(pdpServiceWithPayments), "Operator should be the PDP service"); assertEq(cacheMissRail.validator, address(0), "Validator should be empty"); assertEq(cacheMissRail.commissionRateBps, 0, "No commission"); - assertEq(cacheMissRail.lockupFixed, expectedCacheMissLockup, "Cache miss lockup should be 0.3 USDFC"); + assertEq(cacheMissRail.lockupFixed, defaultCacheMissLockup, "Cache miss lockup should be 0.3 USDFC"); assertEq(cacheMissRail.paymentRate, 0, "Initial payment rate should be 0"); Payments.RailView memory cdnRail = payments.getRail(cdnRailId); @@ -584,7 +584,7 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cdnRail.operator, address(pdpServiceWithPayments), "Operator should be the PDP service"); assertEq(cdnRail.validator, address(0), "Validator should be empty"); assertEq(cdnRail.commissionRateBps, 0, "No commission"); - assertEq(cdnRail.lockupFixed, expectedCDNLockup, "CDN lockup should be 0.7 USDFC"); + assertEq(cdnRail.lockupFixed, defaultCDNLockup, "CDN lockup should be 0.7 USDFC"); assertEq(cdnRail.paymentRate, 0, "Initial payment rate should be 0"); } @@ -2683,8 +2683,8 @@ contract FilecoinWarmStorageServiceTest is Test { // Verify lockup amounts are set to the expected values Payments.RailView memory cacheMissRail = payments.getRail(dataSet.cacheMissRailId); Payments.RailView memory cdnRail = payments.getRail(dataSet.cdnRailId); - assertEq(cacheMissRail.lockupFixed, expectedCacheMissLockup, "Cache miss lockup should be 0.3 USDFC"); - assertEq(cdnRail.lockupFixed, expectedCDNLockup, "CDN lockup should be 0.7 USDFC"); + assertEq(cacheMissRail.lockupFixed, defaultCacheMissLockup, "Cache miss lockup should be 0.3 USDFC"); + assertEq(cdnRail.lockupFixed, defaultCDNLockup, "CDN lockup should be 0.7 USDFC"); // Verify that CDN rails have no validator assertEq(cacheMissRail.validator, address(0), "Cache miss rail should have no validator"); assertEq(cdnRail.validator, address(0), "CDN rail should have no validator"); @@ -2702,7 +2702,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails first to allow for settlement vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + dataSetId, defaultCDNLockup + cdnAmount, defaultCacheMissLockup + cacheMissAmount ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2728,7 +2728,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up only the CDN rail vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + dataSetId, defaultCDNLockup + cdnAmount, defaultCacheMissLockup + cacheMissAmount ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2752,7 +2752,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up only the cache miss rail vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + dataSetId, defaultCDNLockup + cdnAmount, defaultCacheMissLockup + cacheMissAmount ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2779,8 +2779,8 @@ contract FilecoinWarmStorageServiceTest is Test { // Expecting the payment to fail due to insufficient lockup (OneTimePaymentExceedsLockup error) // Try to settle more than the initial lockup - uint256 cdnAmount = expectedCDNLockup + 50000; // More than initial 0.7 USDFC - uint256 cacheMissAmount = expectedCacheMissLockup + 25000; // More than initial 0.3 USDFC + uint256 cdnAmount = defaultCDNLockup + 50000; // More than initial 0.7 USDFC + uint256 cacheMissAmount = defaultCacheMissLockup + 25000; // More than initial 0.3 USDFC vm.expectRevert(); vm.prank(filBeamController); @@ -2828,7 +2828,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails first vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + dataSetId, defaultCDNLockup + cdnAmount, defaultCacheMissLockup + cacheMissAmount ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2849,7 +2849,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails first vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + dataSetId, defaultCDNLockup + cdnAmount, defaultCacheMissLockup + cacheMissAmount ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2892,7 +2892,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Top up the rails first vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnAmount, expectedCacheMissLockup + cacheMissAmount + dataSetId, defaultCDNLockup + cdnAmount, defaultCacheMissLockup + cacheMissAmount ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); @@ -2902,12 +2902,12 @@ contract FilecoinWarmStorageServiceTest is Test { Payments.RailView memory cacheMissRailBefore = payments.getRail(info.cacheMissRailId); assertEq( cdnRailBefore.lockupFixed, - expectedCDNLockup + cdnAmount, + defaultCDNLockup + cdnAmount, "CDN rail should have lockup equal to initial plus top-up" ); assertEq( cacheMissRailBefore.lockupFixed, - expectedCacheMissLockup + cacheMissAmount, + defaultCacheMissLockup + cacheMissAmount, "Cache miss rail should have lockup equal to initial plus top-up" ); @@ -2928,17 +2928,17 @@ contract FilecoinWarmStorageServiceTest is Test { // Verify initial lockup matches expected values Payments.RailView memory cdnRailBefore = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRailBefore = payments.getRail(info.cacheMissRailId); - assertEq(cdnRailBefore.lockupFixed, expectedCDNLockup, "CDN rail should start with 0.7 USDFC lockup"); + assertEq(cdnRailBefore.lockupFixed, defaultCDNLockup, "CDN rail should start with 0.7 USDFC lockup"); assertEq( cacheMissRailBefore.lockupFixed, - expectedCacheMissLockup, + defaultCacheMissLockup, "Cache miss rail should start with 0.3 USDFC lockup" ); // Top up the rails vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + dataSetId, defaultCDNLockup + cdnTopUp, defaultCacheMissLockup + cacheMissTopUp ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -2947,11 +2947,11 @@ contract FilecoinWarmStorageServiceTest is Test { Payments.RailView memory cdnRailAfter = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRailAfter = payments.getRail(info.cacheMissRailId); assertEq( - cdnRailAfter.lockupFixed, expectedCDNLockup + cdnTopUp, "CDN rail lockup should equal initial plus top-up" + cdnRailAfter.lockupFixed, defaultCDNLockup + cdnTopUp, "CDN rail lockup should equal initial plus top-up" ); assertEq( cacheMissRailAfter.lockupFixed, - expectedCacheMissLockup + cacheMissTopUp, + defaultCacheMissLockup + cacheMissTopUp, "Cache miss rail lockup should equal initial plus top-up" ); } @@ -2973,7 +2973,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Should work as payer vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + 1000, expectedCacheMissLockup + 1000 + dataSetId, defaultCDNLockup + 1000, defaultCacheMissLockup + 1000 ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 1000); @@ -2999,30 +2999,30 @@ contract FilecoinWarmStorageServiceTest is Test { // First top-up vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + 1000, expectedCacheMissLockup + 500 + dataSetId, defaultCDNLockup + 1000, defaultCacheMissLockup + 500 ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 1000, 500); Payments.RailView memory cdnRail1 = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRail1 = payments.getRail(info.cacheMissRailId); - assertEq(cdnRail1.lockupFixed, expectedCDNLockup + 1000); - assertEq(cacheMissRail1.lockupFixed, expectedCacheMissLockup + 500); + assertEq(cdnRail1.lockupFixed, defaultCDNLockup + 1000); + assertEq(cacheMissRail1.lockupFixed, defaultCacheMissLockup + 500); // Second top-up (should be additive) vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + 3000, expectedCacheMissLockup + 2000 + dataSetId, defaultCDNLockup + 3000, defaultCacheMissLockup + 2000 ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 2000, 1500); Payments.RailView memory cdnRail2 = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRail2 = payments.getRail(info.cacheMissRailId); - assertEq(cdnRail2.lockupFixed, expectedCDNLockup + 3000, "CDN lockup should be initial plus cumulative top-ups"); + assertEq(cdnRail2.lockupFixed, defaultCDNLockup + 3000, "CDN lockup should be initial plus cumulative top-ups"); assertEq( cacheMissRail2.lockupFixed, - expectedCacheMissLockup + 2000, + defaultCacheMissLockup + 2000, "Cache miss lockup should be initial plus cumulative top-ups" ); } @@ -3049,9 +3049,9 @@ contract FilecoinWarmStorageServiceTest is Test { // Verify lockup remains at initial values Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); - assertEq(cdnRail.lockupFixed, expectedCDNLockup, "CDN lockup should remain at initial 0.7 USDFC"); + assertEq(cdnRail.lockupFixed, defaultCDNLockup, "CDN lockup should remain at initial 0.7 USDFC"); assertEq( - cacheMissRail.lockupFixed, expectedCacheMissLockup, "Cache miss lockup should remain at initial 0.3 USDFC" + cacheMissRail.lockupFixed, defaultCacheMissLockup, "Cache miss lockup should remain at initial 0.3 USDFC" ); } @@ -3074,7 +3074,7 @@ contract FilecoinWarmStorageServiceTest is Test { vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + dataSetId, defaultCDNLockup + cdnTopUp, defaultCacheMissLockup + cacheMissTopUp ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -3100,7 +3100,7 @@ contract FilecoinWarmStorageServiceTest is Test { vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + dataSetId, defaultCDNLockup + cdnTopUp, defaultCacheMissLockup + cacheMissTopUp ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -3127,7 +3127,7 @@ contract FilecoinWarmStorageServiceTest is Test { vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + dataSetId, defaultCDNLockup + cdnTopUp, defaultCacheMissLockup + cacheMissTopUp ); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); @@ -3172,28 +3172,28 @@ contract FilecoinWarmStorageServiceTest is Test { // First top-up vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnTopUp, expectedCacheMissLockup + cacheMissTopUp + dataSetId, defaultCDNLockup + cdnTopUp, defaultCacheMissLockup + cacheMissTopUp ); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, cacheMissTopUp); // Second top-up vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnTopUp * 3, expectedCacheMissLockup + cacheMissTopUp * 3 + dataSetId, defaultCDNLockup + cdnTopUp * 3, defaultCacheMissLockup + cacheMissTopUp * 3 ); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp * 2, cacheMissTopUp * 2); // Third top-up (only CDN) vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnTopUp * 4, expectedCacheMissLockup + cacheMissTopUp * 3 + dataSetId, defaultCDNLockup + cdnTopUp * 4, defaultCacheMissLockup + cacheMissTopUp * 3 ); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, 0); // Fourth top-up (only cache miss) vm.expectEmit(true, false, false, true); emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( - dataSetId, expectedCDNLockup + cdnTopUp * 4, expectedCacheMissLockup + cacheMissTopUp * 4 + dataSetId, defaultCDNLockup + cdnTopUp * 4, defaultCacheMissLockup + cacheMissTopUp * 4 ); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, cacheMissTopUp); @@ -3208,10 +3208,10 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cacheMissRail.endEpoch, 0, "Cache miss rail should not be terminated"); // Verify lockup amounts (initial lockup plus sum of all top-ups) - uint256 expectedCdnLockupTotal = expectedCDNLockup + (cdnTopUp * 4); // initial + (1 + 2 + 1 + 0 = 4x) - uint256 expectedCacheMissLockupTotal = expectedCacheMissLockup + (cacheMissTopUp * 4); // initial + (1 + 2 + 0 + 1 = 4x) + uint256 expectedCdnLockupTotal = defaultCDNLockup + (cdnTopUp * 4); // initial + (1 + 2 + 1 + 0 = 4x) + uint256 defaultCacheMissLockupTotal = defaultCacheMissLockup + (cacheMissTopUp * 4); // initial + (1 + 2 + 0 + 1 = 4x) assertEq(cdnRail.lockupFixed, expectedCdnLockupTotal, "CDN rail lockup incorrect"); - assertEq(cacheMissRail.lockupFixed, expectedCacheMissLockupTotal, "Cache miss rail lockup incorrect"); + assertEq(cacheMissRail.lockupFixed, defaultCacheMissLockupTotal, "Cache miss rail lockup incorrect"); } // Tests for insufficient lockup failures @@ -3220,8 +3220,8 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); // Try to settle more than the initial lockup amount - uint256 cdnAmount = expectedCDNLockup + 50000; // More than initial 0.7 USDFC - uint256 cacheMissAmount = expectedCacheMissLockup + 10000; // More than initial 0.3 USDFC + uint256 cdnAmount = defaultCDNLockup + 50000; // More than initial 0.7 USDFC + uint256 cacheMissAmount = defaultCacheMissLockup + 10000; // More than initial 0.3 USDFC // Attempt to settle without additional top-up (only initial lockup available) // Expecting OneTimePaymentExceedsLockup error @@ -3241,8 +3241,8 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, topUpCdn, topUpCacheMiss); // Try to settle with amounts larger than initial plus top-up - uint256 cdnAmount = expectedCDNLockup + topUpCdn + 50000; // More than available lockup - uint256 cacheMissAmount = expectedCacheMissLockup + topUpCacheMiss + 10000; // More than available lockup + uint256 cdnAmount = defaultCDNLockup + topUpCdn + 50000; // More than available lockup + uint256 cacheMissAmount = defaultCacheMissLockup + topUpCacheMiss + 10000; // More than available lockup // Should fail due to insufficient lockup vm.expectRevert(); From 2042693289a76c8aff04f8c0f2b09623e6301d55 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Fri, 3 Oct 2025 11:45:10 +0200 Subject: [PATCH 20/31] refactor: allow top up only if both cdn rails are active --- .../src/FilecoinWarmStorageService.sol | 33 +++++++------------ .../test/FilecoinWarmStorageService.t.sol | 12 +++---- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 87394856..6e95e2d4 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -1037,37 +1037,28 @@ contract FilecoinWarmStorageService is Payments payments = Payments(paymentsContractAddress); - uint256 totalCdnLockup = 0; - uint256 totalCacheMissLockup = 0; + // Both rails must be active for any top-up operation + Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); + Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); + require(cdnRail.endEpoch == 0, Errors.CDNPaymentAlreadyTerminated(dataSetId)); + require(cacheMissRail.endEpoch == 0, Errors.CacheMissPaymentAlreadyTerminated(dataSetId)); + + // Calculate total lockup amounts + uint256 totalCdnLockup = cdnRail.lockupFixed + cdnAmountToAdd; + uint256 totalCacheMissLockup = cacheMissRail.lockupFixed + cacheMissAmountToAdd; + + // Only modify rails if amounts are being added if (cdnAmountToAdd > 0) { - // Get current lockup and increment by the passed amount - Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); - // Ensure the rail is not terminated - require(cdnRail.endEpoch == 0, Errors.CDNPaymentAlreadyTerminated(dataSetId)); - totalCdnLockup = cdnRail.lockupFixed + cdnAmountToAdd; payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, totalCdnLockup); } if (cacheMissAmountToAdd > 0) { - // Get current lockup and increment by the passed amount - Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); - // Ensure the rail is not terminated - require(cacheMissRail.endEpoch == 0, Errors.CacheMissPaymentAlreadyTerminated(dataSetId)); - totalCacheMissLockup = cacheMissRail.lockupFixed + cacheMissAmountToAdd; payments.modifyRailLockup(info.cacheMissRailId, DEFAULT_LOCKUP_PERIOD, totalCacheMissLockup); } + // Emit event if any amount was added if (cdnAmountToAdd > 0 || cacheMissAmountToAdd > 0) { - // If we didn't update one of the rails, we need to get its current total - if (cdnAmountToAdd == 0 && info.cdnRailId != 0) { - Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); - totalCdnLockup = cdnRail.lockupFixed; - } - if (cacheMissAmountToAdd == 0 && info.cacheMissRailId != 0) { - Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); - totalCacheMissLockup = cacheMissRail.lockupFixed; - } emit CDNPaymentRailsToppedUp(dataSetId, totalCdnLockup, totalCacheMissLockup); } } diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index e9aee07b..3f465661 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -3137,20 +3137,20 @@ contract FilecoinWarmStorageServiceTest is Test { vm.prank(address(pdpServiceWithPayments)); payments.terminateRail(info.cdnRailId); - // Attempt to top up CDN rail (should fail with our new validation) + // Attempt to top up only CDN rail (should fail since CDN rail is terminated) vm.expectRevert(abi.encodeWithSelector(Errors.CDNPaymentAlreadyTerminated.selector, dataSetId)); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, cdnTopUp, 0); + // Attempt to top up only cache miss rail (should also fail since CDN rail is terminated) + vm.expectRevert(abi.encodeWithSelector(Errors.CDNPaymentAlreadyTerminated.selector, dataSetId)); + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, cacheMissTopUp); + // Now terminate cache miss rail too vm.prank(address(pdpServiceWithPayments)); payments.terminateRail(info.cacheMissRailId); - // Attempt to top up cache miss rail (should also fail) - vm.expectRevert(abi.encodeWithSelector(Errors.CacheMissPaymentAlreadyTerminated.selector, dataSetId)); - vm.prank(client); - pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, cacheMissTopUp); - // Attempt to top up both (should fail on first check) vm.expectRevert(abi.encodeWithSelector(Errors.CDNPaymentAlreadyTerminated.selector, dataSetId)); vm.prank(client); From 8a53789e54bd8e71c34fa997d3ac95bb0c121f07 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Fri, 3 Oct 2025 11:46:15 +0200 Subject: [PATCH 21/31] chore: update abi --- service_contracts/abi/FilecoinWarmStorageService.abi.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/service_contracts/abi/FilecoinWarmStorageService.abi.json b/service_contracts/abi/FilecoinWarmStorageService.abi.json index 3b02f3f4..13785ea4 100644 --- a/service_contracts/abi/FilecoinWarmStorageService.abi.json +++ b/service_contracts/abi/FilecoinWarmStorageService.abi.json @@ -766,12 +766,12 @@ "internalType": "uint256" }, { - "name": "cdnAmount", + "name": "cdnAmountToAdd", "type": "uint256", "internalType": "uint256" }, { - "name": "cacheMissAmount", + "name": "cacheMissAmountToAdd", "type": "uint256", "internalType": "uint256" } @@ -929,13 +929,13 @@ "internalType": "uint256" }, { - "name": "cdnAmount", + "name": "totalCdnLockup", "type": "uint256", "indexed": false, "internalType": "uint256" }, { - "name": "cacheMissAmount", + "name": "totalCacheMissLockup", "type": "uint256", "indexed": false, "internalType": "uint256" From 19fdfa5ba45028c93cdd2fec09d71aa9bb220c37 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Fri, 3 Oct 2025 12:08:09 +0200 Subject: [PATCH 22/31] refactor: remove conditional blocks from topUpCDNPaymentRails --- .../abi/FilecoinWarmStorageService.abi.json | 11 ++++++++++ service_contracts/src/Errors.sol | 4 ++++ .../src/FilecoinWarmStorageService.sol | 22 ++++++++----------- .../test/FilecoinWarmStorageService.t.sol | 13 ++--------- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/service_contracts/abi/FilecoinWarmStorageService.abi.json b/service_contracts/abi/FilecoinWarmStorageService.abi.json index 13785ea4..51b0b423 100644 --- a/service_contracts/abi/FilecoinWarmStorageService.abi.json +++ b/service_contracts/abi/FilecoinWarmStorageService.abi.json @@ -1814,6 +1814,17 @@ } ] }, + { + "type": "error", + "name": "InvalidTopUpAmount", + "inputs": [ + { + "name": "dataSetId", + "type": "uint256", + "internalType": "uint256" + } + ] + }, { "type": "error", "name": "MaxProvingPeriodZero", diff --git a/service_contracts/src/Errors.sol b/service_contracts/src/Errors.sol index c99830be..9e8c9725 100644 --- a/service_contracts/src/Errors.sol +++ b/service_contracts/src/Errors.sol @@ -136,6 +136,10 @@ library Errors { /// @param dataSetId The data set ID error CacheMissPaymentAlreadyTerminated(uint256 dataSetId); + /// @notice Invalid top-up amount - both CDN and cache miss amounts are zero + /// @param dataSetId The data set ID + error InvalidTopUpAmount(uint256 dataSetId); + /// @notice The specified data set does not exist or is not valid /// @param dataSetId The data set ID that was invalid or unregistered error InvalidDataSetId(uint256 dataSetId); diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 6e95e2d4..d87cd943 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -1032,8 +1032,7 @@ contract FilecoinWarmStorageService is ); // Check if cache miss and CDN rails are configured - require(info.cacheMissRailId != 0, Errors.InvalidDataSetId(dataSetId)); - require(info.cdnRailId != 0, Errors.InvalidDataSetId(dataSetId)); + require(info.cacheMissRailId != 0 && info.cdnRailId != 0, Errors.InvalidDataSetId(dataSetId)); Payments payments = Payments(paymentsContractAddress); @@ -1044,23 +1043,20 @@ contract FilecoinWarmStorageService is require(cdnRail.endEpoch == 0, Errors.CDNPaymentAlreadyTerminated(dataSetId)); require(cacheMissRail.endEpoch == 0, Errors.CacheMissPaymentAlreadyTerminated(dataSetId)); + // Require at least one amount to be non-zero + if (cdnAmountToAdd == 0 && cacheMissAmountToAdd == 0) { + revert Errors.InvalidTopUpAmount(dataSetId); + } + // Calculate total lockup amounts uint256 totalCdnLockup = cdnRail.lockupFixed + cdnAmountToAdd; uint256 totalCacheMissLockup = cacheMissRail.lockupFixed + cacheMissAmountToAdd; // Only modify rails if amounts are being added - if (cdnAmountToAdd > 0) { - payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, totalCdnLockup); - } - - if (cacheMissAmountToAdd > 0) { - payments.modifyRailLockup(info.cacheMissRailId, DEFAULT_LOCKUP_PERIOD, totalCacheMissLockup); - } + payments.modifyRailLockup(info.cdnRailId, DEFAULT_LOCKUP_PERIOD, totalCdnLockup); + payments.modifyRailLockup(info.cacheMissRailId, DEFAULT_LOCKUP_PERIOD, totalCacheMissLockup); - // Emit event if any amount was added - if (cdnAmountToAdd > 0 || cacheMissAmountToAdd > 0) { - emit CDNPaymentRailsToppedUp(dataSetId, totalCdnLockup, totalCacheMissLockup); - } + emit CDNPaymentRailsToppedUp(dataSetId, totalCdnLockup, totalCacheMissLockup); } function terminateCDNService(uint256 dataSetId) external onlyFilBeamController { diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index 3f465661..abb820b1 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -3032,20 +3032,11 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); - // Top up with zero amounts (should not revert and should not emit event) - vm.recordLogs(); + // Top up with zero amounts (should revert with InvalidTopUpAmount error) + vm.expectRevert(abi.encodeWithSelector(Errors.InvalidTopUpAmount.selector, dataSetId)); vm.prank(client); pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 0, 0); - // Verify no CDNPaymentRailsToppedUp event was emitted - Vm.Log[] memory logs = vm.getRecordedLogs(); - for (uint256 i = 0; i < logs.length; i++) { - assertFalse( - logs[i].topics[0] == keccak256("CDNPaymentRailsToppedUp(uint256,uint256,uint256)"), - "CDNPaymentRailsToppedUp should not be emitted for zero amounts" - ); - } - // Verify lockup remains at initial values Payments.RailView memory cdnRail = payments.getRail(info.cdnRailId); Payments.RailView memory cacheMissRail = payments.getRail(info.cacheMissRailId); From c5ac4952603d33ee21ad520b684a03e587c0344d Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Fri, 3 Oct 2025 12:22:42 +0200 Subject: [PATCH 23/31] chore: reshuffle tests --- .../test/FilecoinWarmStorageService.t.sol | 204 +++++++++--------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index abb820b1..cd313852 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -247,10 +247,10 @@ contract FilecoinWarmStorageServiceTest is Test { // Transfer tokens to client for payment mockUSDFC.safeTransfer(client, 10000 * 10 ** mockUSDFC.decimals()); - // Initialize expected lockup amounts based on token decimals + // Initialize expected lockup amounts defaultCDNLockup = (7 * 10 ** mockUSDFC.decimals()) / 10; // 0.7 USDFC defaultCacheMissLockup = (3 * 10 ** mockUSDFC.decimals()) / 10; // 0.3 USDFC - defaultTotalCDNLockup = 10 ** mockUSDFC.decimals(); // 1.0 USDFC + defaultTotalCDNLockup = defaultCacheMissLockup + defaultCDNLockup; // Deploy FilecoinWarmStorageService with proxy FilecoinWarmStorageService pdpServiceImpl = new FilecoinWarmStorageService( @@ -2916,6 +2916,106 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } + // Tests for insufficient lockup failures + function testSettleCDNPaymentRails_FailsWithInsufficientLockup() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + // Try to settle more than the initial lockup amount + uint256 cdnAmount = defaultCDNLockup + 50000; // More than initial 0.7 USDFC + uint256 cacheMissAmount = defaultCacheMissLockup + 10000; // More than initial 0.3 USDFC + + // Attempt to settle without additional top-up (only initial lockup available) + // Expecting OneTimePaymentExceedsLockup error + vm.expectRevert(); + vm.prank(filBeamController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_FailsWhenLockupLessThanSettlement() public { + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + + // Top up with smaller amounts than we'll try to settle + uint256 topUpCdn = 10000; + uint256 topUpCacheMiss = 5000; + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, topUpCdn, topUpCacheMiss); + + // Try to settle with amounts larger than initial plus top-up + uint256 cdnAmount = defaultCDNLockup + topUpCdn + 50000; // More than available lockup + uint256 cacheMissAmount = defaultCacheMissLockup + topUpCacheMiss + 10000; // More than available lockup + + // Should fail due to insufficient lockup + vm.expectRevert(); + vm.prank(filBeamController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_AfterTermination() public { + // Create dataset with CDN enabled + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + // Top up CDN rails with sufficient funds + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 100000, 50000); + + // Terminate the CDN service (this removes withCDN metadata) + vm.prank(filBeamController); + pdpServiceWithPayments.terminateCDNService(dataSetId); + + // Verify withCDN metadata is removed + (bool exists,) = viewContract.getDataSetMetadata(dataSetId, "withCDN"); + assertFalse(exists, "withCDN metadata should be removed after termination"); + + // Should still be able to settle CDN payment rails after termination + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + // Expect the correct events to be emitted for successful settlement + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); + + vm.prank(filBeamController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + + function testSettleCDNPaymentRails_AfterServiceTermination() public { + // Create dataset with CDN enabled + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); + FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); + + // Top up CDN rails with sufficient funds + vm.prank(client); + pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 100000, 50000); + + // Terminate the entire service (this also removes withCDN metadata and terminates CDN rails) + vm.prank(client); + pdpServiceWithPayments.terminateService(dataSetId); + + // Verify withCDN metadata is removed + (bool exists,) = viewContract.getDataSetMetadata(dataSetId, "withCDN"); + assertFalse(exists, "withCDN metadata should be removed after service termination"); + + // Should still be able to settle CDN payment rails after termination + uint256 cdnAmount = 50000; + uint256 cacheMissAmount = 25000; + + // Expect the correct events to be emitted for successful settlement + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); + vm.expectEmit(true, false, false, true); + emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); + + vm.prank(filBeamController); + pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + } + // Tests for topUpCDNPaymentRails function function testTopUpCDNPaymentRails_Success() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); @@ -3205,106 +3305,6 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cacheMissRail.lockupFixed, defaultCacheMissLockupTotal, "Cache miss rail lockup incorrect"); } - // Tests for insufficient lockup failures - function testSettleCDNPaymentRails_FailsWithInsufficientLockup() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - - // Try to settle more than the initial lockup amount - uint256 cdnAmount = defaultCDNLockup + 50000; // More than initial 0.7 USDFC - uint256 cacheMissAmount = defaultCacheMissLockup + 10000; // More than initial 0.3 USDFC - - // Attempt to settle without additional top-up (only initial lockup available) - // Expecting OneTimePaymentExceedsLockup error - vm.expectRevert(); - vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); - } - - function testSettleCDNPaymentRails_FailsWhenLockupLessThanSettlement() public { - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - - // Top up with smaller amounts than we'll try to settle - uint256 topUpCdn = 10000; - uint256 topUpCacheMiss = 5000; - vm.prank(client); - pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, topUpCdn, topUpCacheMiss); - - // Try to settle with amounts larger than initial plus top-up - uint256 cdnAmount = defaultCDNLockup + topUpCdn + 50000; // More than available lockup - uint256 cacheMissAmount = defaultCacheMissLockup + topUpCacheMiss + 10000; // More than available lockup - - // Should fail due to insufficient lockup - vm.expectRevert(); - vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); - } - - function testSettleCDNPaymentRails_AfterTermination() public { - // Create dataset with CDN enabled - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); - - // Top up CDN rails with sufficient funds - vm.prank(client); - pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 100000, 50000); - - // Terminate the CDN service (this removes withCDN metadata) - vm.prank(filBeamController); - pdpServiceWithPayments.terminateCDNService(dataSetId); - - // Verify withCDN metadata is removed - (bool exists,) = viewContract.getDataSetMetadata(dataSetId, "withCDN"); - assertFalse(exists, "withCDN metadata should be removed after termination"); - - // Should still be able to settle CDN payment rails after termination - uint256 cdnAmount = 50000; - uint256 cacheMissAmount = 25000; - - // Expect the correct events to be emitted for successful settlement - vm.expectEmit(true, false, false, true); - emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); - vm.expectEmit(true, false, false, true); - emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); - - vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); - } - - function testSettleCDNPaymentRails_AfterServiceTermination() public { - // Create dataset with CDN enabled - (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); - uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); - FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); - - // Top up CDN rails with sufficient funds - vm.prank(client); - pdpServiceWithPayments.topUpCDNPaymentRails(dataSetId, 100000, 50000); - - // Terminate the entire service (this also removes withCDN metadata and terminates CDN rails) - vm.prank(client); - pdpServiceWithPayments.terminateService(dataSetId); - - // Verify withCDN metadata is removed - (bool exists,) = viewContract.getDataSetMetadata(dataSetId, "withCDN"); - assertFalse(exists, "withCDN metadata should be removed after service termination"); - - // Should still be able to settle CDN payment rails after termination - uint256 cdnAmount = 50000; - uint256 cacheMissAmount = 25000; - - // Expect the correct events to be emitted for successful settlement - vm.expectEmit(true, false, false, true); - emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); - vm.expectEmit(true, false, false, true); - emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); - - vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); - } - function _makeStringOfLength(uint256 len) internal pure returns (string memory s) { s = string(_makeBytesOfLength(len)); } From 74a38db01127fa6785ded2d4659e9029c5354f91 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Mon, 6 Oct 2025 10:38:04 +0200 Subject: [PATCH 24/31] feat: emit CDNPaymentRailsToppedUp after rail creation --- .../src/FilecoinWarmStorageService.sol | 2 + .../test/FilecoinWarmStorageService.t.sol | 96 +++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index d87cd943..ac532022 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -607,6 +607,8 @@ contract FilecoinWarmStorageService is railToDataSet[cdnRailId] = dataSetId; // Set lockup with 0.7 USDFC payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, DEFAULT_CDN_LOCKUP_AMOUNT); + + emit CDNPaymentRailsToppedUp(dataSetId, DEFAULT_CDN_LOCKUP_AMOUNT, DEFAULT_CACHE_MISS_LOCKUP_AMOUNT); } // Emit event for tracking diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index cd313852..93aee731 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -508,6 +508,10 @@ contract FilecoinWarmStorageServiceTest is Test { payments.deposit(mockUSDFC, client, depositAmount); vm.stopPrank(); + // Expect CDNPaymentRailsToppedUp event when creating the data set with CDN enabled + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(1, defaultCDNLockup, defaultCacheMissLockup); + // Expect DataSetCreated event when creating the data set (with CDN rails) vm.expectEmit(true, true, true, true); emit FilecoinWarmStorageService.DataSetCreated( @@ -2670,6 +2674,10 @@ contract FilecoinWarmStorageServiceTest is Test { payments.deposit(mockUSDFC, client, depositAmount); vm.stopPrank(); + // Expect CDNPaymentRailsToppedUp event when creating the data set with CDN enabled + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp(1, defaultCDNLockup, defaultCacheMissLockup); + makeSignaturePass(client); vm.startPrank(serviceProvider); uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); @@ -2690,6 +2698,94 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(cdnRail.validator, address(0), "CDN rail should have no validator"); } + function testCreateDataSetWithCDN_EmitsCDNPaymentRailsToppedUp() public { + // Test that creating a dataset with CDN enabled emits CDNPaymentRailsToppedUp event + (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); + + FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ + payer: client, + metadataKeys: metadataKeys, + metadataValues: metadataValues, + signature: FAKE_SIGNATURE + }); + + extraData = + abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); + + vm.startPrank(client); + payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 1000e6, 1000e6, 365 days); + uint256 depositAmount = 1e6; + mockUSDFC.approve(address(payments), depositAmount); + payments.deposit(mockUSDFC, client, depositAmount); + vm.stopPrank(); + + // Expect the CDNPaymentRailsToppedUp event with correct parameters + // Event signature: CDNPaymentRailsToppedUp(uint256 indexed dataSetId, uint256 totalCdnLockup, uint256 totalCacheMissLockup) + vm.expectEmit(true, false, false, true); + emit FilecoinWarmStorageService.CDNPaymentRailsToppedUp( + 1, // dataSetId will be 1 (first dataset created) + defaultCDNLockup, // Should be 0.7 USDFC + defaultCacheMissLockup // Should be 0.3 USDFC + ); + + // Create the dataset + makeSignaturePass(client); + vm.startPrank(serviceProvider); + uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); + vm.stopPrank(); + + // Verify the dataset was created with CDN rails + FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); + assertTrue(dataSet.cacheMissRailId > 0, "Cache Miss Rail ID should be non-zero"); + assertTrue(dataSet.cdnRailId > 0, "CDN Rail ID should be non-zero"); + } + + function testCreateDataSetWithoutCDN_NoCDNPaymentRailsToppedUpEvent() public { + // Test that creating a dataset without CDN does not emit CDNPaymentRailsToppedUp event + string[] memory metadataKeys = new string[](0); + string[] memory metadataValues = new string[](0); + + FilecoinWarmStorageService.DataSetCreateData memory createData = FilecoinWarmStorageService.DataSetCreateData({ + payer: client, + metadataKeys: metadataKeys, + metadataValues: metadataValues, + signature: FAKE_SIGNATURE + }); + + extraData = + abi.encode(createData.payer, createData.metadataKeys, createData.metadataValues, createData.signature); + + vm.startPrank(client); + payments.setOperatorApproval(mockUSDFC, address(pdpServiceWithPayments), true, 1000e6, 1000e6, 365 days); + uint256 depositAmount = 10e6; + mockUSDFC.approve(address(payments), depositAmount); + payments.deposit(mockUSDFC, client, depositAmount); + vm.stopPrank(); + + // Record logs to verify CDNPaymentRailsToppedUp event is NOT emitted + vm.recordLogs(); + + // Create the dataset + makeSignaturePass(client); + vm.startPrank(serviceProvider); + uint256 newDataSetId = mockPDPVerifier.createDataSet(pdpServiceWithPayments, extraData); + vm.stopPrank(); + + // Check that CDNPaymentRailsToppedUp event was NOT emitted + Vm.Log[] memory logs = vm.getRecordedLogs(); + bytes32 cdnEventSignature = keccak256("CDNPaymentRailsToppedUp(uint256,uint256,uint256)"); + for (uint256 i = 0; i < logs.length; i++) { + assertNotEq( + logs[i].topics[0], cdnEventSignature, "CDNPaymentRailsToppedUp should not be emitted without CDN" + ); + } + + // Verify the dataset was created without CDN rails + FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(newDataSetId); + assertEq(dataSet.cacheMissRailId, 0, "Cache Miss Rail ID should be zero"); + assertEq(dataSet.cdnRailId, 0, "CDN Rail ID should be zero"); + } + // Tests for settleCDNPaymentRails function function testSettleCDNPaymentRails_BothAmounts() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); From 47be0afc26442cd35cf634a2c17c9d560899d5a7 Mon Sep 17 00:00:00 2001 From: Srdjan Date: Mon, 6 Oct 2025 12:44:49 +0200 Subject: [PATCH 25/31] Update service_contracts/src/FilecoinWarmStorageService.sol Co-authored-by: Julian Gruber --- service_contracts/src/FilecoinWarmStorageService.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index ac532022..8a47fe81 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -605,7 +605,6 @@ contract FilecoinWarmStorageService is ); info.cdnRailId = cdnRailId; railToDataSet[cdnRailId] = dataSetId; - // Set lockup with 0.7 USDFC payments.modifyRailLockup(cdnRailId, DEFAULT_LOCKUP_PERIOD, DEFAULT_CDN_LOCKUP_AMOUNT); emit CDNPaymentRailsToppedUp(dataSetId, DEFAULT_CDN_LOCKUP_AMOUNT, DEFAULT_CACHE_MISS_LOCKUP_AMOUNT); From 644f4bf919ce6cdb75b4d5cca1500ead9f897a58 Mon Sep 17 00:00:00 2001 From: Srdjan Date: Mon, 6 Oct 2025 12:44:55 +0200 Subject: [PATCH 26/31] Update service_contracts/src/FilecoinWarmStorageService.sol Co-authored-by: Julian Gruber --- service_contracts/src/FilecoinWarmStorageService.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 8a47fe81..b1f733ef 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -594,7 +594,6 @@ contract FilecoinWarmStorageService is // Set lockup with 0.3 USDFC payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, DEFAULT_CACHE_MISS_LOCKUP_AMOUNT); - // Create CDN payment rail with 0.7 USDFC lockup cdnRailId = payments.createRail( usdfcTokenAddress, // token address createData.payer, // from (payer) From 962dfccc9057d2ebf79ae2a2c5781c0ea90c1d40 Mon Sep 17 00:00:00 2001 From: Srdjan Date: Mon, 6 Oct 2025 12:45:36 +0200 Subject: [PATCH 27/31] Update service_contracts/src/FilecoinWarmStorageService.sol Co-authored-by: Julian Gruber --- service_contracts/src/FilecoinWarmStorageService.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index b1f733ef..cbadb019 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -580,7 +580,6 @@ contract FilecoinWarmStorageService is uint256 cdnRailId = 0; if (hasMetadataKey(createData.metadataKeys, METADATA_KEY_WITH_CDN)) { - // Create cache-miss payment rail with 0.3 USDFC lockup cacheMissRailId = payments.createRail( usdfcTokenAddress, // token address createData.payer, // from (payer) From f832caae337a30548a2581e779f5194d6a9b187a Mon Sep 17 00:00:00 2001 From: Srdjan Date: Mon, 6 Oct 2025 12:45:43 +0200 Subject: [PATCH 28/31] Update service_contracts/src/FilecoinWarmStorageService.sol Co-authored-by: Julian Gruber --- service_contracts/src/FilecoinWarmStorageService.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index cbadb019..87ce8bf6 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -590,7 +590,6 @@ contract FilecoinWarmStorageService is ); info.cacheMissRailId = cacheMissRailId; railToDataSet[cacheMissRailId] = dataSetId; - // Set lockup with 0.3 USDFC payments.modifyRailLockup(cacheMissRailId, DEFAULT_LOCKUP_PERIOD, DEFAULT_CACHE_MISS_LOCKUP_AMOUNT); cdnRailId = payments.createRail( From a49b22381391b451ad140006224a6836a6a61ddd Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Mon, 6 Oct 2025 13:07:29 +0200 Subject: [PATCH 29/31] fix: failing test --- service_contracts/test/FilecoinWarmStorageService.t.sol | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index f2d90298..62036ef1 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -1287,11 +1287,7 @@ contract FilecoinWarmStorageServiceTest is Test { console.log("Testing dataSetDeleted - should revert (in grace period)"); vm.prank(address(mockPDPVerifier)); - vm.expectRevert( - abi.encodeWithSelector( - Errors.PaymentRailsNotFinalized.selector, dataSetId, info.pdpEndEpoch, info.cdnEndEpoch - ) - ); + vm.expectRevert(abi.encodeWithSelector(Errors.PaymentRailsNotFinalized.selector, dataSetId, info.pdpEndEpoch)); pdpServiceWithPayments.dataSetDeleted(dataSetId, 10, bytes("")); // Wait for payment end epoch to elapse From 0968f4e6d46b89bd235f6b7ef339b862e634bc90 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Mon, 6 Oct 2025 16:17:51 +0200 Subject: [PATCH 30/31] chore: Rename settleCNDPaymentRails to settleFilBeamPaymentRails --- .../abi/FilecoinWarmStorageService.abi.json | 2 +- .../src/FilecoinWarmStorageService.sol | 2 +- .../test/FilecoinWarmStorageService.t.sol | 36 +++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/service_contracts/abi/FilecoinWarmStorageService.abi.json b/service_contracts/abi/FilecoinWarmStorageService.abi.json index 49fe90a1..cc021ce7 100644 --- a/service_contracts/abi/FilecoinWarmStorageService.abi.json +++ b/service_contracts/abi/FilecoinWarmStorageService.abi.json @@ -681,7 +681,7 @@ }, { "type": "function", - "name": "settleCDNPaymentRails", + "name": "settleFilBeamPaymentRails", "inputs": [ { "name": "dataSetId", diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 0edaca51..a6b2d083 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -989,7 +989,7 @@ contract FilecoinWarmStorageService is * @param cdnAmount Amount to settle for CDN rail * @param cacheMissAmount Amount to settle for cache miss rail */ - function settleCDNPaymentRails(uint256 dataSetId, uint256 cdnAmount, uint256 cacheMissAmount) + function settleFilBeamPaymentRails(uint256 dataSetId, uint256 cdnAmount, uint256 cacheMissAmount) external onlyFilBeamController { diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index 62036ef1..351c28bc 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -2811,7 +2811,7 @@ contract FilecoinWarmStorageServiceTest is Test { assertEq(dataSet.cdnRailId, 0, "CDN Rail ID should be zero"); } - // Tests for settleCDNPaymentRails function + // Tests for settleFilBeamPaymentRails function function testSettleCDNPaymentRails_BothAmounts() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2835,7 +2835,7 @@ contract FilecoinWarmStorageServiceTest is Test { emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_OnlyCdnAmount() public { @@ -2859,7 +2859,7 @@ contract FilecoinWarmStorageServiceTest is Test { emit RailOneTimePaymentProcessed(info.cdnRailId, cdnAmount, 0); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_OnlyCacheMissAmount() public { @@ -2883,7 +2883,7 @@ contract FilecoinWarmStorageServiceTest is Test { emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_ZeroAmounts() public { @@ -2891,7 +2891,7 @@ contract FilecoinWarmStorageServiceTest is Test { uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 0, 0); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, 0, 0); } function testSettleCDNPaymentRails_OnlyfilBeamController() public { @@ -2905,7 +2905,7 @@ contract FilecoinWarmStorageServiceTest is Test { vm.expectRevert(); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_RevertIfNotController() public { @@ -2914,11 +2914,11 @@ contract FilecoinWarmStorageServiceTest is Test { vm.expectRevert(abi.encodeWithSelector(Errors.OnlyFilBeamControllerAllowed.selector, filBeamController, client)); vm.prank(client); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, 50000, 25000); vm.expectRevert(abi.encodeWithSelector(Errors.OnlyFilBeamControllerAllowed.selector, filBeamController, sp1)); vm.prank(sp1); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, 50000, 25000); } function testSettleCDNPaymentRails_InvalidDataSetId() public { @@ -2926,7 +2926,7 @@ contract FilecoinWarmStorageServiceTest is Test { vm.expectRevert(abi.encodeWithSelector(Errors.InvalidDataSetId.selector, invalidDataSetId)); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(invalidDataSetId, 50000, 25000); + pdpServiceWithPayments.settleFilBeamPaymentRails(invalidDataSetId, 50000, 25000); } function testSettleCDNPaymentRails_DataSetWithoutCDN() public { @@ -2936,7 +2936,7 @@ contract FilecoinWarmStorageServiceTest is Test { vm.expectRevert(abi.encodeWithSelector(Errors.InvalidDataSetId.selector, dataSetId)); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 50000, 25000); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, 50000, 25000); } function testSettleCDNPaymentRails_DataSetWithEmptyCDNMetadata() public { @@ -2956,7 +2956,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Empty CDN metadata still creates CDN rails and can be settled after top-up vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_EmitsCorrectEvents() public { @@ -2982,7 +2982,7 @@ contract FilecoinWarmStorageServiceTest is Test { emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_NoEventsForZeroAmounts() public { @@ -2991,7 +2991,7 @@ contract FilecoinWarmStorageServiceTest is Test { vm.recordLogs(); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, 0, 0); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, 0, 0); Vm.Log[] memory logs = vm.getRecordedLogs(); for (uint256 i = 0; i < logs.length; i++) { @@ -3034,7 +3034,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Process the payments vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } // Tests for insufficient lockup failures @@ -3050,7 +3050,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Expecting OneTimePaymentExceedsLockup error vm.expectRevert(); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_FailsWhenLockupLessThanSettlement() public { @@ -3070,7 +3070,7 @@ contract FilecoinWarmStorageServiceTest is Test { // Should fail due to insufficient lockup vm.expectRevert(); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_AfterTermination() public { @@ -3102,7 +3102,7 @@ contract FilecoinWarmStorageServiceTest is Test { emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } function testSettleCDNPaymentRails_AfterServiceTermination() public { @@ -3134,7 +3134,7 @@ contract FilecoinWarmStorageServiceTest is Test { emit RailOneTimePaymentProcessed(info.cacheMissRailId, cacheMissAmount, 0); vm.prank(filBeamController); - pdpServiceWithPayments.settleCDNPaymentRails(dataSetId, cdnAmount, cacheMissAmount); + pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } // Tests for topUpCDNPaymentRails function From 2d596c6993d07c949a0a4b32d4a932c8f3dae36a Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Mon, 6 Oct 2025 16:20:37 +0200 Subject: [PATCH 31/31] chore: Rename tests from testSettleCNDPaymentRails_* to testSettleFilBeamPaymentRails_* --- .../test/FilecoinWarmStorageService.t.sol | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index 351c28bc..c81a36fa 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -2812,7 +2812,7 @@ contract FilecoinWarmStorageServiceTest is Test { } // Tests for settleFilBeamPaymentRails function - function testSettleCDNPaymentRails_BothAmounts() public { + function testSettleFilBeamPaymentRails_BothAmounts() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2838,7 +2838,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_OnlyCdnAmount() public { + function testSettleFilBeamPaymentRails_OnlyCdnAmount() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2862,7 +2862,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_OnlyCacheMissAmount() public { + function testSettleFilBeamPaymentRails_OnlyCacheMissAmount() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2886,7 +2886,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_ZeroAmounts() public { + function testSettleFilBeamPaymentRails_ZeroAmounts() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2894,7 +2894,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, 0, 0); } - function testSettleCDNPaymentRails_OnlyfilBeamController() public { + function testSettleFilBeamPaymentRails_OnlyfilBeamController() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2908,7 +2908,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_RevertIfNotController() public { + function testSettleFilBeamPaymentRails_RevertIfNotController() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2921,7 +2921,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, 50000, 25000); } - function testSettleCDNPaymentRails_InvalidDataSetId() public { + function testSettleFilBeamPaymentRails_InvalidDataSetId() public { uint256 invalidDataSetId = 999999; vm.expectRevert(abi.encodeWithSelector(Errors.InvalidDataSetId.selector, invalidDataSetId)); @@ -2929,7 +2929,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(invalidDataSetId, 50000, 25000); } - function testSettleCDNPaymentRails_DataSetWithoutCDN() public { + function testSettleFilBeamPaymentRails_DataSetWithoutCDN() public { string[] memory emptyKeys = new string[](0); string[] memory emptyValues = new string[](0); uint256 dataSetId = createDataSetForClient(sp1, client, emptyKeys, emptyValues); @@ -2939,7 +2939,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, 50000, 25000); } - function testSettleCDNPaymentRails_DataSetWithEmptyCDNMetadata() public { + function testSettleFilBeamPaymentRails_DataSetWithEmptyCDNMetadata() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", ""); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -2959,7 +2959,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_EmitsCorrectEvents() public { + function testSettleFilBeamPaymentRails_EmitsCorrectEvents() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -2985,7 +2985,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_NoEventsForZeroAmounts() public { + function testSettleFilBeamPaymentRails_NoEventsForZeroAmounts() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -3002,7 +3002,7 @@ contract FilecoinWarmStorageServiceTest is Test { } } - function testSettleCDNPaymentRails_ProcessesPaymentsCorrectly() public { + function testSettleFilBeamPaymentRails_ProcessesPaymentsCorrectly() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId); @@ -3038,7 +3038,7 @@ contract FilecoinWarmStorageServiceTest is Test { } // Tests for insufficient lockup failures - function testSettleCDNPaymentRails_FailsWithInsufficientLockup() public { + function testSettleFilBeamPaymentRails_FailsWithInsufficientLockup() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -3053,7 +3053,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_FailsWhenLockupLessThanSettlement() public { + function testSettleFilBeamPaymentRails_FailsWhenLockupLessThanSettlement() public { (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -3073,7 +3073,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_AfterTermination() public { + function testSettleFilBeamPaymentRails_AfterTermination() public { // Create dataset with CDN enabled (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues); @@ -3105,7 +3105,7 @@ contract FilecoinWarmStorageServiceTest is Test { pdpServiceWithPayments.settleFilBeamPaymentRails(dataSetId, cdnAmount, cacheMissAmount); } - function testSettleCDNPaymentRails_AfterServiceTermination() public { + function testSettleFilBeamPaymentRails_AfterServiceTermination() public { // Create dataset with CDN enabled (string[] memory metadataKeys, string[] memory metadataValues) = _getSingleMetadataKV("withCDN", "true"); uint256 dataSetId = createDataSetForClient(sp1, client, metadataKeys, metadataValues);