All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Detect and recover missing permissions for preinstalled Snaps (#3775)
- Add support for
DateTimePickercomponent (#3698)
- Bump
@metamask/permission-controllerfrom12.1.0to12.1.1(#3746)
- Use
no-cachefor fetching registry (#3760)
- BREAKING: Ensure user has onboarded before allowing usage of SnapController (#3731)
- This is breaking as it adds a new required constructor argument to
SnapControllercalledensureOnboardingComplete.
- This is breaking as it adds a new required constructor argument to
- BREAKING: Support specified
clientVersionsin the registry (#3737)- This is breaking as it adds a new required constructor argument to
JsonSnapsRegistrycalledclientConfig.
- This is breaking as it adds a new required constructor argument to
- Override
disableSnapInstallationfeature flag when using automatic updates (#3735)
- Add NPM proxy support (#3695)
- Bump
@metamask/permission-controllerfrom12.0.0to12.1.0(#3714) - Bump
@metamask/phishing-controllerfrom13.1.0to15.0.0(#3707)
- Remove logic for granting CAIP-25 permissions (#3723)
- Prevent initial connections from being revoked as unused on update (#3729)
- Keep dynamic permissions on update (#3726)
- BREAKING: Use new
Messengerfrom@metamask/messenger(#3611)- Previously,
SnapController,CronjobController,SnapInsightsController,SnapInterfaceController,MultichainRouter,ExecutionServiceandWebSocketServiceaccepted aRestrictedMessengerinstance from@metamask/base-controller.
- Previously,
- BREAKING: Metadata property
anonymousrenamed toincludeInDebugSnapshot(#3611) - Bump
@metamask/approval-controllerfrom^7.2.0to^8.0.0((#3611) - Bump
@metamask/base-controllerfrom^8.4.1to^9.0.0((#3611) - Bump
@metamask/permission-controllerfrom^11.0.6to^12.0.0((#3611)
- Throw if Snap not installed (#3666)
- Stop creating errors before needing to throw (#3664)
- BREAKING: Allow updating preinstalled Snaps via the registry (#3616)
SnapController:updateBlockedSnapshas been renamed toSnapController:updateRegistry.
- Add two new controller state metadata properties:
includeInStateLogsandusedInUi(#3632)
- BREAKING: Make
SnapInterfaceController:createInterfaceandSnapInterfaceController:updateInterfaceactions synchronous (#3361) - BREAKING: Remove
useCaip25Permissionfeature flag and enable behaviour by default (#3413) - BREAKING: Use hash private functions for updating internals (#3601)
updateSnap,processRequestedSnapandauthorizeare no longer publicly available functions.
- Move JSON-RPC request inspection outside of the executor (#3356)
- Simplify JSON-RPC failure validation (#3661)
- Bump MetaMask dependencies (#3651, #3638, #3648, #3630, #3628, #3629, #3607, #3623, #3612)
- Properly roll back
initialConnections(#3618) - Display a warning instead of an error when Snaps fail to terminate (#3621)
- Throw a different error when the NPM registry returns 404 while fetching tarballs (#3602)
- Prevent logging multiple errors as the cause when a Snap crashes due to an unhandled error (#3569)
- Prevent double scheduling events and ensure long-running events work correctly (#3561)
- Emit event when destroying execution environment streams (#3074)
- Ignore terminate calls to not executing Snaps (#3559)
- Properly stop Snaps when clearing state (#3552)
- Add support for
onActiveandonInactivelifecycle hooks (#3542)
- Bump
@metamask/phishing-controllerfrom12.6.0to13.1.0(#3538)
- Use custom state manager for cronjob controller (#3539)
- Add support for non-fungible assets to
endowment:assets(#3527) - Add feature flag to treat local Snaps as preinstalled (#3523)
- Clear cronjobs properly for local Snaps (#3514)
- Improve error message for cancelled requests when a Snap is stopped (#3518)
- Improve execution service error messages (#3521)
- Ensure Snap gets half of allocated initialization time (#3522)
- Handle scheduled events close to current time gracefully (#3510)
- Add support for
onAssetsMarketDatahandler (#3496)
- BREAKING: Move
CronjobControllerinit to separate function (#3507)
- Always delete socket when
closeis emitted (#3465) - Add missing boilerplate to
WebSocketService(#3464)
- Add
WebSocketServicefor WebSockets support (#3450)- This service must be instantiated to invoke
onWebSocketEventwhen WebSocket messages are received.
- This service must be instantiated to invoke
- Add
SnapController:initto supportonStarthandler (#3455)- This function should be called when the client has been fully started.
- BREAKING: Drop support for Node.js 18 and 21 (#3447)
- BREAKING: Refactor cronjob controller to reduce duplication (#3421)
- The
jobsstate property was removed in favour of theeventsproperty, which now contains all background events and cronjobs. CronjobController:schedulenow expects aschedulefield instead ofdate.- Some actions were renamed to remove the
BackgroundEventsuffix:CronjobController:scheduleBackgroundEvent->CronjobController:schedule.CronjobController:cancelBackgroundEvent->CronjobController:cancel.CronjobController:getBackgroundEvents->CronjobController:get.
- The
- Log errors that cause a crash (#3443)
- Recover from a crash more gracefully (#3440)
- This resolves possible race conditions when sending requests to a Snap that is in the process of being stopped.
- Support lifecycle hooks for preinstalled Snaps (#3426)
- Add support for
AccountSelectorcomponent (#3088)
- Fetch registry files in parallel (#3416)
- Prevent scheduling background events less than 1 second in the future (#3414)
- Add
isMinimumPlatformVersionaction (#3405)
- Pass origin to
SnapKeyringviaMultichainRouter(#3403)
- Add support for
wallet_switchEthereumChain(#2634) - Add support for SIP-31
onClientRequesthandler (#3394)
- Fix wrong event name for
Snap Export Used(#3389) - Remove undefined parameters in
MultichainRouter(#3388)
- Add Snap export usage metrics (#3281)
- Bump
@metamask/post-message-streamfrom9.0.0to10.0.0(#3322) - Bump
@metamask/base-controllerfrom8.0.0to8.0.1(#3365)
- BREAKING: Remove web worker execution service (#3371)
- Catch cronjob errors during initialization (#3373)
- Clear unencrypted Snap state when resetting the client (#3382)
- Use more performant function to determine if message is a notification (#3352)
- Stop unnecessarily encoding messages in web view executor (#3347)
- Increase size of request queue when Snap is starting up (#3340)
- Make comparison case sensitive in MultichainRouter (#3310)
- Add support for market data to
onAssetsConversionhandler (#3299) - Add support for
onAssetHistoricalPricehandler (#3282)
- Debounce persistence of state updates (#3258)
- Inject
contextintoonUserInputrequest (#3298) - Consider protocol Snaps when determining
isSupportedScope(#3284) - Validate origin in
handleRequest(#3292) - Update
nameandsymbolto be optional in a fungible asset type (#3300) - Stop refreshing phishing list when updating interfaces (#3272)
- Add support for the
AddressInputcomponent (#3129) - Add support for the
AssetSelectorcomponent (#3166) - Add mutex to
getSnapStateto prevent concurrent decryption (#3234)
- Increase Snap interface context size limit slightly (#3246)
- Bump
@metamask/key-treefrom10.1.0to10.1.1(#3254) - Bump
nanoidfrom3.1.31to3.3.10(#3228, #3255)
- Handle
withKeyringbreaking change inMultichainRouter(#3238)
- BREAKING: Use mnemonic seed for state encryption key derivation (#3217)
SnapControllernow expects agetMnemonicSeedhook that must return the BIP-39 seed for the user's primary mnemonic.
- Improve error messaging (#3142)
- BREAKING: Use a WebView per Snap on mobile (#3085)
WebViewExecutionServicenow requirescreateWebViewandremoveWebViewconstructor arguments,getWebViewis no longer supported.
- BREAKING: Encode messages in
WebViewMessageStreamas byte arrays (#3077)- A version of the Snaps execution environment that supports this encoding is required.
- Bump MetaMask dependencies (#3091, #3092, #3084, #3083, #3082, #3050)
- Recreate JSON-RPC request in
MultichainRouter(#3086) - Properly pass down execution service constructor args (#3110)
- Add
nameandstatetoExecutionServiceandMultichainRouter(#3058) - Allow
nullin theendowment:assetshandlers return value (#3056) - Rename
ControllerMessengertoMessenger(#3053)
- Add
MultichainRouterfor SIP-26 (#2875) - Add
onProtocolRequestsupport for SIP-26 (#2875) - Add
getRunnableSnapsaction toSnapController(#3049)
- Add support for
onAssetsLookupandonAssetsConversionhandlers (#3028)
- Added support for non-recurring cronjobs via
snap_scheduleBackgroundEvent(#2941)
- Bump MetaMask dependencies (#2946, #3007, #2999, #3003, #2991, #2989)
- Cache snap state in memory for improved performance (#2980)
- Stop storing messenger manually in
CronjobController(#3006)
- Add support for
onSettingsPageexport (#2911)
- Use
BigIntfor processing insight chain IDs (#2935)
- Add
clientCryptographyproperty for specifying custom cryptography functions (#2909)
- Emit
snapInstalledandsnapUpdatedevents for preinstalled Snaps (#2900)- This indirectly makes preinstalled Snaps trigger cronjobs and lifecycle hooks more reliably.
- Add interface persistence (#2856)
- Use
arrayBufferfor fetching local Snaps (#2884)- This fixes some incompatiblities with React Native.
- Add platform version field to manifest (#2803)
- Bump MetaMask dependencies (#2853)
- Stop unnecesarily validating JSON for stored state (#2845)
- Reduce unnecessary JSON validation (#2844)
- Pass full URLs to
PhishingController(#2835) - Ignore Snap insight response if transaction or signature has already been signed (#2825)
- Allow updating interface context (#2809)
snap_updateInterfacenow accepts acontextparameter to update the context of an interface.
- Remove
AccountSelectorcomponent (#2794)- This is technically a breaking change, but the
AccountSelectorcomponent was never actually implemented, so it should not affect any existing code.
- This is technically a breaking change, but the
- Add
AccountSelectorcomponent (#2764, #2768, #2766) - Convert
createWindowparameters to options bag (#2765)
- Add support for
metamask:schemed URLs (#2719)
- Export
WebViewMessageStreamand related types (#2746)
- Fix invalid
exportsfield (#2740)
- Fix invalid types in type declaration in some cases (#2714)
- Add
stopAllSnapsfunction toSnapController(#2674)
- Fix ESM version of the package (#2682)
- This fixes the ESM version of the package to be fully compliant with the ESM standard.
- Bump
@metamask/utilsfrom^9.1.0to^9.2.1(#2680) - Bump other MetaMask dependencies (#2703)
- Add
Selectorcomponent (#2645) - Add missing types for
getStateaction &stateChangeevent (#2655, #2659)
- Fix
fetchbinding under LavaMoat (#2642)
- Add
RadioGroupcomponent (#2592)
- Persist
severityproperty inSnapInsightsController(#2612)
- Bump
@metamask/approval-controllerfrom^7.0.0to^7.0.2(#2593) - Bump
@metamask/base-controllerfrom^6.0.1to^6.0.2(#2593) - Bump
@metamask/json-rpc-enginefrom^9.0.0to^9.0.2(#2593) - Bump
@metamask/json-rpc-middleware-streamfrom^8.0.0to^8.0.2(#2593) - Bump
@metamask/permission-controllerfrom^10.0.1to^11.0.0(#2593) - Bump
@metamask/phishing-controllerfrom^10.0.0to^10.1.1(#2593) - Bump
@metamask/snaps-utilsfrom^7.8.0to^7.8.1(#2595)
- Add
snap_resolveInterfaceRPC method to theSnapInterfaceController(#2509) - Add
SnapInsightsController(#2555)
- Bump
@metamask/base-controllerfrom^6.0.0to^6.0.1(#2445) - Bump
@metamask/permission-controllerfrom^10.0.0to^10.0.1(#2445) - Bump
@metamask/rpc-errorsfrom^6.2.1to^6.3.1(#2445) - Bump
@metamask/snaps-registryfrom^3.1.0to^3.2.1(#2445) - Bump
@metamask/snaps-rpc-methodsto^10.0.0(#2589) - Bump
@metamask/snaps-sdkto^6.1.0(#2589) - Bump
@metamask/snaps-utilsto^7.8.0(#2589) - Bump
@metamask/utilsfrom^8.3.0to^9.1.0(#2445) - Bump peer dependency
@metamask/snaps-execution-environmentsto^6.6.1(#2589)
- Handle initial connections for preinstalled Snaps (#2591)
- Account for revoked origins when calculating the difference in
initialConnections(#2535)- Fixes issue of revoking permissions that are already revoked.
- Enables revoked connections to be highlighted as being re-added in the UI.
- Enforce stricter size limits for source code, static auxiliary files, and
snap_getFilereturn values (#2527)- Prevent communication failures by enabling compliance with JSON-RPC extension message requirements.
- Add feature flag to disable Snap installation (#2521)
- Add
Checkboxcomponent (#2501) - Add
FileInputcomponent (#2469) - Support additional components inside forms (#2497)
- BREAKING: Defer creation of offscreen document in
OffscreenExecutionService(#2473) - Update
onNameLookupresponse to includedomainName(#2484) - Bump MetaMask dependencies (#2460)
- Properly decrypt legacy state blobs (#2472)
- Add
hiddenflag for preinstalled Snaps (#2463)
- Use first Dropdown option as the default value (#2465)
- Fix
react-nativeexport for tools that don't supportpackage.jsonexports (#2451)
- Add origin to lifecycle hooks (#2441)
- Lifecycle hooks can now use the
originparameter to determine the origin of the installation or update.
- Lifecycle hooks can now use the
- Add
contextfield tosnap_createInterface(#2413) - Add feature flag to disable platform (#2434)
- Add support for
Dropdowncomponent (#2420) - Add
initialConnectionsdiff calculations needed for Snap update (#2424)
- Correctly merge caveats when using initial connections (#2419)
- Re-instantiate preinstalled Snaps after clearing state (#2393)
- Add JSX support for custom UI (#2258)
- Bump
@metamask/approval-controllerfrom6.0.1to6.0.2(#2380) - Bump
@metamask/base-controllerfrom5.0.1to5.0.2(#2375)
- Fix an issue where certain types of executors would be timed out too quickly (#2389)
- BREAKING: Move
maxInitTimeconstructor argument fromSnapControllertoExecutionService(#2348)
- Increase max UI size limit from 250 KB to 10 MB (#2342)
- Consider caveats in permissions difference calculation (#2345)
- This fixes a bug where certain caveats would not be correctly applied when updating Snaps.
- Gracefully handle errors for multiple simultaneous failing requests (#2346)
- Properly handle termination of Snaps that are currently executing (#2304)
- Properly tear down partially initialized executors and improve stability when executor initialization fails (#2348)
- Fix encryption key caching issues (#2326)
- BREAKING: Refactor encryption to enable caching (#2316)
- New required constructor arguments
encryptorandgetMnemonichave been added.
- New required constructor arguments
- Include
initialConnectionsin approvalrequestState(#2322)
- Delete unencrypted state when uninstalling a Snap (#2311)
- Bump MetaMask dependencies (#2270)
- Handle unavailable registry more gracefully (#2256)
- Bump
@metamask/snaps-registryto^3.0.1(#2255) - Bump
@metamask/json-rpc-engineto^7.3.3(#2247)
- Improve timeout handling when the execution environment fails to load (#2242)
- Fix minor build configuration problems (#2220)
- BREAKING: Update ESM build to be fully compliant with the ESM standard (#2210)
- BREAKING: Move Node.js exports to separate export (#2210)
- The default export is now browser-compatible.
- Node.js APIs can be imported from
<package>/node.
- Bump
@metamask/rpc-errorsto^6.2.1(#2209)
- Add sizing limits for custom UI (#2199)
- Fix issue installing non-allowlisted Snaps in allowlist mode (#2196)
- Add support for dynamic user interfaces (#1465, #2126, #2144, #2152, #2143)
- Add support for Snap defined execution timeouts (#2098)
- A Snap can now define
maxRequestTimeto extend or shorten its execution timeout.
- A Snap can now define
- Add
WebViewExecutionServicefor mobile execution (#2005)
- Loosen allowlist requirements (#1672)
- Snaps with certain permissions can now be installed without being allowlisted.
- Reintroduce
DecompressionStreamfor improved installation performance (#2110) - Bump
tar-stream(#2116)- This fixes a problem where Snaps would sometimes fail to download from NPM.
- Bump several MetaMask dependencies (#2129, #2132, #2130, #2139, #2142)
- Pass localized snap name to SubjectMetadataController (#2157)
- BREAKING: Remove endowment permission specifications from this package (#2155)
- They can now be found in
snaps-rpc-methods.
- They can now be found in
- Add support for signature insights (#2074)
- Add support for initial connections (#2048)
- Add support for preinstalled snaps (#2008)
- Add additional install events (#2087)
- BREAKING: Remove
:snapAddedevent (#2073) - BREAKING: Remove
:snapRemovedevent (#2076) - Populate subject metadata when snaps are added to state (#2069)
- Revert usage of
DecompressionStream(#2052) - Refactor
NpmLocationclass (#2038)- Most logic is now located in
BaseNpmLocation, making it easier to extend without duplication.
- Most logic is now located in
- Bump several MetaMask dependencies (#2053, #2061, #2064, #2065, #2067)
- Remove support for object-like syntax for cronjobs (#2057)
- Since this never worked in the first place we aren't marking it as breaking.
- Reduce memory usage by removing source code and state from runtime (#2009)
- Improve base64 encoding/decoding speeds (#1985)
- Use
DecompressionStreamfor NPM fetching when available (#1971) - Bump several MetaMask dependencies (#1989, #1993, #1987, #1983)
- Fix idle snap timeout for unused snap (#2010)
- Fix a few issues with passing non-JSON-serializable values (#1974)
- Use
SubtleCryptofor checksum calculation if available (#1953)- This reduces the time of the checksum calculation by up to 95% in some environments.
- Use
@metamask/snaps-sdkpackage (#1930, #1949)- This package replaces the
@metamask/snaps-typesand @metamask/snaps-uipackages.
- This package replaces the
- Fix support for transaction insight Snaps returning
null(#1952)
- Add manifest localization functionality (#1889)
- Add support for unencrypted storage using
snap_manageState(#1902) - Add
OnHomePageexport (#1896)
- Add support for links in custom UI and notifications (#1814)
- Fix an issue where snaps throwing a
SnapErrorwould be allowed to run for longer than expected (#1897)
- Fix a few issues with allowlist version resolving (#1888)
- Add static file API (#1836)
- This adds a
snap_getFilemethod, which Snaps can use to load files.
- This adds a
- Add
originparameter tosnapInstalledandsnapUpdatedevents (#1867)
- Improve error handling (#1841)
- Snaps can now throw a
SnapError, without causing the Snap to crash.
- Snaps can now throw a
- Bump
tar-streamfrom^2.2.0to^3.1.6(#1853) - Make
snaps-execution-environmentsan optional peer dependency (#1845) - Remove snap errors from state (#1837)
- Try to match requested versions with an allowlisted version (#1877)
- Improve performance when installing snaps with a static version (#1878)
- Stop persisting snaps in the installing state (#1876)
- Add keyring export and endowment (#1787)
- Add optional
allowedOriginsfield toendowment:rpc(#1822)- This can be used to only accept certain origins in your Snap.
- BREAKING: Bump minimum Node.js version to
^18.16.0(#1741)
- Add
SnapController:snapUninstalledevent (#1800)
- Fix some issues with SnapController events (#1800)
- Fix an issue where cronjobs would continually be executed on init (#1790)
- Remove deprecated
endowment:long-running(#1751)
- Initial stable release from main branch (#1757)
- Add
onNameLookupexport (#1394)
- Fix cronjob running on disabled snaps (#1743)
- Bump
@metamask/post-message-streamfrom 6.1.2 to 7.0.0 (#1707, #1724) - Bump
@metamask/utilsand@metamask/snaps-registry(#1694)
- Fix unpacking zero byte files from NPM (#1708)
- Remove unused dependencies (#1680)
- Fix parallel usage of registry (#1669)
- Add
onInstallandonUpdatelifecycle hooks (#1643)
- Make
updateBlockedSnapsupdate the registry (#1625) - Move source code and snap state back to controller state (#1634)
- Release package independently (#1600)
- The version of the package no longer needs to match the version of all other MetaMask Snaps packages.