Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
3265abb
Reorganize src tree
cedelavergne-ledger Sep 24, 2025
c422a3c
Merge remote-tracking branch 'origin/master' into develop
apaillier-ledger Sep 25, 2025
ac2ee6a
Merge pull request #866 from LedgerHQ/cev/reorg_src
cedelavergne-ledger Sep 25, 2025
735d81d
Merge remote-tracking branch 'origin/master' into develop
apaillier-ledger Sep 26, 2025
7491d9c
Do not check dynamic network in SWAP mode
cedelavergne-ledger Sep 29, 2025
464d063
Merge pull request #870 from LedgerHQ/cev/fix_swap_dyn_networks
cedelavergne-ledger Sep 29, 2025
844a5ef
Bump plugin SDK submodule
cedelavergne-ledger Sep 30, 2025
05e6755
Merge pull request #871 from LedgerHQ/cev/update_plugin_sdk
cedelavergne-ledger Sep 30, 2025
b3f21c4
Removed Metamask Gator from 7702 whitelist
apaillier-ledger Sep 30, 2025
17d968d
Fixed indentation in 7702 Ragger test
apaillier-ledger Sep 30, 2025
51bf143
Removed unused derivation paths
apaillier-ledger Sep 30, 2025
b81c915
Allocate 1k memory for plugins
fbeutin-ledger Sep 30, 2025
6222704
Merge pull request #874 from LedgerHQ/fbe/1k_memory_for_plugins
fbeutin-ledger Oct 1, 2025
ca66dbf
Merge pull request #873 from LedgerHQ/feat/apa/cleanup_deriv_paths
apaillier-ledger Oct 1, 2025
2e5fa12
Cleanup plugin interface
fbeutin-ledger Oct 1, 2025
2dd1b07
Merge pull request #875 from LedgerHQ/fbe/plugin_interface_cleanup
fbeutin-ledger Oct 1, 2025
ea34640
[auto-update] Update Ragger snapshots (#879)
github-actions[bot] Oct 3, 2025
6439d8a
Re-introduce 'skip' button for EIP712 raw messages
cedelavergne-ledger Oct 3, 2025
cf9d070
Remove useless 'skip' button from EIP191
cedelavergne-ledger Oct 3, 2025
7266f3c
Update snapshots
cedelavergne-ledger Oct 3, 2025
34238aa
Merge pull request #877 from LedgerHQ/cev/skip_for_eip712_raw
cedelavergne-ledger Oct 3, 2025
e5ebcf7
Added handling for GCS with no field descriptor
apaillier-ledger Sep 19, 2025
496cb55
Added Ragger tests
apaillier-ledger Sep 22, 2025
c663b66
Fixed GCS with legacy TX
apaillier-ledger Oct 9, 2025
860ab61
Fixed GCS TX context pop
apaillier-ledger Oct 9, 2025
39849a0
Fix STRUCT_TYPE value 0x0A for Safe Signers
cedelavergne-ledger Oct 10, 2025
87d2411
Merge pull request #884 from LedgerHQ/cev/fix_safe
cedelavergne-ledger Oct 10, 2025
409f95d
Merge pull request #881 from LedgerHQ/feat/apa/calldata_no_param
apaillier-ledger Oct 10, 2025
ff127a8
Merge pull request #882 from LedgerHQ/fix/apa/legacy_tx_gcs
apaillier-ledger Oct 10, 2025
29389f4
Merge pull request #883 from LedgerHQ/fix/apa/gcs_tx_ctx_pop
apaillier-ledger Oct 10, 2025
965405f
Added support for token trusted names
apaillier-ledger Oct 10, 2025
1e48133
Added support for token trusted names in Python client
apaillier-ledger Oct 10, 2025
1075a75
Added token trusted name Ragger test
apaillier-ledger Oct 13, 2025
f1aaa60
Add tool to copy binaries to exchange directory
cedelavergne-ledger Oct 8, 2025
9a7bfa2
Cleanup static declaration
cedelavergne-ledger Oct 6, 2025
83ff629
Set ticker after fee, follow same rule as amountToString in plugin-sdk
cedelavergne-ledger Oct 6, 2025
851862d
Update error case test
cedelavergne-ledger Oct 8, 2025
eda1c3c
Update plugin-sdk
cedelavergne-ledger Oct 6, 2025
d4fbc00
Update snapshots
cedelavergne-ledger Oct 6, 2025
c7f7b6a
Merge pull request #880 from LedgerHQ/cev/B2CA-2320_move-tickers-right
cedelavergne-ledger Oct 14, 2025
5c32bd4
Update ethereum plugin sdk
cedelavergne-ledger Oct 14, 2025
b204ba5
Merge pull request #889 from LedgerHQ/dev/update_submodule
cedelavergne-ledger Oct 14, 2025
af78c07
Merge pull request #872 from LedgerHQ/feat/apa/remove_metamask_from_7…
apaillier-ledger Oct 14, 2025
5437695
Merge pull request #886 from LedgerHQ/feat/apa/token_trusted_name_sup…
apaillier-ledger Oct 14, 2025
d425714
Updated Ragger test snapshots
apaillier-ledger Oct 14, 2025
3a2a3b9
Merge pull request #891 from LedgerHQ/update_snapshots
apaillier-ledger Oct 14, 2025
8241346
Merge remote-tracking branch 'origin/master' into develop
apaillier-ledger Oct 15, 2025
7ffda38
[auto-update] Update Ragger snapshots
github-actions[bot] Oct 16, 2025
977c9ca
Merge pull request #894 from LedgerHQ/auto/update_snapshots-7ffda381
cedelavergne-ledger Oct 16, 2025
54f8d4a
[auto-update] Update Ragger snapshots
github-actions[bot] Oct 17, 2025
48f4b66
Merge pull request #896 from LedgerHQ/auto/update_snapshots-54f8d4ad
cedelavergne-ledger Oct 17, 2025
d776ae0
Merge remote-tracking branch 'origin/master' into develop
cedelavergne-ledger Oct 24, 2025
09f798e
Align reusable workflows (#887)
cedelavergne-ledger Oct 30, 2025
53818ed
Migrated to the SDK status word macros
apaillier-ledger Oct 2, 2025
09793f8
Replaced some SWO by better ones
apaillier-ledger Oct 15, 2025
7fcd081
Changed so that CONDITIONS_NOT_SATISFIED is only returned on user rej…
apaillier-ledger Oct 3, 2025
477c535
Fixed Ragger tests
apaillier-ledger Nov 3, 2025
b97edd6
Fixed fuzzing build
apaillier-ledger Nov 3, 2025
c35cde9
Merge pull request #893 from LedgerHQ/feat/apa/swo_cleanup
apaillier-ledger Nov 3, 2025
ed1c8d6
Stop sending PKI certificate beforehand when using a pre-computed sig…
apaillier-ledger Nov 18, 2025
a7c3172
Merge pull request #907 from LedgerHQ/fix/apa/python_client_precomput…
apaillier-ledger Nov 18, 2025
acf8d65
[auto-update] Update Ragger snapshots
github-actions[bot] Nov 20, 2025
a5b57b7
[auto-update] Update Ragger snapshots (#909)
apaillier-ledger Nov 20, 2025
9efa84e
error eip712 signature with nested fields (#905)
franco-gondi Nov 25, 2025
3739981
Add support for displaying extra data trailing calldata in ERC20 calls
lcastillo-ledger Aug 29, 2025
7b5ea1c
Replaced hardcoded values in ERC-20 internal plugin by macros
apaillier-ledger Nov 24, 2025
16bb44f
Merged two functions testing if a given string was printable
apaillier-ledger Nov 5, 2025
3d9d668
Removed support for plugin UI_TYPE_AMOUNT_ADDRESS
apaillier-ledger Nov 6, 2025
78f272e
Added ERC-20 flows Ragger tests
apaillier-ledger Nov 4, 2025
4c8f1fd
Renamed pluginType enum values
apaillier-ledger Nov 13, 2025
645ed0f
Added a pluginType NONE
apaillier-ledger Nov 13, 2025
38c9eac
Removed g_use_standard_ui flag
apaillier-ledger Nov 12, 2025
2d15635
Fixed swap with calldata
apaillier-ledger Nov 20, 2025
c78ac25
Fixed token swap
apaillier-ledger Nov 21, 2025
93d8a66
Added a check to make sure the swap amount/destination checks have be…
apaillier-ledger Nov 25, 2025
3d4f4a4
Merge pull request #852 from lcastillo-ledger/feat/erc20-extra-data
apaillier-ledger Nov 26, 2025
e6c8d85
B2CA-2188: Multisig UI (#898)
cedelavergne-ledger Nov 26, 2025
c33e759
Added missing trusted name types and sources from Python client
apaillier-ledger Nov 26, 2025
46ceb64
Added support for multisig address book (MAB) trusted names
apaillier-ledger Nov 26, 2025
17a7a5b
Added MAB trusted name support in Python client
apaillier-ledger Nov 26, 2025
08ee8ee
Renamed one EIP-712 Ragger test
apaillier-ledger Nov 26, 2025
7cfeb38
Renamed some APDUs in the app
apaillier-ledger Nov 26, 2025
fb0e47f
Updated a Ragger test to use the new MAB trusted name source
apaillier-ledger Nov 26, 2025
ec3b253
Fixed Ragger tests linting
apaillier-ledger Nov 26, 2025
e6f31c3
Merge pull request #911 from LedgerHQ/feat/apa/multisig_address_book
apaillier-ledger Nov 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
25 changes: 24 additions & 1 deletion .github/workflows/build_and_functional_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,29 @@ jobs:
uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1
with:
download_app_binaries_artifact: "memory_elfs"
test_options: " -s 2>&1 | tools/valground.py -q"
run_for_devices: '["nanox"]'
upload_snapshots_on_failure: false
capture_file: pytest-logs-combined

ragger_mem__results:
name: Process pytest logs
if: always()
needs: ragger_mem_tests
runs-on: ubuntu-latest
steps:
- name: Clone
uses: actions/checkout@v4

- name: Download and process pytest logs
if: always()
uses: actions/download-artifact@v4
with:
name: pytest-logs-combined
path: logs

- name: Process logs with valground
if: always()
run: |
if [ -f logs/pytest-logs-combined.log ]; then
cat logs/pytest-logs-combined.log | tools/valground.py -q
fi
46 changes: 0 additions & 46 deletions .github/workflows/cflite_cron.yml

This file was deleted.

43 changes: 0 additions & 43 deletions .github/workflows/cflite_pr.yml

This file was deleted.

18 changes: 18 additions & 0 deletions .github/workflows/clusterfuzzlite.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: ClusterFuzzLite fuzzing tests

on:
workflow_dispatch:
pull_request:
push:
branches:
- main
schedule:
- cron: '0 13 * * 6' # At 01:00 PM, only on Saturday

permissions: read-all

jobs:
Fuzzing:
uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_clusterfuzz_tests.yml@v1
with:
exec_mode: ${{ github.event_name }}
15 changes: 3 additions & 12 deletions .github/workflows/codespell.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,6 @@ on:
jobs:
misspell:
name: Check misspellings
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true

- name: Check misspellings
uses: codespell-project/actions-codespell@v2
with:
builtin: clear,rare
check_filenames: true
path: src, src_bagl, src_features, src_nbgl, src_plugins, doc, client
uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_spell_check.yml@v1
with:
src_path: src, doc, client
7 changes: 0 additions & 7 deletions .github/workflows/lint-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,3 @@ jobs:
with:
source: './'
extensions: 'h,c'

yamllint:
name: Check yaml files
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: yamllint .
22 changes: 22 additions & 0 deletions .github/workflows/yml-workflow.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
name: Yaml style check

# This workflow will run linting checks to ensure a level of uniformization among all Ledger applications.
#
# The presence of this workflow is mandatory as a minimal level of linting is required.
# You are however free to modify the content of the .clang-format file and thus the coding style of your application.
# We simply ask you to not diverge too much from the linting of the Boilerplate application.

on:
workflow_dispatch:
push:
branches:
- master
- main
- develop
pull_request:

jobs:
check_linting:
name: Check linting using the reusable workflow
uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_yaml_lint.yml@v1
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [1.20.0](../../compare/1.19.3...1.20.0) - 2025-xx-xx

## [1.19.3](../../compare/1.19.2...1.19.3) - 2025-10-23

### Changed
Expand Down
9 changes: 4 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ endif
include ./makefile_conf/chain/$(CHAIN).mk

APPVERSION_M = 1
APPVERSION_N = 19
APPVERSION_P = 3
APPVERSION = $(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)
APPVERSION_N = 20
APPVERSION_P = 0
APPVERSION = $(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dev

# Application source files
APP_SOURCE_PATH += src src_features src_plugins src_nbgl
APP_SOURCE_PATH += src
APP_SOURCE_FILES += $(filter-out ./ethereum-plugin-sdk/src/main.c, $(wildcard ./ethereum-plugin-sdk/src/*.c))
INCLUDES_PATH += ./ethereum-plugin-sdk/src

Expand Down Expand Up @@ -98,7 +98,6 @@ CURVE_APP_LOAD_PARAMS += secp256k1
# and SLIP-0044 standards.
# If your app needs it, you can specify multiple path by using:
# `PATH_APP_LOAD_PARAMS = "44'/1'" "45'/1'"`
PATH_APP_LOAD_PARAMS += "45'" "44'/1'"

# Setting to allow building variant applications
# - <VARIANT_PARAM> is the name of the parameter which should be set
Expand Down
29 changes: 17 additions & 12 deletions client/src/ledger_app_clients/ethereum/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ class TrustedNameType(IntEnum):
ACCOUNT = 0x01
CONTRACT = 0x02
NFT = 0x03
TOKEN = 0x04
WALLET = 0x05
CONTEXT_ADDRESS = 0x06


class TrustedNameSource(IntEnum):
Expand All @@ -34,6 +37,8 @@ class TrustedNameSource(IntEnum):
UD = 0x03
FN = 0x04
DNS = 0x05
DYN_RESOLVER = 0x06
MULTISIG_ADDRESS_BOOK = 0x07


class EIP712CalldataParamPresence(IntEnum):
Expand Down Expand Up @@ -338,10 +343,10 @@ def set_plugin(self,
algo_id: int = 1,
sig: Optional[bytes] = None) -> RAPDU:

# Send ledgerPKI certificate
self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_PLUGIN_METADATA)

if sig is None:
# Send ledgerPKI certificate
self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_PLUGIN_METADATA)

# Temporarily get a command with an empty signature to extract the payload and
# compute the signature on it
tmp = self._cmd_builder.set_plugin(type_,
Expand Down Expand Up @@ -375,10 +380,10 @@ def provide_nft_metadata(self,
algo_id: int = 1,
sig: Optional[bytes] = None) -> RAPDU:

# Send ledgerPKI certificate
self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_NFT_METADATA)

if sig is None:
# Send ledgerPKI certificate
self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_NFT_METADATA)

# Temporarily get a command with an empty signature to extract the payload and
# compute the signature on it
tmp = self._cmd_builder.provide_nft_information(type_,
Expand Down Expand Up @@ -406,10 +411,10 @@ def set_external_plugin(self,
method_selelector: bytes,
sig: Optional[bytes] = None) -> RAPDU:

# Send ledgerPKI certificate
self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_COIN_META)

if sig is None:
# Send ledgerPKI certificate
self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_COIN_META)

# Temporarily get a command with an empty signature to extract the payload and
# compute the signature on it
tmp = self._cmd_builder.set_external_plugin(plugin_name, contract_address, method_selelector, bytes())
Expand All @@ -434,10 +439,10 @@ def provide_token_metadata(self,
chain_id: int,
sig: Optional[bytes] = None) -> RAPDU:

# Send ledgerPKI certificate
self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_COIN_META)

if sig is None:
# Send ledgerPKI certificate
self.pki_client.send_certificate(PKIPubKeyUsage.PUBKEY_USAGE_COIN_META)

# Temporarily get a command with an empty signature to extract the payload and
# compute the signature on it
tmp = self._cmd_builder.provide_erc20_token_information(ticker,
Expand Down
1 change: 1 addition & 0 deletions client/src/ledger_app_clients/ethereum/status_word.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class StatusWord(IntEnum):
INSUFFICIENT_MEMORY = 0x6a84
INVALID_INS = 0x6d00
INVALID_P1_P2 = 0x6b00
COMMAND_NOT_ALLOWED = 0x6980
CONDITION_NOT_SATISFIED = 0x6985
REF_DATA_NOT_FOUND = 0x6a88
EXCEPTION_OVERFLOW = 0x6807
Expand Down
6 changes: 3 additions & 3 deletions doc/eth_contract_support_embedded.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ This document described how a specific device UI for a smart contract can be add

The application already includes dedicated UI support for those specific contract calls :

* ERC 20 approve(address, uint256) - implementation in *src_features/erc20_approval*
* ERC 20 transfer(address, uint256) - implementation in *src_features/signTx*
* ERC 20 approve(address, uint256) - implementation in *src/features/erc20_approval*
* ERC 20 transfer(address, uint256) - implementation in *src/features/signTx*

## Requirements

Expand All @@ -38,6 +38,6 @@ The following online tool can be used to compute selectors https://emn178.github

A UI implementation might want to convert an ERC 20 token contract address to a ticker for easier validation

2 tickers can be temporarily provisioned to the application by using the PROVIDE ERC 20 TOKEN INFORMATION APDU, described in *src_features/provideErc20TokenInformation* - the UI can then iterate on the provisioned tickers to display relevant information to the user
2 tickers can be temporarily provisioned to the application by using the PROVIDE ERC 20 TOKEN INFORMATION APDU, described in *src/features/provideErc20TokenInformation* - the UI can then iterate on the provisioned tickers to display relevant information to the user

The same mechanism will be extended to support well known contract addresses in the future
2 changes: 1 addition & 1 deletion doc/ethapp_plugins.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ The plugin common dispatcher is found in _src/eth_plugin_handler.c_
The plugin generic UI dispatcher is found in _src/eth_plugin_ui.c_
Sample internal plugins are provided in _src_plugins/_
Sample internal plugins are provided in _src/plugins/_
## Creating a plugin
Expand Down
2 changes: 2 additions & 0 deletions ledger_app.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ dbg_use_test_keys = "DEBUG=1 CAL_TEST_KEY=1 TRUSTED_NAME_TEST_KEY=1 SET_PLUGIN_T
cal_bypass = "BYPASS_SIGNATURES=1"
dbg_cal_bypass = "DEBUG=1 BYPASS_SIGNATURES=1"
memory_profiling = "DEBUG=1 EIP7702_TEST_WHITELIST=1 MEMORY_PROFILING=1"
dbg_no_checks = "DEBUG=1 BYPASS_SIGNATURES=1 CHALLENGE_NO_CHECK=1"
dbg_no_checks_profiling = "DEBUG=1 BYPASS_SIGNATURES=1 CHALLENGE_NO_CHECK=1 MEMORY_PROFILING=1"

[tests]
unit_directory = "./tests/unit"
Expand Down
6 changes: 6 additions & 0 deletions makefile_conf/features.mk
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ ifneq ($(BYPASS_SIGNATURES),0)
DEFINES += HAVE_BYPASS_SIGNATURES
endif

# Bypass the challenge verification
CHALLENGE_NO_CHECK ?= 0
ifneq ($(CHALLENGE_NO_CHECK),0)
DEFINES += HAVE_CHALLENGE_NO_CHECK
endif

# Enable the SET_PLUGIN test key
SET_PLUGIN_TEST_KEY ?= 0
ifneq ($(SET_PLUGIN_TEST_KEY),0)
Expand Down
Loading
Loading