diff --git a/src_common/ethUstream.h b/src_common/ethUstream.h index 01b9f37..e73cc95 100644 --- a/src_common/ethUstream.h +++ b/src_common/ethUstream.h @@ -126,7 +126,7 @@ typedef struct txContent_t { txInt256_t chainID; uint8_t destination[ADDRESS_LENGTH]; uint8_t destinationLength; - uint8_t v[4]; + uint8_t v[8]; uint8_t vLength; bool dataPresent; } txContent_t; diff --git a/src_common/network.c b/src_common/network.c index 9c85618..23872ea 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -20,10 +20,11 @@ const network_info_t NETWORK_MAPPING[] = { {.chain_id = 137, .name = "Polygon", .ticker = "MATIC "}, {.chain_id = 250, .name = "Fantom", .ticker = "FTM "}, {.chain_id = 43114, .name = "Avalanche", .ticker = "AVAX "}, - {.chain_id = 11297108099, .name = "Palm Network", .ticker = "PALM "}}; + {.chain_id = 11297108109, .name = "Palm Network", .ticker = "PALM "}}; uint64_t get_chain_id(void) { uint64_t chain_id = 0; + char tmp[16] = {0}; switch (txContext.txType) { case LEGACY: @@ -38,17 +39,24 @@ uint64_t get_chain_id(void) { PRINTF("Txtype `%d` not supported while generating chainID\n", txContext.txType); break; } - PRINTF("ChainID: %d\n", chain_id); + u64_to_string(chain_id, tmp, sizeof(tmp)); + PRINTF("\n\nTMP: %s\n", tmp); return chain_id; } network_info_t *get_network(void) { uint64_t chain_id = get_chain_id(); + char tmp1[16]; + char tmp2[16]; for (uint8_t i = 0; i < sizeof(NETWORK_MAPPING) / sizeof(*NETWORK_MAPPING); i++) { + u64_to_string(NETWORK_MAPPING[i].chain_id, tmp1, sizeof(tmp1)); + u64_to_string(chain_id, tmp2, sizeof(tmp2)); + PRINTF("Comparing %s but wanted %s\n", tmp1, tmp2); if (NETWORK_MAPPING[i].chain_id == chain_id) { return (network_info_t *) PIC(&NETWORK_MAPPING[i]); } } + PRINTF("RETURNING NULL\n"); return NULL; } diff --git a/src_features/signTx/cmd_signTx.c b/src_features/signTx/cmd_signTx.c index 4e4fdbe..09c0f8c 100644 --- a/src_features/signTx/cmd_signTx.c +++ b/src_features/signTx/cmd_signTx.c @@ -59,7 +59,7 @@ void handleSign(uint8_t p1, } else { txContext.txType = LEGACY; } - PRINTF("TxType: %d\n", txContext.txType); + PRINTF("TxType: %x\n", txContext.txType); } else if (p1 != P1_MORE) { THROW(0x6B00); } diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index 82f640a..8e291cc 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -267,6 +267,7 @@ void prepareNetworkDisplay() { } else { // Network name found, simply copy it. strlcpy(strings.common.network_name, name, sizeof(strings.common.network_name)); + PRINTF("COPIED\n"); } } @@ -452,9 +453,14 @@ void finalizeParsing(bool direct) { // Compute maximum fee prepareFeeDisplay(); + PRINTF("Fees displayed: %s\n", strings.common.maxFee); // Prepare chainID field prepareNetworkDisplay(); + PRINTF("Network bytes: %.*H\n", + sizeof(strings.common.network_name), + strings.common.network_name); + PRINTF("Network: %s\n", strings.common.network_name); bool no_consent; diff --git a/src_features/signTx/ui_flow_signTx.c b/src_features/signTx/ui_flow_signTx.c index b508ee5..7b47212 100644 --- a/src_features/signTx/ui_flow_signTx.c +++ b/src_features/signTx/ui_flow_signTx.c @@ -224,6 +224,7 @@ void ux_approve_tx(bool fromPlugin) { uint64_t chain_id = get_chain_id(); if (chainConfig->chainId == ETHEREUM_MAINNET_CHAINID && chain_id != chainConfig->chainId) { + PRINTF("ADDED GET CHAIN ID\n"); ux_approval_tx_flow[step++] = &ux_approval_network_step; } diff --git a/tests/snapshots/chainid/nanos/accept.png b/tests/snapshots/chainid/nanos/accept.png new file mode 100644 index 0000000..3158ea6 Binary files /dev/null and b/tests/snapshots/chainid/nanos/accept.png differ diff --git a/tests/snapshots/chainid/nanos/address_1.png b/tests/snapshots/chainid/nanos/address_1.png new file mode 100644 index 0000000..f979f71 Binary files /dev/null and b/tests/snapshots/chainid/nanos/address_1.png differ diff --git a/tests/snapshots/chainid/nanos/address_2.png b/tests/snapshots/chainid/nanos/address_2.png new file mode 100644 index 0000000..93c90c5 Binary files /dev/null and b/tests/snapshots/chainid/nanos/address_2.png differ diff --git a/tests/snapshots/chainid/nanos/address_3.png b/tests/snapshots/chainid/nanos/address_3.png new file mode 100644 index 0000000..402c20d Binary files /dev/null and b/tests/snapshots/chainid/nanos/address_3.png differ diff --git a/tests/snapshots/chainid/nanos/amount_1.png b/tests/snapshots/chainid/nanos/amount_1.png new file mode 100644 index 0000000..4cd3e38 Binary files /dev/null and b/tests/snapshots/chainid/nanos/amount_1.png differ diff --git a/tests/snapshots/chainid/nanos/amount_2.png b/tests/snapshots/chainid/nanos/amount_2.png new file mode 100644 index 0000000..11ae75e Binary files /dev/null and b/tests/snapshots/chainid/nanos/amount_2.png differ diff --git a/tests/snapshots/chainid/nanos/amount_3.png b/tests/snapshots/chainid/nanos/amount_3.png new file mode 100644 index 0000000..e042010 Binary files /dev/null and b/tests/snapshots/chainid/nanos/amount_3.png differ diff --git a/tests/snapshots/chainid/nanos/fees.png b/tests/snapshots/chainid/nanos/fees.png new file mode 100644 index 0000000..8b996b5 Binary files /dev/null and b/tests/snapshots/chainid/nanos/fees.png differ diff --git a/tests/snapshots/chainid/nanos/network.png b/tests/snapshots/chainid/nanos/network.png new file mode 100644 index 0000000..3242d61 Binary files /dev/null and b/tests/snapshots/chainid/nanos/network.png differ diff --git a/tests/snapshots/chainid/nanos/palm.png b/tests/snapshots/chainid/nanos/palm.png new file mode 100644 index 0000000..297527f Binary files /dev/null and b/tests/snapshots/chainid/nanos/palm.png differ diff --git a/tests/snapshots/chainid/nanos/review.png b/tests/snapshots/chainid/nanos/review.png new file mode 100644 index 0000000..2994983 Binary files /dev/null and b/tests/snapshots/chainid/nanos/review.png differ diff --git a/tests/snapshots/chainid/nanox/accept.png b/tests/snapshots/chainid/nanox/accept.png new file mode 100644 index 0000000..a2cb8f9 Binary files /dev/null and b/tests/snapshots/chainid/nanox/accept.png differ diff --git a/tests/snapshots/chainid/nanox/address.png b/tests/snapshots/chainid/nanox/address.png new file mode 100644 index 0000000..4228ae1 Binary files /dev/null and b/tests/snapshots/chainid/nanox/address.png differ diff --git a/tests/snapshots/chainid/nanox/amount.png b/tests/snapshots/chainid/nanox/amount.png new file mode 100644 index 0000000..a5592a6 Binary files /dev/null and b/tests/snapshots/chainid/nanox/amount.png differ diff --git a/tests/snapshots/chainid/nanox/fees.png b/tests/snapshots/chainid/nanox/fees.png new file mode 100644 index 0000000..a67fa25 Binary files /dev/null and b/tests/snapshots/chainid/nanox/fees.png differ diff --git a/tests/snapshots/chainid/nanox/network.png b/tests/snapshots/chainid/nanox/network.png new file mode 100644 index 0000000..04c32e9 Binary files /dev/null and b/tests/snapshots/chainid/nanox/network.png differ diff --git a/tests/snapshots/chainid/nanox/review.png b/tests/snapshots/chainid/nanox/review.png new file mode 100644 index 0000000..4a982c5 Binary files /dev/null and b/tests/snapshots/chainid/nanox/review.png differ diff --git a/tests/src/chainid.test.js b/tests/src/chainid.test.js new file mode 100644 index 0000000..ab7c972 --- /dev/null +++ b/tests/src/chainid.test.js @@ -0,0 +1,298 @@ +import "core-js/stable"; +import "regenerator-runtime/runtime"; +import Eth from "@ledgerhq/hw-app-eth"; +import { byContractAddress } from "@ledgerhq/hw-app-eth/erc20"; +import Zemu from "@zondax/zemu"; +import { TransportStatusError } from "@ledgerhq/errors"; +import { expect } from "../jest"; + +const {NANOS_ELF_PATH, NANOX_ELF_PATH, sim_options_nanos, sim_options_nanox, TIMEOUT, getTmpPath} = require("generic.js"); + +const ORIGINAL_SNAPSHOT_PATH_PREFIX = "snapshots/chainid/"; + +const ORIGINAL_SNAPSHOT_PATH_NANOS = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanos/"; +const ORIGINAL_SNAPSHOT_PATH_NANOX = ORIGINAL_SNAPSHOT_PATH_PREFIX + "nanox/"; + +test.skip("Transfer on network 112233445566 on Ethereum nanos", async () => { + jest.setTimeout(TIMEOUT); + const sim = new Zemu(NANOS_ELF_PATH); + let tmpPath = getTmpPath(expect.getState().currentTestName); + + try { + await sim.start(sim_options_nanos); + + let transport = await sim.getTransport(); + let eth = new Eth(transport); + + // Send transaction + let tx = eth.signTransaction( + "44'/60'/0'/0/0", + "f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf6181880851a21a278be8080" + ) + let filename; + + await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot()); + // Review tx + filename = "review.png"; + await sim.snapshot(tmpPath + filename); + const review = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(review).toMatchSnapshot(expected_review); + + // Amount 1/3 + filename = "amount_1.png"; + await sim.clickRight(tmpPath + filename); + const amount_1 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_1).toMatchSnapshot(expected_amount_1); + + // Amount 2/3 + filename = "amount_2.png"; + await sim.clickRight(tmpPath + filename); + const amount_2 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_2).toMatchSnapshot(expected_amount_2); + + // Amount 3/3 + filename = "amount_3.png"; + await sim.clickRight(tmpPath + filename); + const amount_3 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_3).toMatchSnapshot(expected_amount_3); + + // Address 1/3 + filename = "address_1.png"; + await sim.clickRight(tmpPath + filename); + const address_1 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_1).toMatchSnapshot(expected_address_1); + + // Address 2/3 + filename = "address_2.png"; + await sim.clickRight(tmpPath + filename); + const address_2 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_2).toMatchSnapshot(expected_address_2); + + // Address 3/3 + filename = "address_3.png"; + await sim.clickRight(tmpPath + filename); + const address_3 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_3).toMatchSnapshot(expected_address_3); + + // Network + filename = "network.png"; + await sim.clickRight(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); // scott + const network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); // scott + const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(network).toMatchSnapshot(expected_network); + + // Max Fees + filename = "fees.png"; + await sim.clickRight(tmpPath + filename); + const fees = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(fees).toMatchSnapshot(expected_fees); + + // Accept + filename = "accept.png"; + await sim.clickRight(tmpPath + filename); + const accept = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(accept).toMatchSnapshot(expected_accept); + + await sim.clickBoth(); + + await expect(tx).resolves.toEqual( + { + "r": "31fca443b3cad62f3ce18e287f3cf4892ac2669379cc21b5cf198561f0511d1e", + "s": "3cf21485cd8b86e1acddbcc641e16a3efad18aaeb5ae96a650f1a8b291078494", + "v": "344344f1a0", + } + ); + } finally { + await sim.close(); + } +}); + +test("Transfer on palm network on Ethereum nanos", async () => { + jest.setTimeout(TIMEOUT); + const sim = new Zemu(NANOS_ELF_PATH); + let tmpPath = getTmpPath(expect.getState().currentTestName); + + try { + await sim.start(sim_options_nanos); + + let transport = await sim.getTransport(); + let eth = new Eth(transport); + + // Send transaction + let tx = eth.signTransaction( + "44'/60'/0'/0/0", + "f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf61818808502a15c308d8080" + ) + let filename; + + await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot()); + // Review tx + filename = "review.png"; + await sim.snapshot(tmpPath + filename); + const review = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(review).toMatchSnapshot(expected_review); + + // Amount 1/3 + filename = "amount_1.png"; + console.log("after5"); + await sim.clickRight(tmpPath + filename); + console.log("after6"); + const amount_1 = Zemu.LoadPng2RGB(tmpPath + filename); + console.log("after7"); + const expected_amount_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + console.log("after8"); + // expect(amount_1).toMatchSnapshot(expected_amount_1); + console.log("after9"); + + // Amount 2/3 + filename = "amount_2.png"; + console.log("after10"); + await sim.clickRight(tmpPath + filename); + console.log("after11"); + const amount_2 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_amount_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_2).toMatchSnapshot(expected_amount_2); + + // Amount 3/3 + filename = "amount_3.png"; + await sim.clickRight(tmpPath + filename); + const amount_3 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_amount_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(amount_3).toMatchSnapshot(expected_amount_3); + + // Address 1/3 + filename = "address_1.png"; + await sim.clickRight(tmpPath + filename); + const address_1 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_address_1 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_1).toMatchSnapshot(expected_address_1); + + // Address 2/3 + filename = "address_2.png"; + await sim.clickRight(tmpPath + filename); + const address_2 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_address_2 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_2).toMatchSnapshot(expected_address_2); + + // Address 3/3 + filename = "address_3.png"; + await sim.clickRight(tmpPath + filename); + const address_3 = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_address_3 = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(address_3).toMatchSnapshot(expected_address_3); + + // Network + filename = "palm.png"; + await sim.clickRight(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); // scott + const network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); // scott + const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(network).toMatchSnapshot(expected_network); + + // Max Fees + filename = "fees.png"; + await sim.clickRight(tmpPath + filename); + const fees = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(fees).toMatchSnapshot(expected_fees); + + // Accept + filename = "accept.png"; + await sim.clickRight(tmpPath + filename); + const accept = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOS + filename); + expect(accept).toMatchSnapshot(expected_accept); + + await sim.clickBoth(); + + await expect(tx).resolves.toEqual( + { + "r": "f9b5d903c47c34027156e869bda5aa002233d6cca583ad53d125612fc0795f3b", + "s": "00da038129414e5ae6f7c1529c6067e82484e3694c84c16d575e77162f631c27", + "v": "0542b8613d", + } + ); + } finally { + await sim.close(); + } +}); + +test.skip("Transfer on network 112233445566 on Ethereum nanox", async () => { + jest.setTimeout(TIMEOUT); + const sim = new Zemu(NANOX_ELF_PATH); + let tmpPath = getTmpPath(expect.getState().currentTestName); + + try { + await sim.start(sim_options_nanox); + + let transport = await sim.getTransport(); + let eth = new Eth(transport); + + // Send transaction + let tx = eth.signTransaction( + "44'/60'/0'/0/0", + "f044850306dc4200825208945a321744667052affa8386ed49e00ef223cbffc3876f9c9e7bf6181880851a21a278be8080" + ) + let filename; + + await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot()); + // Review tx + filename = "review.png"; + await sim.snapshot(tmpPath + filename); + const review = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_review = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(review).toMatchSnapshot(expected_review); + + // Amount + filename = "amount.png"; + await sim.clickRight(tmpPath + filename); + const amount = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_amount = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(amount).toMatchSnapshot(expected_amount); + + // Address + filename = "address.png"; + await sim.clickRight(tmpPath + filename); + const address = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_address = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(address).toMatchSnapshot(expected_address); + + // Network + filename = "network.png"; + await sim.clickRight(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); // scott + const network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); // scott + const expected_network = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(network).toMatchSnapshot(expected_network); + + // Max Fees + filename = "fees.png"; + await sim.clickRight(tmpPath + filename); + const fees = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_fees = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(fees).toMatchSnapshot(expected_fees); + + // Accept + filename = "accept.png"; + await sim.clickRight(tmpPath + filename); + const accept = Zemu.LoadPng2RGB(tmpPath + filename); + const expected_accept = Zemu.LoadPng2RGB(ORIGINAL_SNAPSHOT_PATH_NANOX + filename); + expect(accept).toMatchSnapshot(expected_accept); + + await sim.clickBoth(); + + await expect(tx).resolves.toEqual( + Buffer.from([]) + ); + } finally { + await sim.close(); + } +}); \ No newline at end of file