From 77beaae6e3e78ee0a977baae09ac190705012b68 Mon Sep 17 00:00:00 2001 From: dk1a Date: Mon, 6 Feb 2023 19:37:52 +0300 Subject: [PATCH] fix: update dependencies, make Subsystem local --- .../duration/ScopedDurationSubsystem.sol | 8 ++-- contracts/mud/Subsystem.sol | 22 +++++++++ contracts/mud/SystemCallbackBareComponent.sol | 48 ------------------- .../duration/ScopedDurationSubsystem.t.sol | 6 ++- .../ERC1155/SafeBatchTransferFromSystem.t.sol | 6 +-- .../token/ERC721/SafeTransferSystem.t.sol | 6 +-- .../token/ERC1155/ERC1155BaseSubsystem.sol | 17 +++---- .../ERC1155/logic/ERC1155BaseInternal.sol | 16 +------ .../token/ERC721/ERC721BaseSubsystem.sol | 17 +++---- .../token/ERC721/logic/ERC721BaseInternal.sol | 15 +----- package.json | 8 ++-- yarn.lock | 30 ++++++------ 12 files changed, 75 insertions(+), 124 deletions(-) create mode 100644 contracts/mud/Subsystem.sol delete mode 100644 contracts/mud/SystemCallbackBareComponent.sol diff --git a/contracts/duration/ScopedDurationSubsystem.sol b/contracts/duration/ScopedDurationSubsystem.sol index 99c983c..6d9bda8 100644 --- a/contracts/duration/ScopedDurationSubsystem.sol +++ b/contracts/duration/ScopedDurationSubsystem.sol @@ -3,15 +3,15 @@ pragma solidity ^0.8.17; import { IWorld } from "@latticexyz/solecs/src/interfaces/IWorld.sol"; -import { Subsystem } from "@latticexyz/solecs/src/Subsystem.sol"; import { getAddressById } from "@latticexyz/solecs/src/utils.sol"; - -import { ScopedValue } from "../scoped-value/ScopedValue.sol"; import { SystemCallbackBareComponent, SystemCallback, executeSystemCallback -} from "../mud/SystemCallbackBareComponent.sol"; +} from "@latticexyz/std-contracts/src/components/SystemCallbackBareComponent.sol"; + +import { Subsystem } from "../mud/Subsystem.sol"; +import { ScopedValue } from "../scoped-value/ScopedValue.sol"; /// @dev durationEntity = hashed(target, prototype) function getDurationEntity(uint256 targetEntity, uint256 protoEntity) pure returns (uint256) { diff --git a/contracts/mud/Subsystem.sol b/contracts/mud/Subsystem.sol new file mode 100644 index 0000000..85aa65c --- /dev/null +++ b/contracts/mud/Subsystem.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: Unlicense +pragma solidity >=0.8.0; + +import { IWorld } from "@latticexyz/solecs/src/interfaces/IWorld.sol"; +import { System } from "@latticexyz/solecs/src/System.sol"; + +import { OwnableWritable } from "@latticexyz/solecs/src/OwnableWritable.sol"; + +/** + * Subsystem base contract + */ +abstract contract Subsystem is System, OwnableWritable { + constructor(IWorld _world, address _components) System(_world, _components) {} + + /** Subsystems have predefined access control for execute */ + function execute(bytes memory args) public override onlyWriter returns (bytes memory) { + return _execute(args); + } + + /** Override _execute rather than execute */ + function _execute(bytes memory args) internal virtual returns (bytes memory); +} diff --git a/contracts/mud/SystemCallbackBareComponent.sol b/contracts/mud/SystemCallbackBareComponent.sol deleted file mode 100644 index ceba99b..0000000 --- a/contracts/mud/SystemCallbackBareComponent.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.0; - -// imports for the component -import { LibTypes } from "@latticexyz/solecs/src/LibTypes.sol"; -import { BareComponent } from "@latticexyz/solecs/src/BareComponent.sol"; - -// imports for `executeSystemCallback` helper -import { IWorld } from "@latticexyz/solecs/src/interfaces/IWorld.sol"; -import { ISystem } from "@latticexyz/solecs/src/interfaces/ISystem.sol"; -import { getAddressById } from "@latticexyz/solecs/src/utils.sol"; - -struct SystemCallback { - uint256 systemId; - bytes args; -} - -contract SystemCallbackBareComponent is BareComponent { - constructor(address world, uint256 id) BareComponent(world, id) {} - - function getSchema() public pure override returns (string[] memory keys, LibTypes.SchemaValue[] memory values) { - keys = new string[](2); - values = new LibTypes.SchemaValue[](2); - - keys[0] = "systemId"; - values[0] = LibTypes.SchemaValue.UINT256; - - keys[1] = "args"; - values[1] = LibTypes.SchemaValue.BYTES; - } - - function set(uint256 entity, SystemCallback memory value) public virtual { - set(entity, abi.encode(value)); - } - - function getValue(uint256 entity) public view virtual returns (SystemCallback memory) { - return abi.decode(getRawValue(entity), (SystemCallback)); - } -} - -/** - * @dev Queries `world.systems()` for `cb.systemId`, - * then executes the system with `cb.args`. - */ -function executeSystemCallback(IWorld world, SystemCallback memory cb) returns (bytes memory) { - ISystem system = ISystem(getAddressById(world.systems(), cb.systemId)); - return system.execute(cb.args); -} diff --git a/contracts/test/duration/ScopedDurationSubsystem.t.sol b/contracts/test/duration/ScopedDurationSubsystem.t.sol index 8346730..92af6e6 100644 --- a/contracts/test/duration/ScopedDurationSubsystem.t.sol +++ b/contracts/test/duration/ScopedDurationSubsystem.t.sol @@ -7,9 +7,13 @@ import { PRBTest } from "@prb/test/src/PRBTest.sol"; import { World } from "@latticexyz/solecs/src/World.sol"; import { Uint256Component } from "@latticexyz/solecs/src/components/Uint256Component.sol"; +import { + SystemCallbackBareComponent, + SystemCallback, + executeSystemCallback +} from "@latticexyz/std-contracts/src/components/SystemCallbackBareComponent.sol"; import { ScopeComponent } from "../../scoped-value/ScopeComponent.sol"; import { ValueComponent } from "../../scoped-value/ValueComponent.sol"; -import { SystemCallbackBareComponent, SystemCallback } from "../../mud/SystemCallbackBareComponent.sol"; import { ScopedDurationSubsystem, ScopedDuration } from "../../duration/ScopedDurationSubsystem.sol"; import { SetValueSystem, ID as SetValueSystemID } from "./SetValueSystem.sol"; diff --git a/contracts/test/token/ERC1155/SafeBatchTransferFromSystem.t.sol b/contracts/test/token/ERC1155/SafeBatchTransferFromSystem.t.sol index fa6d996..ced2da4 100644 --- a/contracts/test/token/ERC1155/SafeBatchTransferFromSystem.t.sol +++ b/contracts/test/token/ERC1155/SafeBatchTransferFromSystem.t.sol @@ -8,7 +8,7 @@ import { BaseTest } from "./BaseTest.sol"; import { SafeBatchTransferFromSystemMock, ID as SafeBatchTransferFromSystemMockID } from "./SafeBatchTransferFromSystemMock.sol"; // errors -import { ERC1155BaseInternal } from "../../../token/ERC1155/logic/ERC1155BaseInternal.sol"; +import { IERC1155BaseInternal } from "@solidstate/contracts/token/ERC1155/base/IERC1155BaseInternal.sol"; contract SafeBatchTransferFromSystemTest is BaseTest { SafeBatchTransferFromSystemMock transferSystem; @@ -49,7 +49,7 @@ contract SafeBatchTransferFromSystemTest is BaseTest { _defaultMintToAlice(); vm.prank(bob); - vm.expectRevert(ERC1155BaseInternal.ERC1155Base__NotOwnerOrApproved.selector); + vm.expectRevert(IERC1155BaseInternal.ERC1155Base__NotOwnerOrApproved.selector); transferSystem.executeTyped(alice, bob, _asArray(tokenId), _asArray(80), ''); } @@ -58,7 +58,7 @@ contract SafeBatchTransferFromSystemTest is BaseTest { ercSubsystem.executeSafeMintBatch(address(transferSystem), _asArray(tokenId), _asArray(100), ''); vm.prank(bob); - vm.expectRevert(ERC1155BaseInternal.ERC1155Base__NotOwnerOrApproved.selector); + vm.expectRevert(IERC1155BaseInternal.ERC1155Base__NotOwnerOrApproved.selector); transferSystem.executeTyped(address(transferSystem), bob, _asArray(tokenId), _asArray(80), ''); } } \ No newline at end of file diff --git a/contracts/test/token/ERC721/SafeTransferSystem.t.sol b/contracts/test/token/ERC721/SafeTransferSystem.t.sol index ebf2234..2b6a92f 100644 --- a/contracts/test/token/ERC721/SafeTransferSystem.t.sol +++ b/contracts/test/token/ERC721/SafeTransferSystem.t.sol @@ -8,7 +8,7 @@ import { BaseTest } from "./BaseTest.sol"; import { SafeTransferSystemMock, ID as SafeTransferSystemMockID } from "./SafeTransferSystemMock.sol"; // errors -import { ERC721BaseInternal } from "../../../token/ERC721/logic/ERC721BaseInternal.sol"; +import { IERC721BaseInternal } from "@solidstate/contracts/token/ERC721/base/IERC721BaseInternal.sol"; contract SafeTransferSystemTest is BaseTest { SafeTransferSystemMock transferSystem; @@ -44,7 +44,7 @@ contract SafeTransferSystemTest is BaseTest { _defaultMintToAlice(); vm.prank(bob); - vm.expectRevert(ERC721BaseInternal.ERC721Base__NotOwnerOrApproved.selector); + vm.expectRevert(IERC721BaseInternal.ERC721Base__NotOwnerOrApproved.selector); transferSystem.executeTyped(alice, bob, tokenId, ''); } @@ -53,7 +53,7 @@ contract SafeTransferSystemTest is BaseTest { ercSubsystem.executeSafeMint(address(transferSystem), tokenId, ''); vm.prank(bob); - vm.expectRevert(ERC721BaseInternal.ERC721Base__NotOwnerOrApproved.selector); + vm.expectRevert(IERC721BaseInternal.ERC721Base__NotOwnerOrApproved.selector); transferSystem.executeTyped(address(transferSystem), bob, tokenId, ''); } } \ No newline at end of file diff --git a/contracts/token/ERC1155/ERC1155BaseSubsystem.sol b/contracts/token/ERC1155/ERC1155BaseSubsystem.sol index f913edd..7d25a0b 100644 --- a/contracts/token/ERC1155/ERC1155BaseSubsystem.sol +++ b/contracts/token/ERC1155/ERC1155BaseSubsystem.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.17; // erc165 -import { ERC165, IERC165 } from "@solidstate/contracts/introspection/ERC165.sol"; -import { ERC165Storage } from "@solidstate/contracts/introspection/ERC165Storage.sol"; +import { IERC165 } from "@solidstate/contracts/interfaces/IERC165.sol"; +import { ERC165Base } from "@solidstate/contracts/introspection/ERC165/base/ERC165Base.sol"; import { IERC1155 } from "@solidstate/contracts/interfaces/IERC1155.sol"; import { ISystem } from "@latticexyz/solecs/src/interfaces/ISystem.sol"; // ECS import { IWorld } from "@latticexyz/solecs/src/interfaces/IWorld.sol"; -import { Subsystem } from "@latticexyz/solecs/src/Subsystem.sol"; +import { Subsystem } from "../../mud/Subsystem.sol"; // ERC1155 logic and data provider import { ERC1155BaseLogic } from "./logic/ERC1155BaseLogic.sol"; @@ -35,13 +35,11 @@ import { ERC1155BaseDataComponents } from "./data-providers/ERC1155BaseDataCompo * TODO metadata, enumerable? */ contract ERC1155BaseSubsystem is - ERC165, + ERC165Base, ERC1155BaseDataComponents, ERC1155BaseLogic, Subsystem { - using ERC165Storage for ERC165Storage.Layout; - error ERC1155BaseSubsystem__InvalidExecuteSelector(); // TODO diamond-compatible version? @@ -56,13 +54,12 @@ contract ERC1155BaseSubsystem is __ERC1155BaseDataComponents_init(_world, balanceComponentId, operatorApprovalComponentId); // register interfaces - ERC165Storage.Layout storage erc165 = ERC165Storage.layout(); // IERC165 - erc165.setSupportedInterface(type(IERC165).interfaceId, true); + _setSupportsInterface(type(IERC165).interfaceId, true); // IERC1155 - erc165.setSupportedInterface(type(IERC1155).interfaceId, true); + _setSupportsInterface(type(IERC1155).interfaceId, true); // ISystem - erc165.setSupportedInterface(type(ISystem).interfaceId, true); + _setSupportsInterface(type(ISystem).interfaceId, true); } /** diff --git a/contracts/token/ERC1155/logic/ERC1155BaseInternal.sol b/contracts/token/ERC1155/logic/ERC1155BaseInternal.sol index 5b77275..1b4f9dc 100644 --- a/contracts/token/ERC1155/logic/ERC1155BaseInternal.sol +++ b/contracts/token/ERC1155/logic/ERC1155BaseInternal.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.17; import { Address } from "@openzeppelin/contracts/utils/Address.sol"; import { Context } from "@openzeppelin/contracts/utils/Context.sol"; import { IERC1155Receiver } from '@solidstate/contracts/interfaces/IERC1155Receiver.sol'; -import { IERC1155Internal } from "@solidstate/contracts/interfaces/IERC1155Internal.sol"; +import { IERC1155BaseInternal } from "@solidstate/contracts/token/ERC1155/base/IERC1155BaseInternal.sol"; import { ERC1155BaseVData } from "./ERC1155BaseVData.sol"; @@ -16,21 +16,9 @@ import { ERC1155BaseVData } from "./ERC1155BaseVData.sol"; */ abstract contract ERC1155BaseInternal is Context, - IERC1155Internal, + IERC1155BaseInternal, ERC1155BaseVData { - error ERC1155Base__ArrayLengthMismatch(); - error ERC1155Base__BalanceQueryZeroAddress(); - error ERC1155Base__BurnExceedsBalance(); - error ERC1155Base__BurnFromZeroAddress(); - error ERC1155Base__ERC1155ReceiverRejected(); - error ERC1155Base__ERC1155ReceiverNotImplemented(); - error ERC1155Base__MintToZeroAddress(); - error ERC1155Base__NotOwnerOrApproved(); - error ERC1155Base__SelfApproval(); - error ERC1155Base__TransferExceedsBalance(); - error ERC1155Base__TransferToZeroAddress(); - function _balanceOf(address account, uint256 id) internal view virtual returns (uint256) { if (account == address(0)) revert ERC1155Base__BalanceQueryZeroAddress(); return _get_balance(account, id); diff --git a/contracts/token/ERC721/ERC721BaseSubsystem.sol b/contracts/token/ERC721/ERC721BaseSubsystem.sol index aedbd20..2fead6d 100644 --- a/contracts/token/ERC721/ERC721BaseSubsystem.sol +++ b/contracts/token/ERC721/ERC721BaseSubsystem.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.17; // erc165 -import { ERC165, IERC165 } from "@solidstate/contracts/introspection/ERC165.sol"; -import { ERC165Storage } from "@solidstate/contracts/introspection/ERC165Storage.sol"; +import { IERC165 } from "@solidstate/contracts/interfaces/IERC165.sol"; +import { ERC165Base } from "@solidstate/contracts/introspection/ERC165/base/ERC165Base.sol"; import { IERC721 } from "@solidstate/contracts/interfaces/IERC721.sol"; import { ISystem } from "@latticexyz/solecs/src/interfaces/ISystem.sol"; // ECS import { IWorld } from "@latticexyz/solecs/src/interfaces/IWorld.sol"; -import { Subsystem } from "@latticexyz/solecs/src/Subsystem.sol"; +import { Subsystem } from "../../mud/Subsystem.sol"; // ERC721 logic and data provider import { ERC721BaseLogic } from "./logic/ERC721BaseLogic.sol"; @@ -35,13 +35,11 @@ import { ERC721BaseDataComponents } from "./data-providers/ERC721BaseDataCompone * TODO metadata, enumerable? */ contract ERC721BaseSubsystem is - ERC165, + ERC165Base, ERC721BaseDataComponents, ERC721BaseLogic, Subsystem { - using ERC165Storage for ERC165Storage.Layout; - error ERC721BaseSubsystem__InvalidExecuteSelector(); constructor( @@ -56,13 +54,12 @@ contract ERC721BaseSubsystem is __ERC721BaseDataComponents_init(_world, ownershipComponentId, operatorApprovalComponentId, tokenApprovalComponentId); // register interfaces - ERC165Storage.Layout storage erc165 = ERC165Storage.layout(); // IERC165 - erc165.setSupportedInterface(type(IERC165).interfaceId, true); + _setSupportsInterface(type(IERC165).interfaceId, true); // IERC721 - erc165.setSupportedInterface(type(IERC721).interfaceId, true); + _setSupportsInterface(type(IERC721).interfaceId, true); // ISystem - erc165.setSupportedInterface(type(ISystem).interfaceId, true); + _setSupportsInterface(type(ISystem).interfaceId, true); } /** diff --git a/contracts/token/ERC721/logic/ERC721BaseInternal.sol b/contracts/token/ERC721/logic/ERC721BaseInternal.sol index 2367fa1..a6703a8 100644 --- a/contracts/token/ERC721/logic/ERC721BaseInternal.sol +++ b/contracts/token/ERC721/logic/ERC721BaseInternal.sol @@ -5,26 +5,15 @@ pragma solidity ^0.8.17; import { Address } from "@openzeppelin/contracts/utils/Address.sol"; import { Context } from "@openzeppelin/contracts/utils/Context.sol"; import { IERC721Receiver } from '@solidstate/contracts/interfaces/IERC721Receiver.sol'; -import { IERC721Internal } from "@solidstate/contracts/interfaces/IERC721Internal.sol"; +import { IERC721BaseInternal } from "@solidstate/contracts/token/ERC721/base/IERC721BaseInternal.sol"; import { ERC721BaseVData } from "./ERC721BaseVData.sol"; abstract contract ERC721BaseInternal is Context, - IERC721Internal, + IERC721BaseInternal, ERC721BaseVData { - error ERC721Base__NotOwnerOrApproved(); - error ERC721Base__SelfApproval(); - error ERC721Base__BalanceQueryZeroAddress(); - error ERC721Base__ERC721ReceiverNotImplemented(); - error ERC721Base__InvalidOwner(); - error ERC721Base__MintToZeroAddress(); - error ERC721Base__NonExistentToken(); - error ERC721Base__NotTokenOwner(); - error ERC721Base__TokenAlreadyMinted(); - error ERC721Base__TransferToZeroAddress(); - function _balanceOf(address account) internal view virtual returns (uint256) { if (account == address(0)) revert ERC721Base__BalanceQueryZeroAddress(); return _get_balanceOf(account); diff --git a/package.json b/package.json index e19edde..af9d0fc 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,10 @@ "/contracts/**/*.sol" ], "dependencies": { - "@latticexyz/solecs": "https://gitpkg.now.sh/dk1a/mud/packages/solecs?982747e9d05ebaa05a084d4c2aacfd53aa7b4397", - "@latticexyz/std-contracts": "https://gitpkg.now.sh/dk1a/mud/packages/std-contracts?982747e9d05ebaa05a084d4c2aacfd53aa7b4397", - "@openzeppelin/contracts": "^4.8.0", - "@solidstate/contracts": "^0.0.48", + "@latticexyz/solecs": "^1.34.0", + "@latticexyz/std-contracts": "^1.34.0", + "@openzeppelin/contracts": "^4.8.1", + "@solidstate/contracts": "^0.0.52", "memmove": "github:dk1a/memmove#ffd71cd77b1708574ef46a667b23ca3a5cc9fa27" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 991e1a2..74fe956 100644 --- a/yarn.lock +++ b/yarn.lock @@ -559,13 +559,15 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@latticexyz/solecs@https://gitpkg.now.sh/dk1a/mud/packages/solecs?982747e9d05ebaa05a084d4c2aacfd53aa7b4397": - version "1.32.0" - resolved "https://gitpkg.now.sh/dk1a/mud/packages/solecs?982747e9d05ebaa05a084d4c2aacfd53aa7b4397#298cc4bcd647eef994ce04be2306cba50730ff16" +"@latticexyz/solecs@^1.34.0": + version "1.34.0" + resolved "https://registry.yarnpkg.com/@latticexyz/solecs/-/solecs-1.34.0.tgz#bfbf6ca5b577f5c5f5912a35704d99c1ecc089e9" + integrity sha512-tgUyHJWjs03PeOiqxzc+P98NUv2GcH+Ml87puhb/7RFv8WLrus7QOjkiwUcHHRO6+UZCBwr34ySaCY3AzJ4nUg== -"@latticexyz/std-contracts@https://gitpkg.now.sh/dk1a/mud/packages/std-contracts?982747e9d05ebaa05a084d4c2aacfd53aa7b4397": - version "1.32.0" - resolved "https://gitpkg.now.sh/dk1a/mud/packages/std-contracts?982747e9d05ebaa05a084d4c2aacfd53aa7b4397#c7b389f71a5d9ff6b4e24f6081d2dcd2d03f4ad5" +"@latticexyz/std-contracts@^1.34.0": + version "1.34.0" + resolved "https://registry.yarnpkg.com/@latticexyz/std-contracts/-/std-contracts-1.34.0.tgz#3f2bdae721d7aaa641f94ca83592592ab60055f8" + integrity sha512-eLX6qLQV+wQoJpkcO9OFFYB/uJq1ih+hZ1Ufg1n5NzOGzf3kWqJTwQwtSaYWDwUe9bszw2FtreivyqmwfYwubw== "@metamask/eth-sig-util@^4.0.0": version "4.0.1" @@ -808,10 +810,10 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== -"@openzeppelin/contracts@^4.8.0": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.0.tgz#6854c37df205dd2c056bdfa1b853f5d732109109" - integrity sha512-AGuwhRRL+NaKx73WKRNzeCxOCOCxpaqF+kp8TJ89QzAipSwZy/NoflkWaL9bywXFRhIzXt8j38sfF7KBKCPWLw== +"@openzeppelin/contracts@^4.8.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.1.tgz#709cfc4bbb3ca9f4460d60101f15dac6b7a2d5e4" + integrity sha512-xQ6eUZl+RDyb/FiZe1h+U7qr/f4p/SrTSQcTPH2bjur3C5DbuW/zFgCU/b1P/xcIaEqJep+9ju4xDRi3rmChdQ== "@prb/test@^0.1.3": version "0.1.3" @@ -908,10 +910,10 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@solidstate/contracts@^0.0.48": - version "0.0.48" - resolved "https://registry.yarnpkg.com/@solidstate/contracts/-/contracts-0.0.48.tgz#c97eb44cec623a388c67e2b36b404df3d46cf6ed" - integrity sha512-egof846MhC1lo+C8MJPmvte2xOjGEIbHcEB4G2H1ysC51F3xd81WZOTB/w+irylBSBK+HQE2uxhVW8QlUTBcEQ== +"@solidstate/contracts@^0.0.52": + version "0.0.52" + resolved "https://registry.yarnpkg.com/@solidstate/contracts/-/contracts-0.0.52.tgz#cfe7e2ef237421f6e150927d7338c1ef02daa7b8" + integrity sha512-xSBn5oLnfYtgNYrsRq/COlWHt0NxK26PFQ3FvI2DDMAFpZKFsffGLzUl8umezj2gVKpN7EZ+EVLdPKjqx6eUOw== "@solidstate/library@^0.0.48": version "0.0.48"