fix: transaction screens name a token from the tokens of the transaction's network (closes #629)
decodeCalldata() looked a token's symbol and decimals up in the active network's tracked tokens and balances, whatever chain id it was given, so TransactionDetail and TxApproval showed a token tracked on another network by address only, with its amount in base units. The lookup now uses what the wallet knows of the tokens on the transaction's network: the active network's tracked tokens and balances, or for another network the tokens tracked on it and no balances. TxApproval's token labels, the symbol it hands the wait, success and error screens, and SuccessTx's decoded token label use the same lookup. Model: opus-5-5
This commit was merged in pull request #630.
This commit is contained in:
@@ -12,7 +12,9 @@
|
||||
// whichever network is active
|
||||
// (https://git.eeqj.de/sneak/AutistMask/issues/584), and the transaction is
|
||||
// read from that network's Blockscout, the one Settings has for it
|
||||
// (https://git.eeqj.de/sneak/AutistMask/issues/623).
|
||||
// (https://git.eeqj.de/sneak/AutistMask/issues/623). Its decoded details name
|
||||
// the token, and scale its amount, from what the wallet knows of that
|
||||
// network's tokens (https://git.eeqj.de/sneak/AutistMask/issues/629).
|
||||
//
|
||||
// The row is the one the real history parser makes from the explorer's answer,
|
||||
// opened through transactionDetail.show(), which is what a click on the row
|
||||
@@ -165,6 +167,7 @@ beforeEach(() => {
|
||||
},
|
||||
];
|
||||
state.trackedTokens = [{ address: TOKEN, symbol: "TDOL", decimals: 6 }];
|
||||
state.networkTrackedTokens = {};
|
||||
state.viewData = {};
|
||||
state.viewStack = [];
|
||||
state.currentView = null;
|
||||
@@ -245,3 +248,46 @@ test("with mainnet active and no Blockscout remembered for Sepolia, a Sepolia tr
|
||||
NETWORKS.sepolia.defaultBlockscoutUrl + "/transactions/" + TX_HASH,
|
||||
]);
|
||||
});
|
||||
|
||||
// Open the Sepolia transfer's detail screen with mainnet active, and wait for
|
||||
// its decoded details.
|
||||
async function showSepoliaTransferWithMainnetActive() {
|
||||
state.networkId = "mainnet";
|
||||
state.blockscoutUrl = OTHER_EXPLORER;
|
||||
state.networkEndpoints = { sepolia: { blockscoutUrl: EXPLORER } };
|
||||
const [row] = await fetchRecentTransactions(
|
||||
HOLDER,
|
||||
EXPLORER,
|
||||
NETWORKS.sepolia.chainId,
|
||||
);
|
||||
transactionDetail.show(row);
|
||||
for (let i = 0; i < 10; i++) await new Promise((r) => setTimeout(r, 0));
|
||||
}
|
||||
|
||||
test("with mainnet active, a Sepolia token transfer's decoded details name the token tracked on Sepolia and its amount at its scale", async () => {
|
||||
state.trackedTokens = [];
|
||||
state.networkTrackedTokens = {
|
||||
sepolia: [{ address: TOKEN, symbol: "TDOL", decimals: 6 }],
|
||||
};
|
||||
await showSepoliaTransferWithMainnetActive();
|
||||
|
||||
expect(decodedLine("Token")).toContain('<div class="font-bold">TDOL</div>');
|
||||
expect(decodedLine("Amount")).toContain(
|
||||
'<div class="font-bold">1234.5000 TDOL</div>',
|
||||
);
|
||||
});
|
||||
|
||||
// The same contract address on mainnet is another token, so what the wallet
|
||||
// tracks and holds there names nothing on Sepolia.
|
||||
test("with mainnet active, a Sepolia token transfer's decoded details take nothing from mainnet's tracked tokens or balances", async () => {
|
||||
state.trackedTokens = [{ address: TOKEN, symbol: "MDOL", decimals: 18 }];
|
||||
state.wallets[0].addresses[0].tokenBalances = [
|
||||
{ address: TOKEN, symbol: "MDOL", decimals: 18, balance: "1.0" },
|
||||
];
|
||||
await showSepoliaTransferWithMainnetActive();
|
||||
|
||||
expect(decodedLine("Token")).not.toContain("MDOL");
|
||||
expect(decodedLine("Amount")).toContain(
|
||||
'<div class="font-bold">1234500000 base units (decimals unknown)</div>',
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user