From cd8fcc467c9773774ebdda67259bc1f437982412 Mon Sep 17 00:00:00 2001 From: ghgoodreau Date: Fri, 23 Jan 2026 11:18:07 -0600 Subject: [PATCH 1/5] fix: remove getMinimumBalanceForRentExemption from the codebase --- .../bridge-controller.sse.test.ts.snap | 2 - .../bridge-controller.test.ts.snap | 354 +----------------- .../src/bridge-controller.test.ts | 331 ---------------- .../src/bridge-controller.ts | 30 -- .../bridge-controller/src/constants/bridge.ts | 1 - packages/bridge-controller/src/index.ts | 1 - .../bridge-controller/src/selectors.test.ts | 41 -- packages/bridge-controller/src/selectors.ts | 7 - packages/bridge-controller/src/types.ts | 5 - .../bridge-controller/src/utils/snaps.test.ts | 29 +- packages/bridge-controller/src/utils/snaps.ts | 53 --- 11 files changed, 3 insertions(+), 851 deletions(-) diff --git a/packages/bridge-controller/src/__snapshots__/bridge-controller.sse.test.ts.snap b/packages/bridge-controller/src/__snapshots__/bridge-controller.sse.test.ts.snap index aaf5643b16e..2e18f4fe165 100644 --- a/packages/bridge-controller/src/__snapshots__/bridge-controller.sse.test.ts.snap +++ b/packages/bridge-controller/src/__snapshots__/bridge-controller.sse.test.ts.snap @@ -161,7 +161,6 @@ Object { "usdExchangeRate": "100", }, }, - "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, "quoteRequest": Object { "destChainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", @@ -270,7 +269,6 @@ Object { "usdExchangeRate": "100", }, }, - "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, "quoteRequest": Object { "destChainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", diff --git a/packages/bridge-controller/src/__snapshots__/bridge-controller.test.ts.snap b/packages/bridge-controller/src/__snapshots__/bridge-controller.test.ts.snap index f8441e5766b..ac84299e4fa 100644 --- a/packages/bridge-controller/src/__snapshots__/bridge-controller.test.ts.snap +++ b/packages/bridge-controller/src/__snapshots__/bridge-controller.test.ts.snap @@ -8,7 +8,6 @@ Object { "usdExchangeRate": "100", }, }, - "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, "quoteRequest": Object { "destChainId": "0x1", @@ -34,7 +33,6 @@ Object { "usdExchangeRate": "100", }, }, - "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, "quoteRequest": Object { "destChainId": "0x1", @@ -512,268 +510,6 @@ Array [ ] `; -exports[`BridgeController updateBridgeQuoteRequestParams should reset minimumBalanceForRentExemptionInLamports if getMinimumBalanceForRentExemption call fails 1`] = ` -Array [ - Array [ - "Error setting minimum balance for rent exemption", - [Error: Min balance error], - ], -] -`; - -exports[`BridgeController updateBridgeQuoteRequestParams should reset minimumBalanceForRentExemptionInLamports if getMinimumBalanceForRentExemption call fails 2`] = ` -Array [ - Array [ - "SnapController:handleRequest", - Object { - "handler": "onProtocolRequest", - "origin": "metamask", - "request": Object { - "jsonrpc": "2.0", - "method": " ", - "params": Object { - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "getMinimumBalanceForRentExemption", - "params": Array [ - 0, - Object { - "commitment": "confirmed", - }, - ], - }, - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onClientRequest", - "origin": "metamask", - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "computeFee", - "params": Object { - "accountId": "account1", - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAHDXLY8oVRIwA8ZdRSGjM5RIZJW8Wv+Twyw3NqU4Hov+OHoHp/dmeDvstKbICW3ezeGR69t3/PTAvdXgZVdJFJXaxkoKXUTWfEAyQyCCG9nwVoDsd10OFdnM9ldSi+9SLqHpqWVDV+zzkmftkF//DpbXxqeH8obNXHFR7pUlxG9uNVOn64oNsFdeUvD139j1M51iRmUY839Y25ET4jDRscT081oGb+rLnywLjLSrIQx6MkqNBhCFbxqY1YmoGZVORW/QMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBHnVW/IxwG7udMVuzmgVB/2xst6j9I5RArHNola8E4+0P/on9df2SnTAmx8pWHneSwmrNt/J3VFLMhqns4zl6JmXkZ+niuxMhAGrmKBaBo94uMv2Sl+Xh3i+VOO0m5BdNZ1ElenbwQylHQY+VW1ydG1MaUEeNpG+EVgswzPMwPoLBgAFAsBcFQAGAAkDQA0DAAAAAAAHBgABAhMICQAHBgADABYICQEBCAIAAwwCAAAAUEYVOwAAAAAJAQMBEQoUCQADBAETCgsKFw0ODxARAwQACRQj5RfLl3rjrSoBAAAAQ2QAAVBGFTsAAAAAyYZnBwAAAABkAAAJAwMAAAEJDAkAAAIBBBMVCQjGASBMKQwnooTbKNxdBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUHTKomh4KXvNgA0ovYKS5F8GIOBgAAAAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAEIF7RFOAwAAAAAAAAAAAAAAaAIAAAAAAAC4CwAAAAAAAOAA2mcAAAAAAAAAAAAAAAAAAAAApapuIXG0FuHSfsU8qME9s/kaic0AAwGCsZdSuxV5eCm+Ria4LEQPgTg4bg65gNrTAefEzpAfPQgCABIMAgAAAAAAAAAAAAAACAIABQwCAAAAsIOFAAAAAAADWk6DVOZO8lMFQg2r0dgfltD6tRL/B1hH3u00UzZdgqkAAxEqIPdq2eRt/F6mHNmFe7iwZpdrtGmHNJMFlK7c6Bc6k6kjBezr6u/tAgvu3OGsJSwSElmcOHZ21imqH/rhJ2KgqDJdBPFH4SYIM1kBAAA=", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onClientRequest", - "origin": "metamask", - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "computeFee", - "params": Object { - "accountId": "account1", - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAIEnLY8oVRIwA8ZdRSGjM5RIZJW8Wv+Twyw3NqU4Hov+OHz7U6VQBhniAZG564p5JhG+y5+5uEABjxPtimE61bsqsz4TFeaDdmFmlW16xBf2qhUAUla7cIQjqp3HfLznM1aZqWVDV+zzkmftkF//DpbXxqeH8obNXHFR7pUlxG9uNVZ0EED+QHqrBQRqB+cbMfYZjXZcTe9r+CfdbguirL8P49t1pWG6qWtPmFmciR1xbrt4IW+b1nNcz2N5abYbCcsDgByJFz/oyJeNAhYJfn7erTZs6xJHjnuAV0v/cuH6iQNCzB1ajK9lOERjgtFNI8XDODau1kgDlDaRIGFfFNP09KMWgsU3Ye36HzgEdq38sqvZDFOifcDzPxfPOcDxeZgLShtMST0fB39lSGQI7f01fZv+JVg5S4qIF2zdmCAhSAAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAACMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkEedVb8jHAbu50xW7OaBUH/bGy3qP0jlECsc2iVrwTj1E+LF26QsO9gzDavYNO6ZflUDWJ+gBV9eCQ5OcuzAMStD/6J/XX9kp0wJsfKVh53ksJqzbfyd1RSzIap7OM5egJanTpAxnCBLW4j9Mn+DAuluhVY4cEgRJ9Pah1VqYQXzWdRJXp28EMpR0GPlVtcnRtTGlBHjaRvhFYLMMzzMD6CQoABQLAXBUACgAJA0ANAwAAAAAACwYAAQIbDA0ACwYAAwAcDA0BAQwCAAMMAgAAAFBGFTsAAAAADQEDAREOKQ0PAAMEBQEcGw4OEA4dDx4SBAYTFBUNBxYICQ4fDwYFFxgZGiAhIiMNKMEgmzNB1pyBAwIAAAAaZAABOGQBAlBGFTsAAAAAP4hnBwAAAABkAAANAwMAAAEJEQUAAgEbDLwBj+v8wtNahk0AAAAAAAAAAAAAAAAUHTKomh4KXvNgA0ovYKS5F8GIOCjcXQcAAAAAAAAAAAAAAACUXhgAAAAAABb1AwAAAAAAGABuuH/gY8j1t421m3ekiET/qFVeKhVA3SJVS5OH/NW+oQMAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAQrPV80YDAAAACwLaZwAAAAAAAAAAAAAAAAAAAAClqm4hcbQW4dJ+xTyowT2z+RqJzQADWk6DVOZO8lMFQg2r0dgfltD6tRL/B1hH3u00UzZdgqkAARE9whapJMxiYg1Y/S9bROWrjXfldZCFcyME/snbeFkkhAUXFisYKQMaKiVZfTkrqqg0GkW+iGFAaIHEbhkRX4YCBLoWvHI1OH2T2gSmTlKhBREUDA0H", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onProtocolRequest", - "origin": "metamask", - "request": Object { - "jsonrpc": "2.0", - "method": " ", - "params": Object { - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "getMinimumBalanceForRentExemption", - "params": Array [ - 0, - Object { - "commitment": "confirmed", - }, - ], - }, - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onProtocolRequest", - "origin": "metamask", - "request": Object { - "jsonrpc": "2.0", - "method": " ", - "params": Object { - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "getMinimumBalanceForRentExemption", - "params": Array [ - 0, - Object { - "commitment": "confirmed", - }, - ], - }, - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onClientRequest", - "origin": "metamask", - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "computeFee", - "params": Object { - "accountId": "account1", - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAHDXLY8oVRIwA8ZdRSGjM5RIZJW8Wv+Twyw3NqU4Hov+OHoHp/dmeDvstKbICW3ezeGR69t3/PTAvdXgZVdJFJXaxkoKXUTWfEAyQyCCG9nwVoDsd10OFdnM9ldSi+9SLqHpqWVDV+zzkmftkF//DpbXxqeH8obNXHFR7pUlxG9uNVOn64oNsFdeUvD139j1M51iRmUY839Y25ET4jDRscT081oGb+rLnywLjLSrIQx6MkqNBhCFbxqY1YmoGZVORW/QMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBHnVW/IxwG7udMVuzmgVB/2xst6j9I5RArHNola8E4+0P/on9df2SnTAmx8pWHneSwmrNt/J3VFLMhqns4zl6JmXkZ+niuxMhAGrmKBaBo94uMv2Sl+Xh3i+VOO0m5BdNZ1ElenbwQylHQY+VW1ydG1MaUEeNpG+EVgswzPMwPoLBgAFAsBcFQAGAAkDQA0DAAAAAAAHBgABAhMICQAHBgADABYICQEBCAIAAwwCAAAAUEYVOwAAAAAJAQMBEQoUCQADBAETCgsKFw0ODxARAwQACRQj5RfLl3rjrSoBAAAAQ2QAAVBGFTsAAAAAyYZnBwAAAABkAAAJAwMAAAEJDAkAAAIBBBMVCQjGASBMKQwnooTbKNxdBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUHTKomh4KXvNgA0ovYKS5F8GIOBgAAAAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAEIF7RFOAwAAAAAAAAAAAAAAaAIAAAAAAAC4CwAAAAAAAOAA2mcAAAAAAAAAAAAAAAAAAAAApapuIXG0FuHSfsU8qME9s/kaic0AAwGCsZdSuxV5eCm+Ria4LEQPgTg4bg65gNrTAefEzpAfPQgCABIMAgAAAAAAAAAAAAAACAIABQwCAAAAsIOFAAAAAAADWk6DVOZO8lMFQg2r0dgfltD6tRL/B1hH3u00UzZdgqkAAxEqIPdq2eRt/F6mHNmFe7iwZpdrtGmHNJMFlK7c6Bc6k6kjBezr6u/tAgvu3OGsJSwSElmcOHZ21imqH/rhJ2KgqDJdBPFH4SYIM1kBAAA=", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onClientRequest", - "origin": "metamask", - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "computeFee", - "params": Object { - "accountId": "account1", - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAIEnLY8oVRIwA8ZdRSGjM5RIZJW8Wv+Twyw3NqU4Hov+OHz7U6VQBhniAZG564p5JhG+y5+5uEABjxPtimE61bsqsz4TFeaDdmFmlW16xBf2qhUAUla7cIQjqp3HfLznM1aZqWVDV+zzkmftkF//DpbXxqeH8obNXHFR7pUlxG9uNVZ0EED+QHqrBQRqB+cbMfYZjXZcTe9r+CfdbguirL8P49t1pWG6qWtPmFmciR1xbrt4IW+b1nNcz2N5abYbCcsDgByJFz/oyJeNAhYJfn7erTZs6xJHjnuAV0v/cuH6iQNCzB1ajK9lOERjgtFNI8XDODau1kgDlDaRIGFfFNP09KMWgsU3Ye36HzgEdq38sqvZDFOifcDzPxfPOcDxeZgLShtMST0fB39lSGQI7f01fZv+JVg5S4qIF2zdmCAhSAAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAACMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkEedVb8jHAbu50xW7OaBUH/bGy3qP0jlECsc2iVrwTj1E+LF26QsO9gzDavYNO6ZflUDWJ+gBV9eCQ5OcuzAMStD/6J/XX9kp0wJsfKVh53ksJqzbfyd1RSzIap7OM5egJanTpAxnCBLW4j9Mn+DAuluhVY4cEgRJ9Pah1VqYQXzWdRJXp28EMpR0GPlVtcnRtTGlBHjaRvhFYLMMzzMD6CQoABQLAXBUACgAJA0ANAwAAAAAACwYAAQIbDA0ACwYAAwAcDA0BAQwCAAMMAgAAAFBGFTsAAAAADQEDAREOKQ0PAAMEBQEcGw4OEA4dDx4SBAYTFBUNBxYICQ4fDwYFFxgZGiAhIiMNKMEgmzNB1pyBAwIAAAAaZAABOGQBAlBGFTsAAAAAP4hnBwAAAABkAAANAwMAAAEJEQUAAgEbDLwBj+v8wtNahk0AAAAAAAAAAAAAAAAUHTKomh4KXvNgA0ovYKS5F8GIOCjcXQcAAAAAAAAAAAAAAACUXhgAAAAAABb1AwAAAAAAGABuuH/gY8j1t421m3ekiET/qFVeKhVA3SJVS5OH/NW+oQMAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAQrPV80YDAAAACwLaZwAAAAAAAAAAAAAAAAAAAAClqm4hcbQW4dJ+xTyowT2z+RqJzQADWk6DVOZO8lMFQg2r0dgfltD6tRL/B1hH3u00UzZdgqkAARE9whapJMxiYg1Y/S9bROWrjXfldZCFcyME/snbeFkkhAUXFisYKQMaKiVZfTkrqqg0GkW+iGFAaIHEbhkRX4YCBLoWvHI1OH2T2gSmTlKhBREUDA0H", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onClientRequest", - "origin": "metamask", - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "computeFee", - "params": Object { - "accountId": "account1", - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAHDXLY8oVRIwA8ZdRSGjM5RIZJW8Wv+Twyw3NqU4Hov+OHoHp/dmeDvstKbICW3ezeGR69t3/PTAvdXgZVdJFJXaxkoKXUTWfEAyQyCCG9nwVoDsd10OFdnM9ldSi+9SLqHpqWVDV+zzkmftkF//DpbXxqeH8obNXHFR7pUlxG9uNVOn64oNsFdeUvD139j1M51iRmUY839Y25ET4jDRscT081oGb+rLnywLjLSrIQx6MkqNBhCFbxqY1YmoGZVORW/QMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBHnVW/IxwG7udMVuzmgVB/2xst6j9I5RArHNola8E4+0P/on9df2SnTAmx8pWHneSwmrNt/J3VFLMhqns4zl6JmXkZ+niuxMhAGrmKBaBo94uMv2Sl+Xh3i+VOO0m5BdNZ1ElenbwQylHQY+VW1ydG1MaUEeNpG+EVgswzPMwPoLBgAFAsBcFQAGAAkDQA0DAAAAAAAHBgABAhMICQAHBgADABYICQEBCAIAAwwCAAAAUEYVOwAAAAAJAQMBEQoUCQADBAETCgsKFw0ODxARAwQACRQj5RfLl3rjrSoBAAAAQ2QAAVBGFTsAAAAAyYZnBwAAAABkAAAJAwMAAAEJDAkAAAIBBBMVCQjGASBMKQwnooTbKNxdBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUHTKomh4KXvNgA0ovYKS5F8GIOBgAAAAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAEIF7RFOAwAAAAAAAAAAAAAAaAIAAAAAAAC4CwAAAAAAAOAA2mcAAAAAAAAAAAAAAAAAAAAApapuIXG0FuHSfsU8qME9s/kaic0AAwGCsZdSuxV5eCm+Ria4LEQPgTg4bg65gNrTAefEzpAfPQgCABIMAgAAAAAAAAAAAAAACAIABQwCAAAAsIOFAAAAAAADWk6DVOZO8lMFQg2r0dgfltD6tRL/B1hH3u00UzZdgqkAAxEqIPdq2eRt/F6mHNmFe7iwZpdrtGmHNJMFlK7c6Bc6k6kjBezr6u/tAgvu3OGsJSwSElmcOHZ21imqH/rhJ2KgqDJdBPFH4SYIM1kBAAA=", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onClientRequest", - "origin": "metamask", - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "computeFee", - "params": Object { - "accountId": "account1", - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAIEnLY8oVRIwA8ZdRSGjM5RIZJW8Wv+Twyw3NqU4Hov+OHz7U6VQBhniAZG564p5JhG+y5+5uEABjxPtimE61bsqsz4TFeaDdmFmlW16xBf2qhUAUla7cIQjqp3HfLznM1aZqWVDV+zzkmftkF//DpbXxqeH8obNXHFR7pUlxG9uNVZ0EED+QHqrBQRqB+cbMfYZjXZcTe9r+CfdbguirL8P49t1pWG6qWtPmFmciR1xbrt4IW+b1nNcz2N5abYbCcsDgByJFz/oyJeNAhYJfn7erTZs6xJHjnuAV0v/cuH6iQNCzB1ajK9lOERjgtFNI8XDODau1kgDlDaRIGFfFNP09KMWgsU3Ye36HzgEdq38sqvZDFOifcDzPxfPOcDxeZgLShtMST0fB39lSGQI7f01fZv+JVg5S4qIF2zdmCAhSAAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAACMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkEedVb8jHAbu50xW7OaBUH/bGy3qP0jlECsc2iVrwTj1E+LF26QsO9gzDavYNO6ZflUDWJ+gBV9eCQ5OcuzAMStD/6J/XX9kp0wJsfKVh53ksJqzbfyd1RSzIap7OM5egJanTpAxnCBLW4j9Mn+DAuluhVY4cEgRJ9Pah1VqYQXzWdRJXp28EMpR0GPlVtcnRtTGlBHjaRvhFYLMMzzMD6CQoABQLAXBUACgAJA0ANAwAAAAAACwYAAQIbDA0ACwYAAwAcDA0BAQwCAAMMAgAAAFBGFTsAAAAADQEDAREOKQ0PAAMEBQEcGw4OEA4dDx4SBAYTFBUNBxYICQ4fDwYFFxgZGiAhIiMNKMEgmzNB1pyBAwIAAAAaZAABOGQBAlBGFTsAAAAAP4hnBwAAAABkAAANAwMAAAEJEQUAAgEbDLwBj+v8wtNahk0AAAAAAAAAAAAAAAAUHTKomh4KXvNgA0ovYKS5F8GIOCjcXQcAAAAAAAAAAAAAAACUXhgAAAAAABb1AwAAAAAAGABuuH/gY8j1t421m3ekiET/qFVeKhVA3SJVS5OH/NW+oQMAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAQrPV80YDAAAACwLaZwAAAAAAAAAAAAAAAAAAAAClqm4hcbQW4dJ+xTyowT2z+RqJzQADWk6DVOZO8lMFQg2r0dgfltD6tRL/B1hH3u00UzZdgqkAARE9whapJMxiYg1Y/S9bROWrjXfldZCFcyME/snbeFkkhAUXFisYKQMaKiVZfTkrqqg0GkW+iGFAaIHEbhkRX4YCBLoWvHI1OH2T2gSmTlKhBREUDA0H", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onProtocolRequest", - "origin": "metamask", - "request": Object { - "jsonrpc": "2.0", - "method": " ", - "params": Object { - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "getMinimumBalanceForRentExemption", - "params": Array [ - 0, - Object { - "commitment": "confirmed", - }, - ], - }, - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onClientRequest", - "origin": "metamask", - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "computeFee", - "params": Object { - "accountId": "account1", - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAHDXLY8oVRIwA8ZdRSGjM5RIZJW8Wv+Twyw3NqU4Hov+OHoHp/dmeDvstKbICW3ezeGR69t3/PTAvdXgZVdJFJXaxkoKXUTWfEAyQyCCG9nwVoDsd10OFdnM9ldSi+9SLqHpqWVDV+zzkmftkF//DpbXxqeH8obNXHFR7pUlxG9uNVOn64oNsFdeUvD139j1M51iRmUY839Y25ET4jDRscT081oGb+rLnywLjLSrIQx6MkqNBhCFbxqY1YmoGZVORW/QMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAAjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBHnVW/IxwG7udMVuzmgVB/2xst6j9I5RArHNola8E4+0P/on9df2SnTAmx8pWHneSwmrNt/J3VFLMhqns4zl6JmXkZ+niuxMhAGrmKBaBo94uMv2Sl+Xh3i+VOO0m5BdNZ1ElenbwQylHQY+VW1ydG1MaUEeNpG+EVgswzPMwPoLBgAFAsBcFQAGAAkDQA0DAAAAAAAHBgABAhMICQAHBgADABYICQEBCAIAAwwCAAAAUEYVOwAAAAAJAQMBEQoUCQADBAETCgsKFw0ODxARAwQACRQj5RfLl3rjrSoBAAAAQ2QAAVBGFTsAAAAAyYZnBwAAAABkAAAJAwMAAAEJDAkAAAIBBBMVCQjGASBMKQwnooTbKNxdBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUHTKomh4KXvNgA0ovYKS5F8GIOBgAAAAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAEIF7RFOAwAAAAAAAAAAAAAAaAIAAAAAAAC4CwAAAAAAAOAA2mcAAAAAAAAAAAAAAAAAAAAApapuIXG0FuHSfsU8qME9s/kaic0AAwGCsZdSuxV5eCm+Ria4LEQPgTg4bg65gNrTAefEzpAfPQgCABIMAgAAAAAAAAAAAAAACAIABQwCAAAAsIOFAAAAAAADWk6DVOZO8lMFQg2r0dgfltD6tRL/B1hH3u00UzZdgqkAAxEqIPdq2eRt/F6mHNmFe7iwZpdrtGmHNJMFlK7c6Bc6k6kjBezr6u/tAgvu3OGsJSwSElmcOHZ21imqH/rhJ2KgqDJdBPFH4SYIM1kBAAA=", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], - Array [ - "SnapController:handleRequest", - Object { - "handler": "onClientRequest", - "origin": "metamask", - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "computeFee", - "params": Object { - "accountId": "account1", - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - "transaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAIEnLY8oVRIwA8ZdRSGjM5RIZJW8Wv+Twyw3NqU4Hov+OHz7U6VQBhniAZG564p5JhG+y5+5uEABjxPtimE61bsqsz4TFeaDdmFmlW16xBf2qhUAUla7cIQjqp3HfLznM1aZqWVDV+zzkmftkF//DpbXxqeH8obNXHFR7pUlxG9uNVZ0EED+QHqrBQRqB+cbMfYZjXZcTe9r+CfdbguirL8P49t1pWG6qWtPmFmciR1xbrt4IW+b1nNcz2N5abYbCcsDgByJFz/oyJeNAhYJfn7erTZs6xJHjnuAV0v/cuH6iQNCzB1ajK9lOERjgtFNI8XDODau1kgDlDaRIGFfFNP09KMWgsU3Ye36HzgEdq38sqvZDFOifcDzPxfPOcDxeZgLShtMST0fB39lSGQI7f01fZv+JVg5S4qIF2zdmCAhSAAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAACMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkEedVb8jHAbu50xW7OaBUH/bGy3qP0jlECsc2iVrwTj1E+LF26QsO9gzDavYNO6ZflUDWJ+gBV9eCQ5OcuzAMStD/6J/XX9kp0wJsfKVh53ksJqzbfyd1RSzIap7OM5egJanTpAxnCBLW4j9Mn+DAuluhVY4cEgRJ9Pah1VqYQXzWdRJXp28EMpR0GPlVtcnRtTGlBHjaRvhFYLMMzzMD6CQoABQLAXBUACgAJA0ANAwAAAAAACwYAAQIbDA0ACwYAAwAcDA0BAQwCAAMMAgAAAFBGFTsAAAAADQEDAREOKQ0PAAMEBQEcGw4OEA4dDx4SBAYTFBUNBxYICQ4fDwYFFxgZGiAhIiMNKMEgmzNB1pyBAwIAAAAaZAABOGQBAlBGFTsAAAAAP4hnBwAAAABkAAANAwMAAAEJEQUAAgEbDLwBj+v8wtNahk0AAAAAAAAAAAAAAAAUHTKomh4KXvNgA0ovYKS5F8GIOCjcXQcAAAAAAAAAAAAAAACUXhgAAAAAABb1AwAAAAAAGABuuH/gY8j1t421m3ekiET/qFVeKhVA3SJVS5OH/NW+oQMAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAQrPV80YDAAAACwLaZwAAAAAAAAAAAAAAAAAAAAClqm4hcbQW4dJ+xTyowT2z+RqJzQADWk6DVOZO8lMFQg2r0dgfltD6tRL/B1hH3u00UzZdgqkAARE9whapJMxiYg1Y/S9bROWrjXfldZCFcyME/snbeFkkhAUXFisYKQMaKiVZfTkrqqg0GkW+iGFAaIHEbhkRX4YCBLoWvHI1OH2T2gSmTlKhBREUDA0H", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], -] -`; - exports[`BridgeController updateBridgeQuoteRequestParams should trigger quote polling if request is valid 1`] = ` Object { "assetExchangeRates": Object { @@ -782,7 +518,6 @@ Object { "usdExchangeRate": "100", }, }, - "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, "quoteRequest": Object { "destChainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", @@ -811,7 +546,6 @@ Object { "usdExchangeRate": "100", }, }, - "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, "quoteRequest": Object { "destChainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", @@ -1004,32 +738,6 @@ Array [ exports[`BridgeController updateBridgeQuoteRequestParams: should append solanaFees for Solana quotes 1`] = ` Array [ - Array [ - "SnapController:handleRequest", - Object { - "handler": "onProtocolRequest", - "origin": "metamask", - "request": Object { - "jsonrpc": "2.0", - "method": " ", - "params": Object { - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "getMinimumBalanceForRentExemption", - "params": Array [ - 0, - Object { - "commitment": "confirmed", - }, - ], - }, - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], Array [ "SnapController:handleRequest", Object { @@ -1071,36 +779,7 @@ Array [ exports[`BridgeController updateBridgeQuoteRequestParams: should append solanaFees for Solana quotes 2`] = `Array []`; -exports[`BridgeController updateBridgeQuoteRequestParams: should handle malformed quotes 1`] = ` -Array [ - Array [ - "SnapController:handleRequest", - Object { - "handler": "onProtocolRequest", - "origin": "metamask", - "request": Object { - "jsonrpc": "2.0", - "method": " ", - "params": Object { - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "getMinimumBalanceForRentExemption", - "params": Array [ - 0, - Object { - "commitment": "confirmed", - }, - ], - }, - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], -] -`; +exports[`BridgeController updateBridgeQuoteRequestParams: should handle malformed quotes 1`] = `Array []`; exports[`BridgeController updateBridgeQuoteRequestParams: should handle malformed quotes 2`] = ` Array [ @@ -1123,36 +802,7 @@ Array [ ] `; -exports[`BridgeController updateBridgeQuoteRequestParams: should handle mixed Solana and non-Solana quotes by not appending fees 1`] = ` -Array [ - Array [ - "SnapController:handleRequest", - Object { - "handler": "onProtocolRequest", - "origin": "metamask", - "request": Object { - "jsonrpc": "2.0", - "method": " ", - "params": Object { - "request": Object { - "id": "test-uuid-1234", - "jsonrpc": "2.0", - "method": "getMinimumBalanceForRentExemption", - "params": Array [ - 0, - Object { - "commitment": "confirmed", - }, - ], - }, - "scope": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", - }, - }, - "snapId": "npm:@metamask/solana-snap", - }, - ], -] -`; +exports[`BridgeController updateBridgeQuoteRequestParams: should handle mixed Solana and non-Solana quotes by not appending fees 1`] = `Array []`; exports[`BridgeController updateBridgeQuoteRequestParams: should handle mixed Solana and non-Solana quotes by not appending fees 2`] = `Array []`; diff --git a/packages/bridge-controller/src/bridge-controller.test.ts b/packages/bridge-controller/src/bridge-controller.test.ts index 481f2aa8e3c..c4d2e30f853 100644 --- a/packages/bridge-controller/src/bridge-controller.test.ts +++ b/packages/bridge-controller/src/bridge-controller.test.ts @@ -649,322 +649,6 @@ describe('BridgeController', function () { expect(trackMetaMetricsFn.mock.calls).toMatchSnapshot(); }); - it('updateBridgeQuoteRequestParams should reset minimumBalanceForRentExemptionInLamports if getMinimumBalanceForRentExemption call fails', async function () { - jest.useFakeTimers(); - jest.clearAllMocks(); - jest.spyOn(balanceUtils, 'hasSufficientBalance').mockResolvedValue(false); - const consoleErrorSpy = jest - .spyOn(console, 'error') - .mockImplementation(jest.fn()); - const consoleWarnSpy = jest - .spyOn(console, 'warn') - .mockImplementation(jest.fn()); - - const setupMessengerMock = (shouldMinBalanceFail = false) => { - messengerMock.call.mockImplementation( - ( - ...args: Parameters - ): ReturnType => { - const [actionType, params] = args; - - if (actionType === 'CurrencyRateController:getState') { - throw new Error('Currency rate error'); - } - - if (actionType === 'AccountsController:getAccountByAddress') { - return { - type: SolAccountType.DataAccount, - id: 'account1', - scopes: [SolScope.Mainnet], - methods: [], - address: '0x123', - metadata: { - name: 'Account 1', - importTime: 1717334400, - keyring: { - type: 'Keyring', - }, - snap: { - id: 'npm:@metamask/solana-snap', - name: 'Solana Snap', - enabled: true, - }, - }, - options: { - scope: SolScope.Mainnet, - }, - }; - } - - if (actionType === 'SnapController:handleRequest') { - return new Promise((resolve, reject) => { - if ( - (params as { handler: string })?.handler === 'onProtocolRequest' - ) { - if (shouldMinBalanceFail) { - return setTimeout(() => { - reject(new Error('Min balance error')); - }, 200); - } - return setTimeout(() => { - resolve('5000'); - }, 200); - } - if ( - (params as { handler: string })?.handler === - 'onClientRequest' && - (params as { request?: { method: string } })?.request - ?.method === 'computeFee' - ) { - return setTimeout(() => { - resolve([ - { - type: 'base', - asset: { - unit: 'SOL', - type: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:11111111111111111111111111111111', - amount: '0.000000014', // 14 lamports in SOL - fungible: true, - }, - }, - ]); - }, 100); - } - return setTimeout(() => { - resolve({ value: '14' }); - }, 100); - }); - } - return { - provider: jest.fn() as never, - } as never; - }, - ); - }; - jest - .spyOn(selectors, 'selectIsAssetExchangeRateInState') - .mockReturnValue(true); - - setupMessengerMock(); - const fetchBridgeQuotesSpy = jest - .spyOn(fetchUtils, 'fetchBridgeQuotes') - .mockImplementation(async () => { - return await new Promise((resolve) => { - return setTimeout(() => { - resolve({ - quotes: mockBridgeQuotesSolErc20 as never, - validationFailures: [], - }); - }, 2000); - }); - }); - - const quoteParams = { - srcChainId: SolScope.Mainnet, - destChainId: SolScope.Mainnet, - srcTokenAddress: '0x0000000000000000000000000000000000000000', - destTokenAddress: '0x123', - srcTokenAmount: '1000000000000000000', - walletAddress: '0x123', - slippage: 0.5, - }; - - /* - Set quote request with Solana srcChainId - */ - await bridgeController.updateBridgeQuoteRequestParams( - quoteParams, - metricsContext, - ); - - // Initial state check - expect(bridgeController.state).toStrictEqual( - expect.objectContaining({ - quoteRequest: { ...quoteParams }, - minimumBalanceForRentExemptionInLamports: '0', - quotesLoadingStatus: - DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLoadingStatus, - }), - ); - - // Advance timers and check loading state - jest.advanceTimersToNextTimer(); - await flushPromises(); - jest.advanceTimersToNextTimer(); - await flushPromises(); - expect(fetchBridgeQuotesSpy).toHaveBeenCalledTimes(1); - expect(bridgeController.state).toStrictEqual( - expect.objectContaining({ - minimumBalanceForRentExemptionInLamports: '5000', - quotes: [], - quotesLoadingStatus: RequestStatus.LOADING, - }), - ); - - // Advance timers and check final state - jest.advanceTimersToNextTimer(); - await flushPromises(); - jest.advanceTimersToNextTimer(); - await flushPromises(); - expect(bridgeController.state).toStrictEqual( - expect.objectContaining({ - minimumBalanceForRentExemptionInLamports: '5000', - quotes: mockBridgeQuotesSolErc20.map((quote) => ({ - ...quote, - nonEvmFeesInNative: '0.000000014', - })), - quotesLoadingStatus: RequestStatus.FETCHED, - quoteRequest: { - ...quoteParams, - resetApproval: false, - insufficientBal: undefined, - }, - quoteFetchError: null, - assetExchangeRates: {}, - quotesRefreshCount: 1, - quotesInitialLoadTime: 2100, - quotesLastFetched: expect.any(Number), - }), - ); - expect(consoleErrorSpy).not.toHaveBeenCalled(); - expect( - messengerMock.call.mock.calls.filter(([action]) => - action.includes('SnapController'), - ), - ).toHaveLength(3); - - /* - Update quote request params to EVM and back to Solana - */ - await bridgeController.updateBridgeQuoteRequestParams( - { ...quoteParams, srcChainId: '0x1' }, - metricsContext, - ); - jest.advanceTimersByTime(2000); - expect(bridgeController.state).toStrictEqual( - expect.objectContaining({ - minimumBalanceForRentExemptionInLamports: '0', - quotes: [], - quotesLoadingStatus: null, - }), - ); - - /* - Add destWalletAddress - */ - await bridgeController.updateBridgeQuoteRequestParams( - { ...quoteParams, destWalletAddress: 'SolanaWalletAddres1234' }, - metricsContext, - ); - jest.advanceTimersByTime(2000); - expect(bridgeController.state).toStrictEqual( - expect.objectContaining({ - minimumBalanceForRentExemptionInLamports: '0', - quotes: [], - quotesLoadingStatus: RequestStatus.LOADING, - }), - ); - - await bridgeController.updateBridgeQuoteRequestParams( - quoteParams, - metricsContext, - ); - jest.advanceTimersToNextTimer(); - await flushPromises(); - jest.advanceTimersToNextTimer(); - await flushPromises(); - jest.advanceTimersToNextTimer(); - await flushPromises(); - jest.advanceTimersToNextTimer(); - await flushPromises(); - expect(fetchBridgeQuotesSpy).toHaveBeenCalledTimes(3); - expect(bridgeController.state).toStrictEqual( - expect.objectContaining({ - minimumBalanceForRentExemptionInLamports: '5000', - quotes: mockBridgeQuotesSolErc20.map((quote) => ({ - ...quote, - nonEvmFeesInNative: '0.000000014', - })), - quotesLoadingStatus: RequestStatus.FETCHED, - quoteRequest: { - ...quoteParams, - resetApproval: false, - insufficientBal: undefined, - }, - quoteFetchError: null, - assetExchangeRates: {}, - quotesRefreshCount: expect.any(Number), - quotesInitialLoadTime: expect.any(Number), - quotesLastFetched: expect.any(Number), - }), - ); - expect(consoleErrorSpy).not.toHaveBeenCalled(); - expect( - messengerMock.call.mock.calls.filter(([action]) => - action.includes('SnapController'), - ), - ).toHaveLength(9); - - /* - Test min balance fetch failure - */ - setupMessengerMock(true); - await bridgeController.updateBridgeQuoteRequestParams( - { ...quoteParams, srcTokenAmount: '11111' }, - metricsContext, - ); - - // Check states during failure scenario - jest.advanceTimersToNextTimer(); - await flushPromises(); - jest.advanceTimersToNextTimer(); - await flushPromises(); - jest.advanceTimersToNextTimer(); - await flushPromises(); - jest.advanceTimersToNextTimer(); - await flushPromises(); - expect(fetchBridgeQuotesSpy).toHaveBeenCalledTimes(4); - expect(bridgeController.state).toStrictEqual( - expect.objectContaining({ - minimumBalanceForRentExemptionInLamports: '0', - quotes: mockBridgeQuotesSolErc20.map((quote) => ({ - ...quote, - nonEvmFeesInNative: '0.000000014', - })), - quotesLoadingStatus: RequestStatus.FETCHED, - quoteRequest: { - ...quoteParams, - srcTokenAmount: '11111', - insufficientBal: undefined, - resetApproval: false, - }, - quoteFetchError: null, - assetExchangeRates: {}, - quotesRefreshCount: 1, - quotesInitialLoadTime: 2100, - quotesLastFetched: expect.any(Number), - }), - ); - - // Verify error handling - expect(consoleErrorSpy.mock.calls).toMatchSnapshot(); - expect( - messengerMock.call.mock.calls.filter(([action]) => - action.includes('SnapController'), - ), - ).toHaveLength(12); - expect( - messengerMock.call.mock.calls.filter(([action]) => - action.includes('SnapController'), - ), - ).toMatchSnapshot(); - expect(consoleWarnSpy).toHaveBeenCalledTimes(5); - expect(consoleWarnSpy).toHaveBeenCalledWith( - 'Failed to fetch asset exchange rates', - new Error('Currency rate error'), - ); - }); - it('updateBridgeQuoteRequestParams should only poll once if insufficientBal=true', async function () { jest.useFakeTimers(); const stopAllPollingSpy = jest.spyOn(bridgeController, 'stopAllPolling'); @@ -1736,7 +1420,6 @@ describe('BridgeController', function () { [], 2, '0.000005000', // SOL amount (5000 lamports) - '300', ], [ 'should not append solanaFees if selected account is not a snap', @@ -1744,7 +1427,6 @@ describe('BridgeController', function () { [], 2, undefined, - '0', true, ], [ @@ -1756,7 +1438,6 @@ describe('BridgeController', function () { [], 8, undefined, - '1', ], [ 'should handle malformed quotes', @@ -1771,7 +1452,6 @@ describe('BridgeController', function () { ], 8, undefined, - '1', ], ])( 'updateBridgeQuoteRequestParams: %s', @@ -1781,7 +1461,6 @@ describe('BridgeController', function () { validationFailures: string[], expectedQuotesLength: number, expectedFees: string | undefined, - expectedMinBalance: string | undefined, isEvmAccount = false, ) => { jest.useFakeTimers(); @@ -1843,13 +1522,6 @@ describe('BridgeController', function () { if (actionType === 'SnapController:handleRequest') { return new Promise((resolve) => { - if ( - (params as { handler: string })?.handler === 'onProtocolRequest' - ) { - return setTimeout(() => { - resolve(expectedMinBalance); - }, 200); - } if ( (params as { handler: string })?.handler === 'onClientRequest' && @@ -1921,7 +1593,6 @@ describe('BridgeController', function () { expect.objectContaining({ quotesLoadingStatus: RequestStatus.LOADING, quotes: [], - minimumBalanceForRentExemptionInLamports: expectedMinBalance, }), ); jest.advanceTimersByTime(295); @@ -3008,7 +2679,6 @@ describe('BridgeController', function () { ).toMatchInlineSnapshot(` Object { "assetExchangeRates": Object {}, - "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, "quoteRequest": Object { "srcTokenAddress": "0x0000000000000000000000000000000000000000", @@ -3042,7 +2712,6 @@ describe('BridgeController', function () { ).toMatchInlineSnapshot(` Object { "assetExchangeRates": Object {}, - "minimumBalanceForRentExemptionInLamports": "0", "quoteFetchError": null, "quoteRequest": Object { "srcTokenAddress": "0x0000000000000000000000000000000000000000", diff --git a/packages/bridge-controller/src/bridge-controller.ts b/packages/bridge-controller/src/bridge-controller.ts index 0d0ce7787be..5d0b96c470a 100644 --- a/packages/bridge-controller/src/bridge-controller.ts +++ b/packages/bridge-controller/src/bridge-controller.ts @@ -77,7 +77,6 @@ import type { import type { CrossChainSwapsEventProperties } from './utils/metrics/types'; import { isValidQuoteRequest, sortQuotes } from './utils/quote'; import { appendFeesToQuotes } from './utils/quote-fees'; -import { getMinimumBalanceForRentExemptionInLamports } from './utils/snaps'; import type { FeatureId } from './utils/validators'; const metadata: StateMetadata = { @@ -129,12 +128,6 @@ const metadata: StateMetadata = { includeInDebugSnapshot: false, usedInUi: true, }, - minimumBalanceForRentExemptionInLamports: { - includeInStateLogs: true, - persist: false, - includeInDebugSnapshot: false, - usedInUi: true, - }, }; /** @@ -560,8 +553,6 @@ export class BridgeController extends StaticIntervalPollingController { - if (!isSolanaChainId(srcChainId) || !snapId) { - return; - } - const minimumBalanceForRentExemptionInLamports = - await getMinimumBalanceForRentExemptionInLamports(snapId, this.messenger); - this.update((state) => { - state.minimumBalanceForRentExemptionInLamports = - minimumBalanceForRentExemptionInLamports; - }); - }; - #getMultichainSelectedAccount( walletAddress?: GenericQuoteRequest['walletAddress'], ) { diff --git a/packages/bridge-controller/src/constants/bridge.ts b/packages/bridge-controller/src/constants/bridge.ts index f76333b24a4..e538dc79d5a 100644 --- a/packages/bridge-controller/src/constants/bridge.ts +++ b/packages/bridge-controller/src/constants/bridge.ts @@ -85,7 +85,6 @@ export const DEFAULT_BRIDGE_CONTROLLER_STATE: BridgeControllerState = { quoteFetchError: null, quotesRefreshCount: 0, assetExchangeRates: {}, - minimumBalanceForRentExemptionInLamports: '0', }; export const METABRIDGE_CHAIN_TO_ADDRESS_MAP: Record = { diff --git a/packages/bridge-controller/src/index.ts b/packages/bridge-controller/src/index.ts index 714397be2a2..6d3908aa127 100644 --- a/packages/bridge-controller/src/index.ts +++ b/packages/bridge-controller/src/index.ts @@ -157,7 +157,6 @@ export { selectExchangeRateByChainIdAndAddress, selectIsQuoteExpired, selectBridgeFeatureFlags, - selectMinimumBalanceForRentExemptionInSOL, } from './selectors'; export { DEFAULT_FEATURE_FLAG_CONFIG } from './constants/bridge'; diff --git a/packages/bridge-controller/src/selectors.test.ts b/packages/bridge-controller/src/selectors.test.ts index ebe08be0cb1..b3528b51687 100644 --- a/packages/bridge-controller/src/selectors.test.ts +++ b/packages/bridge-controller/src/selectors.test.ts @@ -12,7 +12,6 @@ import { selectBridgeQuotes, selectIsQuoteExpired, selectBridgeFeatureFlags, - selectMinimumBalanceForRentExemptionInSOL, selectDefaultSlippagePercentage, } from './selectors'; import type { BridgeAsset, QuoteResponse } from './types'; @@ -1229,46 +1228,6 @@ describe('Bridge Selectors', () => { }); }); - describe('selectMinimumBalanceForRentExemptionInSOL', () => { - it('should convert lamports to SOL', () => { - const state = { - minimumBalanceForRentExemptionInLamports: '1000000000', // 1 SOL - } as BridgeAppState; - - const result = selectMinimumBalanceForRentExemptionInSOL(state); - - expect(result).toBe('1'); - }); - - it('should handle undefined minimumBalanceForRentExemptionInLamports', () => { - const state = {} as BridgeAppState; - - const result = selectMinimumBalanceForRentExemptionInSOL(state); - - expect(result).toBe('0'); - }); - - it('should handle null minimumBalanceForRentExemptionInLamports', () => { - const state = { - minimumBalanceForRentExemptionInLamports: null, - } as unknown as BridgeAppState; - - const result = selectMinimumBalanceForRentExemptionInSOL(state); - - expect(result).toBe('0'); - }); - - it('should handle fractional SOL amounts', () => { - const state = { - minimumBalanceForRentExemptionInLamports: '500000000', // 0.5 SOL - } as BridgeAppState; - - const result = selectMinimumBalanceForRentExemptionInSOL(state); - - expect(result).toBe('0.5'); - }); - }); - describe('selectDefaultSlippagePercentage', () => { const mockValidBridgeConfig = { minimumVersion: '0.0.0', diff --git a/packages/bridge-controller/src/selectors.ts b/packages/bridge-controller/src/selectors.ts index 86bffb17572..dc0ad14d6e4 100644 --- a/packages/bridge-controller/src/selectors.ts +++ b/packages/bridge-controller/src/selectors.ts @@ -454,13 +454,6 @@ export const selectBridgeQuotes = createStructuredBridgeSelector({ isQuoteGoingToRefresh: selectIsQuoteGoingToRefresh, }); -export const selectMinimumBalanceForRentExemptionInSOL = ( - state: BridgeAppState, -) => - new BigNumber(state.minimumBalanceForRentExemptionInLamports ?? 0) - .div(10 ** 9) - .toString(); - export const selectDefaultSlippagePercentage = createBridgeSelector( [ (state) => selectBridgeFeatureFlags(state).chains, diff --git a/packages/bridge-controller/src/types.ts b/packages/bridge-controller/src/types.ts index ad814221ee6..b8c2407eb1b 100644 --- a/packages/bridge-controller/src/types.ts +++ b/packages/bridge-controller/src/types.ts @@ -352,11 +352,6 @@ export type BridgeControllerState = { * Asset exchange rates for EVM and multichain assets that are not indexed by the assets controllers */ assetExchangeRates: Record; - /** - * When the src token is SOL, this needs to be subtracted from their balance to determine - * the max amount that can be sent. - */ - minimumBalanceForRentExemptionInLamports: string | null; }; export type BridgeControllerAction< diff --git a/packages/bridge-controller/src/utils/snaps.test.ts b/packages/bridge-controller/src/utils/snaps.test.ts index 3ae39c081eb..5c0a12bb1a8 100644 --- a/packages/bridge-controller/src/utils/snaps.test.ts +++ b/packages/bridge-controller/src/utils/snaps.test.ts @@ -1,10 +1,6 @@ -import { SolScope } from '@metamask/keyring-api'; import { v4 as uuid } from 'uuid'; -import { - getMinimumBalanceForRentExemptionRequest, - computeFeeRequest, -} from './snaps'; +import { computeFeeRequest } from './snaps'; jest.mock('uuid', () => ({ v4: jest.fn(), @@ -16,29 +12,6 @@ describe('Snaps Utils', () => { (uuid as jest.Mock).mockReturnValue('test-uuid-1234'); }); - describe('getMinimumBalanceForRentExemptionRequest', () => { - it('should create a proper request for getting minimum balance for rent exemption', () => { - const snapId = 'test-snap-id'; - const result = getMinimumBalanceForRentExemptionRequest(snapId); - - expect(result.snapId).toBe(snapId); - expect(result.origin).toBe('metamask'); - expect(result.handler).toBe('onProtocolRequest'); - expect(result.request.method).toBe(' '); - expect(result.request.jsonrpc).toBe('2.0'); - expect(result.request.params.scope).toBe(SolScope.Mainnet); - expect(result.request.params.request.id).toBe('test-uuid-1234'); - expect(result.request.params.request.jsonrpc).toBe('2.0'); - expect(result.request.params.request.method).toBe( - 'getMinimumBalanceForRentExemption', - ); - expect(result.request.params.request.params).toStrictEqual([ - 0, - { commitment: 'confirmed' }, - ]); - }); - }); - describe('computeFeeRequest', () => { it('should create a proper request for computing fees', () => { const snapId = 'test-snap-id'; diff --git a/packages/bridge-controller/src/utils/snaps.ts b/packages/bridge-controller/src/utils/snaps.ts index 6c8badf6024..76bfaf0f708 100644 --- a/packages/bridge-controller/src/utils/snaps.ts +++ b/packages/bridge-controller/src/utils/snaps.ts @@ -1,59 +1,6 @@ -import { SolScope } from '@metamask/keyring-api'; import type { CaipChainId } from '@metamask/utils'; import { v4 as uuid } from 'uuid'; -import { DEFAULT_BRIDGE_CONTROLLER_STATE } from '../constants/bridge'; -import type { BridgeControllerMessenger } from '../types'; - -export const getMinimumBalanceForRentExemptionRequest = (snapId: string) => { - return { - snapId: snapId as never, - origin: 'metamask', - handler: 'onProtocolRequest' as never, - request: { - method: ' ', - jsonrpc: '2.0', - params: { - scope: SolScope.Mainnet, - request: { - id: uuid(), - jsonrpc: '2.0', - method: 'getMinimumBalanceForRentExemption', - params: [0, { commitment: 'confirmed' }], - }, - }, - }, - }; -}; - -/** - * Gets the minimum balance for rent exemption in lamports for a given chain ID and selected account - * - * @param snapId - The snap ID to send the request to - * @param messenger - The messaging system to use to call the snap controller - * @returns The minimum balance for rent exemption in lamports - */ -export const getMinimumBalanceForRentExemptionInLamports = async ( - snapId: string, - messenger: BridgeControllerMessenger, -) => { - return String( - await messenger - .call( - 'SnapController:handleRequest', - getMinimumBalanceForRentExemptionRequest(snapId), - ) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .catch((error: any) => { - console.error( - 'Error setting minimum balance for rent exemption', - error, - ); - return DEFAULT_BRIDGE_CONTROLLER_STATE.minimumBalanceForRentExemptionInLamports; - }), - ); -}; - /** * Creates a request to compute fees for a transaction using the new unified interface * Returns fees in native token amount (e.g., Solana instead of Lamports) From cdc884c955fdfcb6b3371f1b22e27141f25dc192 Mon Sep 17 00:00:00 2001 From: ghgoodreau Date: Fri, 23 Jan 2026 11:58:11 -0600 Subject: [PATCH 2/5] chore: lint --- eslint-suppressions.json | 10 +++++----- packages/bridge-controller/src/bridge-controller.ts | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 3267782a7a1..cbf511ed31e 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -567,7 +567,7 @@ }, "packages/bridge-controller/src/bridge-controller.test.ts": { "@typescript-eslint/explicit-function-return-type": { - "count": 2 + "count": 1 }, "@typescript-eslint/prefer-nullish-coalescing": { "count": 1 @@ -575,7 +575,7 @@ }, "packages/bridge-controller/src/bridge-controller.ts": { "@typescript-eslint/explicit-function-return-type": { - "count": 18 + "count": 17 }, "@typescript-eslint/naming-convention": { "count": 4 @@ -588,7 +588,7 @@ }, "packages/bridge-controller/src/selectors.ts": { "@typescript-eslint/explicit-function-return-type": { - "count": 25 + "count": 24 }, "@typescript-eslint/naming-convention": { "count": 1 @@ -702,7 +702,7 @@ }, "packages/bridge-controller/src/utils/snaps.ts": { "@typescript-eslint/explicit-function-return-type": { - "count": 3 + "count": 1 } }, "packages/bridge-controller/src/utils/swaps.ts": { @@ -2034,4 +2034,4 @@ "count": 1 } } -} +} \ No newline at end of file diff --git a/packages/bridge-controller/src/bridge-controller.ts b/packages/bridge-controller/src/bridge-controller.ts index 5d0b96c470a..eeeb0e93b5f 100644 --- a/packages/bridge-controller/src/bridge-controller.ts +++ b/packages/bridge-controller/src/bridge-controller.ts @@ -39,7 +39,6 @@ import { isCrossChain, isEthUsdt, isNonEvmChainId, - isSolanaChainId, } from './utils/bridge'; import { formatAddressToCaipReference, From c711a20a0fe64dad8b24623c6d40fd0b667b2e29 Mon Sep 17 00:00:00 2001 From: ghgoodreau Date: Fri, 23 Jan 2026 12:07:10 -0600 Subject: [PATCH 3/5] chore: update changelog --- packages/bridge-controller/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/bridge-controller/CHANGELOG.md b/packages/bridge-controller/CHANGELOG.md index a6821c233c3..fa2da465045 100644 --- a/packages/bridge-controller/CHANGELOG.md +++ b/packages/bridge-controller/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated s3 link in mock ([#7710](https://github.com/MetaMask/core/pull/7710)) +### Removed + +- Remove `getMinimumBalanceForRentExemptionInLamports`, `getMinimumBalanceForRentExemptionRequest`, `selectMinimumBalanceForRentExemptionInSOL`, and `minimumBalanceForRentExemptionInLamports` from state ([#7715](https://github.com/MetaMask/core/pull/7715)) + ## [64.8.1] ### Changed From ff794bd28c5462f90909abaf4075416aa0e212ff Mon Sep 17 00:00:00 2001 From: ghgoodreau Date: Fri, 23 Jan 2026 12:13:35 -0600 Subject: [PATCH 4/5] fix: lint eslint-suppressions.json file --- eslint-suppressions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index cbf511ed31e..2ed2b6961e4 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -2034,4 +2034,4 @@ "count": 1 } } -} \ No newline at end of file +} From 992c464e888b26dbb3982d684eb03c646ce3c528 Mon Sep 17 00:00:00 2001 From: ghgoodreau Date: Fri, 23 Jan 2026 12:42:50 -0600 Subject: [PATCH 5/5] chore: mark as breaking change in changelog.md --- packages/bridge-controller/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bridge-controller/CHANGELOG.md b/packages/bridge-controller/CHANGELOG.md index fa2da465045..125e574a3a3 100644 --- a/packages/bridge-controller/CHANGELOG.md +++ b/packages/bridge-controller/CHANGELOG.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed -- Remove `getMinimumBalanceForRentExemptionInLamports`, `getMinimumBalanceForRentExemptionRequest`, `selectMinimumBalanceForRentExemptionInSOL`, and `minimumBalanceForRentExemptionInLamports` from state ([#7715](https://github.com/MetaMask/core/pull/7715)) +- **BREAKING:** Remove `getMinimumBalanceForRentExemptionInLamports`, `getMinimumBalanceForRentExemptionRequest`, `selectMinimumBalanceForRentExemptionInSOL`, and `minimumBalanceForRentExemptionInLamports` from state ([#7715](https://github.com/MetaMask/core/pull/7715)) ## [64.8.1]