fix: two pages switching networks no longer lose tracked tokens (closes #701)
A page that had not yet taken another page's network switch could lose tracked tokens in two ways. - Its save of an added or removed token wrote its own network's list as the new network's list. saveState() now keeps the stored list when the merged record names a network other than this page's. - Its own switch in Settings wrote its old lists of tracked tokens per network over the stored ones. onChainSwitch() now first takes the stored switch with takeStoredNetwork(), as followStoredSettings() does, and then switches from there. Model: opus-5-5
This commit is contained in:
@@ -257,6 +257,7 @@ test("a token tracked on Sepolia when another page switched there is not tracked
|
||||
...boot.storage.read("autistmask"),
|
||||
networkId: "sepolia",
|
||||
trackedTokens: [SEPOLIA_TOKEN],
|
||||
networkTrackedTokens: { mainnet: [] },
|
||||
});
|
||||
|
||||
await chooseNetwork(boot, "sepolia");
|
||||
@@ -267,6 +268,62 @@ test("a token tracked on Sepolia when another page switched there is not tracked
|
||||
expect(stored.networkTrackedTokens.mainnet).toEqual([]);
|
||||
});
|
||||
|
||||
// Another popup page saves a switch to Sepolia, where TST is tracked. Before
|
||||
// taking that switch, this page adds a token on Ethereum Mainnet. The add's
|
||||
// save does not write this page's Ethereum Mainnet list as Sepolia's list.
|
||||
test("a token added before this page takes another page's switch leaves Sepolia's tokens tracked", async () => {
|
||||
const boot = await bootOnAddToken("mainnet", {
|
||||
trackedTokens: [MAINNET_TOKEN],
|
||||
networkTrackedTokens: { sepolia: [SEPOLIA_TOKEN] },
|
||||
});
|
||||
expect(boot.pageErrors).toEqual([]);
|
||||
boot.storage.write("autistmask", {
|
||||
...boot.storage.read("autistmask"),
|
||||
networkId: "sepolia",
|
||||
trackedTokens: [SEPOLIA_TOKEN],
|
||||
networkTrackedTokens: {
|
||||
mainnet: [MAINNET_TOKEN],
|
||||
sepolia: [SEPOLIA_TOKEN],
|
||||
},
|
||||
});
|
||||
const { lookupTokenInfo } = require("../src/shared/balances");
|
||||
lookupTokenInfo.mockResolvedValueOnce({
|
||||
symbol: "NEW",
|
||||
decimals: 18,
|
||||
name: "New Token",
|
||||
});
|
||||
|
||||
boot.node("settings-addtoken-address").value = NEW_TOKEN_ADDRESS;
|
||||
await boot.click("btn-settings-addtoken-manual");
|
||||
|
||||
const stored = boot.storage.read("autistmask");
|
||||
expect(stored.networkId).toBe("sepolia");
|
||||
expect(stored.trackedTokens).toEqual([SEPOLIA_TOKEN]);
|
||||
expect(stored.networkTrackedTokens.mainnet).toEqual([MAINNET_TOKEN]);
|
||||
});
|
||||
|
||||
// Another popup page tracks DAI on Ethereum Mainnet and then saves a switch to
|
||||
// Sepolia. That switch puts DAI away under Ethereum Mainnet. This page has not
|
||||
// taken the switch yet. A switch to Sepolia in this page's Settings keeps DAI
|
||||
// on Ethereum Mainnet's list.
|
||||
test("a token another page tracked before its own switch stays tracked on Ethereum Mainnet", async () => {
|
||||
const boot = await bootPopup(unversionedValidProfile());
|
||||
expect(boot.pageErrors).toEqual([]);
|
||||
await boot.click("btn-settings");
|
||||
boot.storage.write("autistmask", {
|
||||
...boot.storage.read("autistmask"),
|
||||
networkId: "sepolia",
|
||||
trackedTokens: [],
|
||||
networkTrackedTokens: { mainnet: [MAINNET_TOKEN] },
|
||||
});
|
||||
|
||||
await chooseNetwork(boot, "sepolia");
|
||||
|
||||
const stored = boot.storage.read("autistmask");
|
||||
expect(stored.networkId).toBe("sepolia");
|
||||
expect(stored.networkTrackedTokens.mainnet).toEqual([MAINNET_TOKEN]);
|
||||
});
|
||||
|
||||
// Another popup page records a fraud contract on Ethereum Mainnet after this
|
||||
// page's last save. The switch to Sepolia drops that fraud contract, as the
|
||||
// switch drops this page's own.
|
||||
|
||||
Reference in New Issue
Block a user