From 07ad02ab42cfcb97d88db8056f3bd122a4b1fe33 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Tue, 14 May 2024 14:23:11 +0200
Subject: [PATCH 01/63] feat(mina): add init files and coin mina

---
 apps/cli/src/live-common-setup-base.ts        |   1 +
 .../live-common-set-supported-currencies.ts   |   1 +
 libs/coin-framework/src/derivation.ts         |   3 +
 libs/coin-modules/coin-mina/.eslintrc.js      |  20 +++
 .../coin-modules/coin-mina/.unimportedrc.json |  14 +++
 libs/coin-modules/coin-mina/CHANGELOG.md      | 118 ++++++++++++++++++
 libs/coin-modules/coin-mina/jest.config.js    |   6 +
 libs/coin-modules/coin-mina/package.json      |  80 ++++++++++++
 libs/coin-modules/coin-mina/src/account.ts    |   0
 libs/coin-modules/coin-mina/src/api/index.ts  |  26 ++++
 libs/coin-modules/coin-mina/src/bridge/js.ts  |  68 ++++++++++
 libs/coin-modules/coin-mina/src/config.ts     |  21 ++++
 .../coin-mina/src/hw-getAddress.ts            |  21 ++++
 .../coin-mina/src/js-broadcast.ts             |  15 +++
 .../coin-mina/src/js-buildTransaction.ts      |  21 ++++
 .../coin-mina/src/js-estimateMaxSpendable.ts  |  38 ++++++
 .../coin-mina/src/js-getFeesForTransaction.ts |  11 ++
 .../coin-mina/src/js-getTransactionStatus.ts  |  61 +++++++++
 .../coin-mina/src/js-signOperation.ts         | 112 +++++++++++++++++
 .../coin-mina/src/js-synchronisation.ts       |  51 ++++++++
 .../coin-mina/src/js-transaction.ts           |  28 +++++
 libs/coin-modules/coin-mina/src/logic.ts      |  50 ++++++++
 libs/coin-modules/coin-mina/src/signer.ts     |   9 ++
 .../coin-modules/coin-mina/src/transaction.ts |  61 +++++++++
 libs/coin-modules/coin-mina/src/types.ts      |  41 ++++++
 libs/coin-modules/coin-mina/tsconfig.json     |  12 ++
 libs/ledger-live-common/package.json          |   1 +
 .../__tests__/migration/account-migration.ts  |   1 +
 .../src/__tests__/test-helpers/environment.ts |   1 +
 .../families/mina/bridge.integration.test.ts  |   5 +
 .../src/families/mina/config.ts               |  17 +++
 .../src/families/mina/constants.ts            |   2 +
 .../src/families/mina/logic.ts                |   2 +
 .../src/families/mina/react.ts                |  97 ++++++++++++++
 .../src/families/mina/setup.ts                |  30 +++++
 .../src/families/mina/types.ts                |   2 +
 .../packages/cryptoassets/src/currencies.ts   |  24 ++++
 .../packages/types-cryptoassets/src/index.ts  |   1 +
 .../packages/types-cryptoassets/src/slip44.ts |   1 +
 .../packages/types-live/src/derivation.ts     |   3 +-
 40 files changed, 1075 insertions(+), 1 deletion(-)
 create mode 100644 libs/coin-modules/coin-mina/.eslintrc.js
 create mode 100644 libs/coin-modules/coin-mina/.unimportedrc.json
 create mode 100644 libs/coin-modules/coin-mina/CHANGELOG.md
 create mode 100644 libs/coin-modules/coin-mina/jest.config.js
 create mode 100644 libs/coin-modules/coin-mina/package.json
 create mode 100644 libs/coin-modules/coin-mina/src/account.ts
 create mode 100644 libs/coin-modules/coin-mina/src/api/index.ts
 create mode 100644 libs/coin-modules/coin-mina/src/bridge/js.ts
 create mode 100644 libs/coin-modules/coin-mina/src/config.ts
 create mode 100644 libs/coin-modules/coin-mina/src/hw-getAddress.ts
 create mode 100644 libs/coin-modules/coin-mina/src/js-broadcast.ts
 create mode 100644 libs/coin-modules/coin-mina/src/js-buildTransaction.ts
 create mode 100644 libs/coin-modules/coin-mina/src/js-estimateMaxSpendable.ts
 create mode 100644 libs/coin-modules/coin-mina/src/js-getFeesForTransaction.ts
 create mode 100644 libs/coin-modules/coin-mina/src/js-getTransactionStatus.ts
 create mode 100644 libs/coin-modules/coin-mina/src/js-signOperation.ts
 create mode 100644 libs/coin-modules/coin-mina/src/js-synchronisation.ts
 create mode 100644 libs/coin-modules/coin-mina/src/js-transaction.ts
 create mode 100644 libs/coin-modules/coin-mina/src/logic.ts
 create mode 100644 libs/coin-modules/coin-mina/src/signer.ts
 create mode 100644 libs/coin-modules/coin-mina/src/transaction.ts
 create mode 100644 libs/coin-modules/coin-mina/src/types.ts
 create mode 100644 libs/coin-modules/coin-mina/tsconfig.json
 create mode 100644 libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
 create mode 100644 libs/ledger-live-common/src/families/mina/config.ts
 create mode 100644 libs/ledger-live-common/src/families/mina/constants.ts
 create mode 100644 libs/ledger-live-common/src/families/mina/logic.ts
 create mode 100644 libs/ledger-live-common/src/families/mina/react.ts
 create mode 100644 libs/ledger-live-common/src/families/mina/setup.ts
 create mode 100644 libs/ledger-live-common/src/families/mina/types.ts

diff --git a/apps/cli/src/live-common-setup-base.ts b/apps/cli/src/live-common-setup-base.ts
index e3033759d87a..83a8bf4fd772 100644
--- a/apps/cli/src/live-common-setup-base.ts
+++ b/apps/cli/src/live-common-setup-base.ts
@@ -110,6 +110,7 @@ setSupportedCurrencies([
   "zenrock",
   "sonic",
   "sonic_blaze",
+  "mina",
 ]);
 
 for (const k in process.env) setEnvUnsafe(k as EnvName, process.env[k]);
diff --git a/apps/ledger-live-desktop/src/live-common-set-supported-currencies.ts b/apps/ledger-live-desktop/src/live-common-set-supported-currencies.ts
index 2742125fb7bb..6cb5ee0fa11e 100644
--- a/apps/ledger-live-desktop/src/live-common-set-supported-currencies.ts
+++ b/apps/ledger-live-desktop/src/live-common-set-supported-currencies.ts
@@ -104,4 +104,5 @@ setSupportedCurrencies([
   "zenrock",
   "sonic",
   "sonic_blaze",
+  "mina",
 ]);
diff --git a/libs/coin-framework/src/derivation.ts b/libs/coin-framework/src/derivation.ts
index f737bd9cfe2e..33fa92d27859 100644
--- a/libs/coin-framework/src/derivation.ts
+++ b/libs/coin-framework/src/derivation.ts
@@ -171,6 +171,9 @@ const modes: Readonly<Record<DerivationMode, ModeSpec>> = Object.freeze({
   internet_computer: {
     overridesDerivation: "44'/223'/0'/0/<account>",
   },
+  mina: {
+    overridesDerivation: "44'/12586'/0'/0/<account>",
+  },
   stacks_wallet: {
     overridesDerivation: "44'/5757'/0'/0/<account>",
     startsAt: 1,
diff --git a/libs/coin-modules/coin-mina/.eslintrc.js b/libs/coin-modules/coin-mina/.eslintrc.js
new file mode 100644
index 000000000000..8f6848a860b9
--- /dev/null
+++ b/libs/coin-modules/coin-mina/.eslintrc.js
@@ -0,0 +1,20 @@
+module.exports = {
+  env: {
+    browser: true,
+    es6: true,
+  },
+  overrides: [
+    {
+      files: ["src/**/*.test.{ts,tsx}"],
+      env: {
+        "jest/globals": true,
+      },
+      plugins: ["jest"],
+    },
+  ],
+  rules: {
+    "no-console": ["error", { allow: ["warn", "error"] }],
+    "@typescript-eslint/no-empty-function": "off",
+    "@typescript-eslint/no-explicit-any": "warn",
+  },
+};
diff --git a/libs/coin-modules/coin-mina/.unimportedrc.json b/libs/coin-modules/coin-mina/.unimportedrc.json
new file mode 100644
index 000000000000..caa4bde96225
--- /dev/null
+++ b/libs/coin-modules/coin-mina/.unimportedrc.json
@@ -0,0 +1,14 @@
+{
+  "entry": [
+    "src/account.ts",
+    "src/bridge/js.ts",
+    "src/cli-transaction.ts",
+    "src/deviceTransactionConfig.ts",
+    "src/errors.ts",
+    "src/hw-getAddress.ts",
+    "src/serialization.ts",
+    "src/specs.ts",
+    "src/transaction.ts"
+  ],
+  "ignoreUnimported": []
+}
diff --git a/libs/coin-modules/coin-mina/CHANGELOG.md b/libs/coin-modules/coin-mina/CHANGELOG.md
new file mode 100644
index 000000000000..20c1b22d4a56
--- /dev/null
+++ b/libs/coin-modules/coin-mina/CHANGELOG.md
@@ -0,0 +1,118 @@
+# @ledgerhq/coin-near
+
+## 0.3.12
+
+### Patch Changes
+
+- Updated dependencies [[`7d5a724`](https://github.com/LedgerHQ/ledger-live/commit/7d5a724f40079a233b159b5231d69f318327e175), [`b3dfed5`](https://github.com/LedgerHQ/ledger-live/commit/b3dfed54bd8d54e62530cb2db92c3c108b43e0d7), [`7887ad9`](https://github.com/LedgerHQ/ledger-live/commit/7887ad9842e59f6fc567f118f06b3e12bdb9073b), [`5ae6d8f`](https://github.com/LedgerHQ/ledger-live/commit/5ae6d8fb9b868dc01724e84ede2708e7a717c3f2), [`21f5c44`](https://github.com/LedgerHQ/ledger-live/commit/21f5c4438bb542a3891f692f4274ee4c28aa76cd), [`a780777`](https://github.com/LedgerHQ/ledger-live/commit/a780777c13e08c1c3cd66ef5f6deac0fe928a894), [`1aa8ef4`](https://github.com/LedgerHQ/ledger-live/commit/1aa8ef404411c31f6ac4cf09fba453042db8b955), [`3c15515`](https://github.com/LedgerHQ/ledger-live/commit/3c155155f2d45fb85f8900e7e77c1b5ab1c7ad67), [`762dea1`](https://github.com/LedgerHQ/ledger-live/commit/762dea1c52ef0537961d058f7ba81fa399663ac1), [`fc4f83e`](https://github.com/LedgerHQ/ledger-live/commit/fc4f83e26d9f00b7c518f28157e8d9da55ce3685), [`13bea7c`](https://github.com/LedgerHQ/ledger-live/commit/13bea7ced4b8a7ad40fbc5205e3b58ed8a217982), [`d2f8b26`](https://github.com/LedgerHQ/ledger-live/commit/d2f8b26c99551cba902c07e9c544f3c84d74686c), [`dd1d17f`](https://github.com/LedgerHQ/ledger-live/commit/dd1d17fd3ce7ed42558204b2f93707fb9b1599de), [`5ca7923`](https://github.com/LedgerHQ/ledger-live/commit/5ca79234ccbe66ce22f998fe3ebd2cdec681499a), [`26b3a5d`](https://github.com/LedgerHQ/ledger-live/commit/26b3a5d7d6e11efc226403707d683f3d0098a1c1), [`9ada63a`](https://github.com/LedgerHQ/ledger-live/commit/9ada63a05b2d2518af09a9c07937cf94b5b2ea67), [`5848f9e`](https://github.com/LedgerHQ/ledger-live/commit/5848f9e247f169eb7a4aff322253937214b9efdd), [`c7f072f`](https://github.com/LedgerHQ/ledger-live/commit/c7f072f833a950e230137499d4908b792f6b615f), [`a8138f9`](https://github.com/LedgerHQ/ledger-live/commit/a8138f9ec0cff714d9745012eb91a09713ffbbd2), [`2331bae`](https://github.com/LedgerHQ/ledger-live/commit/2331bae7393f822aa64e5d0ab8f51622b6363b33), [`b72c52b`](https://github.com/LedgerHQ/ledger-live/commit/b72c52b3e4ebbb7aaf2142afbf6a9b9172e7ee04), [`ebb45be`](https://github.com/LedgerHQ/ledger-live/commit/ebb45be56c6b1fdb3c36a8c20a16b41600baa264), [`e1df8bc`](https://github.com/LedgerHQ/ledger-live/commit/e1df8bca348287e94970de90c51e98fa277c5364), [`53da330`](https://github.com/LedgerHQ/ledger-live/commit/53da3301aaceeb16e6b1f96b1ea44428fbeb4483), [`52d5703`](https://github.com/LedgerHQ/ledger-live/commit/52d57039bb015af2616670db480364a2e5fc9966), [`abb1bbb`](https://github.com/LedgerHQ/ledger-live/commit/abb1bbb09c52a3d08577ba622c6cb0f44aab36c1), [`ba5c49b`](https://github.com/LedgerHQ/ledger-live/commit/ba5c49b82af70a2e459720b9cb124546c406b88b)]:
+  - @ledgerhq/types-live@6.46.0
+  - @ledgerhq/coin-framework@0.12.0
+  - @ledgerhq/types-cryptoassets@7.11.0
+  - @ledgerhq/live-env@2.0.1
+  - @ledgerhq/errors@6.16.4
+  - @ledgerhq/devices@8.3.0
+  - @ledgerhq/live-network@1.2.1
+
+## 0.3.12-next.1
+
+### Patch Changes
+
+- Updated dependencies [[`762dea1`](https://github.com/LedgerHQ/ledger-live/commit/762dea1c52ef0537961d058f7ba81fa399663ac1)]:
+  - @ledgerhq/live-env@2.0.1-next.0
+  - @ledgerhq/coin-framework@0.12.0-next.1
+  - @ledgerhq/live-network@1.2.1-next.1
+
+## 0.3.12-next.0
+
+### Patch Changes
+
+- Updated dependencies [[`7d5a724`](https://github.com/LedgerHQ/ledger-live/commit/7d5a724f40079a233b159b5231d69f318327e175), [`b3dfed5`](https://github.com/LedgerHQ/ledger-live/commit/b3dfed54bd8d54e62530cb2db92c3c108b43e0d7), [`7887ad9`](https://github.com/LedgerHQ/ledger-live/commit/7887ad9842e59f6fc567f118f06b3e12bdb9073b), [`5ae6d8f`](https://github.com/LedgerHQ/ledger-live/commit/5ae6d8fb9b868dc01724e84ede2708e7a717c3f2), [`21f5c44`](https://github.com/LedgerHQ/ledger-live/commit/21f5c4438bb542a3891f692f4274ee4c28aa76cd), [`a780777`](https://github.com/LedgerHQ/ledger-live/commit/a780777c13e08c1c3cd66ef5f6deac0fe928a894), [`1aa8ef4`](https://github.com/LedgerHQ/ledger-live/commit/1aa8ef404411c31f6ac4cf09fba453042db8b955), [`3c15515`](https://github.com/LedgerHQ/ledger-live/commit/3c155155f2d45fb85f8900e7e77c1b5ab1c7ad67), [`fc4f83e`](https://github.com/LedgerHQ/ledger-live/commit/fc4f83e26d9f00b7c518f28157e8d9da55ce3685), [`13bea7c`](https://github.com/LedgerHQ/ledger-live/commit/13bea7ced4b8a7ad40fbc5205e3b58ed8a217982), [`d2f8b26`](https://github.com/LedgerHQ/ledger-live/commit/d2f8b26c99551cba902c07e9c544f3c84d74686c), [`dd1d17f`](https://github.com/LedgerHQ/ledger-live/commit/dd1d17fd3ce7ed42558204b2f93707fb9b1599de), [`5ca7923`](https://github.com/LedgerHQ/ledger-live/commit/5ca79234ccbe66ce22f998fe3ebd2cdec681499a), [`26b3a5d`](https://github.com/LedgerHQ/ledger-live/commit/26b3a5d7d6e11efc226403707d683f3d0098a1c1), [`9ada63a`](https://github.com/LedgerHQ/ledger-live/commit/9ada63a05b2d2518af09a9c07937cf94b5b2ea67), [`5848f9e`](https://github.com/LedgerHQ/ledger-live/commit/5848f9e247f169eb7a4aff322253937214b9efdd), [`c7f072f`](https://github.com/LedgerHQ/ledger-live/commit/c7f072f833a950e230137499d4908b792f6b615f), [`a8138f9`](https://github.com/LedgerHQ/ledger-live/commit/a8138f9ec0cff714d9745012eb91a09713ffbbd2), [`2331bae`](https://github.com/LedgerHQ/ledger-live/commit/2331bae7393f822aa64e5d0ab8f51622b6363b33), [`b72c52b`](https://github.com/LedgerHQ/ledger-live/commit/b72c52b3e4ebbb7aaf2142afbf6a9b9172e7ee04), [`ebb45be`](https://github.com/LedgerHQ/ledger-live/commit/ebb45be56c6b1fdb3c36a8c20a16b41600baa264), [`e1df8bc`](https://github.com/LedgerHQ/ledger-live/commit/e1df8bca348287e94970de90c51e98fa277c5364), [`53da330`](https://github.com/LedgerHQ/ledger-live/commit/53da3301aaceeb16e6b1f96b1ea44428fbeb4483), [`52d5703`](https://github.com/LedgerHQ/ledger-live/commit/52d57039bb015af2616670db480364a2e5fc9966), [`abb1bbb`](https://github.com/LedgerHQ/ledger-live/commit/abb1bbb09c52a3d08577ba622c6cb0f44aab36c1), [`ba5c49b`](https://github.com/LedgerHQ/ledger-live/commit/ba5c49b82af70a2e459720b9cb124546c406b88b)]:
+  - @ledgerhq/types-live@6.46.0-next.0
+  - @ledgerhq/coin-framework@0.12.0-next.0
+  - @ledgerhq/types-cryptoassets@7.11.0-next.0
+  - @ledgerhq/errors@6.16.4-next.0
+  - @ledgerhq/devices@8.3.0-next.0
+  - @ledgerhq/live-network@1.2.1-next.0
+
+## 0.3.11
+
+### Patch Changes
+
+- [#6262](https://github.com/LedgerHQ/ledger-live/pull/6262) [`0dd1546`](https://github.com/LedgerHQ/ledger-live/commit/0dd15467070cbf7fcbb9d9055a4535f6a25b2ad0) Thanks [@JesseKuntz](https://github.com/JesseKuntz)! - Updating the near-api-js library and fetching the NEAR staking positions from the node rather than the kitwallet API.
+
+- Updated dependencies [[`4744c31`](https://github.com/LedgerHQ/ledger-live/commit/4744c3136021f1f47ad1617f2c84f47ac0647370), [`0dd1546`](https://github.com/LedgerHQ/ledger-live/commit/0dd15467070cbf7fcbb9d9055a4535f6a25b2ad0), [`f456d69`](https://github.com/LedgerHQ/ledger-live/commit/f456d69a2f64b6a217d3c1d9c6a531f31c2817a8), [`6de15bc`](https://github.com/LedgerHQ/ledger-live/commit/6de15bc96e8b97a2a6815cf3fb1da874f7044b49), [`9c83695`](https://github.com/LedgerHQ/ledger-live/commit/9c8369580b91d82021d4ec28ad7a49dc4ba42e4f), [`2fd465e`](https://github.com/LedgerHQ/ledger-live/commit/2fd465ee730b11594d231503cfb940b984fa2f5a), [`7fb3eb2`](https://github.com/LedgerHQ/ledger-live/commit/7fb3eb266acdca143c94d2fce74329809ebfbb79), [`dfac39b`](https://github.com/LedgerHQ/ledger-live/commit/dfac39b2086f0475d1bc8065032bfe27cbf424f6), [`b34f5cd`](https://github.com/LedgerHQ/ledger-live/commit/b34f5cdda0b7bf34750d258cc8b1c91304516360), [`d870e90`](https://github.com/LedgerHQ/ledger-live/commit/d870e904a0dde5f8abf05f930f5f545828eccbc9), [`dfac39b`](https://github.com/LedgerHQ/ledger-live/commit/dfac39b2086f0475d1bc8065032bfe27cbf424f6)]:
+  - @ledgerhq/live-env@2.0.0
+  - @ledgerhq/errors@6.16.3
+  - @ledgerhq/types-live@6.45.0
+  - @ledgerhq/coin-framework@0.11.3
+  - @ledgerhq/live-network@1.2.0
+  - @ledgerhq/types-cryptoassets@7.10.0
+  - @ledgerhq/devices@8.2.2
+
+## 0.3.11-next.0
+
+### Patch Changes
+
+- [#6262](https://github.com/LedgerHQ/ledger-live/pull/6262) [`0dd1546`](https://github.com/LedgerHQ/ledger-live/commit/0dd15467070cbf7fcbb9d9055a4535f6a25b2ad0) Thanks [@JesseKuntz](https://github.com/JesseKuntz)! - Updating the near-api-js library and fetching the NEAR staking positions from the node rather than the kitwallet API.
+
+- Updated dependencies [[`4744c31`](https://github.com/LedgerHQ/ledger-live/commit/4744c3136021f1f47ad1617f2c84f47ac0647370), [`0dd1546`](https://github.com/LedgerHQ/ledger-live/commit/0dd15467070cbf7fcbb9d9055a4535f6a25b2ad0), [`f456d69`](https://github.com/LedgerHQ/ledger-live/commit/f456d69a2f64b6a217d3c1d9c6a531f31c2817a8), [`6de15bc`](https://github.com/LedgerHQ/ledger-live/commit/6de15bc96e8b97a2a6815cf3fb1da874f7044b49), [`9c83695`](https://github.com/LedgerHQ/ledger-live/commit/9c8369580b91d82021d4ec28ad7a49dc4ba42e4f), [`2fd465e`](https://github.com/LedgerHQ/ledger-live/commit/2fd465ee730b11594d231503cfb940b984fa2f5a), [`7fb3eb2`](https://github.com/LedgerHQ/ledger-live/commit/7fb3eb266acdca143c94d2fce74329809ebfbb79), [`dfac39b`](https://github.com/LedgerHQ/ledger-live/commit/dfac39b2086f0475d1bc8065032bfe27cbf424f6), [`b34f5cd`](https://github.com/LedgerHQ/ledger-live/commit/b34f5cdda0b7bf34750d258cc8b1c91304516360), [`d870e90`](https://github.com/LedgerHQ/ledger-live/commit/d870e904a0dde5f8abf05f930f5f545828eccbc9), [`dfac39b`](https://github.com/LedgerHQ/ledger-live/commit/dfac39b2086f0475d1bc8065032bfe27cbf424f6)]:
+  - @ledgerhq/live-env@2.0.0-next.0
+  - @ledgerhq/errors@6.16.3-next.0
+  - @ledgerhq/types-live@6.45.0-next.0
+  - @ledgerhq/coin-framework@0.11.3-next.0
+  - @ledgerhq/live-network@1.2.0-next.0
+  - @ledgerhq/types-cryptoassets@7.10.0-next.0
+  - @ledgerhq/devices@8.2.2-next.0
+
+## 0.3.10
+
+### Patch Changes
+
+- [#6279](https://github.com/LedgerHQ/ledger-live/pull/6279) [`3e28615`](https://github.com/LedgerHQ/ledger-live/commit/3e28615a8d5edbec3eff1e93207bf0e9d017666a) Thanks [@hedi-edelbloute](https://github.com/hedi-edelbloute)! - Updating the near-api-js library and fetching the NEAR staking positions from the node rather than the kitwallet API.
+
+- Updated dependencies [[`3e28615`](https://github.com/LedgerHQ/ledger-live/commit/3e28615a8d5edbec3eff1e93207bf0e9d017666a)]:
+  - @ledgerhq/live-env@1.0.1
+  - @ledgerhq/coin-framework@0.11.2
+  - @ledgerhq/live-network@1.1.13
+
+## 0.3.10-hotfix.1
+
+### Patch Changes
+
+- Updated dependencies []:
+  - @ledgerhq/coin-framework@0.11.2-hotfix.1
+
+## 0.3.10-hotfix.0
+
+### Patch Changes
+
+- [#6279](https://github.com/LedgerHQ/ledger-live/pull/6279) [`3e28615`](https://github.com/LedgerHQ/ledger-live/commit/3e28615a8d5edbec3eff1e93207bf0e9d017666a) Thanks [@hedi-edelbloute](https://github.com/hedi-edelbloute)! - Updating the near-api-js library and fetching the NEAR staking positions from the node rather than the kitwallet API.
+
+- Updated dependencies [[`3e28615`](https://github.com/LedgerHQ/ledger-live/commit/3e28615a8d5edbec3eff1e93207bf0e9d017666a)]:
+  - @ledgerhq/live-env@1.0.1-hotfix.0
+  - @ledgerhq/coin-framework@0.11.2-hotfix.0
+  - @ledgerhq/live-network@1.1.13-hotfix.0
+
+## 0.3.9
+
+### Patch Changes
+
+- Updated dependencies [[`c18a0cf`](https://github.com/LedgerHQ/ledger-live/commit/c18a0cfdce5d1e44faf8d8bd5659ebdae38533fa), [`ee88785`](https://github.com/LedgerHQ/ledger-live/commit/ee8878515671241ce1037362af5e8f7799b3673a), [`8d99b81`](https://github.com/LedgerHQ/ledger-live/commit/8d99b81feaf5e8d46e0c26f34bc70b709a7e3c14), [`43eea9e`](https://github.com/LedgerHQ/ledger-live/commit/43eea9e8076f2c9d5aeb0f8a3b0738e97b3152c8), [`1cb83b5`](https://github.com/LedgerHQ/ledger-live/commit/1cb83b5baa4603e22f391609438e349ca0ce9b0e), [`c217a6c`](https://github.com/LedgerHQ/ledger-live/commit/c217a6cfa59218278d25d2d987a06dfb33977cd9)]:
+  - @ledgerhq/live-env@1.0.0
+  - @ledgerhq/errors@6.16.2
+  - @ledgerhq/coin-framework@0.11.1
+  - @ledgerhq/types-live@6.44.1
+  - @ledgerhq/live-network@1.1.12
+  - @ledgerhq/devices@8.2.1
+
+## 0.3.9-next.0
+
+### Patch Changes
+
+- Updated dependencies [[`4744c31`](https://github.com/LedgerHQ/ledger-live/commit/4744c3136021f1f47ad1617f2c84f47ac0647370), [`f456d69`](https://github.com/LedgerHQ/ledger-live/commit/f456d69a2f64b6a217d3c1d9c6a531f31c2817a8), [`9c83695`](https://github.com/LedgerHQ/ledger-live/commit/9c8369580b91d82021d4ec28ad7a49dc4ba42e4f), [`2fd465e`](https://github.com/LedgerHQ/ledger-live/commit/2fd465ee730b11594d231503cfb940b984fa2f5a), [`b34f5cd`](https://github.com/LedgerHQ/ledger-live/commit/b34f5cdda0b7bf34750d258cc8b1c91304516360), [`d870e90`](https://github.com/LedgerHQ/ledger-live/commit/d870e904a0dde5f8abf05f930f5f545828eccbc9)]:
+  - @ledgerhq/live-env@1.0.0-next.0
+  - @ledgerhq/errors@6.16.2-next.0
+  - @ledgerhq/coin-framework@0.11.1-next.0
+  - @ledgerhq/types-live@6.44.1-next.0
+  - @ledgerhq/live-network@1.1.12-next.0
+  - @ledgerhq/devices@8.2.1-next.0
diff --git a/libs/coin-modules/coin-mina/jest.config.js b/libs/coin-modules/coin-mina/jest.config.js
new file mode 100644
index 000000000000..f46ddfd2b0a4
--- /dev/null
+++ b/libs/coin-modules/coin-mina/jest.config.js
@@ -0,0 +1,6 @@
+/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
+module.exports = {
+  preset: "ts-jest",
+  testEnvironment: "node",
+  testPathIgnorePatterns: ["lib/", "lib-es/"],
+};
diff --git a/libs/coin-modules/coin-mina/package.json b/libs/coin-modules/coin-mina/package.json
new file mode 100644
index 000000000000..a89f25c68993
--- /dev/null
+++ b/libs/coin-modules/coin-mina/package.json
@@ -0,0 +1,80 @@
+{
+  "name": "@ledgerhq/coin-mina",
+  "version": "0.0.1",
+  "description": "Mina Coin integration",
+  "keywords": [
+    "Ledger",
+    "LedgerWallet",
+    "mina",
+    "Near",
+    "Hardware Wallet"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/LedgerHQ/ledger-live.git"
+  },
+  "bugs": {
+    "url": "https://github.com/LedgerHQ/ledger-live/issues"
+  },
+  "homepage": "https://github.com/LedgerHQ/ledger-live/tree/develop/libs/coin-modules/coin-mina",
+  "publishConfig": {
+    "access": "public"
+  },
+  "typesVersions": {
+    "*": {
+      "lib/*": [
+        "lib/*"
+      ],
+      "lib-es/*": [
+        "lib-es/*"
+      ],
+      "*": [
+        "lib/*"
+      ]
+    }
+  },
+  "exports": {
+    "./lib/*": "./lib/*.js",
+    "./lib-es/*": "./lib-es/*.js",
+    "./*": {
+      "require": "./lib/*.js",
+      "default": "./lib-es/*.js"
+    },
+    "./package.json": "./package.json"
+  },
+  "license": "Apache-2.0",
+  "dependencies": {
+    "@ledgerhq/coin-framework": "workspace:^",
+    "@ledgerhq/cryptoassets": "workspace:^",
+    "@ledgerhq/devices": "workspace:^",
+    "@ledgerhq/errors": "workspace:^",
+    "@ledgerhq/live-network": "workspace:^",
+    "@ledgerhq/logs": "workspace:^",
+    "@ledgerhq/types-cryptoassets": "workspace:^",
+    "@ledgerhq/types-live": "workspace:^",
+    "bignumber.js": "^9.1.2",
+    "expect": "^27.4.6",
+    "invariant": "^2.2.2",
+    "lodash": "^4.17.21",
+    "mina-ledger-js": "^1.0.6",
+    "rxjs": "^7.8.1"
+  },
+  "devDependencies": {
+    "@types/invariant": "^2.2.2",
+    "@types/jest": "^29.5.10",
+    "@types/lodash": "^4.14.191",
+    "jest": "^29.7.0",
+    "ts-jest": "^29.1.1"
+  },
+  "scripts": {
+    "clean": "rimraf lib lib-es",
+    "build": "tsc && tsc -m ES6 --outDir lib-es",
+    "prewatch": "pnpm build",
+    "watch": "tsc --watch",
+    "doc": "documentation readme src/** --section=API --pe ts --re ts --re d.ts",
+    "lint": "eslint ./src --no-error-on-unmatched-pattern --ext .ts,.tsx --cache",
+    "lint:fix": "pnpm lint --fix",
+    "test": "jest",
+    "unimported": "unimported"
+  }
+}
\ No newline at end of file
diff --git a/libs/coin-modules/coin-mina/src/account.ts b/libs/coin-modules/coin-mina/src/account.ts
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
new file mode 100644
index 000000000000..b576544cf03e
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -0,0 +1,26 @@
+import BigNumber from "bignumber.js";
+import { MinaAPIAccount } from "../types";
+
+export const getAccount = (_address: string): MinaAPIAccount => {
+  return {
+    blockHeight: 0,
+    balance: new BigNumber(0),
+    spendableBalance: new BigNumber(0),
+  };
+};
+
+export const getOperations = (_address: string): any[] => {
+  return [];
+};
+
+export const fetchAccountBalance = (_address: string): BigNumber => {
+  return new BigNumber(0);
+};
+
+export const broadcastTransaction = (_sig: string): string => {
+  return "";
+};
+
+export const getFees = (): BigNumber => {
+  return new BigNumber(0);
+};
diff --git a/libs/coin-modules/coin-mina/src/bridge/js.ts b/libs/coin-modules/coin-mina/src/bridge/js.ts
new file mode 100644
index 000000000000..905c2693fd33
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/bridge/js.ts
@@ -0,0 +1,68 @@
+import type { AccountBridge, CurrencyBridge } from "@ledgerhq/types-live";
+import {
+  makeAccountBridgeReceive,
+  defaultUpdateTransaction,
+  makeScanAccounts,
+} from "@ledgerhq/coin-framework/bridge/jsHelpers";
+import { SignerContext } from "@ledgerhq/coin-framework/signer";
+import getAddressWrapper from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
+import type { Transaction } from "../types";
+import resolver from "../hw-getAddress";
+import { sync, getAccountShape } from "../js-synchronisation";
+import { createTransaction, prepareTransaction } from "../js-transaction";
+import getTransactionStatus from "../js-getTransactionStatus";
+import { buildSignOperation } from "../js-signOperation";
+import broadcast from "../js-broadcast";
+import estimateMaxSpendable from "../js-estimateMaxSpendable";
+import { MinaAddress, MinaSignature, MinaSigner } from "../signer";
+import { MinaCoinConfig, setCoinConfig } from "../config";
+
+export function buildCurrencyBridge(
+  signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
+): CurrencyBridge {
+  const getAddress = resolver(signerContext);
+
+  const scanAccounts = makeScanAccounts({
+    getAccountShape,
+    getAddressFn: getAddress,
+  });
+
+  return {
+    preload: async () => Promise.resolve({}),
+    hydrate: () => {},
+    scanAccounts,
+  };
+}
+
+export function buildAccountBridge(
+  signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
+): AccountBridge<Transaction> {
+  const getAddress = resolver(signerContext);
+
+  const receive = makeAccountBridgeReceive(getAddressWrapper(getAddress));
+  const signOperation = buildSignOperation(signerContext);
+
+  return {
+    estimateMaxSpendable,
+    createTransaction,
+    updateTransaction: defaultUpdateTransaction,
+    getTransactionStatus,
+    prepareTransaction,
+    sync,
+    receive,
+    signOperation,
+    broadcast,
+  };
+}
+
+export function createBridges(
+  signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
+  coinConfig: MinaCoinConfig,
+) {
+  setCoinConfig(coinConfig);
+
+  return {
+    currencyBridge: buildCurrencyBridge(signerContext),
+    accountBridge: buildAccountBridge(signerContext),
+  };
+}
diff --git a/libs/coin-modules/coin-mina/src/config.ts b/libs/coin-modules/coin-mina/src/config.ts
new file mode 100644
index 000000000000..bbaeb2865a99
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/config.ts
@@ -0,0 +1,21 @@
+import { CurrencyConfig } from "@ledgerhq/coin-framework/config";
+
+export type MinaCoinConfig = () => CurrencyConfig & {
+  infra: {
+    API_MINA_ROSETTA_NODE: string;
+  };
+};
+
+let coinConfig: MinaCoinConfig | undefined;
+
+export const setCoinConfig = (config: MinaCoinConfig): void => {
+  coinConfig = config;
+};
+
+export const getCoinConfig = (): ReturnType<MinaCoinConfig> => {
+  if (!coinConfig?.()) {
+    throw new Error("Mina module config not set");
+  }
+
+  return coinConfig();
+};
diff --git a/libs/coin-modules/coin-mina/src/hw-getAddress.ts b/libs/coin-modules/coin-mina/src/hw-getAddress.ts
new file mode 100644
index 000000000000..2fb33f84c284
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/hw-getAddress.ts
@@ -0,0 +1,21 @@
+import { GetAddressFn } from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
+import { SignerContext } from "@ledgerhq/coin-framework/signer";
+import { GetAddressOptions } from "@ledgerhq/coin-framework/derivation";
+import { MinaAddress, MinaSignature, MinaSigner } from "./signer";
+
+const resolver = (
+  signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
+): GetAddressFn => {
+  return async (deviceId: string, { path, verify }: GetAddressOptions) => {
+    const r = (await signerContext(deviceId, signer =>
+      signer.getAddress(path, verify || false),
+    )) as MinaAddress;
+    return {
+      address: r.address,
+      publicKey: r.publicKey,
+      path,
+    };
+  };
+};
+
+export default resolver;
diff --git a/libs/coin-modules/coin-mina/src/js-broadcast.ts b/libs/coin-modules/coin-mina/src/js-broadcast.ts
new file mode 100644
index 000000000000..377013bd2ec6
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/js-broadcast.ts
@@ -0,0 +1,15 @@
+import type { Operation, SignedOperation } from "@ledgerhq/types-live";
+import { patchOperationWithHash } from "@ledgerhq/coin-framework/operation";
+import { broadcastTransaction } from "./api";
+
+const broadcast = async ({
+  signedOperation: { signature, operation },
+}: {
+  signedOperation: SignedOperation;
+}): Promise<Operation> => {
+  const hash = await broadcastTransaction(signature);
+
+  return patchOperationWithHash(operation, hash);
+};
+
+export default broadcast;
diff --git a/libs/coin-modules/coin-mina/src/js-buildTransaction.ts b/libs/coin-modules/coin-mina/src/js-buildTransaction.ts
new file mode 100644
index 000000000000..55eca38af930
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/js-buildTransaction.ts
@@ -0,0 +1,21 @@
+import { log } from "@ledgerhq/logs";
+// import * as minaAPI from "mina-ledger-js";
+import type { Account } from "@ledgerhq/types-live";
+import type { Transaction } from "./types";
+
+export const buildTransaction = async (
+  a: Account,
+  t: Transaction,
+  _publicKey: string,
+): Promise<any> => {
+  try {
+    return {};
+  } catch (e) {
+    log("Mina", "Error building transaction", {
+      error: e,
+      transaction: t,
+      account: a,
+    });
+    throw e;
+  }
+};
diff --git a/libs/coin-modules/coin-mina/src/js-estimateMaxSpendable.ts b/libs/coin-modules/coin-mina/src/js-estimateMaxSpendable.ts
new file mode 100644
index 000000000000..edbbb3b0eb49
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/js-estimateMaxSpendable.ts
@@ -0,0 +1,38 @@
+import { BigNumber } from "bignumber.js";
+import type { AccountLike, Account } from "@ledgerhq/types-live";
+import type { Transaction, MinaAccount } from "./types";
+import { getMainAccount } from "@ledgerhq/coin-framework/account/index";
+import { createTransaction } from "./js-transaction";
+import getEstimatedFees from "./js-getFeesForTransaction";
+import { getMaxAmount } from "./logic";
+
+const estimateMaxSpendable = async ({
+  account,
+  parentAccount,
+  transaction,
+  calculatedFees,
+}: {
+  account: AccountLike;
+  parentAccount?: Account | null;
+  transaction?: Transaction | null;
+  calculatedFees?: BigNumber;
+}): Promise<BigNumber> => {
+  const a = getMainAccount(account, parentAccount) as MinaAccount;
+  const t = {
+    ...createTransaction(),
+    ...transaction,
+    amount: a.spendableBalance,
+  };
+
+  const fees = calculatedFees ?? (await getEstimatedFees(t));
+
+  const maxSpendable = getMaxAmount(a, t, fees);
+
+  if (maxSpendable.lt(0)) {
+    return new BigNumber(0);
+  }
+
+  return maxSpendable;
+};
+
+export default estimateMaxSpendable;
diff --git a/libs/coin-modules/coin-mina/src/js-getFeesForTransaction.ts b/libs/coin-modules/coin-mina/src/js-getFeesForTransaction.ts
new file mode 100644
index 000000000000..d63ebfd2da42
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/js-getFeesForTransaction.ts
@@ -0,0 +1,11 @@
+import { BigNumber } from "bignumber.js";
+import { getFees } from "./api";
+import { Transaction } from "./types";
+
+const getEstimatedFees = async (_transaction: Transaction): Promise<BigNumber> => {
+  const gasPrice = await getFees();
+
+  return gasPrice;
+};
+
+export default getEstimatedFees;
diff --git a/libs/coin-modules/coin-mina/src/js-getTransactionStatus.ts b/libs/coin-modules/coin-mina/src/js-getTransactionStatus.ts
new file mode 100644
index 000000000000..267d437922e2
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/js-getTransactionStatus.ts
@@ -0,0 +1,61 @@
+import { BigNumber } from "bignumber.js";
+import {
+  NotEnoughBalance,
+  RecipientRequired,
+  InvalidAddress,
+  FeeNotLoaded,
+  AmountRequired,
+  InvalidAddressBecauseDestinationIsAlsoSource,
+} from "@ledgerhq/errors";
+import type { Transaction, MinaAccount, TransactionStatus, StatusErrorMap } from "./types";
+import { isValidAddress, getMaxAmount, getTotalSpent } from "./logic";
+// import { fetchAccountBalance } from "./api";
+// import {} from "./constants";
+
+const getTransactionStatus = async (a: MinaAccount, t: Transaction): Promise<TransactionStatus> => {
+  const errors: StatusErrorMap = {};
+  const warnings: StatusErrorMap = {};
+  const useAllAmount = !!t.useAllAmount;
+
+  if (!t.fees) {
+    errors.fees = new FeeNotLoaded();
+  }
+
+  if (!t.recipient) {
+    errors.recipient = new RecipientRequired();
+  }
+
+  if (!isValidAddress(t.recipient)) {
+    errors.recipient = new InvalidAddress();
+  }
+
+  if (t.recipient === a.freshAddress) {
+    errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
+  }
+
+  const estimatedFees = t.fees || new BigNumber(0);
+
+  const maxAmount = getMaxAmount(a, t);
+  const maxAmountWithFees = getMaxAmount(a, t, estimatedFees);
+
+  const totalSpent = getTotalSpent(a, t, estimatedFees);
+  const amount = useAllAmount ? maxAmount : new BigNumber(t.amount);
+
+  if (amount.lte(0) && !t.useAllAmount) {
+    errors.amount = new AmountRequired();
+  }
+
+  if (amount.gt(maxAmountWithFees)) {
+    errors.amount = new NotEnoughBalance();
+  }
+
+  return Promise.resolve({
+    errors,
+    warnings,
+    estimatedFees,
+    amount,
+    totalSpent,
+  });
+};
+
+export default getTransactionStatus;
diff --git a/libs/coin-modules/coin-mina/src/js-signOperation.ts b/libs/coin-modules/coin-mina/src/js-signOperation.ts
new file mode 100644
index 000000000000..412028897bf7
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/js-signOperation.ts
@@ -0,0 +1,112 @@
+import { BigNumber } from "bignumber.js";
+import { Observable } from "rxjs";
+import { FeeNotLoaded } from "@ledgerhq/errors";
+// import * as minaAPI from "mina-ledger-js";
+import type { Transaction } from "./types";
+import type {
+  Operation,
+  Account,
+  SignOperationFnSignature,
+  DeviceId,
+  SignOperationEvent,
+  OperationType,
+} from "@ledgerhq/types-live";
+import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
+import { MinaAddress, MinaSignature, MinaSigner } from "./signer";
+import { SignerContext } from "@ledgerhq/coin-framework/signer";
+// import { buildTransaction } from "./js-buildTransaction";
+
+const buildOptimisticOperation = (
+  account: Account,
+  transaction: Transaction,
+  fee: BigNumber,
+): Operation => {
+  let value = new BigNumber(transaction.amount);
+
+  value = value.plus(fee);
+  const type: OperationType = "OUT";
+
+  const operation: Operation = {
+    id: encodeOperationId(account.id, "", type),
+    hash: "",
+    type,
+    value,
+    fee,
+    blockHash: null,
+    blockHeight: null,
+    senders: [account.freshAddress],
+    recipients: [transaction.recipient].filter(Boolean),
+    accountId: account.id,
+    date: new Date(),
+    extra: {},
+  };
+
+  return operation;
+};
+
+/**
+ * Sign Transaction with Ledger hardware
+ */
+export const buildSignOperation =
+  (
+    _signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
+  ): SignOperationFnSignature<Transaction> =>
+  ({
+    account,
+    transaction,
+  }: {
+    account: Account;
+    transaction: Transaction;
+    deviceId: DeviceId;
+  }): Observable<SignOperationEvent> =>
+    new Observable(o => {
+      async function main() {
+        o.next({ type: "device-signature-requested" });
+
+        if (!transaction.fees) {
+          throw new FeeNotLoaded();
+        }
+
+        // const { publicKey } = (await signerContext(deviceId, signer =>
+        //   signer.getAddress(account.freshAddressPath),
+        // )) as MinaAddress;
+        // const unsigned = await buildTransaction(account, transaction, publicKey);
+
+        // const response = (await signerContext(deviceId, signer =>
+        //   signer.signTransaction(unsigned.encode(), account.freshAddressPath),
+        // )) as MinaSignature;
+
+        // const signedTransaction = new minaAPI.transactions.SignedTransaction({
+        //   transaction: unsigned,
+        //   signature: new minaAPI.transactions.Signature({
+        //     keyType: unsigned.publicKey.keyType,
+        //     data: response,
+        //   }),
+        // });
+
+        o.next({ type: "device-signature-granted" });
+
+        const operation = buildOptimisticOperation(
+          account,
+          transaction,
+          transaction.fees ?? new BigNumber(0),
+        );
+        // const signedSerializedTx = signedTransaction.encode();
+
+        o.next({
+          type: "signed",
+          signedOperation: {
+            operation,
+            // signature: Buffer.from(signedSerializedTx).toString("base64"),
+            signature: "",
+          },
+        });
+      }
+
+      main().then(
+        () => o.complete(),
+        e => o.error(e),
+      );
+    });
+
+export default buildSignOperation;
diff --git a/libs/coin-modules/coin-mina/src/js-synchronisation.ts b/libs/coin-modules/coin-mina/src/js-synchronisation.ts
new file mode 100644
index 000000000000..76e2aa8b8d91
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/js-synchronisation.ts
@@ -0,0 +1,51 @@
+import type { Account } from "@ledgerhq/types-live";
+import { encodeAccountId } from "@ledgerhq/coin-framework/account/accountId";
+import type { GetAccountShape } from "@ledgerhq/coin-framework/bridge/jsHelpers";
+import { makeSync, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
+import { getAccount, getOperations } from "./api";
+
+export const getAccountShape: GetAccountShape = async info => {
+  const { address, initialAccount, currency, derivationMode } = info;
+  const oldOperations = initialAccount?.operations || [];
+
+  const accountId = encodeAccountId({
+    type: "js",
+    version: "2",
+    currencyId: currency.id,
+    xpubOrAddress: address,
+    derivationMode,
+  });
+
+  const { blockHeight, balance, spendableBalance } = await getAccount(address);
+
+  const newOperations = await getOperations(address);
+  const operations = mergeOps(oldOperations, newOperations);
+
+  const shape = {
+    id: accountId,
+    balance,
+    spendableBalance,
+    operationsCount: operations.length,
+    blockHeight,
+  };
+
+  return { ...shape, operations };
+};
+
+const postSync = (initial: Account, synced: Account): Account => {
+  const pendingOperations = initial.pendingOperations || [];
+
+  if (pendingOperations.length === 0) {
+    return synced;
+  }
+
+  const { operations } = synced;
+
+  synced.pendingOperations = pendingOperations.filter(
+    po => !operations.some(o => o.hash === po.hash),
+  );
+
+  return synced;
+};
+
+export const sync = makeSync({ getAccountShape, postSync });
diff --git a/libs/coin-modules/coin-mina/src/js-transaction.ts b/libs/coin-modules/coin-mina/src/js-transaction.ts
new file mode 100644
index 000000000000..60bae3244892
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/js-transaction.ts
@@ -0,0 +1,28 @@
+import { BigNumber } from "bignumber.js";
+import type { Account } from "@ledgerhq/types-live";
+import { defaultUpdateTransaction } from "@ledgerhq/coin-framework/bridge/jsHelpers";
+import type { Transaction } from "./types";
+import getEstimatedFees from "./js-getFeesForTransaction";
+import estimateMaxSpendable from "./js-estimateMaxSpendable";
+
+export const createTransaction = (): Transaction => ({
+  family: "mina",
+  amount: new BigNumber(0),
+  recipient: "",
+  useAllAmount: false,
+  fees: new BigNumber(0),
+});
+
+export const prepareTransaction = async (a: Account, t: Transaction): Promise<Transaction> => {
+  const fees = await getEstimatedFees(t);
+
+  const amount = t.useAllAmount
+    ? await estimateMaxSpendable({
+        account: a,
+        transaction: t,
+        calculatedFees: fees,
+      })
+    : t.amount;
+
+  return defaultUpdateTransaction(t, { fees, amount });
+};
diff --git a/libs/coin-modules/coin-mina/src/logic.ts b/libs/coin-modules/coin-mina/src/logic.ts
new file mode 100644
index 000000000000..ee2a583ab7c6
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/logic.ts
@@ -0,0 +1,50 @@
+import { BigNumber } from "bignumber.js";
+// import { MinaLedgerJS } from "mina-ledger-js";
+import { Transaction, MinaAccount } from "./types";
+// import {} from "./constants";
+
+export const isValidAddress = (address: string): boolean => {
+  const readableAddressRegex = /^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/;
+  const hexAddressRegex = /^[a-f0-9]{64}$/;
+
+  if (isImplicitAccount(address)) {
+    return hexAddressRegex.test(address);
+  }
+
+  return readableAddressRegex.test(address);
+};
+
+export const isImplicitAccount = (address: string): boolean => {
+  return !address.includes(".");
+};
+
+/*
+ * Get the max amount that can be spent, taking into account tx type and pending operations.
+ */
+export const getMaxAmount = (a: MinaAccount, t: Transaction, fees?: BigNumber): BigNumber => {
+  let maxAmount;
+
+  let pendingDefaultAmount = new BigNumber(0);
+
+  a.pendingOperations.forEach(({ value }) => {
+    pendingDefaultAmount = pendingDefaultAmount.plus(value);
+  });
+
+  maxAmount = a.spendableBalance.minus(pendingDefaultAmount);
+  if (fees) {
+    maxAmount = maxAmount.minus(fees);
+  }
+  if (maxAmount === undefined || maxAmount.lt(0)) {
+    return new BigNumber(0);
+  }
+
+  return maxAmount;
+};
+
+export const getTotalSpent = (a: MinaAccount, t: Transaction, fees: BigNumber): BigNumber => {
+  if (t.useAllAmount) {
+    return a.spendableBalance;
+  }
+
+  return new BigNumber(t.amount).plus(fees);
+};
diff --git a/libs/coin-modules/coin-mina/src/signer.ts b/libs/coin-modules/coin-mina/src/signer.ts
new file mode 100644
index 000000000000..aae635b1e8e3
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/signer.ts
@@ -0,0 +1,9 @@
+export type MinaAddress = {
+  publicKey: string;
+  address: string;
+};
+export type MinaSignature = Buffer | undefined;
+export interface MinaSigner {
+  getAddress(path: string, verify?: boolean): Promise<MinaAddress>;
+  signTransaction(transaction: Uint8Array, path: string): Promise<MinaSignature>;
+}
diff --git a/libs/coin-modules/coin-mina/src/transaction.ts b/libs/coin-modules/coin-mina/src/transaction.ts
new file mode 100644
index 000000000000..3826144215a1
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/transaction.ts
@@ -0,0 +1,61 @@
+import type { Transaction, TransactionRaw } from "./types";
+import { formatTransactionStatus } from "@ledgerhq/coin-framework/formatters";
+import {
+  fromTransactionCommonRaw,
+  fromTransactionStatusRawCommon as fromTransactionStatusRaw,
+  toTransactionCommonRaw,
+  toTransactionStatusRawCommon as toTransactionStatusRaw,
+} from "@ledgerhq/coin-framework/serialization";
+import type { Account } from "@ledgerhq/types-live";
+import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index";
+import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index";
+import BigNumber from "bignumber.js";
+
+export const formatTransaction = (
+  { recipient, useAllAmount, amount }: Transaction,
+  account: Account,
+): string => `
+SEND ${
+  useAllAmount
+    ? "MAX"
+    : amount.isZero()
+    ? ""
+    : " " +
+      formatCurrencyUnit(getAccountCurrency(account).units[0], amount, {
+        showCode: true,
+        disableRounding: true,
+      })
+}
+TO ${recipient}`;
+
+export const fromTransactionRaw = (tr: TransactionRaw): Transaction => {
+  const common = fromTransactionCommonRaw(tr);
+  return {
+    ...common,
+    family: tr.family,
+    fees: new BigNumber(tr.fees),
+    amount: new BigNumber(tr.amount),
+    memo: tr.memo,
+  };
+};
+
+const toTransactionRaw = (t: Transaction): TransactionRaw => {
+  const common = toTransactionCommonRaw(t);
+
+  return {
+    ...common,
+    family: t.family,
+    amount: t.amount.toFixed(),
+    fees: t.fees.toString(),
+    memo: t.memo,
+  };
+};
+
+export default {
+  formatTransaction,
+  fromTransactionRaw,
+  toTransactionRaw,
+  fromTransactionStatusRaw,
+  toTransactionStatusRaw,
+  formatTransactionStatus,
+};
diff --git a/libs/coin-modules/coin-mina/src/types.ts b/libs/coin-modules/coin-mina/src/types.ts
new file mode 100644
index 000000000000..3d274acdebd3
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/types.ts
@@ -0,0 +1,41 @@
+import type { BigNumber } from "bignumber.js";
+import {
+  Account,
+  AccountRaw,
+  TransactionCommon,
+  TransactionCommonRaw,
+  TransactionStatusCommon,
+  TransactionStatusCommonRaw,
+} from "@ledgerhq/types-live";
+
+export type Transaction = TransactionCommon & {
+  family: "mina";
+  fees: BigNumber;
+  memo?: string;
+};
+
+export type TransactionRaw = TransactionCommonRaw & {
+  family: "mina";
+  fees: string;
+  memo?: string;
+};
+
+export type MinaAccount = Account;
+
+export type MinaAPIAccount = {
+  blockHeight: number;
+  balance: BigNumber;
+  spendableBalance: BigNumber;
+};
+
+export type MinaAccountRaw = AccountRaw;
+
+export type TransactionStatus = TransactionStatusCommon;
+
+export type TransactionStatusRaw = TransactionStatusCommonRaw;
+
+export type StatusErrorMap = {
+  recipient?: Error;
+  amount?: Error;
+  fees?: Error;
+};
diff --git a/libs/coin-modules/coin-mina/tsconfig.json b/libs/coin-modules/coin-mina/tsconfig.json
new file mode 100644
index 000000000000..cdb8be8ecb97
--- /dev/null
+++ b/libs/coin-modules/coin-mina/tsconfig.json
@@ -0,0 +1,12 @@
+{
+  "extends": "../../../tsconfig.base",
+  "compilerOptions": {
+    "declaration": true,
+    "declarationMap": true,
+    "module": "commonjs",
+    "downlevelIteration": true,
+    "lib": ["es2020", "dom"],
+    "outDir": "lib"
+  },
+  "include": ["src/**/*"]
+}
diff --git a/libs/ledger-live-common/package.json b/libs/ledger-live-common/package.json
index cd26c8aaf5f8..e54fb8192b47 100644
--- a/libs/ledger-live-common/package.json
+++ b/libs/ledger-live-common/package.json
@@ -153,6 +153,7 @@
     "@ledgerhq/coin-tron": "workspace:^",
     "@ledgerhq/coin-vechain": "workspace:^",
     "@ledgerhq/coin-xrp": "workspace:^",
+    "@ledgerhq/coin-mina": "workspace:^",
     "@ledgerhq/crypto-icons-ui": "workspace:^",
     "@ledgerhq/cryptoassets": "workspace:^",
     "@ledgerhq/device-core": "workspace:^",
diff --git a/libs/ledger-live-common/src/__tests__/migration/account-migration.ts b/libs/ledger-live-common/src/__tests__/migration/account-migration.ts
index 2fccc688b39a..37535a7837d1 100644
--- a/libs/ledger-live-common/src/__tests__/migration/account-migration.ts
+++ b/libs/ledger-live-common/src/__tests__/migration/account-migration.ts
@@ -96,6 +96,7 @@ setSupportedCurrencies([
   "filecoin",
   "linea",
   "ton",
+  "mina",
 ]);
 
 LiveConfig.setConfig(liveConfig);
diff --git a/libs/ledger-live-common/src/__tests__/test-helpers/environment.ts b/libs/ledger-live-common/src/__tests__/test-helpers/environment.ts
index 24fba475e146..edcacf9a0b32 100644
--- a/libs/ledger-live-common/src/__tests__/test-helpers/environment.ts
+++ b/libs/ledger-live-common/src/__tests__/test-helpers/environment.ts
@@ -110,6 +110,7 @@ setSupportedCurrencies([
   "zenrock",
   "sonic",
   "sonic_blaze",
+  "mina",
 ]);
 LiveConfig.setConfig(liveConfig);
 
diff --git a/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts b/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
new file mode 100644
index 000000000000..d64a3ecae0f8
--- /dev/null
+++ b/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
@@ -0,0 +1,5 @@
+import "../../__tests__/test-helpers/setup";
+import { testBridge } from "../../__tests__/test-helpers/bridge";
+import { dataset } from "@ledgerhq/coin-near/bridge.integration.test";
+
+testBridge(dataset);
diff --git a/libs/ledger-live-common/src/families/mina/config.ts b/libs/ledger-live-common/src/families/mina/config.ts
new file mode 100644
index 000000000000..4b917eb72568
--- /dev/null
+++ b/libs/ledger-live-common/src/families/mina/config.ts
@@ -0,0 +1,17 @@
+import { CurrencyLiveConfigDefinition } from "../../config";
+
+const minaConfig: CurrencyLiveConfigDefinition = {
+  config_currency_mina: {
+    type: "object",
+    default: {
+      status: { type: "active" },
+      infra: {
+        API_NEAR_PRIVATE_NODE: "https://mina.coin.ledger.com/node",
+        API_NEAR_PUBLIC_NODE: "https://rpc.mainnet.mina.org",
+        API_NEAR_INDEXER: "https://mina.coin.ledger.com/indexer",
+      },
+    },
+  },
+};
+
+export { minaConfig };
diff --git a/libs/ledger-live-common/src/families/mina/constants.ts b/libs/ledger-live-common/src/families/mina/constants.ts
new file mode 100644
index 000000000000..68c2669c0379
--- /dev/null
+++ b/libs/ledger-live-common/src/families/mina/constants.ts
@@ -0,0 +1,2 @@
+// Encapsulate for LLD et LLM
+export * from "@ledgerhq/coin-near/constants";
diff --git a/libs/ledger-live-common/src/families/mina/logic.ts b/libs/ledger-live-common/src/families/mina/logic.ts
new file mode 100644
index 000000000000..ccaf1bd5f6e3
--- /dev/null
+++ b/libs/ledger-live-common/src/families/mina/logic.ts
@@ -0,0 +1,2 @@
+// Encapsulate for LLD et LLM
+export * from "@ledgerhq/coin-near/logic";
diff --git a/libs/ledger-live-common/src/families/mina/react.ts b/libs/ledger-live-common/src/families/mina/react.ts
new file mode 100644
index 000000000000..840baad4ca94
--- /dev/null
+++ b/libs/ledger-live-common/src/families/mina/react.ts
@@ -0,0 +1,97 @@
+import invariant from "invariant";
+import { useMemo } from "react";
+import { BigNumber } from "bignumber.js";
+import { FIGMENT_NEAR_VALIDATOR_ADDRESS } from "@ledgerhq/coin-near/constants";
+import { mapStakingPositions } from "@ledgerhq/coin-near/logic";
+import {
+  NearValidatorItem,
+  Transaction,
+  NearMappedStakingPosition,
+  NearAccount,
+} from "@ledgerhq/coin-near/types";
+import { getCurrentNearPreloadData } from "@ledgerhq/coin-near/preload";
+import { getAccountCurrency } from "../../account";
+
+export function useNearMappedStakingPositions(account: NearAccount): NearMappedStakingPosition[] {
+  const { validators } = getCurrentNearPreloadData();
+  const stakingPositions = account.nearResources?.stakingPositions;
+
+  invariant(stakingPositions, "near: stakingPositions is required");
+
+  const unit = getAccountCurrency(account).units[0];
+
+  return useMemo(() => {
+    const mappedStakingPositions = mapStakingPositions(stakingPositions || [], validators, unit);
+    return mappedStakingPositions;
+  }, [stakingPositions, validators, unit]);
+}
+
+export function useNearStakingPositionsQuerySelector(
+  account: NearAccount,
+  transaction: Transaction,
+): {
+  options: NearMappedStakingPosition[];
+  value: NearMappedStakingPosition | undefined;
+} {
+  const stakingPositions = useNearMappedStakingPositions(account);
+  const options = useMemo<NearMappedStakingPosition[]>(
+    () =>
+      stakingPositions.filter(sp =>
+        transaction.mode === "unstake" ? sp.staked.gt(0) : sp.available.gt(0),
+      ),
+    [stakingPositions, transaction],
+  );
+
+  const selectedValidatorAddress = transaction.recipient;
+
+  const value = useMemo(
+    () => stakingPositions.find(({ validatorId }) => validatorId === selectedValidatorAddress),
+    [stakingPositions, selectedValidatorAddress],
+  );
+
+  return {
+    options,
+    value,
+  };
+}
+
+export function useLedgerFirstShuffledValidatorsNear(search: string) {
+  const { validators: unorderedValidators } = getCurrentNearPreloadData();
+  const validators = reorderValidators(unorderedValidators);
+
+  return useMemo(() => {
+    if (validators.length === 0 || !search || search === "") {
+      return validators;
+    }
+
+    const lowercaseSearch = search.toLowerCase();
+
+    const filtered = validators.filter(
+      validator => validator.validatorAddress?.toLowerCase().includes(lowercaseSearch),
+    );
+
+    return filtered;
+  }, [validators, search]);
+}
+
+function reorderValidators(validators: NearValidatorItem[]): NearValidatorItem[] {
+  const sortedValidators = validators.sort((a, b) =>
+    new BigNumber(b.tokens).minus(new BigNumber(a.tokens)).toNumber(),
+  );
+
+  // move Ledger validator to the first position
+  const ledgerValidator = sortedValidators.find(
+    v => v.validatorAddress === FIGMENT_NEAR_VALIDATOR_ADDRESS,
+  );
+
+  if (ledgerValidator) {
+    const sortedValidatorsLedgerFirst = sortedValidators.filter(
+      v => v.validatorAddress !== FIGMENT_NEAR_VALIDATOR_ADDRESS,
+    );
+    sortedValidatorsLedgerFirst.unshift(ledgerValidator);
+
+    return sortedValidatorsLedgerFirst;
+  }
+
+  return sortedValidators;
+}
diff --git a/libs/ledger-live-common/src/families/mina/setup.ts b/libs/ledger-live-common/src/families/mina/setup.ts
new file mode 100644
index 000000000000..b7b3ca6700bb
--- /dev/null
+++ b/libs/ledger-live-common/src/families/mina/setup.ts
@@ -0,0 +1,30 @@
+// Goal of this file is to inject all necessary device/signer dependency to coin-modules
+
+import { createBridges } from "@ledgerhq/coin-near/bridge/js";
+import makeCliTools from "@ledgerhq/coin-near/cli-transaction";
+import nearResolver from "@ledgerhq/coin-near/hw-getAddress";
+import { Transaction } from "@ledgerhq/coin-near/types";
+import Near from "@ledgerhq/hw-app-near";
+import Transport from "@ledgerhq/hw-transport";
+import type { Bridge } from "@ledgerhq/types-live";
+import { NearSigner } from "@ledgerhq/coin-near/lib/signer";
+import { NearCoinConfig } from "@ledgerhq/coin-near/lib/config";
+import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
+import { CreateSigner, createResolver, executeWithSigner } from "../../bridge/setup";
+import type { Resolver } from "../../hw/getAddress/types";
+import { getCurrencyConfiguration } from "../../config";
+
+const createSigner: CreateSigner<NearSigner> = (transport: Transport) => {
+  return new Near(transport);
+};
+
+const getCoinConfig: NearCoinConfig = () =>
+  getCurrencyConfiguration<ReturnType<NearCoinConfig>>(getCryptoCurrencyById("near"));
+
+const bridge: Bridge<Transaction> = createBridges(executeWithSigner(createSigner), getCoinConfig);
+
+const resolver: Resolver = createResolver(createSigner, nearResolver);
+
+const cliTools = makeCliTools();
+
+export { bridge, cliTools, resolver };
diff --git a/libs/ledger-live-common/src/families/mina/types.ts b/libs/ledger-live-common/src/families/mina/types.ts
new file mode 100644
index 000000000000..fe9312eb8b1f
--- /dev/null
+++ b/libs/ledger-live-common/src/families/mina/types.ts
@@ -0,0 +1,2 @@
+// Encapsulate for LLD et LLM
+export * from "@ledgerhq/coin-near/types";
diff --git a/libs/ledgerjs/packages/cryptoassets/src/currencies.ts b/libs/ledgerjs/packages/cryptoassets/src/currencies.ts
index bfb7bf3a1a52..df77f9e2643b 100644
--- a/libs/ledgerjs/packages/cryptoassets/src/currencies.ts
+++ b/libs/ledgerjs/packages/cryptoassets/src/currencies.ts
@@ -3476,6 +3476,30 @@ export const cryptocurrenciesById: Record<CryptoCurrencyId, CryptoCurrency> = {
       },
     ],
   },
+  mina: {
+    type: "CryptoCurrency",
+    id: "mina",
+    coinType: CoinType.MINA,
+    name: "Mina",
+    managerAppName: "Mina",
+    ticker: "MINA",
+    scheme: "mina",
+    color: "#e1effa",
+    family: "mina",
+    units: [
+      {
+        name: "MINA",
+        code: "MINA",
+        magnitude: 9,
+      },
+    ],
+    explorerViews: [
+      {
+        tx: "https://devnet.minaexplorer.com/transaction/$hash",
+        address: "https://devnet.minaexplorer.com/wallet/$address",
+      },
+    ],
+  },
   injective: {
     type: "CryptoCurrency",
     id: "injective",
diff --git a/libs/ledgerjs/packages/types-cryptoassets/src/index.ts b/libs/ledgerjs/packages/types-cryptoassets/src/index.ts
index 6ee77ca1d12c..12a4c702a2a5 100644
--- a/libs/ledgerjs/packages/types-cryptoassets/src/index.ts
+++ b/libs/ledgerjs/packages/types-cryptoassets/src/index.ts
@@ -174,6 +174,7 @@ export type CryptoCurrencyId =
   | "zenrock"
   | "sonic"
   | "sonic_blaze";
+  | "mina";
 
 export type LedgerExplorerId =
   | "btc"
diff --git a/libs/ledgerjs/packages/types-cryptoassets/src/slip44.ts b/libs/ledgerjs/packages/types-cryptoassets/src/slip44.ts
index 6f3bb9eeabd3..c65bfc960128 100644
--- a/libs/ledgerjs/packages/types-cryptoassets/src/slip44.ts
+++ b/libs/ledgerjs/packages/types-cryptoassets/src/slip44.ts
@@ -55,6 +55,7 @@ export enum CoinType {
   LBRY = 140,
   LITECOIN = 2,
   LISK = 134,
+  MINA = 12586,
   MIX = 76,
   MONERO = 128,
   MUSICOIN = 184,
diff --git a/libs/ledgerjs/packages/types-live/src/derivation.ts b/libs/ledgerjs/packages/types-live/src/derivation.ts
index 1e8509623d1b..4ab9fddc7e8b 100644
--- a/libs/ledgerjs/packages/types-live/src/derivation.ts
+++ b/libs/ledgerjs/packages/types-live/src/derivation.ts
@@ -32,4 +32,5 @@ export type DerivationMode =
   | "stacks_wallet"
   | "icon"
   | "ton"
-  | "aptos";
+  | "aptos"
+  | "mina";

From 93cce066c749645680a7e36bfdbd8c3a5e1bf49e Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Wed, 15 May 2024 17:20:21 +0200
Subject: [PATCH 02/63] feat(mina): add getAddress support

squashed
---
 .../src/live-common-setup.ts                  |  1 +
 apps/web-tools/live-common-setup.ts           |  1 +
 libs/coin-modules/coin-mina/src/account.ts    |  0
 libs/coin-modules/coin-mina/src/bridge/js.ts  | 10 +-
 .../coin-mina/src/cli-transaction.ts          | 43 ++++++++
 .../coin-mina/src/hw-getAddress.ts            | 20 ++--
 .../coin-mina/src/js-signOperation.ts         |  6 +-
 libs/coin-modules/coin-mina/src/logic.test.ts | 18 ++++
 libs/coin-modules/coin-mina/src/logic.ts      | 24 +++++
 libs/coin-modules/coin-mina/src/signer.ts     |  7 +-
 libs/coin-modules/coin-mina/src/types.ts      | 12 +++
 libs/ledger-live-common/package.json          |  1 +
 .../scripts/sync-families-dispatch.mjs        |  3 +
 .../families/mina/bridge.integration.test.ts  |  8 +-
 .../src/families/mina/config.ts               |  4 +-
 .../src/families/mina/constants.ts            |  2 -
 .../src/families/mina/logic.ts                |  3 +-
 .../src/families/mina/react.ts                | 97 -------------------
 .../src/families/mina/setup.ts                | 24 ++---
 .../src/families/mina/types.ts                |  1 -
 .../src/generated/bridge/js.ts                |  6 ++
 .../src/generated/cli-transaction.ts          |  6 ++
 .../src/generated/hw-getAddress.ts            |  6 ++
 .../src/generated/transaction.ts              |  6 ++
 package.json                                  |  1 +
 pnpm-lock.yaml                                |  3 +
 26 files changed, 170 insertions(+), 143 deletions(-)
 delete mode 100644 libs/coin-modules/coin-mina/src/account.ts
 create mode 100644 libs/coin-modules/coin-mina/src/cli-transaction.ts
 create mode 100644 libs/coin-modules/coin-mina/src/logic.test.ts
 delete mode 100644 libs/ledger-live-common/src/families/mina/constants.ts
 delete mode 100644 libs/ledger-live-common/src/families/mina/react.ts

diff --git a/apps/ledger-live-mobile/src/live-common-setup.ts b/apps/ledger-live-mobile/src/live-common-setup.ts
index b871273aaa7e..67f24dc85133 100644
--- a/apps/ledger-live-mobile/src/live-common-setup.ts
+++ b/apps/ledger-live-mobile/src/live-common-setup.ts
@@ -137,6 +137,7 @@ setSupportedCurrencies([
   "zenrock",
   "sonic",
   "sonic_blaze",
+  "mina",
 ]);
 
 if (Config.BLE_LOG_LEVEL) BluetoothTransport.setLogLevel(Config.BLE_LOG_LEVEL);
diff --git a/apps/web-tools/live-common-setup.ts b/apps/web-tools/live-common-setup.ts
index d362e95ec863..621efcde833b 100644
--- a/apps/web-tools/live-common-setup.ts
+++ b/apps/web-tools/live-common-setup.ts
@@ -72,4 +72,5 @@ setSupportedCurrencies([
   "mantra",
   "xion",
   "zenrock",
+  "mina",
 ]);
diff --git a/libs/coin-modules/coin-mina/src/account.ts b/libs/coin-modules/coin-mina/src/account.ts
deleted file mode 100644
index e69de29bb2d1..000000000000
diff --git a/libs/coin-modules/coin-mina/src/bridge/js.ts b/libs/coin-modules/coin-mina/src/bridge/js.ts
index 905c2693fd33..9d4fb1f23dab 100644
--- a/libs/coin-modules/coin-mina/src/bridge/js.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/js.ts
@@ -14,12 +14,10 @@ import getTransactionStatus from "../js-getTransactionStatus";
 import { buildSignOperation } from "../js-signOperation";
 import broadcast from "../js-broadcast";
 import estimateMaxSpendable from "../js-estimateMaxSpendable";
-import { MinaAddress, MinaSignature, MinaSigner } from "../signer";
+import { MinaSigner } from "../signer";
 import { MinaCoinConfig, setCoinConfig } from "../config";
 
-export function buildCurrencyBridge(
-  signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
-): CurrencyBridge {
+export function buildCurrencyBridge(signerContext: SignerContext<MinaSigner>): CurrencyBridge {
   const getAddress = resolver(signerContext);
 
   const scanAccounts = makeScanAccounts({
@@ -35,7 +33,7 @@ export function buildCurrencyBridge(
 }
 
 export function buildAccountBridge(
-  signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
+  signerContext: SignerContext<MinaSigner>,
 ): AccountBridge<Transaction> {
   const getAddress = resolver(signerContext);
 
@@ -56,7 +54,7 @@ export function buildAccountBridge(
 }
 
 export function createBridges(
-  signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
+  signerContext: SignerContext<MinaSigner>,
   coinConfig: MinaCoinConfig,
 ) {
   setCoinConfig(coinConfig);
diff --git a/libs/coin-modules/coin-mina/src/cli-transaction.ts b/libs/coin-modules/coin-mina/src/cli-transaction.ts
new file mode 100644
index 000000000000..0eb9cd47e5e7
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/cli-transaction.ts
@@ -0,0 +1,43 @@
+import type { Account, AccountLike, AccountLikeArray } from "@ledgerhq/types-live";
+import invariant from "invariant";
+import flatMap from "lodash/flatMap";
+import type { Transaction } from "./types";
+
+const options = [
+  {
+    name: "memo",
+    type: String,
+    desc: "set a memo",
+  },
+];
+
+function inferAccounts(account: Account): AccountLikeArray {
+  invariant(account.currency.family === "mina", "mina family");
+  return [account];
+}
+
+function inferTransactions(
+  transactions: Array<{
+    account: AccountLike;
+    transaction: Transaction;
+  }>,
+  opts: Record<string, any>,
+): Transaction[] {
+  return flatMap(transactions, ({ transaction }) => {
+    invariant(transaction.family === "mina", "mina family");
+
+    return {
+      ...transaction,
+      family: "mina",
+      memo: opts.memo,
+    };
+  });
+}
+
+export default function makeCliTools() {
+  return {
+    options,
+    inferAccounts,
+    inferTransactions,
+  };
+}
diff --git a/libs/coin-modules/coin-mina/src/hw-getAddress.ts b/libs/coin-modules/coin-mina/src/hw-getAddress.ts
index 2fb33f84c284..ab51e8944186 100644
--- a/libs/coin-modules/coin-mina/src/hw-getAddress.ts
+++ b/libs/coin-modules/coin-mina/src/hw-getAddress.ts
@@ -1,17 +1,19 @@
 import { GetAddressFn } from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
 import { GetAddressOptions } from "@ledgerhq/coin-framework/derivation";
-import { MinaAddress, MinaSignature, MinaSigner } from "./signer";
+import { MinaAddress, MinaSigner } from "./signer";
+import { getAccountNumFromPath } from "./logic";
+import invariant from "invariant";
+import { log } from "@ledgerhq/logs";
 
-const resolver = (
-  signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
-): GetAddressFn => {
-  return async (deviceId: string, { path, verify }: GetAddressOptions) => {
-    const r = (await signerContext(deviceId, signer =>
-      signer.getAddress(path, verify || false),
-    )) as MinaAddress;
+const resolver = (signerContext: SignerContext<MinaSigner>): GetAddressFn => {
+  return async (deviceId: string, { path }: GetAddressOptions) => {
+    const account = getAccountNumFromPath(path);
+    log("debug", "getAddress, extracted account for path: ", { account, path });
+    invariant(account !== undefined, "Invalid account path, supported: 44'/12586'/<account>'/0/0");
+    const r = (await signerContext(deviceId, signer => signer.getAddress(account))) as MinaAddress;
     return {
-      address: r.address,
+      address: r.publicKey,
       publicKey: r.publicKey,
       path,
     };
diff --git a/libs/coin-modules/coin-mina/src/js-signOperation.ts b/libs/coin-modules/coin-mina/src/js-signOperation.ts
index 412028897bf7..06a1fb35487e 100644
--- a/libs/coin-modules/coin-mina/src/js-signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/js-signOperation.ts
@@ -12,7 +12,7 @@ import type {
   OperationType,
 } from "@ledgerhq/types-live";
 import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
-import { MinaAddress, MinaSignature, MinaSigner } from "./signer";
+import { MinaSigner } from "./signer";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
 // import { buildTransaction } from "./js-buildTransaction";
 
@@ -48,9 +48,7 @@ const buildOptimisticOperation = (
  * Sign Transaction with Ledger hardware
  */
 export const buildSignOperation =
-  (
-    _signerContext: SignerContext<MinaSigner, MinaAddress | MinaSignature>,
-  ): SignOperationFnSignature<Transaction> =>
+  (_signerContext: SignerContext<MinaSigner>): SignOperationFnSignature<Transaction> =>
   ({
     account,
     transaction,
diff --git a/libs/coin-modules/coin-mina/src/logic.test.ts b/libs/coin-modules/coin-mina/src/logic.test.ts
new file mode 100644
index 000000000000..65bb6eb35f1f
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/logic.test.ts
@@ -0,0 +1,18 @@
+import { getAccountNumFromPath } from "./logic";
+
+describe("getAccountNumFromPath", () => {
+  it("should return undefined for invalid account number", () => {
+    const account = getAccountNumFromPath("44'/616'/4'/0/0");
+    expect(account).toBe(undefined);
+  });
+
+  it("should return undefined for unsupported path", () => {
+    const account = getAccountNumFromPath("44'/616'/4/0/0");
+    expect(account).toBe(undefined);
+  });
+
+  it("should return the account number", () => {
+    const account = getAccountNumFromPath("44'/12586'/4'/0/0");
+    expect(account).toBe(4);
+  });
+});
diff --git a/libs/coin-modules/coin-mina/src/logic.ts b/libs/coin-modules/coin-mina/src/logic.ts
index ee2a583ab7c6..8e6c29697fc1 100644
--- a/libs/coin-modules/coin-mina/src/logic.ts
+++ b/libs/coin-modules/coin-mina/src/logic.ts
@@ -1,6 +1,7 @@
 import { BigNumber } from "bignumber.js";
 // import { MinaLedgerJS } from "mina-ledger-js";
 import { Transaction, MinaAccount } from "./types";
+import { CoinType } from "@ledgerhq/types-cryptoassets";
 // import {} from "./constants";
 
 export const isValidAddress = (address: string): boolean => {
@@ -18,6 +19,29 @@ export const isImplicitAccount = (address: string): boolean => {
   return !address.includes(".");
 };
 
+// Get the account number from the path
+export const getAccountNumFromPath = (path: string): number | undefined => {
+  const parts = path.split("'/");
+
+  if (parts.length === 3) {
+    return;
+  }
+
+  if (parts[1] !== `${CoinType.MINA}`) {
+    return;
+  }
+
+  try {
+    const acc = parseInt(parts[2], 10);
+    if (acc >= 0) {
+      return acc;
+    }
+    return;
+  } catch (e) {
+    return;
+  }
+};
+
 /*
  * Get the max amount that can be spent, taking into account tx type and pending operations.
  */
diff --git a/libs/coin-modules/coin-mina/src/signer.ts b/libs/coin-modules/coin-mina/src/signer.ts
index aae635b1e8e3..79f879e738d5 100644
--- a/libs/coin-modules/coin-mina/src/signer.ts
+++ b/libs/coin-modules/coin-mina/src/signer.ts
@@ -1,9 +1,10 @@
+import { SignTransaction } from "./types";
+
 export type MinaAddress = {
   publicKey: string;
-  address: string;
 };
 export type MinaSignature = Buffer | undefined;
 export interface MinaSigner {
-  getAddress(path: string, verify?: boolean): Promise<MinaAddress>;
-  signTransaction(transaction: Uint8Array, path: string): Promise<MinaSignature>;
+  getAddress(account: number): Promise<MinaAddress>;
+  signTransaction(transaction: SignTransaction): Promise<MinaSignature>;
 }
diff --git a/libs/coin-modules/coin-mina/src/types.ts b/libs/coin-modules/coin-mina/src/types.ts
index 3d274acdebd3..dbec27bcdf57 100644
--- a/libs/coin-modules/coin-mina/src/types.ts
+++ b/libs/coin-modules/coin-mina/src/types.ts
@@ -39,3 +39,15 @@ export type StatusErrorMap = {
   amount?: Error;
   fees?: Error;
 };
+
+export type SignTransaction = {
+  txType: string;
+  senderAccount: number;
+  senderAddress: string;
+  receiverAddress: string;
+  amount: number;
+  fee: number;
+  nonce: number;
+  memo: string;
+  networkId: string;
+};
diff --git a/libs/ledger-live-common/package.json b/libs/ledger-live-common/package.json
index e54fb8192b47..bc19bbbbb1b3 100644
--- a/libs/ledger-live-common/package.json
+++ b/libs/ledger-live-common/package.json
@@ -230,6 +230,7 @@
     "jotai": "^2.10.1",
     "json-rpc-2.0": "^0.2.19",
     "lodash": "^4.17.21",
+    "mina-ledger-js": "^1.0.6",
     "minimatch": "^5.1.0",
     "numeral": "^2.0.6",
     "pako": "^2.0.4",
diff --git a/libs/ledger-live-common/scripts/sync-families-dispatch.mjs b/libs/ledger-live-common/scripts/sync-families-dispatch.mjs
index da73dedd30d5..49a65d84e29e 100644
--- a/libs/ledger-live-common/scripts/sync-families-dispatch.mjs
+++ b/libs/ledger-live-common/scripts/sync-families-dispatch.mjs
@@ -43,6 +43,9 @@ const familiesWPackage = [
   "tron",
   "vechain",
   "xrp",
+  "icon",
+  "ton",
+  "mina",
 ];
 
 cd(path.join(__dirname, "..", "src"));
diff --git a/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts b/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
index d64a3ecae0f8..83cec99c9677 100644
--- a/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
+++ b/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
@@ -1,5 +1,5 @@
-import "../../__tests__/test-helpers/setup";
-import { testBridge } from "../../__tests__/test-helpers/bridge";
-import { dataset } from "@ledgerhq/coin-near/bridge.integration.test";
+// import "../../__tests__/test-helpers/setup";
+// import { testBridge } from "../../__tests__/test-helpers/bridge";
+// import { dataset } from "@ledgerhq/coin-mina/bridge.integration.test";
 
-testBridge(dataset);
+// testBridge(dataset);
diff --git a/libs/ledger-live-common/src/families/mina/config.ts b/libs/ledger-live-common/src/families/mina/config.ts
index 4b917eb72568..717a65b2dac8 100644
--- a/libs/ledger-live-common/src/families/mina/config.ts
+++ b/libs/ledger-live-common/src/families/mina/config.ts
@@ -6,9 +6,7 @@ const minaConfig: CurrencyLiveConfigDefinition = {
     default: {
       status: { type: "active" },
       infra: {
-        API_NEAR_PRIVATE_NODE: "https://mina.coin.ledger.com/node",
-        API_NEAR_PUBLIC_NODE: "https://rpc.mainnet.mina.org",
-        API_NEAR_INDEXER: "https://mina.coin.ledger.com/indexer",
+        API_MINA_ROSETTA_NODE: "https://rosetta-devnet.minaprotocol.network",
       },
     },
   },
diff --git a/libs/ledger-live-common/src/families/mina/constants.ts b/libs/ledger-live-common/src/families/mina/constants.ts
deleted file mode 100644
index 68c2669c0379..000000000000
--- a/libs/ledger-live-common/src/families/mina/constants.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-// Encapsulate for LLD et LLM
-export * from "@ledgerhq/coin-near/constants";
diff --git a/libs/ledger-live-common/src/families/mina/logic.ts b/libs/ledger-live-common/src/families/mina/logic.ts
index ccaf1bd5f6e3..a03f1e374ddd 100644
--- a/libs/ledger-live-common/src/families/mina/logic.ts
+++ b/libs/ledger-live-common/src/families/mina/logic.ts
@@ -1,2 +1 @@
-// Encapsulate for LLD et LLM
-export * from "@ledgerhq/coin-near/logic";
+export * from "@ledgerhq/coin-mina/logic";
diff --git a/libs/ledger-live-common/src/families/mina/react.ts b/libs/ledger-live-common/src/families/mina/react.ts
deleted file mode 100644
index 840baad4ca94..000000000000
--- a/libs/ledger-live-common/src/families/mina/react.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-import invariant from "invariant";
-import { useMemo } from "react";
-import { BigNumber } from "bignumber.js";
-import { FIGMENT_NEAR_VALIDATOR_ADDRESS } from "@ledgerhq/coin-near/constants";
-import { mapStakingPositions } from "@ledgerhq/coin-near/logic";
-import {
-  NearValidatorItem,
-  Transaction,
-  NearMappedStakingPosition,
-  NearAccount,
-} from "@ledgerhq/coin-near/types";
-import { getCurrentNearPreloadData } from "@ledgerhq/coin-near/preload";
-import { getAccountCurrency } from "../../account";
-
-export function useNearMappedStakingPositions(account: NearAccount): NearMappedStakingPosition[] {
-  const { validators } = getCurrentNearPreloadData();
-  const stakingPositions = account.nearResources?.stakingPositions;
-
-  invariant(stakingPositions, "near: stakingPositions is required");
-
-  const unit = getAccountCurrency(account).units[0];
-
-  return useMemo(() => {
-    const mappedStakingPositions = mapStakingPositions(stakingPositions || [], validators, unit);
-    return mappedStakingPositions;
-  }, [stakingPositions, validators, unit]);
-}
-
-export function useNearStakingPositionsQuerySelector(
-  account: NearAccount,
-  transaction: Transaction,
-): {
-  options: NearMappedStakingPosition[];
-  value: NearMappedStakingPosition | undefined;
-} {
-  const stakingPositions = useNearMappedStakingPositions(account);
-  const options = useMemo<NearMappedStakingPosition[]>(
-    () =>
-      stakingPositions.filter(sp =>
-        transaction.mode === "unstake" ? sp.staked.gt(0) : sp.available.gt(0),
-      ),
-    [stakingPositions, transaction],
-  );
-
-  const selectedValidatorAddress = transaction.recipient;
-
-  const value = useMemo(
-    () => stakingPositions.find(({ validatorId }) => validatorId === selectedValidatorAddress),
-    [stakingPositions, selectedValidatorAddress],
-  );
-
-  return {
-    options,
-    value,
-  };
-}
-
-export function useLedgerFirstShuffledValidatorsNear(search: string) {
-  const { validators: unorderedValidators } = getCurrentNearPreloadData();
-  const validators = reorderValidators(unorderedValidators);
-
-  return useMemo(() => {
-    if (validators.length === 0 || !search || search === "") {
-      return validators;
-    }
-
-    const lowercaseSearch = search.toLowerCase();
-
-    const filtered = validators.filter(
-      validator => validator.validatorAddress?.toLowerCase().includes(lowercaseSearch),
-    );
-
-    return filtered;
-  }, [validators, search]);
-}
-
-function reorderValidators(validators: NearValidatorItem[]): NearValidatorItem[] {
-  const sortedValidators = validators.sort((a, b) =>
-    new BigNumber(b.tokens).minus(new BigNumber(a.tokens)).toNumber(),
-  );
-
-  // move Ledger validator to the first position
-  const ledgerValidator = sortedValidators.find(
-    v => v.validatorAddress === FIGMENT_NEAR_VALIDATOR_ADDRESS,
-  );
-
-  if (ledgerValidator) {
-    const sortedValidatorsLedgerFirst = sortedValidators.filter(
-      v => v.validatorAddress !== FIGMENT_NEAR_VALIDATOR_ADDRESS,
-    );
-    sortedValidatorsLedgerFirst.unshift(ledgerValidator);
-
-    return sortedValidatorsLedgerFirst;
-  }
-
-  return sortedValidators;
-}
diff --git a/libs/ledger-live-common/src/families/mina/setup.ts b/libs/ledger-live-common/src/families/mina/setup.ts
index b7b3ca6700bb..8561d902ad66 100644
--- a/libs/ledger-live-common/src/families/mina/setup.ts
+++ b/libs/ledger-live-common/src/families/mina/setup.ts
@@ -1,29 +1,29 @@
 // Goal of this file is to inject all necessary device/signer dependency to coin-modules
 
-import { createBridges } from "@ledgerhq/coin-near/bridge/js";
-import makeCliTools from "@ledgerhq/coin-near/cli-transaction";
-import nearResolver from "@ledgerhq/coin-near/hw-getAddress";
-import { Transaction } from "@ledgerhq/coin-near/types";
-import Near from "@ledgerhq/hw-app-near";
+import { createBridges } from "@ledgerhq/coin-mina/bridge/js";
+import makeCliTools from "@ledgerhq/coin-mina/cli-transaction";
+import minaResolver from "@ledgerhq/coin-mina/hw-getAddress";
+import { Transaction } from "@ledgerhq/coin-mina/types";
+import { MinaLedgerJS } from "mina-ledger-js";
 import Transport from "@ledgerhq/hw-transport";
 import type { Bridge } from "@ledgerhq/types-live";
-import { NearSigner } from "@ledgerhq/coin-near/lib/signer";
-import { NearCoinConfig } from "@ledgerhq/coin-near/lib/config";
+import { MinaSigner } from "@ledgerhq/coin-mina/lib/signer";
+import { MinaCoinConfig } from "@ledgerhq/coin-mina/lib/config";
 import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
 import { CreateSigner, createResolver, executeWithSigner } from "../../bridge/setup";
 import type { Resolver } from "../../hw/getAddress/types";
 import { getCurrencyConfiguration } from "../../config";
 
-const createSigner: CreateSigner<NearSigner> = (transport: Transport) => {
-  return new Near(transport);
+const createSigner: CreateSigner<MinaSigner> = (transport: Transport) => {
+  return new MinaLedgerJS(transport);
 };
 
-const getCoinConfig: NearCoinConfig = () =>
-  getCurrencyConfiguration<ReturnType<NearCoinConfig>>(getCryptoCurrencyById("near"));
+const getCoinConfig: MinaCoinConfig = () =>
+  getCurrencyConfiguration<ReturnType<MinaCoinConfig>>(getCryptoCurrencyById("mina"));
 
 const bridge: Bridge<Transaction> = createBridges(executeWithSigner(createSigner), getCoinConfig);
 
-const resolver: Resolver = createResolver(createSigner, nearResolver);
+const resolver: Resolver = createResolver(createSigner, minaResolver);
 
 const cliTools = makeCliTools();
 
diff --git a/libs/ledger-live-common/src/families/mina/types.ts b/libs/ledger-live-common/src/families/mina/types.ts
index fe9312eb8b1f..27d7c45cc92f 100644
--- a/libs/ledger-live-common/src/families/mina/types.ts
+++ b/libs/ledger-live-common/src/families/mina/types.ts
@@ -1,2 +1 @@
-// Encapsulate for LLD et LLM
 export * from "@ledgerhq/coin-near/types";
diff --git a/libs/ledger-live-common/src/generated/bridge/js.ts b/libs/ledger-live-common/src/generated/bridge/js.ts
index b823a6c24ec6..4f21e1fdb1f3 100644
--- a/libs/ledger-live-common/src/generated/bridge/js.ts
+++ b/libs/ledger-live-common/src/generated/bridge/js.ts
@@ -21,6 +21,9 @@ import { bridge as ton } from "../../families/ton/setup";
 import { bridge as tron } from "../../families/tron/setup";
 import { bridge as vechain } from "../../families/vechain/setup";
 import { bridge as xrp } from "../../families/xrp/setup";
+import { bridge as icon } from "../../families/icon/setup";
+import { bridge as ton } from "../../families/ton/setup";
+import { bridge as mina } from "../../families/mina/setup";
 
 export default {
   celo,
@@ -46,4 +49,7 @@ export default {
   tron,
   vechain,
   xrp,
+  icon,
+  ton,
+  mina,
 };
diff --git a/libs/ledger-live-common/src/generated/cli-transaction.ts b/libs/ledger-live-common/src/generated/cli-transaction.ts
index 0eea25c82c93..b74593604a65 100644
--- a/libs/ledger-live-common/src/generated/cli-transaction.ts
+++ b/libs/ledger-live-common/src/generated/cli-transaction.ts
@@ -21,6 +21,9 @@ import { cliTools as ton } from "../families/ton/setup";
 import { cliTools as tron } from "../families/tron/setup";
 import { cliTools as vechain } from "../families/vechain/setup";
 import { cliTools as xrp } from "../families/xrp/setup";
+import { cliTools as icon } from "../families/icon/setup";
+import { cliTools as ton } from "../families/ton/setup";
+import { cliTools as mina } from "../families/mina/setup";
 
 export default {
   celo,
@@ -46,4 +49,7 @@ export default {
   tron,
   vechain,
   xrp,
+  icon,
+  ton,
+  mina,
 };
diff --git a/libs/ledger-live-common/src/generated/hw-getAddress.ts b/libs/ledger-live-common/src/generated/hw-getAddress.ts
index 148b23db5564..2a56ba8a9ccf 100644
--- a/libs/ledger-live-common/src/generated/hw-getAddress.ts
+++ b/libs/ledger-live-common/src/generated/hw-getAddress.ts
@@ -21,6 +21,9 @@ import { resolver as ton } from "../families/ton/setup";
 import { resolver as tron } from "../families/tron/setup";
 import { resolver as vechain } from "../families/vechain/setup";
 import { resolver as xrp } from "../families/xrp/setup";
+import { resolver as icon } from "../families/icon/setup";
+import { resolver as ton } from "../families/ton/setup";
+import { resolver as mina } from "../families/mina/setup";
 
 export default {
   celo,
@@ -46,4 +49,7 @@ export default {
   tron,
   vechain,
   xrp,
+  icon,
+  ton,
+  mina,
 };
diff --git a/libs/ledger-live-common/src/generated/transaction.ts b/libs/ledger-live-common/src/generated/transaction.ts
index e7ab89e96671..63157a620eb2 100644
--- a/libs/ledger-live-common/src/generated/transaction.ts
+++ b/libs/ledger-live-common/src/generated/transaction.ts
@@ -21,6 +21,9 @@ import ton from "@ledgerhq/coin-ton/transaction";
 import tron from "@ledgerhq/coin-tron/transaction";
 import vechain from "@ledgerhq/coin-vechain/transaction";
 import xrp from "@ledgerhq/coin-xrp/transaction";
+import icon from "@ledgerhq/coin-icon/transaction";
+import ton from "@ledgerhq/coin-ton/transaction";
+import mina from "@ledgerhq/coin-mina/transaction";
 
 export default {
   celo,
@@ -46,4 +49,7 @@ export default {
   tron,
   vechain,
   xrp,
+  icon,
+  ton,
+  mina,
 };
diff --git a/package.json b/package.json
index 66bb6cd83f68..6adb79e7033a 100644
--- a/package.json
+++ b/package.json
@@ -78,6 +78,7 @@
     "coin:tester": "pnpm --filter coin-tester",
     "coin:multiversx": "pnpm --filter coin-multiversx",
     "coin:near": "pnpm --filter coin-near",
+    "coin:mina": "pnpm --filter coin-mina",
     "coin:polkadot": "pnpm --filter coin-polkadot",
     "coin:ton": "pnpm --filter coin-ton",
     "coin:solana": "pnpm --filter coin-solana",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 12c1878495c5..501cb1a56f88 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4413,6 +4413,9 @@ importers:
       lodash:
         specifier: ^4.17.21
         version: 4.17.21
+      mina-ledger-js:
+        specifier: ^1.0.6
+        version: 1.0.6
       minimatch:
         specifier: ^5.1.0
         version: 5.1.6

From cbabd04693918ddd3909416623eab9cfef3c8841 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Mon, 10 Jun 2024 01:07:21 +0200
Subject: [PATCH 03/63] feat(mina): add sync

---
 libs/coin-framework/src/derivation.ts         |   3 +-
 libs/coin-modules/coin-mina/src/api/index.ts  |  21 ++--
 .../coin-mina/src/api/rosetta/index.ts        |  43 +++++++
 .../coin-mina/src/api/rosetta/types.ts        |  94 +++++++++++++++
 .../coin-mina/src/api/rosetta/utils.ts        |  19 +++
 libs/coin-modules/coin-mina/src/consts.ts     |  11 ++
 .../coin-mina/src/js-signOperation.ts         |   4 +-
 .../coin-mina/src/js-synchronisation.ts       | 108 +++++++++++++++++-
 libs/coin-modules/coin-mina/src/logic.ts      |   2 -
 .../src/config/sharedConfig.ts                |   2 +
 .../src/families/mina/config.ts               |   2 +-
 11 files changed, 290 insertions(+), 19 deletions(-)
 create mode 100644 libs/coin-modules/coin-mina/src/api/rosetta/index.ts
 create mode 100644 libs/coin-modules/coin-mina/src/api/rosetta/types.ts
 create mode 100644 libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
 create mode 100644 libs/coin-modules/coin-mina/src/consts.ts

diff --git a/libs/coin-framework/src/derivation.ts b/libs/coin-framework/src/derivation.ts
index 33fa92d27859..d9391658e113 100644
--- a/libs/coin-framework/src/derivation.ts
+++ b/libs/coin-framework/src/derivation.ts
@@ -172,7 +172,7 @@ const modes: Readonly<Record<DerivationMode, ModeSpec>> = Object.freeze({
     overridesDerivation: "44'/223'/0'/0/<account>",
   },
   mina: {
-    overridesDerivation: "44'/12586'/0'/0/<account>",
+    overridesDerivation: "44'/12586'/<account>'/0/0",
   },
   stacks_wallet: {
     overridesDerivation: "44'/5757'/0'/0/<account>",
@@ -358,6 +358,7 @@ const seedIdentifierPath: Record<string, SeedPathFn> = {
   cardano: ({ purpose, coinType }) => `${purpose}'/${coinType}'/0'/0/0`,
   cardano_testnet: ({ purpose, coinType }) => `${purpose}'/${coinType}'/0'/0/0`,
   internet_computer: ({ purpose, coinType }) => `${purpose}'/${coinType}'/0'/0/0`,
+  mina: ({ purpose, coinType }) => `${purpose}'/${coinType}'/0'/0/0`,
   near: ({ purpose, coinType }) => `${purpose}'/${coinType}'/0'/0'/0'`,
   vechain: ({ purpose, coinType }) => `${purpose}'/${coinType}'/0'/0/0`,
   ton: ({ purpose, coinType }) => `${purpose}'/${coinType}'/0'/0'/0'/0'`,
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index b576544cf03e..939c19fe7ce8 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -1,20 +1,23 @@
 import BigNumber from "bignumber.js";
 import { MinaAPIAccount } from "../types";
+import { fetchAccountBalance, fetchAccountTransactions, fetchNetworkStatus } from "./rosetta";
+import { RosettaTransaction } from "./rosetta/types";
+
+export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
+  const networkStatus = await fetchNetworkStatus();
+  const balance = await fetchAccountBalance(address);
 
-export const getAccount = (_address: string): MinaAPIAccount => {
   return {
-    blockHeight: 0,
-    balance: new BigNumber(0),
-    spendableBalance: new BigNumber(0),
+    blockHeight: networkStatus.current_block_identifier.index,
+    balance: new BigNumber(balance.balances[0].metadata.total_balance),
+    spendableBalance: new BigNumber(balance.balances[0].metadata.liquid_balance),
   };
 };
 
-export const getOperations = (_address: string): any[] => {
-  return [];
-};
+export const getTransactions = async (address: string): Promise<RosettaTransaction[]> => {
+  const res = await fetchAccountTransactions(address);
 
-export const fetchAccountBalance = (_address: string): BigNumber => {
-  return new BigNumber(0);
+  return res.transactions;
 };
 
 export const broadcastTransaction = (_sig: string): string => {
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
new file mode 100644
index 000000000000..2f16dbb38112
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
@@ -0,0 +1,43 @@
+import network from "@ledgerhq/live-network";
+import {
+  FetchAccountBalanceResponse,
+  FetchAccountTransactionsResponse,
+  FetchNetworkStatusResponse,
+} from "./types";
+import { getCoinConfig } from "../../config";
+import { addNetworkIdentifier, buildAccountIdentifier } from "./utils";
+
+const getRosettaUrl = (route: string): string => {
+  const currencyConfig = getCoinConfig();
+  return `${currencyConfig.infra.API_MINA_ROSETTA_NODE}${route || ""}`;
+};
+
+export const fetchNetworkStatus = async () => {
+  const { data } = await network<FetchNetworkStatusResponse>({
+    method: "POST",
+    url: getRosettaUrl("/network/status"),
+    data: addNetworkIdentifier({}),
+  });
+
+  return data;
+};
+
+export const fetchAccountBalance = async (address: string) => {
+  const { data } = await network<FetchAccountBalanceResponse>({
+    method: "POST",
+    url: getRosettaUrl("/account/balance"),
+    data: addNetworkIdentifier(buildAccountIdentifier(address)),
+  });
+
+  return data;
+};
+
+export const fetchAccountTransactions = async (address: string) => {
+  const { data } = await network<FetchAccountTransactionsResponse>({
+    method: "POST",
+    url: getRosettaUrl("/search/transactions"),
+    data: addNetworkIdentifier(buildAccountIdentifier(address)),
+  });
+
+  return data;
+};
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
new file mode 100644
index 000000000000..d934957a13aa
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
@@ -0,0 +1,94 @@
+export type FetchNetworkStatusResponse = {
+  current_block_identifier: {
+    index: number;
+    hash: string;
+  };
+  current_block_timestamp: number;
+  genesis_block_identifier: {
+    index: number;
+    hash: string;
+  };
+  oldest_block_identifier: {
+    index: number;
+    hash: string;
+  };
+  sync_status: {
+    current_index: number;
+    stage: string;
+    synced: boolean;
+  };
+  peers: Array<{
+    peer_id: string;
+  }>;
+};
+
+export type FetchAccountBalanceResponse = {
+  block_identifier: {
+    index: number;
+    hash: string;
+  };
+  balances: Array<{
+    value: string;
+    currency: {
+      symbol: string;
+      decimals: number;
+    };
+    metadata: {
+      locked_balance: number;
+      liquid_balance: number;
+      total_balance: number;
+    };
+  }>;
+  metadata: {
+    created_via_historical_lookup: boolean;
+    nonce: string;
+  };
+};
+
+export type RosettaTransaction = {
+  block_identifier: {
+    index: number;
+    hash: string;
+  };
+  transaction: {
+    transaction_identifier: {
+      hash: string;
+    };
+    operations: Array<{
+      operation_identifier: {
+        index: number;
+      };
+      type:
+        | "fee_payment"
+        | "payment_source_dec"
+        | "payment_receiver_inc"
+        | "account_creation_fee_via_payment";
+      status: string;
+      account: {
+        address: string;
+        metadata: {
+          token_id: string;
+        };
+      };
+      amount: {
+        value: string;
+        currency: {
+          symbol: string;
+          decimals: number;
+        };
+      };
+      related_operations?: Array<{
+        index: number;
+      }>;
+    }>;
+    related_transactions: Array<any>;
+    metadata?: {
+      memo: string;
+    };
+  };
+};
+
+export type FetchAccountTransactionsResponse = {
+  transactions: RosettaTransaction[];
+  total_count: number;
+};
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts b/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
new file mode 100644
index 000000000000..b269efa6e89d
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
@@ -0,0 +1,19 @@
+import { MINA_TOKEN_ID, TESTNET_NETWORK_IDENTIFIER } from "../../consts";
+
+export const addNetworkIdentifier = (data: any) => {
+  return {
+    ...TESTNET_NETWORK_IDENTIFIER,
+    ...data,
+  };
+};
+
+export const buildAccountIdentifier = (address: string) => {
+  return {
+    account_identifier: {
+      address,
+      metadata: {
+        token_id: MINA_TOKEN_ID,
+      },
+    },
+  };
+};
diff --git a/libs/coin-modules/coin-mina/src/consts.ts b/libs/coin-modules/coin-mina/src/consts.ts
new file mode 100644
index 000000000000..4d22a022c926
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/consts.ts
@@ -0,0 +1,11 @@
+export const TESTNET_NETWORK_IDENTIFIER = {
+  network_identifier: {
+    blockchain: "mina",
+    network: "testnet",
+  },
+};
+
+export const MINA_TOKEN_ID = "wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf";
+export const MINA_DECIMALS = 9;
+export const MINA_SYMBOL = "MINA";
+export const MINA_CURVE_TYPE = "pallas";
diff --git a/libs/coin-modules/coin-mina/src/js-signOperation.ts b/libs/coin-modules/coin-mina/src/js-signOperation.ts
index 06a1fb35487e..982ee81c3b4c 100644
--- a/libs/coin-modules/coin-mina/src/js-signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/js-signOperation.ts
@@ -6,10 +6,10 @@ import type { Transaction } from "./types";
 import type {
   Operation,
   Account,
-  SignOperationFnSignature,
   DeviceId,
   SignOperationEvent,
   OperationType,
+  AccountBridge,
 } from "@ledgerhq/types-live";
 import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
 import { MinaSigner } from "./signer";
@@ -48,7 +48,7 @@ const buildOptimisticOperation = (
  * Sign Transaction with Ledger hardware
  */
 export const buildSignOperation =
-  (_signerContext: SignerContext<MinaSigner>): SignOperationFnSignature<Transaction> =>
+  (_signerContext: SignerContext<MinaSigner>): AccountBridge<Transaction>["signOperation"] =>
   ({
     account,
     transaction,
diff --git a/libs/coin-modules/coin-mina/src/js-synchronisation.ts b/libs/coin-modules/coin-mina/src/js-synchronisation.ts
index 76e2aa8b8d91..ced8421ba2ba 100644
--- a/libs/coin-modules/coin-mina/src/js-synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/js-synchronisation.ts
@@ -1,8 +1,104 @@
-import type { Account } from "@ledgerhq/types-live";
+import type { Account, Operation } from "@ledgerhq/types-live";
 import { encodeAccountId } from "@ledgerhq/coin-framework/account/accountId";
 import type { GetAccountShape } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { makeSync, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
-import { getAccount, getOperations } from "./api";
+import { getAccount, getTransactions } from "./api";
+import { MinaAccount } from "./types";
+import { RosettaTransaction } from "./api/rosetta/types";
+import { encodeOperationId } from "@ledgerhq/coin-framework/lib/operation";
+import BigNumber from "bignumber.js";
+import { log } from "@ledgerhq/logs";
+import invariant from "invariant";
+
+const mapRosettaTxnToOperation = (
+  accountId: string,
+  address: string,
+  txn: RosettaTransaction,
+): Operation[] => {
+  try {
+    const hash = txn.transaction.transaction_identifier.hash;
+    const blockHeight = txn.block_identifier.index;
+    const blockHash = txn.block_identifier.hash;
+    const date = new Date();
+    const memo = txn.transaction.metadata?.memo || "";
+
+    let value = new BigNumber(0);
+    let fee = new BigNumber(0);
+
+    let fromAccount: string = "";
+    let toAccount: string = "";
+    let isSending = false;
+
+    for (const op of txn.transaction.operations) {
+      const opValue = new BigNumber(op.amount.value);
+      switch (op.type) {
+        case "fee_payment": {
+          fee = fee.plus(opValue.times(-1));
+          value = value.plus(fee);
+          continue;
+        }
+        case "payment_receiver_inc": {
+          toAccount = op.account.address;
+          value = value.plus(opValue);
+          continue;
+        }
+        case "payment_source_dec": {
+          fromAccount = op.account.address;
+          if (fromAccount === address) {
+            isSending = true;
+          }
+          continue;
+        }
+        case "account_creation_fee_via_payment": {
+          value = value.plus(opValue.times(-1));
+          continue;
+        }
+      }
+    }
+
+    invariant(fromAccount, "mina: missing fromAccount");
+    invariant(toAccount, "mina: missing toAccount");
+
+    const op: Operation = {
+      id: "",
+      type: "NONE",
+      hash,
+      value,
+      fee,
+      blockHeight,
+      blockHash,
+      accountId,
+      senders: [fromAccount],
+      recipients: [toAccount],
+      date,
+      extra: {
+        memo,
+      },
+    };
+
+    const ops: Operation[] = [];
+    if (isSending) {
+      const type = "OUT";
+      ops.push({
+        ...op,
+        type,
+        id: encodeOperationId(accountId, hash, type),
+      });
+    } else {
+      const type = "IN";
+      ops.push({
+        ...op,
+        type,
+        id: encodeOperationId(accountId, hash, type),
+      });
+    }
+
+    return ops;
+  } catch (e) {
+    log("error", "mina: failed to convert txn to operation", e);
+    return [];
+  }
+};
 
 export const getAccountShape: GetAccountShape = async info => {
   const { address, initialAccount, currency, derivationMode } = info;
@@ -18,10 +114,14 @@ export const getAccountShape: GetAccountShape = async info => {
 
   const { blockHeight, balance, spendableBalance } = await getAccount(address);
 
-  const newOperations = await getOperations(address);
+  const rosettaTxns = await getTransactions(address);
+  const newOperations = rosettaTxns
+    .flatMap(t => mapRosettaTxnToOperation(accountId, address, t))
+    .flat();
+
   const operations = mergeOps(oldOperations, newOperations);
 
-  const shape = {
+  const shape: Partial<MinaAccount> = {
     id: accountId,
     balance,
     spendableBalance,
diff --git a/libs/coin-modules/coin-mina/src/logic.ts b/libs/coin-modules/coin-mina/src/logic.ts
index 8e6c29697fc1..dcaa74155fe6 100644
--- a/libs/coin-modules/coin-mina/src/logic.ts
+++ b/libs/coin-modules/coin-mina/src/logic.ts
@@ -1,8 +1,6 @@
 import { BigNumber } from "bignumber.js";
-// import { MinaLedgerJS } from "mina-ledger-js";
 import { Transaction, MinaAccount } from "./types";
 import { CoinType } from "@ledgerhq/types-cryptoassets";
-// import {} from "./constants";
 
 export const isValidAddress = (address: string): boolean => {
   const readableAddressRegex = /^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/;
diff --git a/libs/ledger-live-common/src/config/sharedConfig.ts b/libs/ledger-live-common/src/config/sharedConfig.ts
index 88158cbec1d9..237894653739 100644
--- a/libs/ledger-live-common/src/config/sharedConfig.ts
+++ b/libs/ledger-live-common/src/config/sharedConfig.ts
@@ -12,6 +12,7 @@ import { fileCoinConfig } from "../families/filecoin/config";
 import { hederaConfig } from "../families/hedera/config";
 import { internetComputerConfig } from "../families/internet_computer/config";
 import { nearConfig } from "../families/near/config";
+import { minaConfig } from "../families/mina/config";
 import { polkadotConfig } from "../families/polkadot/config";
 import { xrpConfig } from "../families/xrp/config";
 import { solanaConfig } from "../families/solana/config";
@@ -53,6 +54,7 @@ export const liveConfig: ConfigSchema = {
   ...hederaConfig,
   ...internetComputerConfig,
   ...nearConfig,
+  ...minaConfig,
   ...polkadotConfig,
   ...xrpConfig,
   ...solanaConfig,
diff --git a/libs/ledger-live-common/src/families/mina/config.ts b/libs/ledger-live-common/src/families/mina/config.ts
index 717a65b2dac8..20dc7eea6291 100644
--- a/libs/ledger-live-common/src/families/mina/config.ts
+++ b/libs/ledger-live-common/src/families/mina/config.ts
@@ -6,7 +6,7 @@ const minaConfig: CurrencyLiveConfigDefinition = {
     default: {
       status: { type: "active" },
       infra: {
-        API_MINA_ROSETTA_NODE: "https://rosetta-devnet.minaprotocol.network",
+        API_MINA_ROSETTA_NODE: "https://mina-rosetta-api.zondax.dev",
       },
     },
   },

From 886d2a657ae5af8c273737cc7eecf4831843e8f7 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Mon, 10 Jun 2024 01:26:09 +0200
Subject: [PATCH 04/63] refac(mina): using new conventions

---
 libs/coin-modules/coin-mina/src/bridge/js.ts  | 13 +++++----
 .../src/{js-broadcast.ts => broadcast.ts}     |  0
 ...uildTransaction.ts => buildTransaction.ts} |  1 -
 .../coin-mina/src/createTransaction.ts        | 14 ++++++++++
 ...axSpendable.ts => estimateMaxSpendable.ts} | 25 ++++++-----------
 ...ransaction.ts => getFeesForTransaction.ts} |  0
 ...ctionStatus.ts => getTransactionStatus.ts} |  7 ++++-
 .../coin-mina/src/js-transaction.ts           | 28 -------------------
 .../coin-mina/src/prepareTransaction.ts       | 21 ++++++++++++++
 .../{js-signOperation.ts => signOperation.ts} |  0
 ...-synchronisation.ts => synchronisation.ts} |  0
 .../coin-modules/coin-mina/src/transaction.ts | 12 ++++----
 12 files changed, 63 insertions(+), 58 deletions(-)
 rename libs/coin-modules/coin-mina/src/{js-broadcast.ts => broadcast.ts} (100%)
 rename libs/coin-modules/coin-mina/src/{js-buildTransaction.ts => buildTransaction.ts} (90%)
 create mode 100644 libs/coin-modules/coin-mina/src/createTransaction.ts
 rename libs/coin-modules/coin-mina/src/{js-estimateMaxSpendable.ts => estimateMaxSpendable.ts} (50%)
 rename libs/coin-modules/coin-mina/src/{js-getFeesForTransaction.ts => getFeesForTransaction.ts} (100%)
 rename libs/coin-modules/coin-mina/src/{js-getTransactionStatus.ts => getTransactionStatus.ts} (86%)
 delete mode 100644 libs/coin-modules/coin-mina/src/js-transaction.ts
 create mode 100644 libs/coin-modules/coin-mina/src/prepareTransaction.ts
 rename libs/coin-modules/coin-mina/src/{js-signOperation.ts => signOperation.ts} (100%)
 rename libs/coin-modules/coin-mina/src/{js-synchronisation.ts => synchronisation.ts} (100%)

diff --git a/libs/coin-modules/coin-mina/src/bridge/js.ts b/libs/coin-modules/coin-mina/src/bridge/js.ts
index 9d4fb1f23dab..7416dbca26ba 100644
--- a/libs/coin-modules/coin-mina/src/bridge/js.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/js.ts
@@ -8,14 +8,15 @@ import { SignerContext } from "@ledgerhq/coin-framework/signer";
 import getAddressWrapper from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
 import type { Transaction } from "../types";
 import resolver from "../hw-getAddress";
-import { sync, getAccountShape } from "../js-synchronisation";
-import { createTransaction, prepareTransaction } from "../js-transaction";
-import getTransactionStatus from "../js-getTransactionStatus";
-import { buildSignOperation } from "../js-signOperation";
-import broadcast from "../js-broadcast";
-import estimateMaxSpendable from "../js-estimateMaxSpendable";
+import { sync, getAccountShape } from "../synchronisation";
 import { MinaSigner } from "../signer";
 import { MinaCoinConfig, setCoinConfig } from "../config";
+import broadcast from "../broadcast";
+import { createTransaction } from "../createTransaction";
+import estimateMaxSpendable from "../estimateMaxSpendable";
+import getTransactionStatus from "../getTransactionStatus";
+import { prepareTransaction } from "../prepareTransaction";
+import buildSignOperation from "../signOperation";
 
 export function buildCurrencyBridge(signerContext: SignerContext<MinaSigner>): CurrencyBridge {
   const getAddress = resolver(signerContext);
diff --git a/libs/coin-modules/coin-mina/src/js-broadcast.ts b/libs/coin-modules/coin-mina/src/broadcast.ts
similarity index 100%
rename from libs/coin-modules/coin-mina/src/js-broadcast.ts
rename to libs/coin-modules/coin-mina/src/broadcast.ts
diff --git a/libs/coin-modules/coin-mina/src/js-buildTransaction.ts b/libs/coin-modules/coin-mina/src/buildTransaction.ts
similarity index 90%
rename from libs/coin-modules/coin-mina/src/js-buildTransaction.ts
rename to libs/coin-modules/coin-mina/src/buildTransaction.ts
index 55eca38af930..2f9d3a3b7768 100644
--- a/libs/coin-modules/coin-mina/src/js-buildTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/buildTransaction.ts
@@ -1,5 +1,4 @@
 import { log } from "@ledgerhq/logs";
-// import * as minaAPI from "mina-ledger-js";
 import type { Account } from "@ledgerhq/types-live";
 import type { Transaction } from "./types";
 
diff --git a/libs/coin-modules/coin-mina/src/createTransaction.ts b/libs/coin-modules/coin-mina/src/createTransaction.ts
new file mode 100644
index 000000000000..e36c26734a13
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/createTransaction.ts
@@ -0,0 +1,14 @@
+import BigNumber from "bignumber.js";
+import { MinaAccount, Transaction } from "./types";
+import { AccountBridge } from "@ledgerhq/types-live";
+
+export const createTransaction: AccountBridge<
+  Transaction,
+  MinaAccount
+>["createTransaction"] = () => ({
+  family: "mina",
+  amount: new BigNumber(0),
+  recipient: "",
+  useAllAmount: false,
+  fees: new BigNumber(0),
+});
diff --git a/libs/coin-modules/coin-mina/src/js-estimateMaxSpendable.ts b/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
similarity index 50%
rename from libs/coin-modules/coin-mina/src/js-estimateMaxSpendable.ts
rename to libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
index edbbb3b0eb49..bd641c609522 100644
--- a/libs/coin-modules/coin-mina/src/js-estimateMaxSpendable.ts
+++ b/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
@@ -1,30 +1,23 @@
 import { BigNumber } from "bignumber.js";
-import type { AccountLike, Account } from "@ledgerhq/types-live";
+import type { AccountBridge } from "@ledgerhq/types-live";
 import type { Transaction, MinaAccount } from "./types";
 import { getMainAccount } from "@ledgerhq/coin-framework/account/index";
-import { createTransaction } from "./js-transaction";
-import getEstimatedFees from "./js-getFeesForTransaction";
 import { getMaxAmount } from "./logic";
+import { createTransaction } from "./createTransaction";
+import getEstimatedFees from "./getFeesForTransaction";
 
-const estimateMaxSpendable = async ({
-  account,
-  parentAccount,
-  transaction,
-  calculatedFees,
-}: {
-  account: AccountLike;
-  parentAccount?: Account | null;
-  transaction?: Transaction | null;
-  calculatedFees?: BigNumber;
-}): Promise<BigNumber> => {
+const estimateMaxSpendable: AccountBridge<
+  Transaction,
+  MinaAccount
+>["estimateMaxSpendable"] = async ({ account, parentAccount, transaction }): Promise<BigNumber> => {
   const a = getMainAccount(account, parentAccount) as MinaAccount;
   const t = {
-    ...createTransaction(),
+    ...createTransaction(account),
     ...transaction,
     amount: a.spendableBalance,
   };
 
-  const fees = calculatedFees ?? (await getEstimatedFees(t));
+  const fees = await getEstimatedFees(t);
 
   const maxSpendable = getMaxAmount(a, t, fees);
 
diff --git a/libs/coin-modules/coin-mina/src/js-getFeesForTransaction.ts b/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
similarity index 100%
rename from libs/coin-modules/coin-mina/src/js-getFeesForTransaction.ts
rename to libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
diff --git a/libs/coin-modules/coin-mina/src/js-getTransactionStatus.ts b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
similarity index 86%
rename from libs/coin-modules/coin-mina/src/js-getTransactionStatus.ts
rename to libs/coin-modules/coin-mina/src/getTransactionStatus.ts
index 267d437922e2..792ed85f91ba 100644
--- a/libs/coin-modules/coin-mina/src/js-getTransactionStatus.ts
+++ b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
@@ -9,10 +9,15 @@ import {
 } from "@ledgerhq/errors";
 import type { Transaction, MinaAccount, TransactionStatus, StatusErrorMap } from "./types";
 import { isValidAddress, getMaxAmount, getTotalSpent } from "./logic";
+import { AccountBridge } from "@ledgerhq/types-live";
 // import { fetchAccountBalance } from "./api";
 // import {} from "./constants";
 
-const getTransactionStatus = async (a: MinaAccount, t: Transaction): Promise<TransactionStatus> => {
+const getTransactionStatus: AccountBridge<
+  Transaction,
+  MinaAccount,
+  TransactionStatus
+>["getTransactionStatus"] = async (a: MinaAccount, t: Transaction): Promise<TransactionStatus> => {
   const errors: StatusErrorMap = {};
   const warnings: StatusErrorMap = {};
   const useAllAmount = !!t.useAllAmount;
diff --git a/libs/coin-modules/coin-mina/src/js-transaction.ts b/libs/coin-modules/coin-mina/src/js-transaction.ts
deleted file mode 100644
index 60bae3244892..000000000000
--- a/libs/coin-modules/coin-mina/src/js-transaction.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { BigNumber } from "bignumber.js";
-import type { Account } from "@ledgerhq/types-live";
-import { defaultUpdateTransaction } from "@ledgerhq/coin-framework/bridge/jsHelpers";
-import type { Transaction } from "./types";
-import getEstimatedFees from "./js-getFeesForTransaction";
-import estimateMaxSpendable from "./js-estimateMaxSpendable";
-
-export const createTransaction = (): Transaction => ({
-  family: "mina",
-  amount: new BigNumber(0),
-  recipient: "",
-  useAllAmount: false,
-  fees: new BigNumber(0),
-});
-
-export const prepareTransaction = async (a: Account, t: Transaction): Promise<Transaction> => {
-  const fees = await getEstimatedFees(t);
-
-  const amount = t.useAllAmount
-    ? await estimateMaxSpendable({
-        account: a,
-        transaction: t,
-        calculatedFees: fees,
-      })
-    : t.amount;
-
-  return defaultUpdateTransaction(t, { fees, amount });
-};
diff --git a/libs/coin-modules/coin-mina/src/prepareTransaction.ts b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
new file mode 100644
index 000000000000..35222ab6d12f
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
@@ -0,0 +1,21 @@
+import { defaultUpdateTransaction } from "@ledgerhq/coin-framework/lib/bridge/jsHelpers";
+import { Account, AccountBridge } from "@ledgerhq/types-live";
+import estimateMaxSpendable from "./estimateMaxSpendable";
+import getEstimatedFees from "./getFeesForTransaction";
+import { MinaAccount, Transaction } from "./types";
+
+export const prepareTransaction: AccountBridge<
+  Transaction,
+  MinaAccount
+>["prepareTransaction"] = async (a: Account, t: Transaction) => {
+  const fees = await getEstimatedFees(t);
+
+  const amount = t.useAllAmount
+    ? await estimateMaxSpendable({
+        account: a,
+        transaction: t,
+      })
+    : t.amount;
+
+  return defaultUpdateTransaction(t, { fees, amount });
+};
diff --git a/libs/coin-modules/coin-mina/src/js-signOperation.ts b/libs/coin-modules/coin-mina/src/signOperation.ts
similarity index 100%
rename from libs/coin-modules/coin-mina/src/js-signOperation.ts
rename to libs/coin-modules/coin-mina/src/signOperation.ts
diff --git a/libs/coin-modules/coin-mina/src/js-synchronisation.ts b/libs/coin-modules/coin-mina/src/synchronisation.ts
similarity index 100%
rename from libs/coin-modules/coin-mina/src/js-synchronisation.ts
rename to libs/coin-modules/coin-mina/src/synchronisation.ts
diff --git a/libs/coin-modules/coin-mina/src/transaction.ts b/libs/coin-modules/coin-mina/src/transaction.ts
index 3826144215a1..4775ca6371e2 100644
--- a/libs/coin-modules/coin-mina/src/transaction.ts
+++ b/libs/coin-modules/coin-mina/src/transaction.ts
@@ -19,12 +19,12 @@ SEND ${
   useAllAmount
     ? "MAX"
     : amount.isZero()
-    ? ""
-    : " " +
-      formatCurrencyUnit(getAccountCurrency(account).units[0], amount, {
-        showCode: true,
-        disableRounding: true,
-      })
+      ? ""
+      : " " +
+        formatCurrencyUnit(getAccountCurrency(account).units[0], amount, {
+          showCode: true,
+          disableRounding: true,
+        })
 }
 TO ${recipient}`;
 

From 4b87802041c239b821edd329d5cd085af19c1637 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Mon, 10 Jun 2024 03:26:05 +0200
Subject: [PATCH 05/63] feat(mina): support send using cli

---
 libs/coin-modules/coin-mina/src/api/index.ts  | 55 +++++++++++++++++--
 .../coin-mina/src/api/rosetta/index.ts        | 39 ++++++++++++-
 .../src/api/rosetta/rosetta.unit.test.ts      | 22 ++++++++
 .../coin-mina/src/api/rosetta/types.ts        | 39 +++++++++++++
 .../coin-mina/src/api/rosetta/utils.ts        | 54 +++++++++++++++++-
 libs/coin-modules/coin-mina/src/broadcast.ts  |  4 +-
 .../coin-mina/src/buildTransaction.ts         | 28 ++++++++--
 libs/coin-modules/coin-mina/src/consts.ts     |  4 ++
 .../coin-mina/src/estimateMaxSpendable.ts     |  2 +-
 .../coin-mina/src/getFeesForTransaction.ts    |  6 +-
 libs/coin-modules/coin-mina/src/logic.ts      | 33 +++++++----
 .../coin-mina/src/prepareTransaction.ts       |  2 +-
 .../coin-mina/src/signOperation.ts            | 41 +++++++-------
 libs/coin-modules/coin-mina/src/signer.ts     |  6 +-
 .../coin-mina/src/synchronisation.ts          |  5 +-
 libs/coin-modules/coin-mina/src/types.ts      | 12 +++-
 16 files changed, 296 insertions(+), 56 deletions(-)
 create mode 100644 libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts

diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index 939c19fe7ce8..4684a038670d 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -1,7 +1,14 @@
 import BigNumber from "bignumber.js";
-import { MinaAPIAccount } from "../types";
-import { fetchAccountBalance, fetchAccountTransactions, fetchNetworkStatus } from "./rosetta";
+import { MinaAPIAccount, MinaSignedTransaction, Transaction } from "../types";
+import {
+  fetchAccountBalance,
+  fetchAccountTransactions,
+  fetchNetworkStatus,
+  fetchTransactionMetadata,
+  rosettaSubmitTransaction,
+} from "./rosetta";
 import { RosettaTransaction } from "./rosetta/types";
+import { MINA_TOKEN_ID } from "../consts";
 
 export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
   const networkStatus = await fetchNetworkStatus();
@@ -20,10 +27,46 @@ export const getTransactions = async (address: string): Promise<RosettaTransacti
   return res.transactions;
 };
 
-export const broadcastTransaction = (_sig: string): string => {
-  return "";
+export const broadcastTransaction = async (txn: MinaSignedTransaction): Promise<string> => {
+  const { nonce, receiverAddress, amount, fee, memo, senderAddress } = txn.transaction;
+  const blob = {
+    signature: txn.signature,
+    payment: {
+      to: receiverAddress,
+      from: senderAddress,
+      fee: fee.toFixed(),
+      token: MINA_TOKEN_ID,
+      nonce: nonce.toFixed(),
+      memo: memo ?? null,
+      amount: amount.toFixed(),
+      valid_until: null,
+    },
+    stake_delegation: null,
+  };
+
+  const { data } = await rosettaSubmitTransaction(JSON.stringify(blob));
+
+  return data.transaction_identifier.hash;
 };
 
-export const getFees = (): BigNumber => {
-  return new BigNumber(0);
+export const getFees = async (txn: Transaction, address: string): Promise<BigNumber> => {
+  const { data } = await fetchTransactionMetadata(
+    address,
+    txn.recipient,
+    txn.fees.toNumber(),
+    txn.amount.toNumber(),
+  );
+
+  return new BigNumber(data.suggested_fee[0].value);
+};
+
+export const getNonce = async (txn: Transaction, address: string): Promise<BigNumber> => {
+  const { data } = await fetchTransactionMetadata(
+    address,
+    txn.recipient,
+    txn.fees.toNumber(),
+    txn.amount.toNumber(),
+  );
+
+  return new BigNumber(data.metadata.nonce);
 };
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
index 2f16dbb38112..74e2b5b9d1a5 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
@@ -3,9 +3,12 @@ import {
   FetchAccountBalanceResponse,
   FetchAccountTransactionsResponse,
   FetchNetworkStatusResponse,
+  RosettaMetadataResponse,
+  RosettaPreprocessResponse,
+  RosettaSubmitResponse,
 } from "./types";
 import { getCoinConfig } from "../../config";
-import { addNetworkIdentifier, buildAccountIdentifier } from "./utils";
+import { addNetworkIdentifier, buildAccountIdentifier, makeTransferPayload } from "./utils";
 
 const getRosettaUrl = (route: string): string => {
   const currencyConfig = getCoinConfig();
@@ -41,3 +44,37 @@ export const fetchAccountTransactions = async (address: string) => {
 
   return data;
 };
+
+const rosettaPreprocess = async (from: string, to: string, feeNano: number, valueNano: number) => {
+  const payload = makeTransferPayload(from, to, feeNano, valueNano);
+  const { data } = await network<RosettaPreprocessResponse>({
+    method: "POST",
+    url: getRosettaUrl("/construction/preprocess"),
+    data: addNetworkIdentifier(payload),
+  });
+
+  return data;
+};
+
+export const fetchTransactionMetadata = async (
+  srcAddress: string,
+  destAddress: string,
+  feeNano: number,
+  valueNano: number,
+) => {
+  const options = await rosettaPreprocess(srcAddress, destAddress, feeNano, valueNano);
+  const payload = makeTransferPayload(srcAddress, destAddress, feeNano, valueNano);
+  return await network<RosettaMetadataResponse>({
+    method: "POST",
+    url: getRosettaUrl("/construction/metadata"),
+    data: addNetworkIdentifier({ ...payload, ...options }),
+  });
+};
+
+export const rosettaSubmitTransaction = async (blob: string) => {
+  return await network<RosettaSubmitResponse>({
+    method: "POST",
+    url: getRosettaUrl("/construction/submit"),
+    data: addNetworkIdentifier({ signed_transaction: blob }),
+  });
+};
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts b/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
new file mode 100644
index 000000000000..84618e416121
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
@@ -0,0 +1,22 @@
+import { fetchTransactionMetadata } from ".";
+import { setCoinConfig } from "../../config";
+
+setCoinConfig((): any => {
+  return {
+    infra: {
+      API_MINA_ROSETTA_NODE: "https://mina-rosetta-api.zondax.dev",
+    },
+  };
+});
+
+test("get metadata for a transactions", async () => {
+  const metadata = await fetchTransactionMetadata(
+    "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+    10000000,
+    10000000,
+  );
+
+  expect(metadata).toBeDefined();
+  expect(metadata.data.suggested_fee).toHaveLength(1);
+});
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
index d934957a13aa..42e6405579fe 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
@@ -92,3 +92,42 @@ export type FetchAccountTransactionsResponse = {
   transactions: RosettaTransaction[];
   total_count: number;
 };
+
+export type RosettaPreprocessResponse = {
+  options: {
+    sender: string;
+    token_id: string;
+    receiver: string;
+  };
+};
+
+export type RosettaMetadataResponse = {
+  metadata: {
+    sender: string;
+    nonce: string;
+    token_id: string;
+    receiver: string;
+  };
+  suggested_fee: Array<{
+    value: string;
+    currency: {
+      symbol: string;
+      decimals: number;
+    };
+    metadata: {
+      minimum_fee: {
+        value: string;
+        currency: {
+          symbol: string;
+          decimals: number;
+        };
+      };
+    };
+  }>;
+};
+
+export type RosettaSubmitResponse = {
+  transaction_identifier: {
+    hash: string;
+  };
+};
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts b/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
index b269efa6e89d..60356dca7244 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
@@ -1,4 +1,9 @@
-import { MINA_TOKEN_ID, TESTNET_NETWORK_IDENTIFIER } from "../../consts";
+import {
+  MINA_DECIMALS,
+  MINA_SYMBOL,
+  MINA_TOKEN_ID,
+  TESTNET_NETWORK_IDENTIFIER,
+} from "../../consts";
 
 export const addNetworkIdentifier = (data: any) => {
   return {
@@ -17,3 +22,50 @@ export const buildAccountIdentifier = (address: string) => {
     },
   };
 };
+
+export function makeTransferPayload(from: string, to: string, feeNano: number, valueNano: number) {
+  function makeOperation(
+    idx: number,
+    relatedIdxs: number[],
+    opType: string,
+    addr: string,
+    value: number,
+    isPositive: boolean,
+  ) {
+    const relatedOps =
+      relatedIdxs.length == 0
+        ? {}
+        : {
+            related_operations: relatedIdxs.map(i => {
+              return { index: i };
+            }),
+          };
+
+    return {
+      operation_identifier: { index: idx },
+      relatedOps,
+      type: opType,
+      account: {
+        address: addr,
+        metadata: {
+          token_id: MINA_TOKEN_ID,
+        },
+      },
+      amount: {
+        value: (isPositive ? "" : "-") + value.toString(),
+        currency: {
+          symbol: MINA_SYMBOL,
+          decimals: MINA_DECIMALS,
+        },
+      },
+    };
+  }
+
+  return {
+    operations: [
+      makeOperation(0, [], "fee_payment", from, feeNano, false),
+      makeOperation(1, [], "payment_source_dec", from, valueNano, false),
+      makeOperation(2, [1], "payment_receiver_inc", to, valueNano, true),
+    ],
+  };
+}
diff --git a/libs/coin-modules/coin-mina/src/broadcast.ts b/libs/coin-modules/coin-mina/src/broadcast.ts
index 377013bd2ec6..ae767c31dd97 100644
--- a/libs/coin-modules/coin-mina/src/broadcast.ts
+++ b/libs/coin-modules/coin-mina/src/broadcast.ts
@@ -1,13 +1,15 @@
 import type { Operation, SignedOperation } from "@ledgerhq/types-live";
 import { patchOperationWithHash } from "@ledgerhq/coin-framework/operation";
 import { broadcastTransaction } from "./api";
+import { MinaSignedTransaction } from "./types";
 
 const broadcast = async ({
   signedOperation: { signature, operation },
 }: {
   signedOperation: SignedOperation;
 }): Promise<Operation> => {
-  const hash = await broadcastTransaction(signature);
+  const signedPayload = JSON.parse(signature) as MinaSignedTransaction;
+  const hash = await broadcastTransaction(signedPayload);
 
   return patchOperationWithHash(operation, hash);
 };
diff --git a/libs/coin-modules/coin-mina/src/buildTransaction.ts b/libs/coin-modules/coin-mina/src/buildTransaction.ts
index 2f9d3a3b7768..479b3563a9d5 100644
--- a/libs/coin-modules/coin-mina/src/buildTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/buildTransaction.ts
@@ -1,16 +1,34 @@
 import { log } from "@ledgerhq/logs";
 import type { Account } from "@ledgerhq/types-live";
-import type { Transaction } from "./types";
+import type { MinaUnsignedTransaction, Transaction } from "./types";
+import { MINA_DEVNET_NETWORK_ID, MINA_PAYMENT_TYPE_ID } from "./consts";
+import { getAccountNumFromPath } from "./logic";
+import { getNonce } from "./api";
+import BigNumber from "bignumber.js";
+import invariant from "invariant";
 
 export const buildTransaction = async (
   a: Account,
   t: Transaction,
-  _publicKey: string,
-): Promise<any> => {
+): Promise<MinaUnsignedTransaction> => {
   try {
-    return {};
+    // log("debug", "mina: build transaction", { account: a, transaction: t });
+    const accountNum = getAccountNumFromPath(a.freshAddressPath);
+    invariant(accountNum !== undefined, "mina: accountNum is required to build transaction");
+    const nonce = await getNonce(t, a.freshAddress);
+    return {
+      txType: MINA_PAYMENT_TYPE_ID,
+      senderAccount: accountNum,
+      senderAddress: a.freshAddress,
+      receiverAddress: t.recipient,
+      amount: t.amount.toNumber(),
+      fee: t.fees.toNumber(),
+      nonce: BigNumber(nonce).toNumber(),
+      memo: t.memo ?? "",
+      networkId: MINA_DEVNET_NETWORK_ID,
+    };
   } catch (e) {
-    log("Mina", "Error building transaction", {
+    log("error", "mina: error building transaction", {
       error: e,
       transaction: t,
       account: a,
diff --git a/libs/coin-modules/coin-mina/src/consts.ts b/libs/coin-modules/coin-mina/src/consts.ts
index 4d22a022c926..e837e74159de 100644
--- a/libs/coin-modules/coin-mina/src/consts.ts
+++ b/libs/coin-modules/coin-mina/src/consts.ts
@@ -1,3 +1,5 @@
+import { WASI } from "wasi";
+
 export const TESTNET_NETWORK_IDENTIFIER = {
   network_identifier: {
     blockchain: "mina",
@@ -5,6 +7,8 @@ export const TESTNET_NETWORK_IDENTIFIER = {
   },
 };
 
+export const MINA_DEVNET_NETWORK_ID = 0;
+export const MINA_PAYMENT_TYPE_ID = 0;
 export const MINA_TOKEN_ID = "wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf";
 export const MINA_DECIMALS = 9;
 export const MINA_SYMBOL = "MINA";
diff --git a/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts b/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
index bd641c609522..b8b66bdc8af4 100644
--- a/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
+++ b/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
@@ -17,7 +17,7 @@ const estimateMaxSpendable: AccountBridge<
     amount: a.spendableBalance,
   };
 
-  const fees = await getEstimatedFees(t);
+  const fees = await getEstimatedFees(t, a.freshAddress);
 
   const maxSpendable = getMaxAmount(a, t, fees);
 
diff --git a/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts b/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
index d63ebfd2da42..10229632dbef 100644
--- a/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
@@ -2,10 +2,10 @@ import { BigNumber } from "bignumber.js";
 import { getFees } from "./api";
 import { Transaction } from "./types";
 
-const getEstimatedFees = async (_transaction: Transaction): Promise<BigNumber> => {
-  const gasPrice = await getFees();
+const getEstimatedFees = async (transaction: Transaction, address: string): Promise<BigNumber> => {
+  const fees = await getFees(transaction, address);
 
-  return gasPrice;
+  return fees;
 };
 
 export default getEstimatedFees;
diff --git a/libs/coin-modules/coin-mina/src/logic.ts b/libs/coin-modules/coin-mina/src/logic.ts
index dcaa74155fe6..e84a3c3522b3 100644
--- a/libs/coin-modules/coin-mina/src/logic.ts
+++ b/libs/coin-modules/coin-mina/src/logic.ts
@@ -2,15 +2,9 @@ import { BigNumber } from "bignumber.js";
 import { Transaction, MinaAccount } from "./types";
 import { CoinType } from "@ledgerhq/types-cryptoassets";
 
-export const isValidAddress = (address: string): boolean => {
-  const readableAddressRegex = /^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/;
-  const hexAddressRegex = /^[a-f0-9]{64}$/;
-
-  if (isImplicitAccount(address)) {
-    return hexAddressRegex.test(address);
-  }
-
-  return readableAddressRegex.test(address);
+export const isValidAddress = (_address: string): boolean => {
+  // TODO add a proper address validation
+  return true;
 };
 
 export const isImplicitAccount = (address: string): boolean => {
@@ -43,7 +37,7 @@ export const getAccountNumFromPath = (path: string): number | undefined => {
 /*
  * Get the max amount that can be spent, taking into account tx type and pending operations.
  */
-export const getMaxAmount = (a: MinaAccount, t: Transaction, fees?: BigNumber): BigNumber => {
+export const getMaxAmount = (a: MinaAccount, _t: Transaction, fees?: BigNumber): BigNumber => {
   let maxAmount;
 
   let pendingDefaultAmount = new BigNumber(0);
@@ -70,3 +64,22 @@ export const getTotalSpent = (a: MinaAccount, t: Transaction, fees: BigNumber):
 
   return new BigNumber(t.amount).plus(fees);
 };
+
+// reEncodeRawSignature takes a raw signature in the form of a 128-character hex string and returns a re-encoded version of it.
+export function reEncodeRawSignature(rawSignature: string) {
+  function shuffleBytes(hex: string) {
+    const bytes = hex.match(/.{2}/g);
+    if (!bytes) {
+      throw "Invalid hex input";
+    }
+    bytes.reverse();
+    return bytes.join("");
+  }
+
+  if (rawSignature.length !== 128) {
+    throw "Invalid raw signature input";
+  }
+  const field = rawSignature.substring(0, 64);
+  const scalar = rawSignature.substring(64);
+  return shuffleBytes(field) + shuffleBytes(scalar);
+}
diff --git a/libs/coin-modules/coin-mina/src/prepareTransaction.ts b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
index 35222ab6d12f..6597b9fccea6 100644
--- a/libs/coin-modules/coin-mina/src/prepareTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
@@ -8,7 +8,7 @@ export const prepareTransaction: AccountBridge<
   Transaction,
   MinaAccount
 >["prepareTransaction"] = async (a: Account, t: Transaction) => {
-  const fees = await getEstimatedFees(t);
+  const fees = await getEstimatedFees(t, a.freshAddress);
 
   const amount = t.useAllAmount
     ? await estimateMaxSpendable({
diff --git a/libs/coin-modules/coin-mina/src/signOperation.ts b/libs/coin-modules/coin-mina/src/signOperation.ts
index 982ee81c3b4c..9060a1b59be9 100644
--- a/libs/coin-modules/coin-mina/src/signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/signOperation.ts
@@ -2,7 +2,7 @@ import { BigNumber } from "bignumber.js";
 import { Observable } from "rxjs";
 import { FeeNotLoaded } from "@ledgerhq/errors";
 // import * as minaAPI from "mina-ledger-js";
-import type { Transaction } from "./types";
+import type { MinaSignedTransaction, Transaction } from "./types";
 import type {
   Operation,
   Account,
@@ -12,8 +12,12 @@ import type {
   AccountBridge,
 } from "@ledgerhq/types-live";
 import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
-import { MinaSigner } from "./signer";
+import { MinaSignature, MinaSigner } from "./signer";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
+import { buildTransaction } from "./buildTransaction";
+import { reEncodeRawSignature } from "./logic";
+import { log } from "@ledgerhq/logs";
+import invariant from "invariant";
 // import { buildTransaction } from "./js-buildTransaction";
 
 const buildOptimisticOperation = (
@@ -48,10 +52,11 @@ const buildOptimisticOperation = (
  * Sign Transaction with Ledger hardware
  */
 export const buildSignOperation =
-  (_signerContext: SignerContext<MinaSigner>): AccountBridge<Transaction>["signOperation"] =>
+  (signerContext: SignerContext<MinaSigner>): AccountBridge<Transaction>["signOperation"] =>
   ({
     account,
     transaction,
+    deviceId,
   }: {
     account: Account;
     transaction: Transaction;
@@ -65,22 +70,19 @@ export const buildSignOperation =
           throw new FeeNotLoaded();
         }
 
-        // const { publicKey } = (await signerContext(deviceId, signer =>
-        //   signer.getAddress(account.freshAddressPath),
-        // )) as MinaAddress;
-        // const unsigned = await buildTransaction(account, transaction, publicKey);
+        const unsigned = await buildTransaction(account, transaction);
 
-        // const response = (await signerContext(deviceId, signer =>
-        //   signer.signTransaction(unsigned.encode(), account.freshAddressPath),
-        // )) as MinaSignature;
+        const { signature } = (await signerContext(deviceId, signer =>
+          signer.signTransaction(unsigned),
+        )) as MinaSignature;
+        // log("debug", "requesting user signature", { signature, unsigned });
+        invariant(signature, "signature should be defined if user accepted");
+        const encodedSignature = reEncodeRawSignature(signature);
 
-        // const signedTransaction = new minaAPI.transactions.SignedTransaction({
-        //   transaction: unsigned,
-        //   signature: new minaAPI.transactions.Signature({
-        //     keyType: unsigned.publicKey.keyType,
-        //     data: response,
-        //   }),
-        // });
+        const signedTransaction: MinaSignedTransaction = {
+          transaction: unsigned,
+          signature: encodedSignature,
+        };
 
         o.next({ type: "device-signature-granted" });
 
@@ -89,14 +91,13 @@ export const buildSignOperation =
           transaction,
           transaction.fees ?? new BigNumber(0),
         );
-        // const signedSerializedTx = signedTransaction.encode();
+        const signedSerializedTx = JSON.stringify(signedTransaction);
 
         o.next({
           type: "signed",
           signedOperation: {
             operation,
-            // signature: Buffer.from(signedSerializedTx).toString("base64"),
-            signature: "",
+            signature: signedSerializedTx,
           },
         });
       }
diff --git a/libs/coin-modules/coin-mina/src/signer.ts b/libs/coin-modules/coin-mina/src/signer.ts
index 79f879e738d5..c288f7362a09 100644
--- a/libs/coin-modules/coin-mina/src/signer.ts
+++ b/libs/coin-modules/coin-mina/src/signer.ts
@@ -1,10 +1,10 @@
-import { SignTransaction } from "./types";
+import { MinaUnsignedTransaction } from "./types";
 
 export type MinaAddress = {
   publicKey: string;
 };
-export type MinaSignature = Buffer | undefined;
+export type MinaSignature = { signature: string; returnCode: string };
 export interface MinaSigner {
   getAddress(account: number): Promise<MinaAddress>;
-  signTransaction(transaction: SignTransaction): Promise<MinaSignature>;
+  signTransaction(transaction: MinaUnsignedTransaction): Promise<MinaSignature>;
 }
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.ts b/libs/coin-modules/coin-mina/src/synchronisation.ts
index ced8421ba2ba..ab70bbb52114 100644
--- a/libs/coin-modules/coin-mina/src/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/synchronisation.ts
@@ -95,7 +95,10 @@ const mapRosettaTxnToOperation = (
 
     return ops;
   } catch (e) {
-    log("error", "mina: failed to convert txn to operation", e);
+    log("error", "mina: failed to convert txn to operation", {
+      error: e,
+      transaction: txn,
+    });
     return [];
   }
 };
diff --git a/libs/coin-modules/coin-mina/src/types.ts b/libs/coin-modules/coin-mina/src/types.ts
index dbec27bcdf57..deddf993cb2f 100644
--- a/libs/coin-modules/coin-mina/src/types.ts
+++ b/libs/coin-modules/coin-mina/src/types.ts
@@ -2,6 +2,7 @@ import type { BigNumber } from "bignumber.js";
 import {
   Account,
   AccountRaw,
+  Operation,
   TransactionCommon,
   TransactionCommonRaw,
   TransactionStatusCommon,
@@ -40,8 +41,8 @@ export type StatusErrorMap = {
   fees?: Error;
 };
 
-export type SignTransaction = {
-  txType: string;
+export type MinaUnsignedTransaction = {
+  txType: number;
   senderAccount: number;
   senderAddress: string;
   receiverAddress: string;
@@ -49,5 +50,10 @@ export type SignTransaction = {
   fee: number;
   nonce: number;
   memo: string;
-  networkId: string;
+  networkId: number;
 };
+
+export interface MinaSignedTransaction {
+  signature: string;
+  transaction: MinaUnsignedTransaction;
+}

From 4ef7fd644e1908452d6eb94d10110cef7e04e35c Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Sun, 30 Jun 2024 18:38:22 +0200
Subject: [PATCH 06/63] feat(mina): add support on lld

---
 .../families/mina/AccountSubHeader.tsx        |  6 +++
 .../src/renderer/families/mina/MemoField.tsx  | 48 +++++++++++++++++++
 .../families/mina/SendAmountFields.tsx        | 46 ++++++++++++++++++
 .../src/renderer/families/mina/index.ts       | 12 +++++
 .../families/mina/operationDetails.tsx        | 31 ++++++++++++
 .../src/renderer/families/mina/types.ts       |  9 ++++
 .../AddAccounts/steps/StepChooseCurrency.tsx  |  3 ++
 .../static/i18n/en/app.json                   |  8 ++++
 libs/coin-modules/coin-mina/package.json      |  2 +-
 libs/coin-modules/coin-mina/src/api/index.ts  |  4 ++
 libs/coin-modules/coin-mina/src/consts.ts     |  4 +-
 .../coin-mina/src/deviceTransactionConfig.ts  | 22 +++++++++
 libs/coin-modules/coin-mina/src/errors.ts     |  6 +++
 .../coin-mina/src/getTransactionStatus.ts     | 10 ++--
 .../coin-mina/src/hw-getAddress.ts            |  1 +
 libs/coin-modules/coin-mina/src/logic.ts      |  5 ++
 .../coin-mina/src/prepareTransaction.ts       |  2 +-
 .../coin-mina/src/signOperation.ts            | 12 ++---
 libs/coin-modules/coin-mina/src/signer.ts     |  6 +--
 .../coin-mina/src/synchronisation.ts          | 12 ++---
 libs/coin-modules/coin-mina/src/types.ts      |  3 ++
 libs/ledger-live-common/package.json          |  2 +-
 .../src/families/mina/config.ts               |  2 +-
 .../src/families/mina/setup.ts                |  2 +-
 .../src/families/mina/types.ts                |  3 +-
 .../src/featureFlags/defaultFeatures.ts       |  1 +
 .../src/generated/deviceTransactionConfig.ts  |  6 +++
 .../ledger-live-common/src/generated/types.ts | 10 ++++
 .../packages/types-live/src/feature.ts        |  1 +
 29 files changed, 253 insertions(+), 26 deletions(-)
 create mode 100644 apps/ledger-live-desktop/src/renderer/families/mina/AccountSubHeader.tsx
 create mode 100644 apps/ledger-live-desktop/src/renderer/families/mina/MemoField.tsx
 create mode 100644 apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
 create mode 100644 apps/ledger-live-desktop/src/renderer/families/mina/index.ts
 create mode 100644 apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
 create mode 100644 apps/ledger-live-desktop/src/renderer/families/mina/types.ts
 create mode 100644 libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts
 create mode 100644 libs/coin-modules/coin-mina/src/errors.ts

diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/AccountSubHeader.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/AccountSubHeader.tsx
new file mode 100644
index 000000000000..9dfa9e7e9843
--- /dev/null
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/AccountSubHeader.tsx
@@ -0,0 +1,6 @@
+import React from "react";
+import AccountSubHeader from "../../components/AccountSubHeader/index";
+
+export default function FilecoinAccountSubHeader() {
+  return <AccountSubHeader family="Mina" team="Zondax"></AccountSubHeader>;
+}
diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/MemoField.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/MemoField.tsx
new file mode 100644
index 000000000000..d981b9af314c
--- /dev/null
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/MemoField.tsx
@@ -0,0 +1,48 @@
+import React, { useCallback } from "react";
+import { getAccountBridge } from "@ledgerhq/live-common/bridge/index";
+import Input from "~/renderer/components/Input";
+import invariant from "invariant";
+import { Account } from "@ledgerhq/types-live";
+import { Transaction, TransactionStatus } from "@ledgerhq/live-common/families/mina/types";
+import { useTranslation } from "react-i18next";
+
+const MemoField = ({
+  onChange,
+  account,
+  transaction,
+  status,
+}: {
+  onChange: (a: Transaction) => void;
+  account: Account;
+  transaction: Transaction;
+  status: TransactionStatus;
+}) => {
+  invariant(transaction.family === "mina", "Memo: Mina family expected");
+
+  const { t } = useTranslation();
+
+  const bridge = getAccountBridge(account);
+
+  const onMemoFieldChange = useCallback(
+    (value: string) => {
+      if (value !== "") onChange(bridge.updateTransaction(transaction, { memo: value }));
+      else onChange(bridge.updateTransaction(transaction, { memo: undefined }));
+    },
+    [onChange, transaction, bridge],
+  );
+
+  // We use transaction as an error here.
+  // on the ledger-live mobile
+  return (
+    <Input
+      warning={status.warnings.transaction}
+      error={status.errors.transaction}
+      value={transaction.memo}
+      placeholder={t("families.mina.memoPlaceholder")}
+      onChange={onMemoFieldChange}
+      spellCheck="false"
+    />
+  );
+};
+
+export default MemoField;
diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
new file mode 100644
index 000000000000..1250c65b3824
--- /dev/null
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
@@ -0,0 +1,46 @@
+import React from "react";
+import { Trans } from "react-i18next";
+import MemoField from "./MemoField";
+import Box from "~/renderer/components/Box";
+import Label from "~/renderer/components/Label";
+import LabelInfoTooltip from "~/renderer/components/LabelInfoTooltip";
+import { Transaction, TransactionStatus } from "@ledgerhq/live-common/families/mina/types";
+import { Account } from "@ledgerhq/types-live";
+
+const Root = (props: {
+  account: Account;
+  transaction: Transaction;
+  status: TransactionStatus;
+  onChange: (a: Transaction) => void;
+  trackProperties?: object;
+}) => {
+  return (
+    <Box flow={1}>
+      <Box
+        horizontal
+        alignItems="center"
+        justifyContent="space-between"
+        style={{ width: "50%", paddingRight: 28 }}
+      >
+        <Label>
+          <LabelInfoTooltip text={<Trans i18nKey="families.mina.memoWarningText" />}>
+            <span>
+              <Trans i18nKey="families.mina.memo" />
+            </span>
+          </LabelInfoTooltip>
+        </Label>
+      </Box>
+      <Box pr={2} pl={2} mb={15} horizontal alignItems="center" justifyContent="space-between">
+        <Box grow={1}>
+          <MemoField {...props} />
+        </Box>
+      </Box>
+    </Box>
+  );
+};
+
+export default {
+  component: Root,
+  // Transaction is used here to prevent user to forward
+  fields: ["memo", "transaction"],
+};
diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/index.ts b/apps/ledger-live-desktop/src/renderer/families/mina/index.ts
new file mode 100644
index 000000000000..d9acdb6bc427
--- /dev/null
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/index.ts
@@ -0,0 +1,12 @@
+import AccountSubHeader from "./AccountSubHeader";
+import sendAmountFields from "./SendAmountFields";
+import operationDetails from "./operationDetails";
+import { MinaFamily } from "./types";
+
+const family: MinaFamily = {
+  AccountSubHeader,
+  operationDetails,
+  sendAmountFields,
+};
+
+export default family;
diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
new file mode 100644
index 000000000000..463f6f983480
--- /dev/null
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
@@ -0,0 +1,31 @@
+import React from "react";
+import { Trans } from "react-i18next";
+import {
+  OpDetailsTitle,
+  OpDetailsData,
+  OpDetailsSection,
+} from "~/renderer/drawers/OperationDetails/styledComponents";
+import Ellipsis from "~/renderer/components/Ellipsis";
+import { MinaOperation } from "@ledgerhq/live-common/families/mina/types";
+
+type OperationDetailsExtraProps = {
+  operation: MinaOperation;
+};
+
+const OperationDetailsExtra = ({ operation }: OperationDetailsExtraProps) => {
+  const { extra } = operation;
+  return !extra.memo ? null : (
+    <OpDetailsSection key={extra.memo}>
+      <OpDetailsTitle>
+        <Trans i18nKey={`operationDetails.extra.memo`} />
+      </OpDetailsTitle>
+      <OpDetailsData>
+        <Ellipsis>{extra.memo}</Ellipsis>
+      </OpDetailsData>
+    </OpDetailsSection>
+  );
+};
+
+export default {
+  OperationDetailsExtra,
+};
diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/types.ts b/apps/ledger-live-desktop/src/renderer/families/mina/types.ts
new file mode 100644
index 000000000000..ebf584b3dd73
--- /dev/null
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/types.ts
@@ -0,0 +1,9 @@
+import {
+  MinaAccount,
+  MinaOperation,
+  Transaction,
+  TransactionStatus,
+} from "@ledgerhq/live-common/families/mina/types";
+import { LLDCoinFamily } from "../types";
+
+export type MinaFamily = LLDCoinFamily<MinaAccount, Transaction, TransactionStatus, MinaOperation>;
diff --git a/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/steps/StepChooseCurrency.tsx b/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/steps/StepChooseCurrency.tsx
index 0d32cad32c49..a7aef0773522 100644
--- a/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/steps/StepChooseCurrency.tsx
+++ b/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/steps/StepChooseCurrency.tsx
@@ -91,6 +91,7 @@ const StepChooseCurrency = ({ currency, setCurrency }: StepProps) => {
   const zenrock = useFeature("currencyZenrock");
   const sonic = useFeature("currencySonic");
   const sonicBlaze = useFeature("currencySonicBlaze");
+  const mina = useFeature("currencyMina");
 
   const featureFlaggedCurrencies = useMemo(
     (): Partial<Record<CryptoCurrencyId, Feature<unknown> | null>> => ({
@@ -150,6 +151,7 @@ const StepChooseCurrency = ({ currency, setCurrency }: StepProps) => {
       zenrock,
       sonic,
       sonic_blaze: sonicBlaze,
+      mina: mina,
     }),
     [
       aptos,
@@ -208,6 +210,7 @@ const StepChooseCurrency = ({ currency, setCurrency }: StepProps) => {
       zenrock,
       sonic,
       sonicBlaze,
+      mina,
     ],
   );
 
diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json
index 48c68a7608e6..c615eeac10ad 100644
--- a/apps/ledger-live-desktop/static/i18n/en/app.json
+++ b/apps/ledger-live-desktop/static/i18n/en/app.json
@@ -5539,6 +5539,11 @@
       "memo": "Tag / Memo",
       "memoPlaceholder": "Optional",
       "requiredMemoPlaceholder": "Required"
+    },
+    "mina": {
+      "memoPlaceholder": "Optional",
+      "memo": "Memo",
+      "memoWarningText": "The value of memo can be a string shorter than or equal to 32 characters"
     }
   },
   "errors": {
@@ -6569,6 +6574,9 @@
         "swap": "Swap",
         "deposit": "Deposit"
       }
+    }, 
+    "InvalidMemoMina": {
+      "title": "Memo text cannot be longer than 32 characters"
     }
   },
   "cryptoOrg": {
diff --git a/libs/coin-modules/coin-mina/package.json b/libs/coin-modules/coin-mina/package.json
index a89f25c68993..6b403b0c4a6c 100644
--- a/libs/coin-modules/coin-mina/package.json
+++ b/libs/coin-modules/coin-mina/package.json
@@ -56,7 +56,7 @@
     "expect": "^27.4.6",
     "invariant": "^2.2.2",
     "lodash": "^4.17.21",
-    "mina-ledger-js": "^1.0.6",
+    "mina-ledger-js": "^1.0.7",
     "rxjs": "^7.8.1"
   },
   "devDependencies": {
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index 4684a038670d..255148b3787a 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -50,6 +50,10 @@ export const broadcastTransaction = async (txn: MinaSignedTransaction): Promise<
 };
 
 export const getFees = async (txn: Transaction, address: string): Promise<BigNumber> => {
+  if (!txn.amount || !txn.recipient) {
+    return txn.fees;
+  }
+
   const { data } = await fetchTransactionMetadata(
     address,
     txn.recipient,
diff --git a/libs/coin-modules/coin-mina/src/consts.ts b/libs/coin-modules/coin-mina/src/consts.ts
index e837e74159de..925c68ade204 100644
--- a/libs/coin-modules/coin-mina/src/consts.ts
+++ b/libs/coin-modules/coin-mina/src/consts.ts
@@ -1,5 +1,3 @@
-import { WASI } from "wasi";
-
 export const TESTNET_NETWORK_IDENTIFIER = {
   network_identifier: {
     blockchain: "mina",
@@ -13,3 +11,5 @@ export const MINA_TOKEN_ID = "wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf
 export const MINA_DECIMALS = 9;
 export const MINA_SYMBOL = "MINA";
 export const MINA_CURVE_TYPE = "pallas";
+
+export const MAX_MEMO_LENGTH = 32;
diff --git a/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts b/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts
new file mode 100644
index 000000000000..b5d8cc516dca
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts
@@ -0,0 +1,22 @@
+import type { Account, AccountLike } from "@ledgerhq/types-live";
+import type { Transaction, TransactionStatus } from "./types";
+import type { CommonDeviceTransactionField as DeviceTransactionField } from "@ledgerhq/coin-framework/transaction/common";
+
+function getDeviceTransactionConfig(input: {
+  account: AccountLike;
+  parentAccount: Account | null | undefined;
+  transaction: Transaction;
+  status: TransactionStatus;
+}): Array<DeviceTransactionField> {
+  const fields: Array<DeviceTransactionField> = [];
+
+  fields.push({
+    type: "text",
+    label: "Memo",
+    value: input.transaction.memo ?? "",
+  });
+
+  return fields;
+}
+
+export default getDeviceTransactionConfig;
diff --git a/libs/coin-modules/coin-mina/src/errors.ts b/libs/coin-modules/coin-mina/src/errors.ts
new file mode 100644
index 000000000000..d35063f5cbbf
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/errors.ts
@@ -0,0 +1,6 @@
+import { createCustomErrorClass } from "@ledgerhq/errors";
+
+/*
+ * When the memo is greater than 32 characters
+ */
+export const InvalidMemoMina = createCustomErrorClass("InvalidMemoMina");
diff --git a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
index 792ed85f91ba..b6932ec03ba0 100644
--- a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
+++ b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
@@ -8,8 +8,9 @@ import {
   InvalidAddressBecauseDestinationIsAlsoSource,
 } from "@ledgerhq/errors";
 import type { Transaction, MinaAccount, TransactionStatus, StatusErrorMap } from "./types";
-import { isValidAddress, getMaxAmount, getTotalSpent } from "./logic";
+import { isValidAddress, isValidMemo, getMaxAmount, getTotalSpent } from "./logic";
 import { AccountBridge } from "@ledgerhq/types-live";
+import { InvalidMemoMina } from "./errors";
 // import { fetchAccountBalance } from "./api";
 // import {} from "./constants";
 
@@ -34,17 +35,20 @@ const getTransactionStatus: AccountBridge<
     errors.recipient = new InvalidAddress();
   }
 
+  if (t.memo && !isValidMemo(t.memo)) {
+    errors.transaction = new InvalidMemoMina();
+  }
+
   if (t.recipient === a.freshAddress) {
     errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
   }
 
   const estimatedFees = t.fees || new BigNumber(0);
 
-  const maxAmount = getMaxAmount(a, t);
   const maxAmountWithFees = getMaxAmount(a, t, estimatedFees);
 
   const totalSpent = getTotalSpent(a, t, estimatedFees);
-  const amount = useAllAmount ? maxAmount : new BigNumber(t.amount);
+  const amount = useAllAmount ? maxAmountWithFees : new BigNumber(t.amount);
 
   if (amount.lte(0) && !t.useAllAmount) {
     errors.amount = new AmountRequired();
diff --git a/libs/coin-modules/coin-mina/src/hw-getAddress.ts b/libs/coin-modules/coin-mina/src/hw-getAddress.ts
index ab51e8944186..8041a1cb6e60 100644
--- a/libs/coin-modules/coin-mina/src/hw-getAddress.ts
+++ b/libs/coin-modules/coin-mina/src/hw-getAddress.ts
@@ -12,6 +12,7 @@ const resolver = (signerContext: SignerContext<MinaSigner>): GetAddressFn => {
     log("debug", "getAddress, extracted account for path: ", { account, path });
     invariant(account !== undefined, "Invalid account path, supported: 44'/12586'/<account>'/0/0");
     const r = (await signerContext(deviceId, signer => signer.getAddress(account))) as MinaAddress;
+    invariant(r.publicKey, "[mina] getAddress: expected publicKey to be defined");
     return {
       address: r.publicKey,
       publicKey: r.publicKey,
diff --git a/libs/coin-modules/coin-mina/src/logic.ts b/libs/coin-modules/coin-mina/src/logic.ts
index e84a3c3522b3..ea7fb18c7e8e 100644
--- a/libs/coin-modules/coin-mina/src/logic.ts
+++ b/libs/coin-modules/coin-mina/src/logic.ts
@@ -1,12 +1,17 @@
 import { BigNumber } from "bignumber.js";
 import { Transaction, MinaAccount } from "./types";
 import { CoinType } from "@ledgerhq/types-cryptoassets";
+import { MAX_MEMO_LENGTH } from "./consts";
 
 export const isValidAddress = (_address: string): boolean => {
   // TODO add a proper address validation
   return true;
 };
 
+export const isValidMemo = (memo: string): boolean => {
+  return memo.length <= MAX_MEMO_LENGTH;
+};
+
 export const isImplicitAccount = (address: string): boolean => {
   return !address.includes(".");
 };
diff --git a/libs/coin-modules/coin-mina/src/prepareTransaction.ts b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
index 6597b9fccea6..2088272469a5 100644
--- a/libs/coin-modules/coin-mina/src/prepareTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
@@ -1,4 +1,4 @@
-import { defaultUpdateTransaction } from "@ledgerhq/coin-framework/lib/bridge/jsHelpers";
+import { defaultUpdateTransaction } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { Account, AccountBridge } from "@ledgerhq/types-live";
 import estimateMaxSpendable from "./estimateMaxSpendable";
 import getEstimatedFees from "./getFeesForTransaction";
diff --git a/libs/coin-modules/coin-mina/src/signOperation.ts b/libs/coin-modules/coin-mina/src/signOperation.ts
index 9060a1b59be9..46d8d9b7bdf9 100644
--- a/libs/coin-modules/coin-mina/src/signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/signOperation.ts
@@ -2,9 +2,8 @@ import { BigNumber } from "bignumber.js";
 import { Observable } from "rxjs";
 import { FeeNotLoaded } from "@ledgerhq/errors";
 // import * as minaAPI from "mina-ledger-js";
-import type { MinaSignedTransaction, Transaction } from "./types";
+import type { MinaOperation, MinaSignedTransaction, Transaction } from "./types";
 import type {
-  Operation,
   Account,
   DeviceId,
   SignOperationEvent,
@@ -16,7 +15,6 @@ import { MinaSignature, MinaSigner } from "./signer";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
 import { buildTransaction } from "./buildTransaction";
 import { reEncodeRawSignature } from "./logic";
-import { log } from "@ledgerhq/logs";
 import invariant from "invariant";
 // import { buildTransaction } from "./js-buildTransaction";
 
@@ -24,13 +22,13 @@ const buildOptimisticOperation = (
   account: Account,
   transaction: Transaction,
   fee: BigNumber,
-): Operation => {
+): MinaOperation => {
   let value = new BigNumber(transaction.amount);
 
   value = value.plus(fee);
   const type: OperationType = "OUT";
 
-  const operation: Operation = {
+  const operation: MinaOperation = {
     id: encodeOperationId(account.id, "", type),
     hash: "",
     type,
@@ -42,7 +40,9 @@ const buildOptimisticOperation = (
     recipients: [transaction.recipient].filter(Boolean),
     accountId: account.id,
     date: new Date(),
-    extra: {},
+    extra: {
+      memo: transaction.memo,
+    },
   };
 
   return operation;
diff --git a/libs/coin-modules/coin-mina/src/signer.ts b/libs/coin-modules/coin-mina/src/signer.ts
index c288f7362a09..418408e2c6af 100644
--- a/libs/coin-modules/coin-mina/src/signer.ts
+++ b/libs/coin-modules/coin-mina/src/signer.ts
@@ -1,10 +1,10 @@
 import { MinaUnsignedTransaction } from "./types";
 
 export type MinaAddress = {
-  publicKey: string;
+  publicKey?: string;
 };
-export type MinaSignature = { signature: string; returnCode: string };
+export type MinaSignature = { signature?: string };
 export interface MinaSigner {
-  getAddress(account: number): Promise<MinaAddress>;
+  getAddress(account?: number): Promise<MinaAddress>;
   signTransaction(transaction: MinaUnsignedTransaction): Promise<MinaSignature>;
 }
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.ts b/libs/coin-modules/coin-mina/src/synchronisation.ts
index ab70bbb52114..ca1f89cfe414 100644
--- a/libs/coin-modules/coin-mina/src/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/synchronisation.ts
@@ -1,11 +1,11 @@
-import type { Account, Operation } from "@ledgerhq/types-live";
+import type { Account } from "@ledgerhq/types-live";
 import { encodeAccountId } from "@ledgerhq/coin-framework/account/accountId";
 import type { GetAccountShape } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { makeSync, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { getAccount, getTransactions } from "./api";
-import { MinaAccount } from "./types";
+import { MinaAccount, MinaOperation } from "./types";
 import { RosettaTransaction } from "./api/rosetta/types";
-import { encodeOperationId } from "@ledgerhq/coin-framework/lib/operation";
+import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
 import BigNumber from "bignumber.js";
 import { log } from "@ledgerhq/logs";
 import invariant from "invariant";
@@ -14,7 +14,7 @@ const mapRosettaTxnToOperation = (
   accountId: string,
   address: string,
   txn: RosettaTransaction,
-): Operation[] => {
+): MinaOperation[] => {
   try {
     const hash = txn.transaction.transaction_identifier.hash;
     const blockHeight = txn.block_identifier.index;
@@ -59,7 +59,7 @@ const mapRosettaTxnToOperation = (
     invariant(fromAccount, "mina: missing fromAccount");
     invariant(toAccount, "mina: missing toAccount");
 
-    const op: Operation = {
+    const op: MinaOperation = {
       id: "",
       type: "NONE",
       hash,
@@ -76,7 +76,7 @@ const mapRosettaTxnToOperation = (
       },
     };
 
-    const ops: Operation[] = [];
+    const ops: MinaOperation[] = [];
     if (isSending) {
       const type = "OUT";
       ops.push({
diff --git a/libs/coin-modules/coin-mina/src/types.ts b/libs/coin-modules/coin-mina/src/types.ts
index deddf993cb2f..c96eb3c76c78 100644
--- a/libs/coin-modules/coin-mina/src/types.ts
+++ b/libs/coin-modules/coin-mina/src/types.ts
@@ -39,6 +39,7 @@ export type StatusErrorMap = {
   recipient?: Error;
   amount?: Error;
   fees?: Error;
+  transaction?: Error;
 };
 
 export type MinaUnsignedTransaction = {
@@ -57,3 +58,5 @@ export interface MinaSignedTransaction {
   signature: string;
   transaction: MinaUnsignedTransaction;
 }
+
+export type MinaOperation = Operation<{ memo?: string }>;
diff --git a/libs/ledger-live-common/package.json b/libs/ledger-live-common/package.json
index bc19bbbbb1b3..00d8adee3bdf 100644
--- a/libs/ledger-live-common/package.json
+++ b/libs/ledger-live-common/package.json
@@ -230,7 +230,7 @@
     "jotai": "^2.10.1",
     "json-rpc-2.0": "^0.2.19",
     "lodash": "^4.17.21",
-    "mina-ledger-js": "^1.0.6",
+    "mina-ledger-js": "^1.0.7",
     "minimatch": "^5.1.0",
     "numeral": "^2.0.6",
     "pako": "^2.0.4",
diff --git a/libs/ledger-live-common/src/families/mina/config.ts b/libs/ledger-live-common/src/families/mina/config.ts
index 20dc7eea6291..3739bc15c5d1 100644
--- a/libs/ledger-live-common/src/families/mina/config.ts
+++ b/libs/ledger-live-common/src/families/mina/config.ts
@@ -6,7 +6,7 @@ const minaConfig: CurrencyLiveConfigDefinition = {
     default: {
       status: { type: "active" },
       infra: {
-        API_MINA_ROSETTA_NODE: "https://mina-rosetta-api.zondax.dev",
+        API_MINA_ROSETTA_NODE: "https://mina-rosetta-api-devnet.zondax.dev",
       },
     },
   },
diff --git a/libs/ledger-live-common/src/families/mina/setup.ts b/libs/ledger-live-common/src/families/mina/setup.ts
index 8561d902ad66..967d9049ffa6 100644
--- a/libs/ledger-live-common/src/families/mina/setup.ts
+++ b/libs/ledger-live-common/src/families/mina/setup.ts
@@ -15,7 +15,7 @@ import type { Resolver } from "../../hw/getAddress/types";
 import { getCurrencyConfiguration } from "../../config";
 
 const createSigner: CreateSigner<MinaSigner> = (transport: Transport) => {
-  return new MinaLedgerJS(transport);
+  return new MinaLedgerJS(transport as any);
 };
 
 const getCoinConfig: MinaCoinConfig = () =>
diff --git a/libs/ledger-live-common/src/families/mina/types.ts b/libs/ledger-live-common/src/families/mina/types.ts
index 27d7c45cc92f..913aa28def59 100644
--- a/libs/ledger-live-common/src/families/mina/types.ts
+++ b/libs/ledger-live-common/src/families/mina/types.ts
@@ -1 +1,2 @@
-export * from "@ledgerhq/coin-near/types";
+// Encapsulate for LLD and LLM
+export * from "@ledgerhq/coin-mina/types";
diff --git a/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts b/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts
index 977e43d0e72e..e300b6785ddd 100644
--- a/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts
+++ b/libs/ledger-live-common/src/featureFlags/defaultFeatures.ts
@@ -89,6 +89,7 @@ export const CURRENCY_DEFAULT_FEATURES = {
   currencyZenrock: DEFAULT_FEATURE,
   currencySonicBlaze: DEFAULT_FEATURE,
   currencySonic: DEFAULT_FEATURE,
+  currencyMina: DEFAULT_FEATURE,
 };
 
 /**
diff --git a/libs/ledger-live-common/src/generated/deviceTransactionConfig.ts b/libs/ledger-live-common/src/generated/deviceTransactionConfig.ts
index b2a97337b0bc..72f88b40b6a9 100644
--- a/libs/ledger-live-common/src/generated/deviceTransactionConfig.ts
+++ b/libs/ledger-live-common/src/generated/deviceTransactionConfig.ts
@@ -20,6 +20,9 @@ import tezos from "@ledgerhq/coin-tezos/deviceTransactionConfig";
 import ton from "@ledgerhq/coin-ton/deviceTransactionConfig";
 import tron from "@ledgerhq/coin-tron/deviceTransactionConfig";
 import xrp from "@ledgerhq/coin-xrp/deviceTransactionConfig";
+import icon from "@ledgerhq/coin-icon/deviceTransactionConfig";
+import ton from "@ledgerhq/coin-ton/deviceTransactionConfig";
+import mina from "@ledgerhq/coin-mina/deviceTransactionConfig";
 
 export default {
   celo,
@@ -44,6 +47,9 @@ export default {
   ton,
   tron,
   xrp,
+  icon,
+  ton,
+  mina,
 };
 import { ExtraDeviceTransactionField as ExtraDeviceTransactionField_aptos } from "@ledgerhq/coin-aptos/bridge/deviceTransactionConfig";
 import { ExtraDeviceTransactionField as ExtraDeviceTransactionField_casper } from "@ledgerhq/coin-casper/bridge/deviceTransactionConfig";
diff --git a/libs/ledger-live-common/src/generated/types.ts b/libs/ledger-live-common/src/generated/types.ts
index 7187f18616fb..5c8e3690dfda 100644
--- a/libs/ledger-live-common/src/generated/types.ts
+++ b/libs/ledger-live-common/src/generated/types.ts
@@ -76,6 +76,12 @@ import type {
   TransactionStatus as multiversxTransactionStatus,
   TransactionStatusRaw as multiversxTransactionStatusRaw,
 } from "@ledgerhq/coin-multiversx/types";
+import type {
+  Transaction as minaTransaction,
+  TransactionRaw as minaTransactionRaw,
+  TransactionStatus as minaTransactionStatus,
+  TransactionStatusRaw as minaTransactionStatusRaw,
+} from "@ledgerhq/coin-mina/types";
 import type {
   Transaction as nearTransaction,
   TransactionRaw as nearTransactionRaw,
@@ -151,6 +157,7 @@ export type Transaction =
   | iconTransaction
   | internet_computerTransaction
   | multiversxTransaction
+  | minaTransaction
   | nearTransaction
   | polkadotTransaction
   | solanaTransaction
@@ -176,6 +183,7 @@ export type TransactionRaw =
   | iconTransactionRaw
   | internet_computerTransactionRaw
   | multiversxTransactionRaw
+  | minaTransactionRaw
   | nearTransactionRaw
   | polkadotTransactionRaw
   | solanaTransactionRaw
@@ -201,6 +209,7 @@ export type TransactionStatus =
   | iconTransactionStatus
   | internet_computerTransactionStatus
   | multiversxTransactionStatus
+  | minaTransactionStatus
   | nearTransactionStatus
   | polkadotTransactionStatus
   | solanaTransactionStatus
@@ -226,6 +235,7 @@ export type TransactionStatusRaw =
   | iconTransactionStatusRaw
   | internet_computerTransactionStatusRaw
   | multiversxTransactionStatusRaw
+  | minaTransactionStatusRaw
   | nearTransactionStatusRaw
   | polkadotTransactionStatusRaw
   | solanaTransactionStatusRaw
diff --git a/libs/ledgerjs/packages/types-live/src/feature.ts b/libs/ledgerjs/packages/types-live/src/feature.ts
index 2d33e6287962..9111840476c6 100644
--- a/libs/ledgerjs/packages/types-live/src/feature.ts
+++ b/libs/ledgerjs/packages/types-live/src/feature.ts
@@ -131,6 +131,7 @@ export type CurrencyFeatures = {
   currencyZenrock: DefaultFeature;
   currencySonic: DefaultFeature;
   currencySonicBlaze: DefaultFeature;
+  currencyMina: DefaultFeature;
 };
 
 /**

From 4521e9b237d2f7539dbaa27ddf6a8f2e142b2fe9 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Tue, 2 Jul 2024 11:50:43 +0200
Subject: [PATCH 07/63] feat(mina): add address validation

---
 libs/coin-modules/coin-mina/package.json      |  1 +
 .../src/api/rosetta/rosetta.unit.test.ts      |  2 +-
 libs/coin-modules/coin-mina/src/consts.ts     |  1 +
 libs/coin-modules/coin-mina/src/logic.test.ts | 62 ++++++++++++++++++-
 libs/coin-modules/coin-mina/src/logic.ts      | 21 +++++--
 5 files changed, 80 insertions(+), 7 deletions(-)

diff --git a/libs/coin-modules/coin-mina/package.json b/libs/coin-modules/coin-mina/package.json
index 6b403b0c4a6c..88827408fd62 100644
--- a/libs/coin-modules/coin-mina/package.json
+++ b/libs/coin-modules/coin-mina/package.json
@@ -53,6 +53,7 @@
     "@ledgerhq/types-cryptoassets": "workspace:^",
     "@ledgerhq/types-live": "workspace:^",
     "bignumber.js": "^9.1.2",
+    "bs58check": "^4.0.0",
     "expect": "^27.4.6",
     "invariant": "^2.2.2",
     "lodash": "^4.17.21",
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts b/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
index 84618e416121..3fa10936ccd3 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
@@ -4,7 +4,7 @@ import { setCoinConfig } from "../../config";
 setCoinConfig((): any => {
   return {
     infra: {
-      API_MINA_ROSETTA_NODE: "https://mina-rosetta-api.zondax.dev",
+      API_MINA_ROSETTA_NODE: "https://mina-rosetta-api-devnet.zondax.dev",
     },
   };
 });
diff --git a/libs/coin-modules/coin-mina/src/consts.ts b/libs/coin-modules/coin-mina/src/consts.ts
index 925c68ade204..1f0ecc13df52 100644
--- a/libs/coin-modules/coin-mina/src/consts.ts
+++ b/libs/coin-modules/coin-mina/src/consts.ts
@@ -13,3 +13,4 @@ export const MINA_SYMBOL = "MINA";
 export const MINA_CURVE_TYPE = "pallas";
 
 export const MAX_MEMO_LENGTH = 32;
+export const MINA_DECODED_ADDRESS_LENGTH = 72;
diff --git a/libs/coin-modules/coin-mina/src/logic.test.ts b/libs/coin-modules/coin-mina/src/logic.test.ts
index 65bb6eb35f1f..2c52026bdd75 100644
--- a/libs/coin-modules/coin-mina/src/logic.test.ts
+++ b/libs/coin-modules/coin-mina/src/logic.test.ts
@@ -1,4 +1,4 @@
-import { getAccountNumFromPath } from "./logic";
+import { getAccountNumFromPath, isValidAddress } from "./logic";
 
 describe("getAccountNumFromPath", () => {
   it("should return undefined for invalid account number", () => {
@@ -16,3 +16,63 @@ describe("getAccountNumFromPath", () => {
     expect(account).toBe(4);
   });
 });
+
+describe("testingAddress", () => {
+  const validAddresses = [
+    "B62qiVhtBtqakq8sNTHdCTXn6tETSK6gtsmNHRn1WdLqjGLpsHbw1xc",
+    "B62qr5cXFjdnZXYxP5dEwRY7wENxcod4Q2oLxUDiq1QrBXZZyxMH8q4",
+    "B62qqmRToRiXZjyLLMJoGnQFXXZuZWdqaNYr43xEDDQzkXMHLouCMZp",
+    "B62qnixP59E4vJytpDWZ5YQPrnmqb7YNwhVWiuSAkxbYdX5RauHWwcm",
+    "B62qmfBiJx88gM9opov4MDxmDVKMutQsBQ1aGt7TrQYyGQx66fRFxvC",
+    "B62qosg21UpwpfPFaxTyirdfUVDHe2Ynsyv1QydE4z34zbLuBZ92ALM",
+    "B62qkWUvsVEnXmd4poHbkKujHNnjxkDcZtrLxN1FTa8pp3GkfHMB1gv",
+    "B62qoiK7DJurVUUJx1dmJGULdNUmX5bjdiYvoWXEXGugS2Cx3YDsHhy",
+    "B62qn1KptFUxxu8aRS52NGQ3GWzn5h8v7U9k571r4LCs5obpoZyd81e",
+    "B62qis2tX1rveddCeJeBAZJnXcCwWPp1x9ScZ3iMCxbV29gRbxWo7qi",
+    "B62qpBKEDTnS4efjBmou7iztx5x152JEmc29XMR1Y3FVCpnmfKGX4R4",
+    "B62qro5bGnk7eCNMA1S5QWmzn5sCcRWckbw83GGaqN3HM2QzP9zYS83",
+    "B62qospDjUj43x2yMKiNehojWWRUsE1wpdUDVpfxH8V3n5Y1QgJKFfw",
+    "B62qrmYwToypQv8v9cjxJdyhAxKihrqtTtEkYC4Y3u412KCPLGSD93V",
+    "B62qj3rpYkGM1T3VN6JDAJs9NccHCRQDYMcQ6UCBc81ff5HXTDjU44d",
+    "B62qp2kks3r14P8GWkR2ieT18JobwnmrBFGEoqy3dAReiyM8aDp4be7",
+    "B62qpW1SYPcp7TcHJYL6egnN9qzvNtQL5XGyiM8S6UsHvxCYzhhFPjz",
+    "B62qospDjUj43x2yMKiNehojWWRUsE1wpdUDVpfxH8V3n5Y1QgJKFfw",
+    "B62qj5L8U8A8gexpHLWHxBdfjKuWb8HMguVPecQ5FGqgZAwBAKHvhEy",
+    "B62qnt5WShcbVVnVqQqWjkyMJdxMwLq4QbRbgMjoi5nmvQw7dZLRtpx",
+    "B62qrGUxqRWn9A8PEJschgLZuS5S1GJiairh65mgTapaK58nkTKHUs8",
+    "B62qkS7hmMkzmNDjeCUKyAMZSw1c98MxszZPA7WnvBuh7Pq66ztiwdt",
+    "B62qjGWerE9MPNk7E2jEJe9Ex5GxkNR9JCc5mhFeJdGFaNDHnMdGQJQ",
+    "B62qpp2DLkLxwFn1QZdkEWgiRFMYnkgh6cj5AJC5pqCYiALh8BmiYJ8",
+    "B62qqALaAoEnaJPSNmQaDkUwFGiKwZo4zRK4Ay5eSMxAMVhNxwr2KeM",
+    "B62qospDjUj43x2yMKiNehojWWRUsE1wpdUDVpfxH8V3n5Y1QgJKFfw",
+    "B62qr3epzHUrxrdminUN4Hzuinuc7aBDAFSR94mPmmxVsbuFpUvDDq6",
+    "B62qrJurUKtcqdhQu1XtJJfSH7rR1xrEtSWPQQcFwBJBwVcsFSyVSM3",
+  ];
+
+  const invalidAddresses = [
+    "", // Empty address
+    null, // Null address
+    undefined, // Undefined address
+    "123", // Too short
+    "B61qiVhtBtqakq8sNTHdCTXn6tETSK6gtsmNHRn1WdLqjGLpsHbw1xc", // Incorrect prefix
+    "B62q!@#$%^&*()_+{}|:<>?`~", // Invalid characters
+    "B62qj5L8U8A8gexpHLWHxBdfjKuWb8HMguVPecQ5FGqgZAwBAKHvhE", // Too short
+    "B62qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", // Too long
+    " B62qiVhtBtqakq8sNTHdCTXn6tETSK6gtsmNHRn1WdLqjGLpsHbw1xc", // Leading whitespace
+    "B62qiVhtBtqakq8sNTHdCTXn6tETSK6gtsmNHRn1WdLqjGLpsHbw1xc ", // Trailing whitespace
+    "B62qiVhtBtqakq8sNTHdC TXn6tETSK6gtsmNHRn1WdLqjGLpsHbw1xc", // Internal whitespace
+    "C62qiVhtBtqakq8sNTHdCTXn6tETSK6gtsmNHRn1WdLqjGLpsHbw1xc", // Incorrect prefix
+  ];
+
+  it("should return true for valid address", () => {
+    for (const address of validAddresses) {
+      expect(isValidAddress(address)).toBe(true);
+    }
+  });
+
+  it("should return false for invalid address", () => {
+    for (const address of invalidAddresses) {
+      expect(isValidAddress(address as string)).toBe(false);
+    }
+  });
+});
diff --git a/libs/coin-modules/coin-mina/src/logic.ts b/libs/coin-modules/coin-mina/src/logic.ts
index ea7fb18c7e8e..06cb513b344c 100644
--- a/libs/coin-modules/coin-mina/src/logic.ts
+++ b/libs/coin-modules/coin-mina/src/logic.ts
@@ -1,12 +1,23 @@
 import { BigNumber } from "bignumber.js";
 import { Transaction, MinaAccount } from "./types";
 import { CoinType } from "@ledgerhq/types-cryptoassets";
-import { MAX_MEMO_LENGTH } from "./consts";
+import { MAX_MEMO_LENGTH, MINA_DECODED_ADDRESS_LENGTH } from "./consts";
+import bs58check from "bs58check";
 
-export const isValidAddress = (_address: string): boolean => {
-  // TODO add a proper address validation
-  return true;
-};
+/*
+ * Validate a Mina address.
+ */
+export function isValidAddress(address: string) {
+  try {
+    if (!address.toLowerCase().startsWith("b62")) {
+      return false;
+    }
+    const decodedAddress = Buffer.from(bs58check.decode(address)).toString("hex");
+    return !!decodedAddress && decodedAddress.length === MINA_DECODED_ADDRESS_LENGTH;
+  } catch (ex) {
+    return false;
+  }
+}
 
 export const isValidMemo = (memo: string): boolean => {
   return memo.length <= MAX_MEMO_LENGTH;

From decba3628c16908d1f8c24fbec24c7efdb4c85bb Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Tue, 2 Jul 2024 14:11:44 +0200
Subject: [PATCH 08/63] feat(mina): add support for llm

---
 .../RootNavigator/types/SendFundsNavigator.ts |   8 ++
 .../types/SignTransactionNavigator.ts         |  17 +++
 .../RootNavigator/types/SwapNavigator.ts      |   8 ++
 .../src/const/navigation.ts                   |   2 +
 apps/ledger-live-mobile/src/families/index.ts |   1 +
 .../src/families/mina/AccountSubHeader.tsx    |   8 ++
 .../src/families/mina/ScreenEditMemo.tsx      | 121 ++++++++++++++++++
 .../src/families/mina/SendRowMemo.tsx         |  81 ++++++++++++
 .../src/families/mina/SendRowsCustom.tsx      |  29 +++++
 .../src/families/mina/index.ts                |   3 +
 .../src/families/mina/operationDetails.tsx    |  23 ++++
 .../screens/AddAccounts/01-SelectCrypto.tsx   |   3 +
 12 files changed, 304 insertions(+)
 create mode 100644 apps/ledger-live-mobile/src/families/mina/AccountSubHeader.tsx
 create mode 100644 apps/ledger-live-mobile/src/families/mina/ScreenEditMemo.tsx
 create mode 100644 apps/ledger-live-mobile/src/families/mina/SendRowMemo.tsx
 create mode 100644 apps/ledger-live-mobile/src/families/mina/SendRowsCustom.tsx
 create mode 100644 apps/ledger-live-mobile/src/families/mina/index.ts
 create mode 100644 apps/ledger-live-mobile/src/families/mina/operationDetails.tsx

diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/types/SendFundsNavigator.ts b/apps/ledger-live-mobile/src/components/RootNavigator/types/SendFundsNavigator.ts
index cad605f2a3c0..25962d5c7e05 100644
--- a/apps/ledger-live-mobile/src/components/RootNavigator/types/SendFundsNavigator.ts
+++ b/apps/ledger-live-mobile/src/components/RootNavigator/types/SendFundsNavigator.ts
@@ -29,6 +29,7 @@ import {
 } from "@ledgerhq/live-common/families/solana/types";
 import type { Transaction as RippleTransaction } from "@ledgerhq/live-common/families/xrp/types";
 import type { Transaction as ICPTransaction } from "@ledgerhq/live-common/families/internet_computer/types";
+import type { Transaction as MinaTransaction } from "@ledgerhq/live-common/families/mina/types";
 import type { Transaction as StellarTransaction } from "@ledgerhq/live-common/families/stellar/types";
 import type { Transaction as StacksTransaction } from "@ledgerhq/live-common/families/stacks/types";
 import type { Transaction as CasperTransaction } from "@ledgerhq/live-common/families/casper/types";
@@ -307,6 +308,13 @@ export type SendFundsNavigatorStackParamList = {
     transaction: ICPTransaction;
     currentNavigation: ScreenName.SignTransactionSummary | ScreenName.SignTransactionSummary;
   };
+  [ScreenName.MinaEditMemo]: {
+    accountId: string;
+    account: Account;
+    parentId?: string;
+    transaction: MinaTransaction;
+    currentNavigation: ScreenName.SignTransactionSummary | ScreenName.SignTransactionSummary;
+  };
   [ScreenName.StacksEditMemo]: {
     accountId: string;
     parentId?: string;
diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/types/SignTransactionNavigator.ts b/apps/ledger-live-mobile/src/components/RootNavigator/types/SignTransactionNavigator.ts
index 9dd7e2e9e4a0..5a6c7c1de18b 100644
--- a/apps/ledger-live-mobile/src/components/RootNavigator/types/SignTransactionNavigator.ts
+++ b/apps/ledger-live-mobile/src/components/RootNavigator/types/SignTransactionNavigator.ts
@@ -23,6 +23,7 @@ import {
 } from "@ledgerhq/live-common/families/solana/types";
 import { Transaction as HederaTransaction } from "@ledgerhq/live-common/families/hedera/types";
 import type { Transaction as ICPTransaction } from "@ledgerhq/live-common/families/internet_computer/types";
+import type { Transaction as MinaTransaction } from "@ledgerhq/live-common/families/mina/types";
 import type { Transaction as RippleTransaction } from "@ledgerhq/live-common/families/xrp/types";
 import type { Transaction as StellarTransaction } from "@ledgerhq/live-common/families/stellar/types";
 import type { Transaction as StacksTransaction } from "@ledgerhq/live-common/families/stacks/types";
@@ -278,6 +279,22 @@ export type SignTransactionNavigatorParamList = {
       | ScreenName.SendSelectDevice
       | ScreenName.SwapForm;
   };
+  [ScreenName.MinaEditMemo]: {
+    accountId: string;
+    account: Account;
+    parentId?: string;
+    transaction: MinaTransaction;
+    currentNavigation:
+      | ScreenName.SignTransactionSummary
+      | ScreenName.SignTransactionSummary
+      | ScreenName.SendSummary
+      | ScreenName.SwapForm;
+    nextNavigation:
+      | ScreenName.SignTransactionSelectDevice
+      | ScreenName.SignTransactionSelectDevice
+      | ScreenName.SendSelectDevice
+      | ScreenName.SwapForm;
+  };
   [ScreenName.CasperEditTransferId]: {
     accountId: string;
     account: Account;
diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/types/SwapNavigator.ts b/apps/ledger-live-mobile/src/components/RootNavigator/types/SwapNavigator.ts
index 6b3677681e89..89562d451352 100644
--- a/apps/ledger-live-mobile/src/components/RootNavigator/types/SwapNavigator.ts
+++ b/apps/ledger-live-mobile/src/components/RootNavigator/types/SwapNavigator.ts
@@ -27,6 +27,7 @@ import {
   SolanaAccount,
   Transaction as SolanaTransaction,
 } from "@ledgerhq/live-common/families/solana/types";
+import type { Transaction as MinaTransaction } from "@ledgerhq/live-common/families/mina/types";
 import type { Transaction as StacksTransaction } from "@ledgerhq/live-common/families/stacks/types";
 import type { Transaction as StellarTransaction } from "@ledgerhq/live-common/families/stellar/types";
 import type { Transaction as TonTransaction } from "@ledgerhq/live-common/families/ton/types";
@@ -270,6 +271,13 @@ export type SwapNavigatorParamList = {
     transaction: ICPTransaction;
     currentNavigation: ScreenName.SignTransactionSummary | ScreenName.SignTransactionSummary;
   };
+  [ScreenName.MinaEditMemo]: {
+    accountId: string;
+    account: Account;
+    parentId?: string;
+    transaction: MinaTransaction;
+    currentNavigation: ScreenName.SignTransactionSummary | ScreenName.SignTransactionSummary;
+  };
 
   [ScreenName.StacksEditMemo]: {
     accountId: string;
diff --git a/apps/ledger-live-mobile/src/const/navigation.ts b/apps/ledger-live-mobile/src/const/navigation.ts
index cfe9d910ef66..86e885f3dbce 100644
--- a/apps/ledger-live-mobile/src/const/navigation.ts
+++ b/apps/ledger-live-mobile/src/const/navigation.ts
@@ -321,6 +321,8 @@ export enum ScreenName {
 
   // ton
   TonEditComment = "TonEditComment",
+  // mina
+  MinaEditMemo = "MinaEditMemo",
 
   // Algorand
   AlgorandEditMemo = "AlgorandEditMemo",
diff --git a/apps/ledger-live-mobile/src/families/index.ts b/apps/ledger-live-mobile/src/families/index.ts
index 48e6aa372226..d148167deda8 100644
--- a/apps/ledger-live-mobile/src/families/index.ts
+++ b/apps/ledger-live-mobile/src/families/index.ts
@@ -7,6 +7,7 @@ export * from "./multiversx";
 export * from "./evm";
 export * from "./hedera";
 export * from "./internet_computer";
+export * from "./mina";
 export * from "./near";
 export * from "./polkadot";
 export * from "./xrp";
diff --git a/apps/ledger-live-mobile/src/families/mina/AccountSubHeader.tsx b/apps/ledger-live-mobile/src/families/mina/AccountSubHeader.tsx
new file mode 100644
index 000000000000..b670b9e1eb3a
--- /dev/null
+++ b/apps/ledger-live-mobile/src/families/mina/AccountSubHeader.tsx
@@ -0,0 +1,8 @@
+import React from "react";
+import AccountSubHeader from "~/components/AccountSubHeader";
+
+function InternetComputerAccountSubHeader() {
+  return <AccountSubHeader family="Mina" team="Zondax" />;
+}
+
+export default InternetComputerAccountSubHeader;
diff --git a/apps/ledger-live-mobile/src/families/mina/ScreenEditMemo.tsx b/apps/ledger-live-mobile/src/families/mina/ScreenEditMemo.tsx
new file mode 100644
index 000000000000..99499cc7c3ff
--- /dev/null
+++ b/apps/ledger-live-mobile/src/families/mina/ScreenEditMemo.tsx
@@ -0,0 +1,121 @@
+import invariant from "invariant";
+import React, { useCallback, useState } from "react";
+import { View, StyleSheet, ScrollView } from "react-native";
+import { SafeAreaView } from "react-native-safe-area-context";
+import { useSelector } from "react-redux";
+import { useTranslation } from "react-i18next";
+import i18next from "i18next";
+import { getAccountBridge } from "@ledgerhq/live-common/bridge/index";
+import { useIsFocused, useTheme } from "@react-navigation/native";
+import KeyboardView from "~/components/KeyboardView";
+import Button from "~/components/Button";
+import { ScreenName } from "~/const";
+import { accountScreenSelector } from "~/reducers/accounts";
+import TextInput from "~/components/FocusedTextInput";
+import { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers";
+import { SendFundsNavigatorStackParamList } from "~/components/RootNavigator/types/SendFundsNavigator";
+import { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator";
+import { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator";
+
+type NavigationProps = BaseComposite<
+  StackNavigatorProps<
+    SendFundsNavigatorStackParamList | SignTransactionNavigatorParamList | SwapNavigatorParamList,
+    ScreenName.MinaEditMemo
+  >
+>;
+
+function MinaEditMemo({ navigation, route }: NavigationProps) {
+  const isFocused = useIsFocused();
+  const { colors } = useTheme();
+  const { t } = useTranslation();
+  const { account } = useSelector(accountScreenSelector(route));
+  invariant(account, "account is required");
+  const [memo, setMemo] = useState(route.params?.transaction.memo);
+  const onChangeMemoValue = useCallback((str: string) => {
+    let value: string = str;
+    value = str.replace(/\D/g, "");
+    setMemo(value === "" ? undefined : value);
+  }, []);
+  const onValidateText = useCallback(() => {
+    const bridge = getAccountBridge(account);
+    const { transaction } = route.params;
+    // @ts-expect-error FIXME: No current / next navigation params?
+    navigation.navigate(ScreenName.SendSummary, {
+      accountId: account.id,
+      transaction: bridge.updateTransaction(transaction, {
+        memo: memo && memo.toString(),
+      }),
+    });
+  }, [navigation, route.params, account, memo]);
+  return (
+    <SafeAreaView style={styles.root}>
+      <KeyboardView
+        style={[
+          styles.body,
+          {
+            backgroundColor: colors.background,
+          },
+        ]}
+      >
+        <ScrollView contentContainerStyle={styles.root} keyboardShouldPersistTaps="always">
+          {isFocused && (
+            <TextInput
+              allowFontScaling={false}
+              autoFocus
+              style={[
+                styles.textInputAS,
+                {
+                  color: colors.darkBlue,
+                },
+              ]}
+              value={memo?.toString() ?? ""}
+              placeholder="Eg: 1658490330"
+              keyboardType="number-pad"
+              returnKeyType="done"
+              onChangeText={onChangeMemoValue}
+              onSubmitEditing={onValidateText}
+            />
+          )}
+
+          <View style={styles.flex}>
+            <Button
+              event="MinaEditMemo"
+              type="primary"
+              title={t("send.summary.validateMemo")}
+              onPress={onValidateText}
+              containerStyle={styles.buttonContainer}
+            />
+          </View>
+        </ScrollView>
+      </KeyboardView>
+    </SafeAreaView>
+  );
+}
+
+const options = {
+  title: i18next.t("send.summary.memo.value"),
+  headerLeft: undefined,
+};
+export { MinaEditMemo as component, options };
+const styles = StyleSheet.create({
+  root: {
+    flex: 1,
+  },
+  body: {
+    flexDirection: "column",
+    flex: 1,
+  },
+  textInputAS: {
+    padding: 16,
+    fontSize: 30,
+  },
+  buttonContainer: {
+    marginHorizontal: 16,
+  },
+  flex: {
+    flex: 1,
+    flexDirection: "column",
+    justifyContent: "flex-end",
+    paddingBottom: 16,
+  },
+});
diff --git a/apps/ledger-live-mobile/src/families/mina/SendRowMemo.tsx b/apps/ledger-live-mobile/src/families/mina/SendRowMemo.tsx
new file mode 100644
index 000000000000..6ec9ca64e131
--- /dev/null
+++ b/apps/ledger-live-mobile/src/families/mina/SendRowMemo.tsx
@@ -0,0 +1,81 @@
+import React, { useCallback } from "react";
+import { View, StyleSheet } from "react-native";
+import { Trans } from "react-i18next";
+import { useNavigation, useRoute, useTheme } from "@react-navigation/native";
+import type { Account } from "@ledgerhq/types-live";
+import type { Transaction as MinaTransaction } from "@ledgerhq/live-common/families/mina/types";
+import LText from "~/components/LText";
+import { ScreenName } from "~/const";
+import SummaryRow from "~/screens/SendFunds/SummaryRow";
+import { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers";
+import { SendFundsNavigatorStackParamList } from "~/components/RootNavigator/types/SendFundsNavigator";
+import { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator";
+import { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator";
+
+type Navigation = BaseComposite<
+  | StackNavigatorProps<SendFundsNavigatorStackParamList, ScreenName.SendSummary>
+  | StackNavigatorProps<SignTransactionNavigatorParamList, ScreenName.SignTransactionSummary>
+  | StackNavigatorProps<SwapNavigatorParamList, ScreenName.SwapSelectFees>
+>;
+
+type Props = {
+  account: Account;
+  transaction: MinaTransaction;
+} & Navigation;
+export default function MinaMemoRow({ account, transaction }: Props) {
+  const { colors } = useTheme();
+  const navigation = useNavigation<Navigation["navigation"]>();
+  const route = useRoute<Navigation["route"]>();
+  const editMemo = useCallback(() => {
+    navigation.navigate(ScreenName.MinaEditMemo, {
+      ...route.params,
+      accountId: account.id,
+      parentId: undefined,
+      account,
+      transaction,
+    });
+  }, [navigation, route.params, account, transaction]);
+  const memo = transaction.memo;
+  return (
+    <View>
+      {!memo ? (
+        <SummaryRow title={<Trans i18nKey="send.summary.memo.title" />} onPress={editMemo}>
+          <LText
+            style={[
+              styles.link,
+              {
+                textDecorationColor: colors.live,
+              },
+            ]}
+            color="live"
+            onPress={editMemo}
+          >
+            <Trans i18nKey="common.edit" />
+          </LText>
+        </SummaryRow>
+      ) : (
+        <SummaryRow title={<Trans i18nKey="common.edit" />} onPress={editMemo}>
+          <LText semiBold style={styles.tagText} onPress={editMemo}>
+            {String(memo)}
+          </LText>
+        </SummaryRow>
+      )}
+    </View>
+  );
+}
+const styles = StyleSheet.create({
+  memoContainer: {
+    flexDirection: "row",
+  },
+  tagText: {
+    fontSize: 14,
+  },
+  link: {
+    textDecorationStyle: "solid",
+    textDecorationLine: "underline",
+    marginLeft: 8,
+  },
+  memo: {
+    marginBottom: 10,
+  },
+});
diff --git a/apps/ledger-live-mobile/src/families/mina/SendRowsCustom.tsx b/apps/ledger-live-mobile/src/families/mina/SendRowsCustom.tsx
new file mode 100644
index 000000000000..d67d7c876a30
--- /dev/null
+++ b/apps/ledger-live-mobile/src/families/mina/SendRowsCustom.tsx
@@ -0,0 +1,29 @@
+import React from "react";
+import type { Account } from "@ledgerhq/types-live";
+import { Transaction as MinaTransaction } from "@ledgerhq/live-common/families/mina/types";
+import type { Transaction } from "@ledgerhq/live-common/generated/types";
+import SendRowMemo from "./SendRowMemo";
+import { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers";
+import { SendFundsNavigatorStackParamList } from "~/components/RootNavigator/types/SendFundsNavigator";
+import { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator";
+import { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator";
+import { ScreenName } from "~/const";
+
+type Navigation = BaseComposite<
+  | StackNavigatorProps<SendFundsNavigatorStackParamList, ScreenName.SendSummary>
+  | StackNavigatorProps<SignTransactionNavigatorParamList, ScreenName.SignTransactionSummary>
+  | StackNavigatorProps<SwapNavigatorParamList, ScreenName.SwapSelectFees>
+>;
+
+type Props = {
+  transaction: Transaction;
+  account: Account;
+} & Navigation;
+export default function MinaSendRowsCustom(props: Props) {
+  const { transaction, ...rest } = props;
+  return (
+    <>
+      <SendRowMemo {...rest} transaction={transaction as MinaTransaction} />
+    </>
+  );
+}
diff --git a/apps/ledger-live-mobile/src/families/mina/index.ts b/apps/ledger-live-mobile/src/families/mina/index.ts
new file mode 100644
index 000000000000..e8a30a4f4494
--- /dev/null
+++ b/apps/ledger-live-mobile/src/families/mina/index.ts
@@ -0,0 +1,3 @@
+import * as MinaEditMemo from "./ScreenEditMemo";
+
+export { MinaEditMemo };
diff --git a/apps/ledger-live-mobile/src/families/mina/operationDetails.tsx b/apps/ledger-live-mobile/src/families/mina/operationDetails.tsx
new file mode 100644
index 000000000000..cfc394906d5e
--- /dev/null
+++ b/apps/ledger-live-mobile/src/families/mina/operationDetails.tsx
@@ -0,0 +1,23 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+import Section from "~/screens/OperationDetails/Section";
+import { InternetComputerOperation } from "@ledgerhq/live-common/families/internet_computer/types";
+
+type Props = {
+  operation: InternetComputerOperation;
+};
+
+function OperationDetailsExtra({ operation }: Props) {
+  const { t } = useTranslation();
+  return (
+    <>
+      {operation.extra.memo && (
+        <Section title={t("operationDetails.extra.memo")} value={operation.extra.memo} />
+      )}
+    </>
+  );
+}
+
+export default {
+  OperationDetailsExtra,
+};
diff --git a/apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.tsx
index 395d257ced63..6929663d0aad 100644
--- a/apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.tsx
+++ b/apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.tsx
@@ -85,6 +85,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) {
   const velasEvm = useFeature("currencyVelasEvm");
   const syscoin = useFeature("currencySyscoin");
   const internetComputer = useFeature("currencyInternetComputer");
+  const mina = useFeature("currencyMina");
   const telosEvm = useFeature("currencyTelosEvm");
   const coreum = useFeature("currencyCoreum");
   const polygonZkEvm = useFeature("currencyPolygonZkEvm");
@@ -172,6 +173,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) {
       zenrock,
       sonic,
       sonic_blaze: sonicBlaze,
+      mina: mina,
     }),
     [
       aptos,
@@ -230,6 +232,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) {
       zenrock,
       sonic,
       sonicBlaze,
+      mina,
     ],
   );
 

From 69ec37e3f0c838f2609ee2b4a9b880207ee8bbca Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Thu, 4 Jul 2024 16:06:16 +0200
Subject: [PATCH 09/63] fix(mina): improve llm

---
 .../src/families/mina/ScreenEditMemo.tsx             |  8 +++-----
 .../coin-mina/src/deviceTransactionConfig.ts         | 12 ++++++------
 .../coin-mina/src/getTransactionStatus.ts            |  2 +-
 3 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/apps/ledger-live-mobile/src/families/mina/ScreenEditMemo.tsx b/apps/ledger-live-mobile/src/families/mina/ScreenEditMemo.tsx
index 99499cc7c3ff..a584723d6d61 100644
--- a/apps/ledger-live-mobile/src/families/mina/ScreenEditMemo.tsx
+++ b/apps/ledger-live-mobile/src/families/mina/ScreenEditMemo.tsx
@@ -32,9 +32,7 @@ function MinaEditMemo({ navigation, route }: NavigationProps) {
   invariant(account, "account is required");
   const [memo, setMemo] = useState(route.params?.transaction.memo);
   const onChangeMemoValue = useCallback((str: string) => {
-    let value: string = str;
-    value = str.replace(/\D/g, "");
-    setMemo(value === "" ? undefined : value);
+    setMemo(str === "" ? undefined : str);
   }, []);
   const onValidateText = useCallback(() => {
     const bridge = getAccountBridge(account);
@@ -69,8 +67,8 @@ function MinaEditMemo({ navigation, route }: NavigationProps) {
                 },
               ]}
               value={memo?.toString() ?? ""}
-              placeholder="Eg: 1658490330"
-              keyboardType="number-pad"
+              placeholder="Optional memo"
+              keyboardType="default"
               returnKeyType="done"
               onChangeText={onChangeMemoValue}
               onSubmitEditing={onValidateText}
diff --git a/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts b/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts
index b5d8cc516dca..11c2063436c8 100644
--- a/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts
+++ b/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts
@@ -2,7 +2,7 @@ import type { Account, AccountLike } from "@ledgerhq/types-live";
 import type { Transaction, TransactionStatus } from "./types";
 import type { CommonDeviceTransactionField as DeviceTransactionField } from "@ledgerhq/coin-framework/transaction/common";
 
-function getDeviceTransactionConfig(input: {
+function getDeviceTransactionConfig(_input: {
   account: AccountLike;
   parentAccount: Account | null | undefined;
   transaction: Transaction;
@@ -10,11 +10,11 @@ function getDeviceTransactionConfig(input: {
 }): Array<DeviceTransactionField> {
   const fields: Array<DeviceTransactionField> = [];
 
-  fields.push({
-    type: "text",
-    label: "Memo",
-    value: input.transaction.memo ?? "",
-  });
+  // fields.push({
+  //   type: "text",
+  //   label: "Memo",
+  //   value: input.transaction.memo ?? "",
+  // });
 
   return fields;
 }
diff --git a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
index b6932ec03ba0..3fc6202feae3 100644
--- a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
+++ b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
@@ -31,7 +31,7 @@ const getTransactionStatus: AccountBridge<
     errors.recipient = new RecipientRequired();
   }
 
-  if (!isValidAddress(t.recipient)) {
+  if (t.recipient && !isValidAddress(t.recipient)) {
     errors.recipient = new InvalidAddress();
   }
 

From 29a19ea7a1317137e36fafd26e90243a9a725c18 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Tue, 9 Jul 2024 18:46:24 +0200
Subject: [PATCH 10/63] feat: add mina svg icon

---
 .../ui/packages/crypto-icons/src/svg/MINA.svg | 30 +++++++++++++++++++
 1 file changed, 30 insertions(+)
 create mode 100644 libs/ui/packages/crypto-icons/src/svg/MINA.svg

diff --git a/libs/ui/packages/crypto-icons/src/svg/MINA.svg b/libs/ui/packages/crypto-icons/src/svg/MINA.svg
new file mode 100644
index 000000000000..914704eb7ba8
--- /dev/null
+++ b/libs/ui/packages/crypto-icons/src/svg/MINA.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 24 24">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: none;
+      }
+
+      .cls-1, .cls-2, .cls-3, .cls-4 {
+        stroke-width: 0px;
+      }
+
+      .cls-2 {
+        fill: #2d2d2d;
+      }
+
+      .cls-3 {
+        fill-rule: evenodd;
+      }
+
+      .cls-3, .cls-4 {
+        fill: #fff;
+      }
+    </style>
+  </defs>
+  <path class="cls-1" d="M12,20.4c-.6,0-1.2-.5-1.3-1.1v-1.1c-1.5-.4-2.3-1.4-2.5-3l-1.2-9.3c-.3,0-.5,0-.8,0-.4,0-.8,0-1.1.1v14.1h-2.4v-11.4c0-1.5.7-2.6,2-3.1v-.7c0-.8.5-1.4,1.3-1.4s1.2.5,1.4,1.3v.7c1.5.4,2.3,1.5,2.5,3.3l1.1,9c.7.1,1.4.1,2,0l1.1-9c.2-1.8,1-2.9,2.4-3.3v-.7c.2-.9.7-1.3,1.5-1.3s1.3.6,1.3,1.4v.7c1.3.5,2,1.5,2,3.1v11.4h-2.4V6c-.4-.1-.8-.2-1.1-.1-.3,0-.5,0-.8,0l-1.2,9.3c-.2,1.6-1,2.6-2.3,3v1.1c-.2.7-.7,1.1-1.4,1.1ZM11,18.3v1c.2.4.5.8,1,.7.4,0,.8-.3.8-.7,0,0,0,0,0,0v-1c-.5.1-1.2.1-1.8,0h0ZM19.3,19.7h1.5v-10.9c0-1.3-.5-2.2-1.5-2.6v13.6ZM3.2,19.7h1.5V6.2c-1,.4-1.5,1.3-1.5,2.6v10.9ZM7.5,6.1l1.2,9.1c.2,1.3.8,2.2,1.9,2.6l-1.1-8.8c-.2-1.6-.8-2.5-1.9-2.9ZM16.5,6.1c-1.1.4-1.7,1.3-1.9,2.9l-1.1,8.8c1.1-.4,1.7-1.2,1.9-2.6l1.2-9.1ZM5.1,5.6h0c.4,0,.8-.1,1.1-.1.2,0,.5,0,.7,0v-.5c-.2-.6-.5-1-1-1s-.9.4-.9,1v.6ZM17.7,5.4c.4,0,.8,0,1.1.1v-.6c0-.6-.3-1-.9-1s-.9.3-.9,1v.5c.2,0,.4,0,.7,0h0Z"/>
+  <path class="cls-3" d="M12,20.4c-4.7,0-8.4-3.8-8.4-8.4S7.3,3.6,12,3.6s8.4,3.8,8.4,8.4-3.8,8.4-8.4,8.4ZM12,19.9c4.4,0,7.9-3.6,7.9-7.9s-3.6-7.9-7.9-7.9-7.9,3.6-7.9,7.9,3.6,7.9,7.9,7.9Z"/>
+  <path class="cls-4" d="M10.6,18.1c.2,0,.9-.6,1.6-1.2.9-.7,1.7-1.5,2.5-2.3.8-.8,1.1-1.1,1.1-1.3.2-.6-1.7-7.2-2-7.3-.2,0-2.2,1.6-4,3.4-1,1-1.3,1.4-1.4,1.6,0,.2,0,.6.2,1.1.4,2,1.3,4.9,1.7,5.8.2.4.2.4.4.3h0Z"/>
+  <path class="cls-2" d="M12,20.4c-.6,0-1.2-.5-1.3-1.1v-1.1c-1.5-.4-2.3-1.4-2.5-3l-1.2-9.3c-.3,0-.5,0-.8,0-.4,0-.8,0-1.1.1v14.1h-2.4v-11.4c0-1.5.7-2.6,2-3.1v-.7c0-.8.5-1.4,1.3-1.4s1.2.5,1.4,1.3v.7c1.5.4,2.3,1.5,2.5,3.3l1.1,9c.7.1,1.4.1,2,0l1.1-9c.2-1.8,1-2.9,2.4-3.3v-.7c.2-.9.7-1.3,1.5-1.3s1.3.6,1.3,1.4v.7c1.3.5,2,1.5,2,3.1v11.4h-2.4V6c-.4-.1-.8-.2-1.1-.1-.3,0-.5,0-.8,0l-1.2,9.3c-.2,1.6-1,2.6-2.3,3v1.1c-.2.7-.7,1.1-1.4,1.1ZM11,18.3v1c.2.4.5.8,1,.7.4,0,.8-.3.8-.7,0,0,0,0,0,0v-1c-.5.1-1.2.1-1.8,0h0ZM19.3,19.7h1.5v-10.9c0-1.3-.5-2.2-1.5-2.6v13.6ZM3.2,19.7h1.5V6.2c-1,.4-1.5,1.3-1.5,2.6v10.9ZM7.5,6.1l1.2,9.1c.2,1.3.8,2.2,1.9,2.6l-1.1-8.8c-.2-1.6-.8-2.5-1.9-2.9ZM16.5,6.1c-1.1.4-1.7,1.3-1.9,2.9l-1.1,8.8c1.1-.4,1.7-1.2,1.9-2.6l1.2-9.1ZM5.1,5.6h0c.4,0,.8-.1,1.1-.1.2,0,.5,0,.7,0v-.5c-.2-.6-.5-1-1-1s-.9.4-.9,1v.6ZM17.7,5.4c.4,0,.8,0,1.1.1v-.6c0-.6-.3-1-.9-1s-.9.3-.9,1v.5c.2,0,.4,0,.7,0h0Z"/>
+</svg>
\ No newline at end of file

From de1cb3274381c1b558fe0cffbf51c1adced94a1a Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Thu, 11 Jul 2024 13:51:36 +0200
Subject: [PATCH 11/63] refac(mina): update derivation path

---
 apps/ledger-live-mobile/src/locales/en/common.json        | 3 +++
 libs/coin-framework/src/derivation.ts                     | 3 ++-
 libs/ledger-live-common/src/hw/actions/implementations.ts | 2 +-
 libs/ledgerjs/packages/types-live/src/derivation.ts       | 2 +-
 4 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json
index bf3d4b21bfe9..67c8837a0897 100644
--- a/apps/ledger-live-mobile/src/locales/en/common.json
+++ b/apps/ledger-live-mobile/src/locales/en/common.json
@@ -1060,6 +1060,9 @@
     },
     "AppManifestNotFoundError": {
       "title": "Failed to load Swap Live App"
+    },
+    "InvalidMemoMina": {
+      "title": "Memo text cannot be longer than 32 characters"
     }
   },
   "crash": {
diff --git a/libs/coin-framework/src/derivation.ts b/libs/coin-framework/src/derivation.ts
index d9391658e113..d1e6a8d747f9 100644
--- a/libs/coin-framework/src/derivation.ts
+++ b/libs/coin-framework/src/derivation.ts
@@ -171,7 +171,7 @@ const modes: Readonly<Record<DerivationMode, ModeSpec>> = Object.freeze({
   internet_computer: {
     overridesDerivation: "44'/223'/0'/0/<account>",
   },
-  mina: {
+  minabip44h: {
     overridesDerivation: "44'/12586'/<account>'/0/0",
   },
   stacks_wallet: {
@@ -197,6 +197,7 @@ const legacyDerivations: Partial<Record<CryptoCurrency["id"], DerivationMode[]>>
   hedera: ["hederaBip44"],
   filecoin: ["glifLegacy", "filecoinBIP44", "glif"],
   internet_computer: ["internet_computer"],
+  mina: ["minabip44h"],
   casper: ["casper_wallet"],
   cardano: ["cardano"],
   cardano_testnet: ["cardano"],
diff --git a/libs/ledger-live-common/src/hw/actions/implementations.ts b/libs/ledger-live-common/src/hw/actions/implementations.ts
index 63470b675db5..a92cf46e2e12 100644
--- a/libs/ledger-live-common/src/hw/actions/implementations.ts
+++ b/libs/ledger-live-common/src/hw/actions/implementations.ts
@@ -63,7 +63,7 @@ export const defaultImplementationConfig: PollingImplementationConfig = {
   pollingFrequency: 2000,
   initialWaitTime: 5000,
   reconnectWaitTime: 5000,
-  connectionTimeout: getEnv("DETOX") ? 60000 : 20000,
+  connectionTimeout: getEnv("MOCK") ? 60000 : 1200000,
 };
 type Implementation = <EmittedEvent, GenericRequestType>(
   params: PollingImplementationParams<GenericRequestType, EmittedEvent>,
diff --git a/libs/ledgerjs/packages/types-live/src/derivation.ts b/libs/ledgerjs/packages/types-live/src/derivation.ts
index 4ab9fddc7e8b..e7a41c6dd458 100644
--- a/libs/ledgerjs/packages/types-live/src/derivation.ts
+++ b/libs/ledgerjs/packages/types-live/src/derivation.ts
@@ -33,4 +33,4 @@ export type DerivationMode =
   | "icon"
   | "ton"
   | "aptos"
-  | "mina";
+  | "minabip44h";

From 86c50a3386744374cbc88c058baf5153f2d5a5ef Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Thu, 11 Jul 2024 13:52:06 +0200
Subject: [PATCH 12/63] test(mina): add bridge integration tests

---
 .../coin-mina/src/bridge.integration.test.ts  | 167 ++++++++++++++++++
 .../families/mina/bridge.integration.test.ts  |   8 +-
 2 files changed, 171 insertions(+), 4 deletions(-)
 create mode 100644 libs/coin-modules/coin-mina/src/bridge.integration.test.ts

diff --git a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
new file mode 100644
index 000000000000..38dc452ce73e
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
@@ -0,0 +1,167 @@
+import { BigNumber } from "bignumber.js";
+import {
+  AmountRequired,
+  InvalidAddress,
+  InvalidAddressBecauseDestinationIsAlsoSource,
+  NotEnoughBalance,
+} from "@ledgerhq/errors";
+import type { DatasetTest, CurrenciesData } from "@ledgerhq/types-live";
+import type { Transaction } from "./types";
+import { fromTransactionRaw } from "./transaction";
+import { InvalidMemoMina } from "./errors";
+
+const ACCOUNT_ADDRESS = "";
+const ACCOUNT_ADDRESS_1 = "";
+
+const mina: CurrenciesData<Transaction> = {
+  scanAccounts: [
+    {
+      name: "mina seed 1",
+      apdus: `
+      => 80040157148000002c8000018d800000008000000080000000
+      <= 18d68decb70d4d4fd267d19a0d25edc06ad079e69ded41233a10976cf36391ec9000
+      => 80040157148000002c8000018d800000008000000080000001
+      <= 6cbf3b0f8d8b4667bf64bf44b4fefa830e4cef0e5da1e5cfb4015b5a755c4ac09000
+      => 80040157148000002c8000018d800000008000000080000002
+      <= 59dff1cf9185758c0c2f878c37a175280f3967dca8fee6e4ad0c4aa26daf8e5c9000
+      `,
+    },
+  ],
+  accounts: [
+    {
+      // Skipping due to rewards being auto-compounded, no operation as evidence
+      FIXME_tests: ["balance is sum of ops"],
+      raw: {
+        id: `js:2:mina:${ACCOUNT_ADDRESS}:`,
+        seedIdentifier: `${ACCOUNT_ADDRESS}`,
+        name: "MINA 1",
+        derivationMode: "minabip44h",
+        index: 0,
+        freshAddress: `${ACCOUNT_ADDRESS}`,
+        freshAddressPath: "44'/12586'/0'/0'/0'",
+        blockHeight: 0,
+        operations: [],
+        pendingOperations: [],
+        currencyId: "mina",
+        lastSyncDate: "",
+        balance: "1000000",
+      },
+      transactions: [
+        {
+          name: "Not a valid address",
+          transaction: fromTransactionRaw({
+            family: "mina",
+            recipient: "novalidaddress",
+            fees: new BigNumber(0).toString(),
+            amount: "1000",
+          }),
+          expectedStatus: {
+            errors: {
+              recipient: new InvalidAddress(),
+            },
+            warnings: {},
+          },
+        },
+        {
+          name: "Not enough balance",
+          transaction: fromTransactionRaw({
+            family: "mina",
+            recipient: ACCOUNT_ADDRESS_1,
+            fees: new BigNumber(0).toString(),
+            amount: (300 * 1e9).toString(),
+          }),
+          expectedStatus: {
+            errors: {
+              amount: new NotEnoughBalance(),
+            },
+            warnings: {},
+          },
+        },
+        {
+          name: "Invalid Memo",
+          transaction: fromTransactionRaw({
+            family: "mina",
+            recipient: ACCOUNT_ADDRESS_1,
+            fees: new BigNumber(0).toString(),
+            amount: "1000",
+            memo: "string greated than 32 chars is invalid",
+          }),
+          expectedStatus: {
+            errors: {
+              transaction: new InvalidMemoMina(),
+            },
+            warnings: {},
+          },
+        },
+        {
+          name: "Amount Required",
+          transaction: fromTransactionRaw({
+            family: "mina",
+            recipient: ACCOUNT_ADDRESS_1,
+            amount: "0",
+            fees: new BigNumber(0).toString(),
+          }),
+          expectedStatus: {
+            errors: {
+              amount: new AmountRequired(),
+            },
+            warnings: {},
+          },
+        },
+        {
+          name: "Recipient same as source",
+          transaction: fromTransactionRaw({
+            family: "mina",
+            recipient: ACCOUNT_ADDRESS,
+            amount: "10",
+            fees: new BigNumber(0).toString(),
+          }),
+          expectedStatus: {
+            errors: {
+              amount: new InvalidAddressBecauseDestinationIsAlsoSource(),
+            },
+            warnings: {},
+          },
+        },
+        {
+          name: "New account and sufficient amount",
+          transaction: fromTransactionRaw({
+            family: "mina",
+            recipient: ACCOUNT_ADDRESS_1,
+            amount: "1000",
+            fees: new BigNumber(0).toString(),
+          }),
+          expectedStatus: {
+            amount: new BigNumber("1000"),
+            errors: {},
+            warnings: {},
+          },
+        },
+      ],
+    },
+  ],
+};
+
+export const dataset: DatasetTest<Transaction> = {
+  implementations: ["js"],
+  currencies: {
+    mina,
+  },
+};
+
+describe("Mina bridge", () => {
+  test.todo(
+    "This is an empty test to make jest command pass. Remove it once there is a real test.",
+  );
+});
+
+/**
+ * NOTE: if tests are added to this file,
+ * like done in libs/coin-polkadot/src/bridge.integration.test.ts for example,
+ * this file fill need to be imported in ledger-live-common
+ * libs/ledger-live-common/src/families/algorand/bridge.integration.test.ts
+ * like done for polkadot.
+ * cf.
+ * - libs/coin-polkadot/src/bridge.integration.test.ts
+ * - libs/ledger-live-common/src/families/polkadot/bridge.integration.test.ts
+ */
diff --git a/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts b/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
index 83cec99c9677..c7dd4767e448 100644
--- a/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
+++ b/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
@@ -1,5 +1,5 @@
-// import "../../__tests__/test-helpers/setup";
-// import { testBridge } from "../../__tests__/test-helpers/bridge";
-// import { dataset } from "@ledgerhq/coin-mina/bridge.integration.test";
+import "../../__tests__/test-helpers/setup";
+import { testBridge } from "../../__tests__/test-helpers/bridge";
+import { dataset } from "@ledgerhq/coin-mina/bridge.integration.test";
 
-// testBridge(dataset);
+testBridge(dataset);

From c05be952db494161c4b15b270bb1d9d795c1e5e4 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Sun, 21 Jul 2024 18:27:27 +0200
Subject: [PATCH 13/63] test(mina): fix integration tests

---
 libs/coin-framework/src/derivation.ts         |    1 +
 .../coin-mina/src/api/api.unit.test.ts        |   46 +
 libs/coin-modules/coin-mina/src/api/index.ts  |   36 +-
 .../coin-mina/src/api/rosetta/index.ts        |   11 +
 .../src/api/rosetta/rosetta.unit.test.ts      |   11 +-
 .../coin-mina/src/api/rosetta/types.ts        |   18 +
 .../coin-mina/src/bridge.integration.test.ts  |   41 +-
 .../coin-mina/src/synchronisation.ts          |    7 +-
 libs/coin-modules/coin-mina/src/testUtils.ts  |   11 +
 .../bridge.integration.test.ts.snap           | 1278 +++++++++++++++++
 .../ui/packages/crypto-icons/src/svg/MINA.svg |   22 +-
 11 files changed, 1416 insertions(+), 66 deletions(-)
 create mode 100644 libs/coin-modules/coin-mina/src/api/api.unit.test.ts
 create mode 100644 libs/coin-modules/coin-mina/src/testUtils.ts
 create mode 100644 libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap

diff --git a/libs/coin-framework/src/derivation.ts b/libs/coin-framework/src/derivation.ts
index d1e6a8d747f9..8754e3da5128 100644
--- a/libs/coin-framework/src/derivation.ts
+++ b/libs/coin-framework/src/derivation.ts
@@ -340,6 +340,7 @@ const disableBIP44: Record<string, boolean> = {
   icon_berlin_testnet: true,
   vechain: true,
   internet_computer: true,
+  mina: true,
   casper: true,
   filecoin: true,
   ton: true,
diff --git a/libs/coin-modules/coin-mina/src/api/api.unit.test.ts b/libs/coin-modules/coin-mina/src/api/api.unit.test.ts
new file mode 100644
index 000000000000..d54ce45bf990
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/api/api.unit.test.ts
@@ -0,0 +1,46 @@
+import { setConfig } from "../testUtils";
+setConfig();
+import { getAccount, getTransactions } from ".";
+
+test("get balance for an account", async () => {
+  const invalidAddress = [
+    "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLJM",
+    "novalidaddress",
+  ];
+  const validAddress = ["B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM"];
+
+  for (const address of invalidAddress) {
+    await expect(getAccount(address)).toBeDefined();
+  }
+
+  for (const address of validAddress) {
+    const account = await getAccount(address);
+    expect(account).toBeDefined();
+    expect(account.balance.toNumber()).toBeGreaterThan(0);
+  }
+});
+
+test(
+  "get transaction",
+  async () => {
+    const invalidAddress = [
+      "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLJM",
+      "novalidaddress",
+    ];
+    const validAddress = ["B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM"];
+
+    for (const address of invalidAddress) {
+      const transactions = await getTransactions(address);
+      expect(transactions).toBeDefined();
+      expect(transactions).toHaveLength(0);
+    }
+
+    for (const address of validAddress) {
+      const transactions = await getTransactions(address);
+      expect(transactions).toBeDefined();
+      expect(transactions.length).toBeGreaterThan(0);
+      expect(transactions[0].date).toBeDefined();
+    }
+  },
+  60 * 1000,
+);
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index 255148b3787a..ff8e0840c7de 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -3,28 +3,50 @@ import { MinaAPIAccount, MinaSignedTransaction, Transaction } from "../types";
 import {
   fetchAccountBalance,
   fetchAccountTransactions,
+  fetchBlockInfo,
   fetchNetworkStatus,
   fetchTransactionMetadata,
   rosettaSubmitTransaction,
 } from "./rosetta";
-import { RosettaTransaction } from "./rosetta/types";
+import { RosettaTransactionWithDate } from "./rosetta/types";
 import { MINA_TOKEN_ID } from "../consts";
+import { isValidAddress } from "../logic";
 
 export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
   const networkStatus = await fetchNetworkStatus();
-  const balance = await fetchAccountBalance(address);
+  let balance = new BigNumber(0);
+  let spendableBalance = new BigNumber(0);
+  try {
+    const resp = await fetchAccountBalance(address);
+    balance = new BigNumber(resp.balances[0].metadata.total_balance);
+    spendableBalance = new BigNumber(resp.balances[0].metadata.liquid_balance);
+  } catch (e) {
+    /* empty */
+  }
 
   return {
     blockHeight: networkStatus.current_block_identifier.index,
-    balance: new BigNumber(balance.balances[0].metadata.total_balance),
-    spendableBalance: new BigNumber(balance.balances[0].metadata.liquid_balance),
+    balance,
+    spendableBalance,
   };
 };
 
-export const getTransactions = async (address: string): Promise<RosettaTransaction[]> => {
+export const getTransactions = async (address: string): Promise<RosettaTransactionWithDate[]> => {
   const res = await fetchAccountTransactions(address);
 
-  return res.transactions;
+  const txns: RosettaTransactionWithDate[] = [];
+  for (const txn of res.transactions) {
+    const date = await getBlockDate(txn.block_identifier.hash);
+    txns.push({ ...txn, date: date });
+  }
+
+  return txns;
+};
+
+export const getBlockDate = async (hash: string): Promise<Date> => {
+  const res = await fetchBlockInfo(hash);
+
+  return new Date(res.block.timestamp);
 };
 
 export const broadcastTransaction = async (txn: MinaSignedTransaction): Promise<string> => {
@@ -50,7 +72,7 @@ export const broadcastTransaction = async (txn: MinaSignedTransaction): Promise<
 };
 
 export const getFees = async (txn: Transaction, address: string): Promise<BigNumber> => {
-  if (!txn.amount || !txn.recipient) {
+  if (!txn.amount || !txn.recipient || !isValidAddress(txn.recipient)) {
     return txn.fees;
   }
 
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
index 74e2b5b9d1a5..74126bac9bed 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
@@ -3,6 +3,7 @@ import {
   FetchAccountBalanceResponse,
   FetchAccountTransactionsResponse,
   FetchNetworkStatusResponse,
+  RosettaBlockInfoResponse,
   RosettaMetadataResponse,
   RosettaPreprocessResponse,
   RosettaSubmitResponse,
@@ -78,3 +79,13 @@ export const rosettaSubmitTransaction = async (blob: string) => {
     data: addNetworkIdentifier({ signed_transaction: blob }),
   });
 };
+
+export const fetchBlockInfo = async (hash: string) => {
+  const res = await network<RosettaBlockInfoResponse>({
+    method: "POST",
+    url: getRosettaUrl("/block"),
+    data: addNetworkIdentifier({ block_identifier: { hash } }),
+  });
+
+  return res.data;
+};
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts b/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
index 3fa10936ccd3..2ff54ff8556e 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
@@ -1,13 +1,6 @@
 import { fetchTransactionMetadata } from ".";
-import { setCoinConfig } from "../../config";
-
-setCoinConfig((): any => {
-  return {
-    infra: {
-      API_MINA_ROSETTA_NODE: "https://mina-rosetta-api-devnet.zondax.dev",
-    },
-  };
-});
+import { setConfig } from "../../testUtils";
+setConfig();
 
 test("get metadata for a transactions", async () => {
   const metadata = await fetchTransactionMetadata(
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
index 42e6405579fe..d35c0946d01c 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
@@ -45,6 +45,10 @@ export type FetchAccountBalanceResponse = {
   };
 };
 
+export type RosettaTransactionWithDate = RosettaTransaction & {
+  date: Date;
+};
+
 export type RosettaTransaction = {
   block_identifier: {
     index: number;
@@ -131,3 +135,17 @@ export type RosettaSubmitResponse = {
     hash: string;
   };
 };
+
+export type RosettaBlockInfoResponse = {
+  block: {
+    block_identifier: {
+      index: number;
+      hash: string;
+    };
+    parent_block_identifier: {
+      index: number;
+      hash: string;
+    };
+    timestamp: number;
+  };
+};
diff --git a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
index 38dc452ce73e..a911a6e00507 100644
--- a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
+++ b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
@@ -10,20 +10,20 @@ import type { Transaction } from "./types";
 import { fromTransactionRaw } from "./transaction";
 import { InvalidMemoMina } from "./errors";
 
-const ACCOUNT_ADDRESS = "";
-const ACCOUNT_ADDRESS_1 = "";
+const ACCOUNT_ADDRESS = "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM";
+const ACCOUNT_ADDRESS_1 = "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314";
 
 const mina: CurrenciesData<Transaction> = {
   scanAccounts: [
     {
       name: "mina seed 1",
       apdus: `
-      => 80040157148000002c8000018d800000008000000080000000
-      <= 18d68decb70d4d4fd267d19a0d25edc06ad079e69ded41233a10976cf36391ec9000
-      => 80040157148000002c8000018d800000008000000080000001
-      <= 6cbf3b0f8d8b4667bf64bf44b4fefa830e4cef0e5da1e5cfb4015b5a755c4ac09000
-      => 80040157148000002c8000018d800000008000000080000002
-      <= 59dff1cf9185758c0c2f878c37a175280f3967dca8fee6e4ad0c4aa26daf8e5c9000
+      => e00200000400000000
+      <= 423632716b6446574a5357387a6154425a6a5456746d65553372567879556b4e7850684b4b573854324a4274706a3558666479774c534d009000
+      => e00200000400000001
+      <= 423632716b576348686f6973574443523776336776577a5836775845567547594c485871336d53796d3447457a6659586d534476333134009000
+      => e00200000400000002
+      <= 423632716d6233356642476a50714c75456f4842336242766f3834397a32707738423271335854703677765a4d4c734641336562325647009000
       `,
     },
   ],
@@ -48,7 +48,7 @@ const mina: CurrenciesData<Transaction> = {
       },
       transactions: [
         {
-          name: "Not a valid address",
+          name: "not a valid address",
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: "novalidaddress",
@@ -63,7 +63,7 @@ const mina: CurrenciesData<Transaction> = {
           },
         },
         {
-          name: "Not enough balance",
+          name: "not enough balance",
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: ACCOUNT_ADDRESS_1,
@@ -78,7 +78,7 @@ const mina: CurrenciesData<Transaction> = {
           },
         },
         {
-          name: "Invalid Memo",
+          name: "invalid Memo",
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: ACCOUNT_ADDRESS_1,
@@ -94,7 +94,7 @@ const mina: CurrenciesData<Transaction> = {
           },
         },
         {
-          name: "Amount Required",
+          name: "amount Required",
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: ACCOUNT_ADDRESS_1,
@@ -109,7 +109,7 @@ const mina: CurrenciesData<Transaction> = {
           },
         },
         {
-          name: "Recipient same as source",
+          name: "recipient same as source",
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: ACCOUNT_ADDRESS,
@@ -118,13 +118,13 @@ const mina: CurrenciesData<Transaction> = {
           }),
           expectedStatus: {
             errors: {
-              amount: new InvalidAddressBecauseDestinationIsAlsoSource(),
+              recipient: new InvalidAddressBecauseDestinationIsAlsoSource(),
             },
             warnings: {},
           },
         },
         {
-          name: "New account and sufficient amount",
+          name: "new account and sufficient amount",
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: ACCOUNT_ADDRESS_1,
@@ -154,14 +154,3 @@ describe("Mina bridge", () => {
     "This is an empty test to make jest command pass. Remove it once there is a real test.",
   );
 });
-
-/**
- * NOTE: if tests are added to this file,
- * like done in libs/coin-polkadot/src/bridge.integration.test.ts for example,
- * this file fill need to be imported in ledger-live-common
- * libs/ledger-live-common/src/families/algorand/bridge.integration.test.ts
- * like done for polkadot.
- * cf.
- * - libs/coin-polkadot/src/bridge.integration.test.ts
- * - libs/ledger-live-common/src/families/polkadot/bridge.integration.test.ts
- */
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.ts b/libs/coin-modules/coin-mina/src/synchronisation.ts
index ca1f89cfe414..5a26a821f75c 100644
--- a/libs/coin-modules/coin-mina/src/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/synchronisation.ts
@@ -4,7 +4,7 @@ import type { GetAccountShape } from "@ledgerhq/coin-framework/bridge/jsHelpers"
 import { makeSync, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { getAccount, getTransactions } from "./api";
 import { MinaAccount, MinaOperation } from "./types";
-import { RosettaTransaction } from "./api/rosetta/types";
+import { RosettaTransactionWithDate } from "./api/rosetta/types";
 import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
 import BigNumber from "bignumber.js";
 import { log } from "@ledgerhq/logs";
@@ -13,13 +13,13 @@ import invariant from "invariant";
 const mapRosettaTxnToOperation = (
   accountId: string,
   address: string,
-  txn: RosettaTransaction,
+  txn: RosettaTransactionWithDate,
 ): MinaOperation[] => {
   try {
     const hash = txn.transaction.transaction_identifier.hash;
     const blockHeight = txn.block_identifier.index;
     const blockHash = txn.block_identifier.hash;
-    const date = new Date();
+    const date = txn.date;
     const memo = txn.transaction.metadata?.memo || "";
 
     let value = new BigNumber(0);
@@ -28,7 +28,6 @@ const mapRosettaTxnToOperation = (
     let fromAccount: string = "";
     let toAccount: string = "";
     let isSending = false;
-
     for (const op of txn.transaction.operations) {
       const opValue = new BigNumber(op.amount.value);
       switch (op.type) {
diff --git a/libs/coin-modules/coin-mina/src/testUtils.ts b/libs/coin-modules/coin-mina/src/testUtils.ts
new file mode 100644
index 000000000000..ca5cc97f2208
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/testUtils.ts
@@ -0,0 +1,11 @@
+import { setCoinConfig } from "./config";
+
+export const setConfig = () => {
+  setCoinConfig((): any => {
+    return {
+      infra: {
+        API_MINA_ROSETTA_NODE: "https://mina-rosetta-api-devnet.zondax.dev",
+      },
+    };
+  });
+};
diff --git a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
new file mode 100644
index 000000000000..858e36b1c0a2
--- /dev/null
+++ b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
@@ -0,0 +1,1278 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`mina currency bridge scanAccounts mina seed 1 1`] = `
+[
+  {
+    "balance": "195579800000",
+    "currencyId": "mina",
+    "derivationMode": "minabip44h",
+    "freshAddress": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "freshAddressPath": "44'/12586'/0'/0/0",
+    "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+    "index": 0,
+    "operationsCount": 16,
+    "pendingOperations": [],
+    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "spendableBalance": "195579800000",
+    "swapHistory": [],
+    "syncHash": undefined,
+    "used": true,
+  },
+  {
+    "balance": "98900000000",
+    "currencyId": "mina",
+    "derivationMode": "minabip44h",
+    "freshAddress": "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+    "freshAddressPath": "44'/12586'/1'/0/0",
+    "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+    "index": 1,
+    "operationsCount": 15,
+    "pendingOperations": [],
+    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "spendableBalance": "98900000000",
+    "swapHistory": [],
+    "syncHash": undefined,
+    "used": true,
+  },
+  {
+    "balance": "195579800000",
+    "currencyId": "mina",
+    "derivationMode": "",
+    "freshAddress": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "freshAddressPath": "44'/12586'/0'/0/0",
+    "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+    "index": 0,
+    "operationsCount": 16,
+    "pendingOperations": [],
+    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "spendableBalance": "195579800000",
+    "swapHistory": [],
+    "syncHash": undefined,
+    "used": true,
+  },
+  {
+    "balance": "98900000000",
+    "currencyId": "mina",
+    "derivationMode": "",
+    "freshAddress": "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+    "freshAddressPath": "44'/12586'/1'/0/0",
+    "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+    "index": 1,
+    "operationsCount": 15,
+    "pendingOperations": [],
+    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "spendableBalance": "98900000000",
+    "swapHistory": [],
+    "syncHash": undefined,
+    "used": true,
+  },
+  {
+    "balance": "0",
+    "currencyId": "mina",
+    "derivationMode": "",
+    "freshAddress": "B62qmb35fBGjPqLuEoHB3bBvo849z2pw8B2q3XTp6wvZMLsFA3eb2VG",
+    "freshAddressPath": "44'/12586'/2'/0/0",
+    "id": "js:2:mina:B62qmb35fBGjPqLuEoHB3bBvo849z2pw8B2q3XTp6wvZMLsFA3eb2VG:",
+    "index": 2,
+    "operationsCount": 0,
+    "pendingOperations": [],
+    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "spendableBalance": "0",
+    "swapHistory": [],
+    "syncHash": undefined,
+    "used": false,
+  },
+]
+`;
+
+exports[`mina currency bridge scanAccounts mina seed 1 2`] = `
+[
+  [
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NK8kxUdaFhncqyNSB8LGSExoL9tfRoy1bb1dXwRKJXpbrSLpDJ2",
+      "blockHeight": 312529,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "10100000",
+      "hash": "5Jtcjsomafb3WUhyLZxdVPddbfFjS9BHr9nMBqwDLxBLNdy71MbS",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jtcjsomafb3WUhyLZxdVPddbfFjS9BHr9nMBqwDLxBLNdy71MbS-IN",
+      "recipients": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "senders": [
+        "B62qjnkKCkcee7vVM6YSyuxHKBgzzzUTJHTsv7wmowAfgF3r2Gz7WU2",
+      ],
+      "type": "IN",
+      "value": "298989900000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NLDayajGCAGjXDjqrQyR4FUSNL27VKTYAowa8fRaPQy4izVaY6u",
+      "blockHeight": 325795,
+      "extra": {
+        "memo": "test memo",
+      },
+      "fee": "100000000",
+      "hash": "5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NLqXt1wcEmedu3EwGcmnhTXM4rzab1AoE2vpPHEoPraVnGbPJiz",
+      "blockHeight": 319286,
+      "extra": {
+        "memo": "demo ledger live cli",
+      },
+      "fee": "100000000",
+      "hash": "5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NKvTuZuFQkqP5nYp5cJCKs6Atev7WPxvek2CnWjz9H7TVA7BJi6",
+      "blockHeight": 314890,
+      "extra": {
+        "memo": "test memo from ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "6100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NKtQuHcs3QS9mkgiUwS4wq3unVcLrWXZt5qQRnz3HgS8idB1Gih",
+      "blockHeight": 316209,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "100000000",
+      "hash": "5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NKMgqv1ApEfMe2VA9trdo72q6uDPd2pTnr1BxpsuWVr8Kc2XFhv",
+      "blockHeight": 322808,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "100000000",
+      "hash": "5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NLNht2Sxka6HYByMXGKYFHV6ya2BASun5BMcm49nea3wtDD1dfu",
+      "blockHeight": 326112,
+      "extra": {
+        "memo": "demo ledger live cli",
+      },
+      "fee": "100000000",
+      "hash": "5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NL4K1A8L7qTt425YjRLKmPaYVNJAYL26iMhUrBcbHshh4ZWdM98",
+      "blockHeight": 323476,
+      "extra": {
+        "memo": "testing ledger live mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NL5vk32Bej24S7rY94EN8dQfUvQYnagS8e7R3FBEXdB6bTC5mmB",
+      "blockHeight": 326132,
+      "extra": {
+        "memo": "Mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NLYGCEhNcreLocBnUxHo7iJH9McWFbT8VBbQGbrcoQpi83tg1MY",
+      "blockHeight": 319098,
+      "extra": {
+        "memo": "late night testing",
+      },
+      "fee": "100000000",
+      "hash": "5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NK7AXHuKh3TeJtsZAz9AqNUNHLsPfBMKFjb2ocUoDhSikBAsBS1",
+      "blockHeight": 322816,
+      "extra": {
+        "memo": "Testing on ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NLRkDBfBNHRgoVa9cEEWmYootgmP51sf24cWbCYcFuugCki9tap",
+      "blockHeight": 314891,
+      "extra": {
+        "memo": "test memo from ledger live 2",
+      },
+      "fee": "100000000",
+      "hash": "5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NLPKopb8HJYyJUxLduVTZcBCvH535Fkn9x5KBd6S6gvLeavDaKJ",
+      "blockHeight": 326113,
+      "extra": {
+        "memo": "ttd",
+      },
+      "fee": "100000000",
+      "hash": "5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "15100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NLu4dL4t64ont8GqNaP5YqSR1AGPB2KiQGAajPNnBiSTjX9zEek",
+      "blockHeight": 316210,
+      "extra": {
+        "memo": "sending using ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NKYJ8f4WzPmTpsmz9AZrmibvmA4fjAFTtPvtnqJuzYXJuAhQiM4",
+      "blockHeight": 326313,
+      "extra": {
+        "memo": "Demo ledger live Desktop",
+      },
+      "fee": "100000000",
+      "hash": "5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "42100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+      "blockHash": "3NK7vCvwwf4moGt2wxQrUDTHQU6J9NUSB6cspKCRzxq7uzJXb8MJ",
+      "blockHeight": 326314,
+      "extra": {
+        "memo": "Demo ledger live mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3-IN",
+      "recipients": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "senders": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "type": "IN",
+      "value": "20100000000",
+    },
+  ],
+  [
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NLDayajGCAGjXDjqrQyR4FUSNL27VKTYAowa8fRaPQy4izVaY6u",
+      "blockHeight": 325795,
+      "extra": {
+        "memo": "test memo",
+      },
+      "fee": "100000000",
+      "hash": "5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NLqXt1wcEmedu3EwGcmnhTXM4rzab1AoE2vpPHEoPraVnGbPJiz",
+      "blockHeight": 319286,
+      "extra": {
+        "memo": "demo ledger live cli",
+      },
+      "fee": "100000000",
+      "hash": "5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NKvTuZuFQkqP5nYp5cJCKs6Atev7WPxvek2CnWjz9H7TVA7BJi6",
+      "blockHeight": 314890,
+      "extra": {
+        "memo": "test memo from ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "6100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NKtQuHcs3QS9mkgiUwS4wq3unVcLrWXZt5qQRnz3HgS8idB1Gih",
+      "blockHeight": 316209,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "100000000",
+      "hash": "5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NKMgqv1ApEfMe2VA9trdo72q6uDPd2pTnr1BxpsuWVr8Kc2XFhv",
+      "blockHeight": 322808,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "100000000",
+      "hash": "5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NLNht2Sxka6HYByMXGKYFHV6ya2BASun5BMcm49nea3wtDD1dfu",
+      "blockHeight": 326112,
+      "extra": {
+        "memo": "demo ledger live cli",
+      },
+      "fee": "100000000",
+      "hash": "5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NL4K1A8L7qTt425YjRLKmPaYVNJAYL26iMhUrBcbHshh4ZWdM98",
+      "blockHeight": 323476,
+      "extra": {
+        "memo": "testing ledger live mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NL5vk32Bej24S7rY94EN8dQfUvQYnagS8e7R3FBEXdB6bTC5mmB",
+      "blockHeight": 326132,
+      "extra": {
+        "memo": "Mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NLYGCEhNcreLocBnUxHo7iJH9McWFbT8VBbQGbrcoQpi83tg1MY",
+      "blockHeight": 319098,
+      "extra": {
+        "memo": "late night testing",
+      },
+      "fee": "100000000",
+      "hash": "5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NK7AXHuKh3TeJtsZAz9AqNUNHLsPfBMKFjb2ocUoDhSikBAsBS1",
+      "blockHeight": 322816,
+      "extra": {
+        "memo": "Testing on ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NLRkDBfBNHRgoVa9cEEWmYootgmP51sf24cWbCYcFuugCki9tap",
+      "blockHeight": 314891,
+      "extra": {
+        "memo": "test memo from ledger live 2",
+      },
+      "fee": "100000000",
+      "hash": "5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NLPKopb8HJYyJUxLduVTZcBCvH535Fkn9x5KBd6S6gvLeavDaKJ",
+      "blockHeight": 326113,
+      "extra": {
+        "memo": "ttd",
+      },
+      "fee": "100000000",
+      "hash": "5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "15100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NLu4dL4t64ont8GqNaP5YqSR1AGPB2KiQGAajPNnBiSTjX9zEek",
+      "blockHeight": 316210,
+      "extra": {
+        "memo": "sending using ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NKYJ8f4WzPmTpsmz9AZrmibvmA4fjAFTtPvtnqJuzYXJuAhQiM4",
+      "blockHeight": 326313,
+      "extra": {
+        "memo": "Demo ledger live Desktop",
+      },
+      "fee": "100000000",
+      "hash": "5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "42100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
+      "blockHash": "3NK7vCvwwf4moGt2wxQrUDTHQU6J9NUSB6cspKCRzxq7uzJXb8MJ",
+      "blockHeight": 326314,
+      "extra": {
+        "memo": "Demo ledger live mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3-OUT",
+      "recipients": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "senders": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "type": "OUT",
+      "value": "20100000000",
+    },
+  ],
+  [
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NK8kxUdaFhncqyNSB8LGSExoL9tfRoy1bb1dXwRKJXpbrSLpDJ2",
+      "blockHeight": 312529,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "10100000",
+      "hash": "5Jtcjsomafb3WUhyLZxdVPddbfFjS9BHr9nMBqwDLxBLNdy71MbS",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5Jtcjsomafb3WUhyLZxdVPddbfFjS9BHr9nMBqwDLxBLNdy71MbS-IN",
+      "recipients": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "senders": [
+        "B62qjnkKCkcee7vVM6YSyuxHKBgzzzUTJHTsv7wmowAfgF3r2Gz7WU2",
+      ],
+      "type": "IN",
+      "value": "298989900000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NLDayajGCAGjXDjqrQyR4FUSNL27VKTYAowa8fRaPQy4izVaY6u",
+      "blockHeight": 325795,
+      "extra": {
+        "memo": "test memo",
+      },
+      "fee": "100000000",
+      "hash": "5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NLqXt1wcEmedu3EwGcmnhTXM4rzab1AoE2vpPHEoPraVnGbPJiz",
+      "blockHeight": 319286,
+      "extra": {
+        "memo": "demo ledger live cli",
+      },
+      "fee": "100000000",
+      "hash": "5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NKvTuZuFQkqP5nYp5cJCKs6Atev7WPxvek2CnWjz9H7TVA7BJi6",
+      "blockHeight": 314890,
+      "extra": {
+        "memo": "test memo from ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "6100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NKtQuHcs3QS9mkgiUwS4wq3unVcLrWXZt5qQRnz3HgS8idB1Gih",
+      "blockHeight": 316209,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "100000000",
+      "hash": "5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NKMgqv1ApEfMe2VA9trdo72q6uDPd2pTnr1BxpsuWVr8Kc2XFhv",
+      "blockHeight": 322808,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "100000000",
+      "hash": "5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NLNht2Sxka6HYByMXGKYFHV6ya2BASun5BMcm49nea3wtDD1dfu",
+      "blockHeight": 326112,
+      "extra": {
+        "memo": "demo ledger live cli",
+      },
+      "fee": "100000000",
+      "hash": "5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NL4K1A8L7qTt425YjRLKmPaYVNJAYL26iMhUrBcbHshh4ZWdM98",
+      "blockHeight": 323476,
+      "extra": {
+        "memo": "testing ledger live mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NL5vk32Bej24S7rY94EN8dQfUvQYnagS8e7R3FBEXdB6bTC5mmB",
+      "blockHeight": 326132,
+      "extra": {
+        "memo": "Mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NLYGCEhNcreLocBnUxHo7iJH9McWFbT8VBbQGbrcoQpi83tg1MY",
+      "blockHeight": 319098,
+      "extra": {
+        "memo": "late night testing",
+      },
+      "fee": "100000000",
+      "hash": "5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NK7AXHuKh3TeJtsZAz9AqNUNHLsPfBMKFjb2ocUoDhSikBAsBS1",
+      "blockHeight": 322816,
+      "extra": {
+        "memo": "Testing on ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NLRkDBfBNHRgoVa9cEEWmYootgmP51sf24cWbCYcFuugCki9tap",
+      "blockHeight": 314891,
+      "extra": {
+        "memo": "test memo from ledger live 2",
+      },
+      "fee": "100000000",
+      "hash": "5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NLPKopb8HJYyJUxLduVTZcBCvH535Fkn9x5KBd6S6gvLeavDaKJ",
+      "blockHeight": 326113,
+      "extra": {
+        "memo": "ttd",
+      },
+      "fee": "100000000",
+      "hash": "5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "15100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NLu4dL4t64ont8GqNaP5YqSR1AGPB2KiQGAajPNnBiSTjX9zEek",
+      "blockHeight": 316210,
+      "extra": {
+        "memo": "sending using ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NKYJ8f4WzPmTpsmz9AZrmibvmA4fjAFTtPvtnqJuzYXJuAhQiM4",
+      "blockHeight": 326313,
+      "extra": {
+        "memo": "Demo ledger live Desktop",
+      },
+      "fee": "100000000",
+      "hash": "5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg-OUT",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "OUT",
+      "value": "42100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
+      "blockHash": "3NK7vCvwwf4moGt2wxQrUDTHQU6J9NUSB6cspKCRzxq7uzJXb8MJ",
+      "blockHeight": 326314,
+      "extra": {
+        "memo": "Demo ledger live mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3-IN",
+      "recipients": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "senders": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "type": "IN",
+      "value": "20100000000",
+    },
+  ],
+  [
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NLDayajGCAGjXDjqrQyR4FUSNL27VKTYAowa8fRaPQy4izVaY6u",
+      "blockHeight": 325795,
+      "extra": {
+        "memo": "test memo",
+      },
+      "fee": "100000000",
+      "hash": "5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NLqXt1wcEmedu3EwGcmnhTXM4rzab1AoE2vpPHEoPraVnGbPJiz",
+      "blockHeight": 319286,
+      "extra": {
+        "memo": "demo ledger live cli",
+      },
+      "fee": "100000000",
+      "hash": "5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NKvTuZuFQkqP5nYp5cJCKs6Atev7WPxvek2CnWjz9H7TVA7BJi6",
+      "blockHeight": 314890,
+      "extra": {
+        "memo": "test memo from ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "6100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NKtQuHcs3QS9mkgiUwS4wq3unVcLrWXZt5qQRnz3HgS8idB1Gih",
+      "blockHeight": 316209,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "100000000",
+      "hash": "5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NKMgqv1ApEfMe2VA9trdo72q6uDPd2pTnr1BxpsuWVr8Kc2XFhv",
+      "blockHeight": 322808,
+      "extra": {
+        "memo": "",
+      },
+      "fee": "100000000",
+      "hash": "5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NLNht2Sxka6HYByMXGKYFHV6ya2BASun5BMcm49nea3wtDD1dfu",
+      "blockHeight": 326112,
+      "extra": {
+        "memo": "demo ledger live cli",
+      },
+      "fee": "100000000",
+      "hash": "5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NL4K1A8L7qTt425YjRLKmPaYVNJAYL26iMhUrBcbHshh4ZWdM98",
+      "blockHeight": 323476,
+      "extra": {
+        "memo": "testing ledger live mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NL5vk32Bej24S7rY94EN8dQfUvQYnagS8e7R3FBEXdB6bTC5mmB",
+      "blockHeight": 326132,
+      "extra": {
+        "memo": "Mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NLYGCEhNcreLocBnUxHo7iJH9McWFbT8VBbQGbrcoQpi83tg1MY",
+      "blockHeight": 319098,
+      "extra": {
+        "memo": "late night testing",
+      },
+      "fee": "100000000",
+      "hash": "5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NK7AXHuKh3TeJtsZAz9AqNUNHLsPfBMKFjb2ocUoDhSikBAsBS1",
+      "blockHeight": 322816,
+      "extra": {
+        "memo": "Testing on ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "10100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NLRkDBfBNHRgoVa9cEEWmYootgmP51sf24cWbCYcFuugCki9tap",
+      "blockHeight": 314891,
+      "extra": {
+        "memo": "test memo from ledger live 2",
+      },
+      "fee": "100000000",
+      "hash": "5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "5100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NLPKopb8HJYyJUxLduVTZcBCvH535Fkn9x5KBd6S6gvLeavDaKJ",
+      "blockHeight": 326113,
+      "extra": {
+        "memo": "ttd",
+      },
+      "fee": "100000000",
+      "hash": "5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "15100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NLu4dL4t64ont8GqNaP5YqSR1AGPB2KiQGAajPNnBiSTjX9zEek",
+      "blockHeight": 316210,
+      "extra": {
+        "memo": "sending using ledger live",
+      },
+      "fee": "100000000",
+      "hash": "5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "2100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NKYJ8f4WzPmTpsmz9AZrmibvmA4fjAFTtPvtnqJuzYXJuAhQiM4",
+      "blockHeight": 326313,
+      "extra": {
+        "memo": "Demo ledger live Desktop",
+      },
+      "fee": "100000000",
+      "hash": "5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg-IN",
+      "recipients": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "42100000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
+      "blockHash": "3NK7vCvwwf4moGt2wxQrUDTHQU6J9NUSB6cspKCRzxq7uzJXb8MJ",
+      "blockHeight": 326314,
+      "extra": {
+        "memo": "Demo ledger live mobile",
+      },
+      "fee": "100000000",
+      "hash": "5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3-OUT",
+      "recipients": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "senders": [
+        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+      ],
+      "type": "OUT",
+      "value": "20100000000",
+    },
+  ],
+  [],
+]
+`;
diff --git a/libs/ui/packages/crypto-icons/src/svg/MINA.svg b/libs/ui/packages/crypto-icons/src/svg/MINA.svg
index 914704eb7ba8..46d51d90dbf5 100644
--- a/libs/ui/packages/crypto-icons/src/svg/MINA.svg
+++ b/libs/ui/packages/crypto-icons/src/svg/MINA.svg
@@ -3,28 +3,10 @@
   <defs>
     <style>
       .cls-1 {
-        fill: none;
-      }
-
-      .cls-1, .cls-2, .cls-3, .cls-4 {
-        stroke-width: 0px;
-      }
-
-      .cls-2 {
-        fill: #2d2d2d;
-      }
-
-      .cls-3 {
-        fill-rule: evenodd;
-      }
-
-      .cls-3, .cls-4 {
         fill: #fff;
+        stroke-width: 0px;
       }
     </style>
   </defs>
-  <path class="cls-1" d="M12,20.4c-.6,0-1.2-.5-1.3-1.1v-1.1c-1.5-.4-2.3-1.4-2.5-3l-1.2-9.3c-.3,0-.5,0-.8,0-.4,0-.8,0-1.1.1v14.1h-2.4v-11.4c0-1.5.7-2.6,2-3.1v-.7c0-.8.5-1.4,1.3-1.4s1.2.5,1.4,1.3v.7c1.5.4,2.3,1.5,2.5,3.3l1.1,9c.7.1,1.4.1,2,0l1.1-9c.2-1.8,1-2.9,2.4-3.3v-.7c.2-.9.7-1.3,1.5-1.3s1.3.6,1.3,1.4v.7c1.3.5,2,1.5,2,3.1v11.4h-2.4V6c-.4-.1-.8-.2-1.1-.1-.3,0-.5,0-.8,0l-1.2,9.3c-.2,1.6-1,2.6-2.3,3v1.1c-.2.7-.7,1.1-1.4,1.1ZM11,18.3v1c.2.4.5.8,1,.7.4,0,.8-.3.8-.7,0,0,0,0,0,0v-1c-.5.1-1.2.1-1.8,0h0ZM19.3,19.7h1.5v-10.9c0-1.3-.5-2.2-1.5-2.6v13.6ZM3.2,19.7h1.5V6.2c-1,.4-1.5,1.3-1.5,2.6v10.9ZM7.5,6.1l1.2,9.1c.2,1.3.8,2.2,1.9,2.6l-1.1-8.8c-.2-1.6-.8-2.5-1.9-2.9ZM16.5,6.1c-1.1.4-1.7,1.3-1.9,2.9l-1.1,8.8c1.1-.4,1.7-1.2,1.9-2.6l1.2-9.1ZM5.1,5.6h0c.4,0,.8-.1,1.1-.1.2,0,.5,0,.7,0v-.5c-.2-.6-.5-1-1-1s-.9.4-.9,1v.6ZM17.7,5.4c.4,0,.8,0,1.1.1v-.6c0-.6-.3-1-.9-1s-.9.3-.9,1v.5c.2,0,.4,0,.7,0h0Z"/>
-  <path class="cls-3" d="M12,20.4c-4.7,0-8.4-3.8-8.4-8.4S7.3,3.6,12,3.6s8.4,3.8,8.4,8.4-3.8,8.4-8.4,8.4ZM12,19.9c4.4,0,7.9-3.6,7.9-7.9s-3.6-7.9-7.9-7.9-7.9,3.6-7.9,7.9,3.6,7.9,7.9,7.9Z"/>
-  <path class="cls-4" d="M10.6,18.1c.2,0,.9-.6,1.6-1.2.9-.7,1.7-1.5,2.5-2.3.8-.8,1.1-1.1,1.1-1.3.2-.6-1.7-7.2-2-7.3-.2,0-2.2,1.6-4,3.4-1,1-1.3,1.4-1.4,1.6,0,.2,0,.6.2,1.1.4,2,1.3,4.9,1.7,5.8.2.4.2.4.4.3h0Z"/>
-  <path class="cls-2" d="M12,20.4c-.6,0-1.2-.5-1.3-1.1v-1.1c-1.5-.4-2.3-1.4-2.5-3l-1.2-9.3c-.3,0-.5,0-.8,0-.4,0-.8,0-1.1.1v14.1h-2.4v-11.4c0-1.5.7-2.6,2-3.1v-.7c0-.8.5-1.4,1.3-1.4s1.2.5,1.4,1.3v.7c1.5.4,2.3,1.5,2.5,3.3l1.1,9c.7.1,1.4.1,2,0l1.1-9c.2-1.8,1-2.9,2.4-3.3v-.7c.2-.9.7-1.3,1.5-1.3s1.3.6,1.3,1.4v.7c1.3.5,2,1.5,2,3.1v11.4h-2.4V6c-.4-.1-.8-.2-1.1-.1-.3,0-.5,0-.8,0l-1.2,9.3c-.2,1.6-1,2.6-2.3,3v1.1c-.2.7-.7,1.1-1.4,1.1ZM11,18.3v1c.2.4.5.8,1,.7.4,0,.8-.3.8-.7,0,0,0,0,0,0v-1c-.5.1-1.2.1-1.8,0h0ZM19.3,19.7h1.5v-10.9c0-1.3-.5-2.2-1.5-2.6v13.6ZM3.2,19.7h1.5V6.2c-1,.4-1.5,1.3-1.5,2.6v10.9ZM7.5,6.1l1.2,9.1c.2,1.3.8,2.2,1.9,2.6l-1.1-8.8c-.2-1.6-.8-2.5-1.9-2.9ZM16.5,6.1c-1.1.4-1.7,1.3-1.9,2.9l-1.1,8.8c1.1-.4,1.7-1.2,1.9-2.6l1.2-9.1ZM5.1,5.6h0c.4,0,.8-.1,1.1-.1.2,0,.5,0,.7,0v-.5c-.2-.6-.5-1-1-1s-.9.4-.9,1v.6ZM17.7,5.4c.4,0,.8,0,1.1.1v-.6c0-.6-.3-1-.9-1s-.9.3-.9,1v.5c.2,0,.4,0,.7,0h0Z"/>
+  <path class="cls-1" d="M12,20.5c-.7,0-1.2-.5-1.3-1.1v-1.1c-1.5-.4-2.3-1.4-2.5-3l-1.2-9.4c-.3,0-.5,0-.8,0-.4,0-.8,0-1.2.2v14.2h-2.4v-11.5c0-1.6.7-2.7,2-3.1v-.7c0-.9.5-1.4,1.3-1.4s1.3.5,1.4,1.4v.7c1.5.4,2.3,1.5,2.5,3.3l1.1,9.1c.7.1,1.4.1,2,0l1.1-9.1c.2-1.8,1.1-2.9,2.4-3.3v-.7c.2-.9.7-1.4,1.5-1.4s1.3.6,1.3,1.4v.7c1.3.5,2,1.6,2,3.1v11.5h-2.4V6c-.4-.1-.8-.2-1.2-.2-.3,0-.5,0-.8,0l-1.2,9.4c-.2,1.6-1,2.6-2.4,3v1.1c-.2.7-.7,1.2-1.4,1.1ZM11,18.4v1c.2.4.5.8,1,.7.4,0,.8-.3.8-.7,0,0,0,0,0,0v-1c-.5.1-1.2.1-1.8,0h0ZM19.4,19.8h1.5v-11c0-1.3-.5-2.2-1.5-2.6v13.7ZM3.1,19.8h1.5V6.1c-1,.4-1.5,1.3-1.5,2.6v11ZM7.5,6l1.2,9.2c.2,1.3.8,2.2,1.9,2.6l-1.1-8.9c-.2-1.6-.8-2.5-2-2.9ZM16.5,6c-1.1.4-1.8,1.3-2,2.9l-1.1,8.9c1.1-.4,1.7-1.2,1.9-2.6l1.2-9.2ZM5.1,5.5h0c.4,0,.8-.1,1.2-.1.2,0,.5,0,.7,0v-.5c-.2-.7-.5-1-1-1s-.9.4-.9,1v.6ZM17.8,5.4c.4,0,.8,0,1.2.1v-.6c0-.6-.3-1-.9-1s-.9.3-1,1v.5c.2,0,.4,0,.7,0h0Z"/>
 </svg>
\ No newline at end of file

From c068f8cffb1c7eda1024bc7f0601da77e2e7104a Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Tue, 30 Jul 2024 14:19:57 +0200
Subject: [PATCH 14/63] test(mina): add bot tests specs

---
 libs/coin-modules/coin-mina/src/specs.ts      | 125 ++++++++++++++++++
 .../coin-mina/src/speculos-deviceActions.ts   |  62 +++++++++
 .../ledger-live-common/src/generated/specs.ts |   6 +
 3 files changed, 193 insertions(+)
 create mode 100644 libs/coin-modules/coin-mina/src/specs.ts
 create mode 100644 libs/coin-modules/coin-mina/src/speculos-deviceActions.ts

diff --git a/libs/coin-modules/coin-mina/src/specs.ts b/libs/coin-modules/coin-mina/src/specs.ts
new file mode 100644
index 000000000000..c63351769748
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/specs.ts
@@ -0,0 +1,125 @@
+import invariant from "invariant";
+import { DeviceModelId } from "@ledgerhq/devices";
+import BigNumber from "bignumber.js";
+import expect from "expect";
+
+import type { Transaction } from "./types";
+import { genericTestDestination, pickSiblings, botTest } from "@ledgerhq/coin-framework/bot/specs";
+import type { AppSpec } from "@ledgerhq/coin-framework/bot/types";
+import { acceptTransaction } from "./speculos-deviceActions";
+import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/index";
+// import {} from "./consts";
+
+const maxAccount = 6;
+const MIN_SAFE = new BigNumber(10);
+
+const minaSpecs: AppSpec<Transaction> = {
+  name: "Mina",
+  currency: getCryptoCurrencyById("mina"),
+  appQuery: {
+    model: DeviceModelId.nanoSP,
+    appName: "Mina",
+  },
+  genericDeviceAction: acceptTransaction,
+  testTimeout: 15 * 60 * 1000,
+  minViableAmount: MIN_SAFE,
+  transactionCheck: ({ maxSpendable }) => {
+    invariant(maxSpendable.gt(MIN_SAFE), "balance is too low");
+  },
+  mutations: [
+    {
+      name: "Send ~50%",
+      maxRun: 1,
+      testDestination: genericTestDestination,
+      transaction: ({ account, siblings, bridge, maxSpendable }) => {
+        invariant(maxSpendable.gt(MIN_SAFE), "balance is too low");
+        const sibling = pickSiblings(siblings, maxAccount);
+        const recipient = sibling.freshAddress;
+        const amount = maxSpendable.div(2).integerValue();
+
+        const transaction = bridge.createTransaction(account);
+        const updates: Array<Partial<Transaction>> = [
+          {
+            recipient,
+          },
+          { amount },
+        ];
+
+        // if (Math.random() < 0.5) {
+        //   updates.push({
+        //     transferId: getRandomTransferID(),
+        //   });
+        // }
+
+        return {
+          transaction,
+          updates,
+        };
+      },
+
+      test: ({ accountBeforeTransaction, operation, account }) => {
+        botTest("account spendable balance decreased with operation", () =>
+          expect(account.spendableBalance).toEqual(
+            accountBeforeTransaction.spendableBalance.minus(operation.value),
+          ),
+        );
+
+        // if (transaction.transferId) {
+        //   botTest("operation transferId", () =>
+        //     expect(operation.extra).toMatchObject({
+        //       transferId: transaction.transferId,
+        //     }),
+        //   );
+        // }
+      },
+    },
+    // {
+    //   name: "Transfer Max",
+    //   maxRun: 1,
+    //   transaction: ({ account, siblings, bridge }) => {
+    //     const updates: Array<Partial<Transaction>> = [
+    //       {
+    //         recipient: pickSiblings(siblings, maxAccount).freshAddress,
+    //       },
+    //       {
+    //         useAllAmount: true,
+    //       },
+    //     ];
+
+    //     // if (Math.random() < 0.5) {
+    //     //   updates.push({
+    //     //     transferId: getRandomTransferID(),
+    //     //   });
+    //     // }
+
+    //     return {
+    //       transaction: bridge.createTransaction(account),
+    //       updates,
+    //     };
+    //   },
+    //   expectStatusWarnings: _ => {
+    //     return {
+    //       amount: MayBlockAccountError,
+    //     };
+    //   },
+    //   testDestination: genericTestDestination,
+    //   test: ({ account }) => {
+    //     botTest("account spendable balance is zero", () =>
+    //       expect(account.spendableBalance.toString()).toBe("0"),
+    //     );
+
+    //     // if (transaction.transferId) {
+    //     //   botTest("operation transferId", () =>
+    //     //     expect(operation.extra).toMatchObject({
+    //     //       transferId: transaction.transferId,
+    //     //     }),
+    //     //   );
+    //     // }
+    //   },
+    // },
+  ],
+};
+
+export default {
+  minaSpecs,
+};
diff --git a/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts b/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
new file mode 100644
index 000000000000..eb3a19dd5622
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
@@ -0,0 +1,62 @@
+import type { DeviceAction } from "@ledgerhq/coin-framework/bot/types";
+import type { Transaction } from "./types";
+import { deviceActionFlow, SpeculosButton } from "@ledgerhq/coin-framework/bot/specs";
+
+export const acceptTransaction: DeviceAction<Transaction, any> = deviceActionFlow({
+  steps: [
+    {
+      title: "Get",
+      button: SpeculosButton.RIGHT,
+    },
+    {
+      title: "Path",
+      button: SpeculosButton.RIGHT,
+    },
+    {
+      title: "Generate",
+      button: SpeculosButton.BOTH,
+    },
+    {
+      title: "Address",
+      button: SpeculosButton.BOTH,
+    },
+    {
+      title: "Approve",
+      button: SpeculosButton.BOTH,
+    },
+    {
+      title: "Type",
+      button: SpeculosButton.RIGHT,
+      expectedValue: () => "Token transfer",
+    },
+    {
+      title: "Chain ID",
+      button: SpeculosButton.RIGHT,
+      expectedValue: () => "casper",
+    },
+    {
+      title: "Account",
+      button: SpeculosButton.RIGHT,
+      expectedValue: ({ account }) => account.freshAddress,
+    },
+    {
+      title: "Fee",
+      button: SpeculosButton.RIGHT,
+      expectedValue: ({ transaction }) => `${transaction.fees.toNumber()} mina`,
+    },
+    {
+      title: "Target",
+      button: SpeculosButton.RIGHT,
+      expectedValue: ({ transaction }) => transaction.recipient,
+    },
+    {
+      title: "Amount",
+      button: SpeculosButton.RIGHT,
+      expectedValue: ({ status }) => `${status.amount.toNumber()} mina`,
+    },
+    {
+      title: "APPROVE",
+      button: SpeculosButton.BOTH,
+    },
+  ],
+});
diff --git a/libs/ledger-live-common/src/generated/specs.ts b/libs/ledger-live-common/src/generated/specs.ts
index 0ff0028e1466..8eaf435f5d79 100644
--- a/libs/ledger-live-common/src/generated/specs.ts
+++ b/libs/ledger-live-common/src/generated/specs.ts
@@ -21,6 +21,9 @@ import ton from "@ledgerhq/coin-ton/specs";
 import tron from "@ledgerhq/coin-tron/specs";
 import vechain from "@ledgerhq/coin-vechain/specs";
 import xrp from "@ledgerhq/coin-xrp/specs";
+import icon from "@ledgerhq/coin-icon/specs";
+import ton from "@ledgerhq/coin-ton/specs";
+import mina from "@ledgerhq/coin-mina/specs";
 
 export default {
   celo,
@@ -46,4 +49,7 @@ export default {
   tron,
   vechain,
   xrp,
+  icon,
+  ton,
+  mina,
 };

From 4dbbb2a4ef2789b4a9061a35311c8cf83d4a9e17 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Sun, 18 Aug 2024 19:41:34 +0200
Subject: [PATCH 15/63] refac(mina): finalize mainnet usage

---
 .../coin-mina/src/api/api.unit.test.ts        |    2 +-
 libs/coin-modules/coin-mina/src/api/index.ts  |   22 +-
 .../coin-mina/src/api/rosetta/index.ts        |   12 +-
 .../coin-mina/src/api/rosetta/types.ts        |    5 +-
 .../coin-mina/src/buildTransaction.ts         |    4 +-
 libs/coin-modules/coin-mina/src/consts.ts     |    4 +-
 .../coin-mina/src/synchronisation.ts          |    9 +-
 .../bridge.integration.test.ts.snap           | 1215 +----------------
 .../src/families/mina/config.ts               |    2 +-
 .../packages/cryptoassets/src/currencies.ts   |    4 +-
 10 files changed, 47 insertions(+), 1232 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/api/api.unit.test.ts b/libs/coin-modules/coin-mina/src/api/api.unit.test.ts
index d54ce45bf990..bda073136bc9 100644
--- a/libs/coin-modules/coin-mina/src/api/api.unit.test.ts
+++ b/libs/coin-modules/coin-mina/src/api/api.unit.test.ts
@@ -39,7 +39,7 @@ test(
       const transactions = await getTransactions(address);
       expect(transactions).toBeDefined();
       expect(transactions.length).toBeGreaterThan(0);
-      expect(transactions[0].date).toBeDefined();
+      expect(transactions[0].timestamp).toBeDefined();
     }
   },
   60 * 1000,
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index ff8e0840c7de..fd66d984fda1 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -3,14 +3,13 @@ import { MinaAPIAccount, MinaSignedTransaction, Transaction } from "../types";
 import {
   fetchAccountBalance,
   fetchAccountTransactions,
-  fetchBlockInfo,
   fetchNetworkStatus,
   fetchTransactionMetadata,
   rosettaSubmitTransaction,
 } from "./rosetta";
-import { RosettaTransactionWithDate } from "./rosetta/types";
 import { MINA_TOKEN_ID } from "../consts";
 import { isValidAddress } from "../logic";
+import { RosettaTransaction } from "./rosetta/types";
 
 export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
   const networkStatus = await fetchNetworkStatus();
@@ -31,22 +30,9 @@ export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
   };
 };
 
-export const getTransactions = async (address: string): Promise<RosettaTransactionWithDate[]> => {
-  const res = await fetchAccountTransactions(address);
-
-  const txns: RosettaTransactionWithDate[] = [];
-  for (const txn of res.transactions) {
-    const date = await getBlockDate(txn.block_identifier.hash);
-    txns.push({ ...txn, date: date });
-  }
-
-  return txns;
-};
-
-export const getBlockDate = async (hash: string): Promise<Date> => {
-  const res = await fetchBlockInfo(hash);
-
-  return new Date(res.block.timestamp);
+export const getTransactions = async (address: string): Promise<RosettaTransaction[]> => {
+  const txns = await fetchAccountTransactions(address);
+  return txns.transactions.sort((a, b) => b.timestamp - a.timestamp);
 };
 
 export const broadcastTransaction = async (txn: MinaSignedTransaction): Promise<string> => {
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
index 74126bac9bed..c4d08234509d 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
@@ -40,7 +40,7 @@ export const fetchAccountTransactions = async (address: string) => {
   const { data } = await network<FetchAccountTransactionsResponse>({
     method: "POST",
     url: getRosettaUrl("/search/transactions"),
-    data: addNetworkIdentifier(buildAccountIdentifier(address)),
+    data: { ...addNetworkIdentifier(buildAccountIdentifier(address)), include_timestamp: true },
   });
 
   return data;
@@ -79,13 +79,3 @@ export const rosettaSubmitTransaction = async (blob: string) => {
     data: addNetworkIdentifier({ signed_transaction: blob }),
   });
 };
-
-export const fetchBlockInfo = async (hash: string) => {
-  const res = await network<RosettaBlockInfoResponse>({
-    method: "POST",
-    url: getRosettaUrl("/block"),
-    data: addNetworkIdentifier({ block_identifier: { hash } }),
-  });
-
-  return res.data;
-};
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
index d35c0946d01c..eec9152183e0 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
@@ -45,10 +45,6 @@ export type FetchAccountBalanceResponse = {
   };
 };
 
-export type RosettaTransactionWithDate = RosettaTransaction & {
-  date: Date;
-};
-
 export type RosettaTransaction = {
   block_identifier: {
     index: number;
@@ -90,6 +86,7 @@ export type RosettaTransaction = {
       memo: string;
     };
   };
+  timestamp: number;
 };
 
 export type FetchAccountTransactionsResponse = {
diff --git a/libs/coin-modules/coin-mina/src/buildTransaction.ts b/libs/coin-modules/coin-mina/src/buildTransaction.ts
index 479b3563a9d5..c5cf3f5405c6 100644
--- a/libs/coin-modules/coin-mina/src/buildTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/buildTransaction.ts
@@ -1,7 +1,7 @@
 import { log } from "@ledgerhq/logs";
 import type { Account } from "@ledgerhq/types-live";
 import type { MinaUnsignedTransaction, Transaction } from "./types";
-import { MINA_DEVNET_NETWORK_ID, MINA_PAYMENT_TYPE_ID } from "./consts";
+import { MINA_MAINNET_NETWORK_ID, MINA_PAYMENT_TYPE_ID } from "./consts";
 import { getAccountNumFromPath } from "./logic";
 import { getNonce } from "./api";
 import BigNumber from "bignumber.js";
@@ -25,7 +25,7 @@ export const buildTransaction = async (
       fee: t.fees.toNumber(),
       nonce: BigNumber(nonce).toNumber(),
       memo: t.memo ?? "",
-      networkId: MINA_DEVNET_NETWORK_ID,
+      networkId: MINA_MAINNET_NETWORK_ID,
     };
   } catch (e) {
     log("error", "mina: error building transaction", {
diff --git a/libs/coin-modules/coin-mina/src/consts.ts b/libs/coin-modules/coin-mina/src/consts.ts
index 1f0ecc13df52..0a3968dabeb3 100644
--- a/libs/coin-modules/coin-mina/src/consts.ts
+++ b/libs/coin-modules/coin-mina/src/consts.ts
@@ -1,11 +1,11 @@
 export const TESTNET_NETWORK_IDENTIFIER = {
   network_identifier: {
     blockchain: "mina",
-    network: "testnet",
+    network: "mainnet",
   },
 };
 
-export const MINA_DEVNET_NETWORK_ID = 0;
+export const MINA_MAINNET_NETWORK_ID = 1;
 export const MINA_PAYMENT_TYPE_ID = 0;
 export const MINA_TOKEN_ID = "wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf";
 export const MINA_DECIMALS = 9;
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.ts b/libs/coin-modules/coin-mina/src/synchronisation.ts
index 5a26a821f75c..14aceaa571a2 100644
--- a/libs/coin-modules/coin-mina/src/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/synchronisation.ts
@@ -4,22 +4,22 @@ import type { GetAccountShape } from "@ledgerhq/coin-framework/bridge/jsHelpers"
 import { makeSync, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { getAccount, getTransactions } from "./api";
 import { MinaAccount, MinaOperation } from "./types";
-import { RosettaTransactionWithDate } from "./api/rosetta/types";
 import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
 import BigNumber from "bignumber.js";
 import { log } from "@ledgerhq/logs";
 import invariant from "invariant";
+import { RosettaTransaction } from "./api/rosetta/types";
 
 const mapRosettaTxnToOperation = (
   accountId: string,
   address: string,
-  txn: RosettaTransactionWithDate,
+  txn: RosettaTransaction,
 ): MinaOperation[] => {
   try {
     const hash = txn.transaction.transaction_identifier.hash;
     const blockHeight = txn.block_identifier.index;
     const blockHash = txn.block_identifier.hash;
-    const date = txn.date;
+    const date = new Date(txn.timestamp);
     const memo = txn.transaction.metadata?.memo || "";
 
     let value = new BigNumber(0);
@@ -33,7 +33,6 @@ const mapRosettaTxnToOperation = (
       switch (op.type) {
         case "fee_payment": {
           fee = fee.plus(opValue.times(-1));
-          value = value.plus(fee);
           continue;
         }
         case "payment_receiver_inc": {
@@ -49,7 +48,7 @@ const mapRosettaTxnToOperation = (
           continue;
         }
         case "account_creation_fee_via_payment": {
-          value = value.plus(opValue.times(-1));
+          fee = fee.plus(opValue.times(-1));
           continue;
         }
       }
diff --git a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
index 858e36b1c0a2..2d8198eee293 100644
--- a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
+++ b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
@@ -3,65 +3,33 @@
 exports[`mina currency bridge scanAccounts mina seed 1 1`] = `
 [
   {
-    "balance": "195579800000",
+    "balance": "17998250000",
     "currencyId": "mina",
     "derivationMode": "minabip44h",
     "freshAddress": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
     "freshAddressPath": "44'/12586'/0'/0/0",
     "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
     "index": 0,
-    "operationsCount": 16,
+    "operationsCount": 2,
     "pendingOperations": [],
     "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-    "spendableBalance": "195579800000",
+    "spendableBalance": "17998250000",
     "swapHistory": [],
     "syncHash": undefined,
     "used": true,
   },
   {
-    "balance": "98900000000",
+    "balance": "0",
     "currencyId": "mina",
     "derivationMode": "minabip44h",
     "freshAddress": "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
     "freshAddressPath": "44'/12586'/1'/0/0",
     "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
     "index": 1,
-    "operationsCount": 15,
-    "pendingOperations": [],
-    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-    "spendableBalance": "98900000000",
-    "swapHistory": [],
-    "syncHash": undefined,
-    "used": true,
-  },
-  {
-    "balance": "195579800000",
-    "currencyId": "mina",
-    "derivationMode": "",
-    "freshAddress": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-    "freshAddressPath": "44'/12586'/0'/0/0",
-    "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-    "index": 0,
-    "operationsCount": 16,
-    "pendingOperations": [],
-    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-    "spendableBalance": "195579800000",
-    "swapHistory": [],
-    "syncHash": undefined,
-    "used": true,
-  },
-  {
-    "balance": "98900000000",
-    "currencyId": "mina",
-    "derivationMode": "",
-    "freshAddress": "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-    "freshAddressPath": "44'/12586'/1'/0/0",
-    "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-    "index": 1,
-    "operationsCount": 15,
+    "operationsCount": 1,
     "pendingOperations": [],
     "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-    "spendableBalance": "98900000000",
+    "spendableBalance": "0",
     "swapHistory": [],
     "syncHash": undefined,
     "used": true,
@@ -69,10 +37,10 @@ exports[`mina currency bridge scanAccounts mina seed 1 1`] = `
   {
     "balance": "0",
     "currencyId": "mina",
-    "derivationMode": "",
+    "derivationMode": "minabip44h",
     "freshAddress": "B62qmb35fBGjPqLuEoHB3bBvo849z2pw8B2q3XTp6wvZMLsFA3eb2VG",
     "freshAddressPath": "44'/12586'/2'/0/0",
-    "id": "js:2:mina:B62qmb35fBGjPqLuEoHB3bBvo849z2pw8B2q3XTp6wvZMLsFA3eb2VG:",
+    "id": "js:2:mina:B62qmb35fBGjPqLuEoHB3bBvo849z2pw8B2q3XTp6wvZMLsFA3eb2VG:minabip44h",
     "index": 2,
     "operationsCount": 0,
     "pendingOperations": [],
@@ -90,90 +58,14 @@ exports[`mina currency bridge scanAccounts mina seed 1 2`] = `
   [
     {
       "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NK8kxUdaFhncqyNSB8LGSExoL9tfRoy1bb1dXwRKJXpbrSLpDJ2",
-      "blockHeight": 312529,
-      "extra": {
-        "memo": "",
-      },
-      "fee": "10100000",
-      "hash": "5Jtcjsomafb3WUhyLZxdVPddbfFjS9BHr9nMBqwDLxBLNdy71MbS",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jtcjsomafb3WUhyLZxdVPddbfFjS9BHr9nMBqwDLxBLNdy71MbS-IN",
-      "recipients": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "senders": [
-        "B62qjnkKCkcee7vVM6YSyuxHKBgzzzUTJHTsv7wmowAfgF3r2Gz7WU2",
-      ],
-      "type": "IN",
-      "value": "298989900000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NLDayajGCAGjXDjqrQyR4FUSNL27VKTYAowa8fRaPQy4izVaY6u",
-      "blockHeight": 325795,
-      "extra": {
-        "memo": "test memo",
-      },
-      "fee": "100000000",
-      "hash": "5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NLqXt1wcEmedu3EwGcmnhTXM4rzab1AoE2vpPHEoPraVnGbPJiz",
-      "blockHeight": 319286,
-      "extra": {
-        "memo": "demo ledger live cli",
-      },
-      "fee": "100000000",
-      "hash": "5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NKvTuZuFQkqP5nYp5cJCKs6Atev7WPxvek2CnWjz9H7TVA7BJi6",
-      "blockHeight": 314890,
-      "extra": {
-        "memo": "test memo from ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "6100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NKtQuHcs3QS9mkgiUwS4wq3unVcLrWXZt5qQRnz3HgS8idB1Gih",
-      "blockHeight": 316209,
+      "blockHash": "3NLHrfB7TqGgu1SWZ8MgyJJprj9axLzYacDUeFWFGbyNefNQHkxy",
+      "blockHeight": 380027,
       "extra": {
-        "memo": "",
+        "memo": "Testing mainnet",
       },
-      "fee": "100000000",
-      "hash": "5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP-OUT",
+      "fee": "1750000",
+      "hash": "5JtoGDxnS9wE5hKkGq64GHddNqvtyU4xWipNLSQm62Bg6E1bxngV",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JtoGDxnS9wE5hKkGq64GHddNqvtyU4xWipNLSQm62Bg6E1bxngV-OUT",
       "recipients": [
         "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
       ],
@@ -181,305 +73,39 @@ exports[`mina currency bridge scanAccounts mina seed 1 2`] = `
         "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
       ],
       "type": "OUT",
-      "value": "5100000000",
+      "value": "2001750000",
     },
     {
       "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NKMgqv1ApEfMe2VA9trdo72q6uDPd2pTnr1BxpsuWVr8Kc2XFhv",
-      "blockHeight": 322808,
+      "blockHash": "3NKrat5mXN1Lp8FmSbnPmvT8nfZMKAge18AvZj4eULTqZjNL55BX",
+      "blockHeight": 378920,
       "extra": {
         "memo": "",
       },
-      "fee": "100000000",
-      "hash": "5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NLNht2Sxka6HYByMXGKYFHV6ya2BASun5BMcm49nea3wtDD1dfu",
-      "blockHeight": 326112,
-      "extra": {
-        "memo": "demo ledger live cli",
-      },
-      "fee": "100000000",
-      "hash": "5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NL4K1A8L7qTt425YjRLKmPaYVNJAYL26iMhUrBcbHshh4ZWdM98",
-      "blockHeight": 323476,
-      "extra": {
-        "memo": "testing ledger live mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NL5vk32Bej24S7rY94EN8dQfUvQYnagS8e7R3FBEXdB6bTC5mmB",
-      "blockHeight": 326132,
-      "extra": {
-        "memo": "Mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NLYGCEhNcreLocBnUxHo7iJH9McWFbT8VBbQGbrcoQpi83tg1MY",
-      "blockHeight": 319098,
-      "extra": {
-        "memo": "late night testing",
-      },
-      "fee": "100000000",
-      "hash": "5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NK7AXHuKh3TeJtsZAz9AqNUNHLsPfBMKFjb2ocUoDhSikBAsBS1",
-      "blockHeight": 322816,
-      "extra": {
-        "memo": "Testing on ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NLRkDBfBNHRgoVa9cEEWmYootgmP51sf24cWbCYcFuugCki9tap",
-      "blockHeight": 314891,
-      "extra": {
-        "memo": "test memo from ledger live 2",
-      },
-      "fee": "100000000",
-      "hash": "5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NLPKopb8HJYyJUxLduVTZcBCvH535Fkn9x5KBd6S6gvLeavDaKJ",
-      "blockHeight": 326113,
-      "extra": {
-        "memo": "ttd",
-      },
-      "fee": "100000000",
-      "hash": "5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "15100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NLu4dL4t64ont8GqNaP5YqSR1AGPB2KiQGAajPNnBiSTjX9zEek",
-      "blockHeight": 316210,
-      "extra": {
-        "memo": "sending using ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NKYJ8f4WzPmTpsmz9AZrmibvmA4fjAFTtPvtnqJuzYXJuAhQiM4",
-      "blockHeight": 326313,
-      "extra": {
-        "memo": "Demo ledger live Desktop",
-      },
-      "fee": "100000000",
-      "hash": "5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "42100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NK7vCvwwf4moGt2wxQrUDTHQU6J9NUSB6cspKCRzxq7uzJXb8MJ",
-      "blockHeight": 326314,
-      "extra": {
-        "memo": "Demo ledger live mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3-IN",
+      "fee": "200100000",
+      "hash": "5Jtu8BF3stgsnauYZVhCEgFfc2ycciMQz4UncsdYnkLENxm9ogDG",
+      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jtu8BF3stgsnauYZVhCEgFfc2ycciMQz4UncsdYnkLENxm9ogDG-IN",
       "recipients": [
         "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
       ],
       "senders": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
+        "B62qq9yz8xR6y3bYZqYa2MTrLFF5HW7vhDtjXcWjnE4iddxCVSzRdyk",
       ],
       "type": "IN",
-      "value": "20100000000",
+      "value": "21200100000",
     },
   ],
   [
     {
       "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NLDayajGCAGjXDjqrQyR4FUSNL27VKTYAowa8fRaPQy4izVaY6u",
-      "blockHeight": 325795,
-      "extra": {
-        "memo": "test memo",
-      },
-      "fee": "100000000",
-      "hash": "5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NLqXt1wcEmedu3EwGcmnhTXM4rzab1AoE2vpPHEoPraVnGbPJiz",
-      "blockHeight": 319286,
-      "extra": {
-        "memo": "demo ledger live cli",
-      },
-      "fee": "100000000",
-      "hash": "5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NKvTuZuFQkqP5nYp5cJCKs6Atev7WPxvek2CnWjz9H7TVA7BJi6",
-      "blockHeight": 314890,
-      "extra": {
-        "memo": "test memo from ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "6100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NKtQuHcs3QS9mkgiUwS4wq3unVcLrWXZt5qQRnz3HgS8idB1Gih",
-      "blockHeight": 316209,
-      "extra": {
-        "memo": "",
-      },
-      "fee": "100000000",
-      "hash": "5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NKMgqv1ApEfMe2VA9trdo72q6uDPd2pTnr1BxpsuWVr8Kc2XFhv",
-      "blockHeight": 322808,
+      "blockHash": "3NLHrfB7TqGgu1SWZ8MgyJJprj9axLzYacDUeFWFGbyNefNQHkxy",
+      "blockHeight": 380027,
       "extra": {
-        "memo": "",
+        "memo": "Testing mainnet",
       },
-      "fee": "100000000",
-      "hash": "5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1-IN",
+      "fee": "1750000",
+      "hash": "5JtoGDxnS9wE5hKkGq64GHddNqvtyU4xWipNLSQm62Bg6E1bxngV",
+      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JtoGDxnS9wE5hKkGq64GHddNqvtyU4xWipNLSQm62Bg6E1bxngV-IN",
       "recipients": [
         "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
       ],
@@ -487,790 +113,7 @@ exports[`mina currency bridge scanAccounts mina seed 1 2`] = `
         "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
       ],
       "type": "IN",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NLNht2Sxka6HYByMXGKYFHV6ya2BASun5BMcm49nea3wtDD1dfu",
-      "blockHeight": 326112,
-      "extra": {
-        "memo": "demo ledger live cli",
-      },
-      "fee": "100000000",
-      "hash": "5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NL4K1A8L7qTt425YjRLKmPaYVNJAYL26iMhUrBcbHshh4ZWdM98",
-      "blockHeight": 323476,
-      "extra": {
-        "memo": "testing ledger live mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NL5vk32Bej24S7rY94EN8dQfUvQYnagS8e7R3FBEXdB6bTC5mmB",
-      "blockHeight": 326132,
-      "extra": {
-        "memo": "Mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NLYGCEhNcreLocBnUxHo7iJH9McWFbT8VBbQGbrcoQpi83tg1MY",
-      "blockHeight": 319098,
-      "extra": {
-        "memo": "late night testing",
-      },
-      "fee": "100000000",
-      "hash": "5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NK7AXHuKh3TeJtsZAz9AqNUNHLsPfBMKFjb2ocUoDhSikBAsBS1",
-      "blockHeight": 322816,
-      "extra": {
-        "memo": "Testing on ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NLRkDBfBNHRgoVa9cEEWmYootgmP51sf24cWbCYcFuugCki9tap",
-      "blockHeight": 314891,
-      "extra": {
-        "memo": "test memo from ledger live 2",
-      },
-      "fee": "100000000",
-      "hash": "5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NLPKopb8HJYyJUxLduVTZcBCvH535Fkn9x5KBd6S6gvLeavDaKJ",
-      "blockHeight": 326113,
-      "extra": {
-        "memo": "ttd",
-      },
-      "fee": "100000000",
-      "hash": "5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "15100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NLu4dL4t64ont8GqNaP5YqSR1AGPB2KiQGAajPNnBiSTjX9zEek",
-      "blockHeight": 316210,
-      "extra": {
-        "memo": "sending using ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NKYJ8f4WzPmTpsmz9AZrmibvmA4fjAFTtPvtnqJuzYXJuAhQiM4",
-      "blockHeight": 326313,
-      "extra": {
-        "memo": "Demo ledger live Desktop",
-      },
-      "fee": "100000000",
-      "hash": "5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "42100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NK7vCvwwf4moGt2wxQrUDTHQU6J9NUSB6cspKCRzxq7uzJXb8MJ",
-      "blockHeight": 326314,
-      "extra": {
-        "memo": "Demo ledger live mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3-OUT",
-      "recipients": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "senders": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "type": "OUT",
-      "value": "20100000000",
-    },
-  ],
-  [
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NK8kxUdaFhncqyNSB8LGSExoL9tfRoy1bb1dXwRKJXpbrSLpDJ2",
-      "blockHeight": 312529,
-      "extra": {
-        "memo": "",
-      },
-      "fee": "10100000",
-      "hash": "5Jtcjsomafb3WUhyLZxdVPddbfFjS9BHr9nMBqwDLxBLNdy71MbS",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5Jtcjsomafb3WUhyLZxdVPddbfFjS9BHr9nMBqwDLxBLNdy71MbS-IN",
-      "recipients": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "senders": [
-        "B62qjnkKCkcee7vVM6YSyuxHKBgzzzUTJHTsv7wmowAfgF3r2Gz7WU2",
-      ],
-      "type": "IN",
-      "value": "298989900000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NLDayajGCAGjXDjqrQyR4FUSNL27VKTYAowa8fRaPQy4izVaY6u",
-      "blockHeight": 325795,
-      "extra": {
-        "memo": "test memo",
-      },
-      "fee": "100000000",
-      "hash": "5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NLqXt1wcEmedu3EwGcmnhTXM4rzab1AoE2vpPHEoPraVnGbPJiz",
-      "blockHeight": 319286,
-      "extra": {
-        "memo": "demo ledger live cli",
-      },
-      "fee": "100000000",
-      "hash": "5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NKvTuZuFQkqP5nYp5cJCKs6Atev7WPxvek2CnWjz9H7TVA7BJi6",
-      "blockHeight": 314890,
-      "extra": {
-        "memo": "test memo from ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "6100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NKtQuHcs3QS9mkgiUwS4wq3unVcLrWXZt5qQRnz3HgS8idB1Gih",
-      "blockHeight": 316209,
-      "extra": {
-        "memo": "",
-      },
-      "fee": "100000000",
-      "hash": "5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NKMgqv1ApEfMe2VA9trdo72q6uDPd2pTnr1BxpsuWVr8Kc2XFhv",
-      "blockHeight": 322808,
-      "extra": {
-        "memo": "",
-      },
-      "fee": "100000000",
-      "hash": "5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NLNht2Sxka6HYByMXGKYFHV6ya2BASun5BMcm49nea3wtDD1dfu",
-      "blockHeight": 326112,
-      "extra": {
-        "memo": "demo ledger live cli",
-      },
-      "fee": "100000000",
-      "hash": "5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NL4K1A8L7qTt425YjRLKmPaYVNJAYL26iMhUrBcbHshh4ZWdM98",
-      "blockHeight": 323476,
-      "extra": {
-        "memo": "testing ledger live mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NL5vk32Bej24S7rY94EN8dQfUvQYnagS8e7R3FBEXdB6bTC5mmB",
-      "blockHeight": 326132,
-      "extra": {
-        "memo": "Mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NLYGCEhNcreLocBnUxHo7iJH9McWFbT8VBbQGbrcoQpi83tg1MY",
-      "blockHeight": 319098,
-      "extra": {
-        "memo": "late night testing",
-      },
-      "fee": "100000000",
-      "hash": "5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NK7AXHuKh3TeJtsZAz9AqNUNHLsPfBMKFjb2ocUoDhSikBAsBS1",
-      "blockHeight": 322816,
-      "extra": {
-        "memo": "Testing on ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NLRkDBfBNHRgoVa9cEEWmYootgmP51sf24cWbCYcFuugCki9tap",
-      "blockHeight": 314891,
-      "extra": {
-        "memo": "test memo from ledger live 2",
-      },
-      "fee": "100000000",
-      "hash": "5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NLPKopb8HJYyJUxLduVTZcBCvH535Fkn9x5KBd6S6gvLeavDaKJ",
-      "blockHeight": 326113,
-      "extra": {
-        "memo": "ttd",
-      },
-      "fee": "100000000",
-      "hash": "5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "15100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NLu4dL4t64ont8GqNaP5YqSR1AGPB2KiQGAajPNnBiSTjX9zEek",
-      "blockHeight": 316210,
-      "extra": {
-        "memo": "sending using ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NKYJ8f4WzPmTpsmz9AZrmibvmA4fjAFTtPvtnqJuzYXJuAhQiM4",
-      "blockHeight": 326313,
-      "extra": {
-        "memo": "Demo ledger live Desktop",
-      },
-      "fee": "100000000",
-      "hash": "5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "42100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:",
-      "blockHash": "3NK7vCvwwf4moGt2wxQrUDTHQU6J9NUSB6cspKCRzxq7uzJXb8MJ",
-      "blockHeight": 326314,
-      "extra": {
-        "memo": "Demo ledger live mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:-5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3-IN",
-      "recipients": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "senders": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "type": "IN",
-      "value": "20100000000",
-    },
-  ],
-  [
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NLDayajGCAGjXDjqrQyR4FUSNL27VKTYAowa8fRaPQy4izVaY6u",
-      "blockHeight": 325795,
-      "extra": {
-        "memo": "test memo",
-      },
-      "fee": "100000000",
-      "hash": "5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JtXEzRXJErT7gdbfmcZEmepCSWPqKHDhp3sn9duVjZW7AjyxG5j-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NLqXt1wcEmedu3EwGcmnhTXM4rzab1AoE2vpPHEoPraVnGbPJiz",
-      "blockHeight": 319286,
-      "extra": {
-        "memo": "demo ledger live cli",
-      },
-      "fee": "100000000",
-      "hash": "5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JtyG2uowz8sVE9bmm7RPekeMiMDeAGahDieZKFKBMG4122H915F-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NKvTuZuFQkqP5nYp5cJCKs6Atev7WPxvek2CnWjz9H7TVA7BJi6",
-      "blockHeight": 314890,
-      "extra": {
-        "memo": "test memo from ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuNg317LPieqULT51c9hpb2ikFvF1THr8zMzSQPhXE2z3oxb95S-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "6100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NKtQuHcs3QS9mkgiUwS4wq3unVcLrWXZt5qQRnz3HgS8idB1Gih",
-      "blockHeight": 316209,
-      "extra": {
-        "memo": "",
-      },
-      "fee": "100000000",
-      "hash": "5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuqtJQZtqQr2KxH2G3mo4SgGBEPXFx1xfpwrbHWu68HHHmpFBdP-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NKMgqv1ApEfMe2VA9trdo72q6uDPd2pTnr1BxpsuWVr8Kc2XFhv",
-      "blockHeight": 322808,
-      "extra": {
-        "memo": "",
-      },
-      "fee": "100000000",
-      "hash": "5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JusX6w8JcJNoxN1Ad1dysR5m8kDqe8eKM7oaDMbNzfd37Rn4op1-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NLNht2Sxka6HYByMXGKYFHV6ya2BASun5BMcm49nea3wtDD1dfu",
-      "blockHeight": 326112,
-      "extra": {
-        "memo": "demo ledger live cli",
-      },
-      "fee": "100000000",
-      "hash": "5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuSXmr3c3UioS1BjwbQQN6UWafaPjKSYpjB2Jb58HwsSKjvEKrr-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NL4K1A8L7qTt425YjRLKmPaYVNJAYL26iMhUrBcbHshh4ZWdM98",
-      "blockHeight": 323476,
-      "extra": {
-        "memo": "testing ledger live mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuuYvx6k1TFhcsvEJQQsXRsJ21QfJvBA8udH5Wq1dMhq9PnXsHg-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NL5vk32Bej24S7rY94EN8dQfUvQYnagS8e7R3FBEXdB6bTC5mmB",
-      "blockHeight": 326132,
-      "extra": {
-        "memo": "Mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JuWZmtdxPYGX6utaPzo2wn7cmqGfQXU12L5h3J5V2nVed8wMFxk-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NLYGCEhNcreLocBnUxHo7iJH9McWFbT8VBbQGbrcoQpi83tg1MY",
-      "blockHeight": 319098,
-      "extra": {
-        "memo": "late night testing",
-      },
-      "fee": "100000000",
-      "hash": "5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5Jv4f1fVgNqmeqnS4EjCkXasSYzKfYyTnZmizs7oGgSms7Rytsyo-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NK7AXHuKh3TeJtsZAz9AqNUNHLsPfBMKFjb2ocUoDhSikBAsBS1",
-      "blockHeight": 322816,
-      "extra": {
-        "memo": "Testing on ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5Jv9oXV9sw7haeufuhRNp1ExKFeNbaZnpced8r1iQaanVtVS95yV-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "10100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NLRkDBfBNHRgoVa9cEEWmYootgmP51sf24cWbCYcFuugCki9tap",
-      "blockHeight": 314891,
-      "extra": {
-        "memo": "test memo from ledger live 2",
-      },
-      "fee": "100000000",
-      "hash": "5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5Jv9Y2UVzE1aStZFgoDztAjyhgqgVsXGUp3iioRDXKANqSBoQ496-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "5100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NLPKopb8HJYyJUxLduVTZcBCvH535Fkn9x5KBd6S6gvLeavDaKJ",
-      "blockHeight": 326113,
-      "extra": {
-        "memo": "ttd",
-      },
-      "fee": "100000000",
-      "hash": "5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JvC1Evp7N5pxMaENtha5mw2wLzAhKgZgK1evPYcNaRgA2khumAe-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "15100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NLu4dL4t64ont8GqNaP5YqSR1AGPB2KiQGAajPNnBiSTjX9zEek",
-      "blockHeight": 316210,
-      "extra": {
-        "memo": "sending using ledger live",
-      },
-      "fee": "100000000",
-      "hash": "5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JvCy4cD6mDcFAG1TRRqYH9oNy1rEWXvcadCnqLMbq2BmcPSzCQJ-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NKYJ8f4WzPmTpsmz9AZrmibvmA4fjAFTtPvtnqJuzYXJuAhQiM4",
-      "blockHeight": 326313,
-      "extra": {
-        "memo": "Demo ledger live Desktop",
-      },
-      "fee": "100000000",
-      "hash": "5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JvF3RAniLpS6sVkTuehXpu6ziCyJzosBzfPmEMgzYTqa1xGruQg-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "42100000000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:",
-      "blockHash": "3NK7vCvwwf4moGt2wxQrUDTHQU6J9NUSB6cspKCRzxq7uzJXb8MJ",
-      "blockHeight": 326314,
-      "extra": {
-        "memo": "Demo ledger live mobile",
-      },
-      "fee": "100000000",
-      "hash": "5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:-5JvMpTSubiUfAUFPjy6u9jbydLMuj5SEyUwkXTUtGePwYnsfGiD3-OUT",
-      "recipients": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "senders": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "type": "OUT",
-      "value": "20100000000",
+      "value": "2001750000",
     },
   ],
   [],
diff --git a/libs/ledger-live-common/src/families/mina/config.ts b/libs/ledger-live-common/src/families/mina/config.ts
index 3739bc15c5d1..1d5e6104be73 100644
--- a/libs/ledger-live-common/src/families/mina/config.ts
+++ b/libs/ledger-live-common/src/families/mina/config.ts
@@ -6,7 +6,7 @@ const minaConfig: CurrencyLiveConfigDefinition = {
     default: {
       status: { type: "active" },
       infra: {
-        API_MINA_ROSETTA_NODE: "https://mina-rosetta-api-devnet.zondax.dev",
+        API_MINA_ROSETTA_NODE: "https://mina-rosetta-api-mainnet.zondax.dev",
       },
     },
   },
diff --git a/libs/ledgerjs/packages/cryptoassets/src/currencies.ts b/libs/ledgerjs/packages/cryptoassets/src/currencies.ts
index df77f9e2643b..900e8b4cc0fb 100644
--- a/libs/ledgerjs/packages/cryptoassets/src/currencies.ts
+++ b/libs/ledgerjs/packages/cryptoassets/src/currencies.ts
@@ -3495,8 +3495,8 @@ export const cryptocurrenciesById: Record<CryptoCurrencyId, CryptoCurrency> = {
     ],
     explorerViews: [
       {
-        tx: "https://devnet.minaexplorer.com/transaction/$hash",
-        address: "https://devnet.minaexplorer.com/wallet/$address",
+        tx: "https://minascan.io/mainnet/tx/$hash/txInfo",
+        address: "https://minascan.io/mainnet/account/$address",
       },
     ],
   },

From 0e7212ddc40d8356ca281006598c023445e47f60 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <prateek@zondax.ch>
Date: Sun, 18 Aug 2024 19:42:42 +0200
Subject: [PATCH 16/63] chore(mina): changeset

---
 .changeset/witty-socks-tan.md | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
 create mode 100644 .changeset/witty-socks-tan.md

diff --git a/.changeset/witty-socks-tan.md b/.changeset/witty-socks-tan.md
new file mode 100644
index 000000000000..a9fb5678815e
--- /dev/null
+++ b/.changeset/witty-socks-tan.md
@@ -0,0 +1,15 @@
+---
+"@ledgerhq/types-cryptoassets": minor
+"@ledgerhq/cryptoassets": minor
+"@ledgerhq/types-live": minor
+"@ledgerhq/crypto-icons-ui": minor
+"@ledgerhq/coin-mina": minor
+"ledger-live-desktop": minor
+"live-mobile": minor
+"@ledgerhq/live-common": minor
+"@ledgerhq/coin-framework": minor
+"@ledgerhq/web-tools": minor
+"@ledgerhq/live-cli": minor
+---
+
+Add support for mina blockchain

From a6c76424c547ee5838830ac02e89418116408ad8 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Fri, 20 Sep 2024 12:51:54 +0200
Subject: [PATCH 17/63] chore(mina): post refac fixed

squashed

chore(mina): post refac fixes
---
 libs/coin-modules/coin-mina/src/bridge/js.ts                | 6 ++++--
 libs/coin-modules/coin-mina/src/prepareTransaction.ts       | 4 ++--
 libs/ledger-live-common/scripts/sync-families-dispatch.mjs  | 2 --
 libs/ledger-live-common/src/generated/bridge/js.ts          | 4 ----
 libs/ledger-live-common/src/generated/cli-transaction.ts    | 4 ----
 .../src/generated/deviceTransactionConfig.ts                | 4 ----
 libs/ledger-live-common/src/generated/hw-getAddress.ts      | 4 ----
 libs/ledger-live-common/src/generated/specs.ts              | 4 ----
 libs/ledger-live-common/src/generated/transaction.ts        | 4 ----
 libs/ledgerjs/packages/cryptoassets/src/abandonseed.ts      | 1 +
 10 files changed, 7 insertions(+), 30 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/bridge/js.ts b/libs/coin-modules/coin-mina/src/bridge/js.ts
index 7416dbca26ba..87d22790b4f1 100644
--- a/libs/coin-modules/coin-mina/src/bridge/js.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/js.ts
@@ -1,7 +1,8 @@
 import type { AccountBridge, CurrencyBridge } from "@ledgerhq/types-live";
 import {
   makeAccountBridgeReceive,
-  defaultUpdateTransaction,
+  getSerializedAddressParameters,
+  updateTransaction,
   makeScanAccounts,
 } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
@@ -44,13 +45,14 @@ export function buildAccountBridge(
   return {
     estimateMaxSpendable,
     createTransaction,
-    updateTransaction: defaultUpdateTransaction,
+    updateTransaction,
     getTransactionStatus,
     prepareTransaction,
     sync,
     receive,
     signOperation,
     broadcast,
+    getSerializedAddressParameters,
   };
 }
 
diff --git a/libs/coin-modules/coin-mina/src/prepareTransaction.ts b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
index 2088272469a5..6ee3eb974a0d 100644
--- a/libs/coin-modules/coin-mina/src/prepareTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
@@ -1,4 +1,4 @@
-import { defaultUpdateTransaction } from "@ledgerhq/coin-framework/bridge/jsHelpers";
+import { updateTransaction } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { Account, AccountBridge } from "@ledgerhq/types-live";
 import estimateMaxSpendable from "./estimateMaxSpendable";
 import getEstimatedFees from "./getFeesForTransaction";
@@ -17,5 +17,5 @@ export const prepareTransaction: AccountBridge<
       })
     : t.amount;
 
-  return defaultUpdateTransaction(t, { fees, amount });
+  return updateTransaction(t, { fees, amount });
 };
diff --git a/libs/ledger-live-common/scripts/sync-families-dispatch.mjs b/libs/ledger-live-common/scripts/sync-families-dispatch.mjs
index 49a65d84e29e..1bd476e10b82 100644
--- a/libs/ledger-live-common/scripts/sync-families-dispatch.mjs
+++ b/libs/ledger-live-common/scripts/sync-families-dispatch.mjs
@@ -43,8 +43,6 @@ const familiesWPackage = [
   "tron",
   "vechain",
   "xrp",
-  "icon",
-  "ton",
   "mina",
 ];
 
diff --git a/libs/ledger-live-common/src/generated/bridge/js.ts b/libs/ledger-live-common/src/generated/bridge/js.ts
index 4f21e1fdb1f3..29cf92655671 100644
--- a/libs/ledger-live-common/src/generated/bridge/js.ts
+++ b/libs/ledger-live-common/src/generated/bridge/js.ts
@@ -21,8 +21,6 @@ import { bridge as ton } from "../../families/ton/setup";
 import { bridge as tron } from "../../families/tron/setup";
 import { bridge as vechain } from "../../families/vechain/setup";
 import { bridge as xrp } from "../../families/xrp/setup";
-import { bridge as icon } from "../../families/icon/setup";
-import { bridge as ton } from "../../families/ton/setup";
 import { bridge as mina } from "../../families/mina/setup";
 
 export default {
@@ -49,7 +47,5 @@ export default {
   tron,
   vechain,
   xrp,
-  icon,
-  ton,
   mina,
 };
diff --git a/libs/ledger-live-common/src/generated/cli-transaction.ts b/libs/ledger-live-common/src/generated/cli-transaction.ts
index b74593604a65..581111a19cc4 100644
--- a/libs/ledger-live-common/src/generated/cli-transaction.ts
+++ b/libs/ledger-live-common/src/generated/cli-transaction.ts
@@ -21,8 +21,6 @@ import { cliTools as ton } from "../families/ton/setup";
 import { cliTools as tron } from "../families/tron/setup";
 import { cliTools as vechain } from "../families/vechain/setup";
 import { cliTools as xrp } from "../families/xrp/setup";
-import { cliTools as icon } from "../families/icon/setup";
-import { cliTools as ton } from "../families/ton/setup";
 import { cliTools as mina } from "../families/mina/setup";
 
 export default {
@@ -49,7 +47,5 @@ export default {
   tron,
   vechain,
   xrp,
-  icon,
-  ton,
   mina,
 };
diff --git a/libs/ledger-live-common/src/generated/deviceTransactionConfig.ts b/libs/ledger-live-common/src/generated/deviceTransactionConfig.ts
index 72f88b40b6a9..def10d18e764 100644
--- a/libs/ledger-live-common/src/generated/deviceTransactionConfig.ts
+++ b/libs/ledger-live-common/src/generated/deviceTransactionConfig.ts
@@ -20,8 +20,6 @@ import tezos from "@ledgerhq/coin-tezos/deviceTransactionConfig";
 import ton from "@ledgerhq/coin-ton/deviceTransactionConfig";
 import tron from "@ledgerhq/coin-tron/deviceTransactionConfig";
 import xrp from "@ledgerhq/coin-xrp/deviceTransactionConfig";
-import icon from "@ledgerhq/coin-icon/deviceTransactionConfig";
-import ton from "@ledgerhq/coin-ton/deviceTransactionConfig";
 import mina from "@ledgerhq/coin-mina/deviceTransactionConfig";
 
 export default {
@@ -47,8 +45,6 @@ export default {
   ton,
   tron,
   xrp,
-  icon,
-  ton,
   mina,
 };
 import { ExtraDeviceTransactionField as ExtraDeviceTransactionField_aptos } from "@ledgerhq/coin-aptos/bridge/deviceTransactionConfig";
diff --git a/libs/ledger-live-common/src/generated/hw-getAddress.ts b/libs/ledger-live-common/src/generated/hw-getAddress.ts
index 2a56ba8a9ccf..d8a51b0ae1c0 100644
--- a/libs/ledger-live-common/src/generated/hw-getAddress.ts
+++ b/libs/ledger-live-common/src/generated/hw-getAddress.ts
@@ -21,8 +21,6 @@ import { resolver as ton } from "../families/ton/setup";
 import { resolver as tron } from "../families/tron/setup";
 import { resolver as vechain } from "../families/vechain/setup";
 import { resolver as xrp } from "../families/xrp/setup";
-import { resolver as icon } from "../families/icon/setup";
-import { resolver as ton } from "../families/ton/setup";
 import { resolver as mina } from "../families/mina/setup";
 
 export default {
@@ -49,7 +47,5 @@ export default {
   tron,
   vechain,
   xrp,
-  icon,
-  ton,
   mina,
 };
diff --git a/libs/ledger-live-common/src/generated/specs.ts b/libs/ledger-live-common/src/generated/specs.ts
index 8eaf435f5d79..9cd30d877dec 100644
--- a/libs/ledger-live-common/src/generated/specs.ts
+++ b/libs/ledger-live-common/src/generated/specs.ts
@@ -21,8 +21,6 @@ import ton from "@ledgerhq/coin-ton/specs";
 import tron from "@ledgerhq/coin-tron/specs";
 import vechain from "@ledgerhq/coin-vechain/specs";
 import xrp from "@ledgerhq/coin-xrp/specs";
-import icon from "@ledgerhq/coin-icon/specs";
-import ton from "@ledgerhq/coin-ton/specs";
 import mina from "@ledgerhq/coin-mina/specs";
 
 export default {
@@ -49,7 +47,5 @@ export default {
   tron,
   vechain,
   xrp,
-  icon,
-  ton,
   mina,
 };
diff --git a/libs/ledger-live-common/src/generated/transaction.ts b/libs/ledger-live-common/src/generated/transaction.ts
index 63157a620eb2..a43328d1e896 100644
--- a/libs/ledger-live-common/src/generated/transaction.ts
+++ b/libs/ledger-live-common/src/generated/transaction.ts
@@ -21,8 +21,6 @@ import ton from "@ledgerhq/coin-ton/transaction";
 import tron from "@ledgerhq/coin-tron/transaction";
 import vechain from "@ledgerhq/coin-vechain/transaction";
 import xrp from "@ledgerhq/coin-xrp/transaction";
-import icon from "@ledgerhq/coin-icon/transaction";
-import ton from "@ledgerhq/coin-ton/transaction";
 import mina from "@ledgerhq/coin-mina/transaction";
 
 export default {
@@ -49,7 +47,5 @@ export default {
   tron,
   vechain,
   xrp,
-  icon,
-  ton,
   mina,
 };
diff --git a/libs/ledgerjs/packages/cryptoassets/src/abandonseed.ts b/libs/ledgerjs/packages/cryptoassets/src/abandonseed.ts
index 8dd7e8498c00..7d25cb8af34f 100644
--- a/libs/ledgerjs/packages/cryptoassets/src/abandonseed.ts
+++ b/libs/ledgerjs/packages/cryptoassets/src/abandonseed.ts
@@ -122,6 +122,7 @@ const abandonSeedAddresses: Partial<Record<CryptoCurrency["id"], string>> = {
   zenrock: "zen1704dk997ccmk5x8smn8secphckfvbgxxfd99xxr",
   sonic: EVM_DEAD_ADDRESS,
   sonic_blaze: EVM_DEAD_ADDRESS,
+  mina: "B62qmphduibdMJQjEvnnDizL9kVV4ripuiE9adR2wsqtegJaxHJzCic",
 };
 
 /**

From 644e2f283e6b4f56b3f7745a1f397a896aed227a Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Thu, 30 Jan 2025 18:44:11 +0100
Subject: [PATCH 18/63] fix(mina): failing build

---
 libs/coin-modules/coin-mina/package.json                   | 6 ++++--
 libs/coin-modules/coin-mina/src/bridge.integration.test.ts | 5 +++++
 libs/coin-modules/coin-mina/src/createTransaction.ts       | 1 +
 libs/coin-modules/coin-mina/src/transaction.ts             | 2 +-
 libs/coin-modules/coin-mina/src/types.ts                   | 6 +++---
 libs/coin-modules/coin-mina/tsconfig.json                  | 7 ++++---
 6 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/libs/coin-modules/coin-mina/package.json b/libs/coin-modules/coin-mina/package.json
index 88827408fd62..f77e9f66fbc2 100644
--- a/libs/coin-modules/coin-mina/package.json
+++ b/libs/coin-modules/coin-mina/package.json
@@ -53,7 +53,7 @@
     "@ledgerhq/types-cryptoassets": "workspace:^",
     "@ledgerhq/types-live": "workspace:^",
     "bignumber.js": "^9.1.2",
-    "bs58check": "^4.0.0",
+    "bs58check": "^2.1.2",
     "expect": "^27.4.6",
     "invariant": "^2.2.2",
     "lodash": "^4.17.21",
@@ -62,6 +62,8 @@
   },
   "devDependencies": {
     "@types/invariant": "^2.2.2",
+    "@types/bs58check": "^2.1.2",
+    "expect": "^27.4.6",
     "@types/jest": "^29.5.10",
     "@types/lodash": "^4.14.191",
     "jest": "^29.7.0",
@@ -69,7 +71,7 @@
   },
   "scripts": {
     "clean": "rimraf lib lib-es",
-    "build": "tsc && tsc -m ES6 --outDir lib-es",
+    "build": "tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es",
     "prewatch": "pnpm build",
     "watch": "tsc --watch",
     "doc": "documentation readme src/** --section=API --pe ts --re ts --re d.ts",
diff --git a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
index a911a6e00507..422d29ddfb6c 100644
--- a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
+++ b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
@@ -54,6 +54,7 @@ const mina: CurrenciesData<Transaction> = {
             recipient: "novalidaddress",
             fees: new BigNumber(0).toString(),
             amount: "1000",
+            memo: undefined,
           }),
           expectedStatus: {
             errors: {
@@ -69,6 +70,7 @@ const mina: CurrenciesData<Transaction> = {
             recipient: ACCOUNT_ADDRESS_1,
             fees: new BigNumber(0).toString(),
             amount: (300 * 1e9).toString(),
+            memo: undefined,
           }),
           expectedStatus: {
             errors: {
@@ -98,6 +100,7 @@ const mina: CurrenciesData<Transaction> = {
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: ACCOUNT_ADDRESS_1,
+            memo: undefined,
             amount: "0",
             fees: new BigNumber(0).toString(),
           }),
@@ -115,6 +118,7 @@ const mina: CurrenciesData<Transaction> = {
             recipient: ACCOUNT_ADDRESS,
             amount: "10",
             fees: new BigNumber(0).toString(),
+            memo: undefined,
           }),
           expectedStatus: {
             errors: {
@@ -130,6 +134,7 @@ const mina: CurrenciesData<Transaction> = {
             recipient: ACCOUNT_ADDRESS_1,
             amount: "1000",
             fees: new BigNumber(0).toString(),
+            memo: undefined,
           }),
           expectedStatus: {
             amount: new BigNumber("1000"),
diff --git a/libs/coin-modules/coin-mina/src/createTransaction.ts b/libs/coin-modules/coin-mina/src/createTransaction.ts
index e36c26734a13..0c29100a5171 100644
--- a/libs/coin-modules/coin-mina/src/createTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/createTransaction.ts
@@ -11,4 +11,5 @@ export const createTransaction: AccountBridge<
   recipient: "",
   useAllAmount: false,
   fees: new BigNumber(0),
+  memo: undefined,
 });
diff --git a/libs/coin-modules/coin-mina/src/transaction.ts b/libs/coin-modules/coin-mina/src/transaction.ts
index 4775ca6371e2..42a07624770f 100644
--- a/libs/coin-modules/coin-mina/src/transaction.ts
+++ b/libs/coin-modules/coin-mina/src/transaction.ts
@@ -47,7 +47,7 @@ const toTransactionRaw = (t: Transaction): TransactionRaw => {
     family: t.family,
     amount: t.amount.toFixed(),
     fees: t.fees.toString(),
-    memo: t.memo,
+    memo: t.memo ?? undefined,
   };
 };
 
diff --git a/libs/coin-modules/coin-mina/src/types.ts b/libs/coin-modules/coin-mina/src/types.ts
index c96eb3c76c78..335af09bb454 100644
--- a/libs/coin-modules/coin-mina/src/types.ts
+++ b/libs/coin-modules/coin-mina/src/types.ts
@@ -12,13 +12,13 @@ import {
 export type Transaction = TransactionCommon & {
   family: "mina";
   fees: BigNumber;
-  memo?: string;
+  memo: string | undefined;
 };
 
 export type TransactionRaw = TransactionCommonRaw & {
   family: "mina";
   fees: string;
-  memo?: string;
+  memo: string | undefined;
 };
 
 export type MinaAccount = Account;
@@ -59,4 +59,4 @@ export interface MinaSignedTransaction {
   transaction: MinaUnsignedTransaction;
 }
 
-export type MinaOperation = Operation<{ memo?: string }>;
+export type MinaOperation = Operation<{ memo: string | undefined }>;
diff --git a/libs/coin-modules/coin-mina/tsconfig.json b/libs/coin-modules/coin-mina/tsconfig.json
index cdb8be8ecb97..a5dd26c4e813 100644
--- a/libs/coin-modules/coin-mina/tsconfig.json
+++ b/libs/coin-modules/coin-mina/tsconfig.json
@@ -3,10 +3,11 @@
   "compilerOptions": {
     "declaration": true,
     "declarationMap": true,
-    "module": "commonjs",
     "downlevelIteration": true,
     "lib": ["es2020", "dom"],
-    "outDir": "lib"
+    "outDir": "lib",
+    "exactOptionalPropertyTypes": true,
+    "typeRoots": ["./types", "./node_modules/@types"],
   },
-  "include": ["src/**/*"]
+  "include": ["src/**/*", "types.d.ts"],
 }

From 0c273ea5d5a0d51763b78bd2fa614db25e763b77 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Fri, 7 Feb 2025 15:31:43 +0100
Subject: [PATCH 19/63] refac(mina): use @zondax/ledger-mina-js

---
 .../coin-mina/src/hw-getAddress.ts            | 10 +++---
 libs/coin-modules/coin-mina/src/signer.ts     | 31 +++++++++++++++----
 .../coin-mina/src/synchronisation.ts          |  1 +
 libs/ledger-live-common/package.json          |  4 +--
 .../src/families/mina/setup.ts                |  4 +--
 5 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/hw-getAddress.ts b/libs/coin-modules/coin-mina/src/hw-getAddress.ts
index 8041a1cb6e60..bb4f219d5ddb 100644
--- a/libs/coin-modules/coin-mina/src/hw-getAddress.ts
+++ b/libs/coin-modules/coin-mina/src/hw-getAddress.ts
@@ -1,17 +1,19 @@
 import { GetAddressFn } from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
 import { GetAddressOptions } from "@ledgerhq/coin-framework/derivation";
-import { MinaAddress, MinaSigner } from "./signer";
+import { GetAddressResponse, MinaSigner } from "./signer";
 import { getAccountNumFromPath } from "./logic";
 import invariant from "invariant";
 import { log } from "@ledgerhq/logs";
 
 const resolver = (signerContext: SignerContext<MinaSigner>): GetAddressFn => {
-  return async (deviceId: string, { path }: GetAddressOptions) => {
+  return async (deviceId: string, { path, verify }: GetAddressOptions) => {
     const account = getAccountNumFromPath(path);
-    log("debug", "getAddress, extracted account for path: ", { account, path });
+    log("debug", "getAddress, extracted account for path: ", { account, path, verify });
     invariant(account !== undefined, "Invalid account path, supported: 44'/12586'/<account>'/0/0");
-    const r = (await signerContext(deviceId, signer => signer.getAddress(account))) as MinaAddress;
+    const r = (await signerContext(deviceId, signer =>
+      signer.getAddress(account, verify || false),
+    )) as GetAddressResponse;
     invariant(r.publicKey, "[mina] getAddress: expected publicKey to be defined");
     return {
       address: r.publicKey,
diff --git a/libs/coin-modules/coin-mina/src/signer.ts b/libs/coin-modules/coin-mina/src/signer.ts
index 418408e2c6af..d1498b404b99 100644
--- a/libs/coin-modules/coin-mina/src/signer.ts
+++ b/libs/coin-modules/coin-mina/src/signer.ts
@@ -1,10 +1,29 @@
-import { MinaUnsignedTransaction } from "./types";
+interface SignTransactionArgs {
+  txType: number;
+  senderAccount: number;
+  senderAddress: string;
+  receiverAddress: string;
+  amount: number;
+  fee: number;
+  nonce: number;
+  validUntil?: number;
+  memo?: string;
+  networkId: number;
+}
+interface BaseLedgerResponse {
+  returnCode: string;
+  statusText?: string;
+  message?: string;
+}
+interface SignTransactionResponse extends BaseLedgerResponse {
+  signature?: string | null;
+}
 
-export type MinaAddress = {
-  publicKey?: string;
-};
+export interface GetAddressResponse extends BaseLedgerResponse {
+  publicKey?: string | null;
+}
 export type MinaSignature = { signature?: string };
 export interface MinaSigner {
-  getAddress(account?: number): Promise<MinaAddress>;
-  signTransaction(transaction: MinaUnsignedTransaction): Promise<MinaSignature>;
+  getAddress(account?: number, verify?: boolean): Promise<GetAddressResponse>;
+  signTransaction(transaction: SignTransactionArgs): Promise<SignTransactionResponse>;
 }
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.ts b/libs/coin-modules/coin-mina/src/synchronisation.ts
index 14aceaa571a2..f2f0627c2075 100644
--- a/libs/coin-modules/coin-mina/src/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/synchronisation.ts
@@ -113,6 +113,7 @@ export const getAccountShape: GetAccountShape = async info => {
     derivationMode,
   });
 
+  // log("debug", "getAccountShape, address: ", { address });
   const { blockHeight, balance, spendableBalance } = await getAccount(address);
 
   const rosettaTxns = await getTransactions(address);
diff --git a/libs/ledger-live-common/package.json b/libs/ledger-live-common/package.json
index 00d8adee3bdf..dc2dce6239b6 100644
--- a/libs/ledger-live-common/package.json
+++ b/libs/ledger-live-common/package.json
@@ -143,6 +143,7 @@
     "@ledgerhq/coin-icon": "workspace:^",
     "@ledgerhq/coin-internet_computer": "workspace:^",
     "@ledgerhq/coin-multiversx": "workspace:^",
+    "@ledgerhq/coin-mina": "workspace:^",
     "@ledgerhq/coin-near": "workspace:^",
     "@ledgerhq/coin-polkadot": "workspace:^",
     "@ledgerhq/coin-solana": "workspace:^",
@@ -153,7 +154,6 @@
     "@ledgerhq/coin-tron": "workspace:^",
     "@ledgerhq/coin-vechain": "workspace:^",
     "@ledgerhq/coin-xrp": "workspace:^",
-    "@ledgerhq/coin-mina": "workspace:^",
     "@ledgerhq/crypto-icons-ui": "workspace:^",
     "@ledgerhq/cryptoassets": "workspace:^",
     "@ledgerhq/device-core": "workspace:^",
@@ -214,6 +214,7 @@
     "@zondax/ledger-cosmos-js": "3.0.3",
     "@zondax/ledger-filecoin": "^2.0.2",
     "@zondax/ledger-icp": "^0.7.0",
+    "@zondax/ledger-mina-js": "0.0.2",
     "@zondax/ledger-stacks": "^1.0.2",
     "async": "^3.2.3",
     "axios": "1.7.7",
@@ -230,7 +231,6 @@
     "jotai": "^2.10.1",
     "json-rpc-2.0": "^0.2.19",
     "lodash": "^4.17.21",
-    "mina-ledger-js": "^1.0.7",
     "minimatch": "^5.1.0",
     "numeral": "^2.0.6",
     "pako": "^2.0.4",
diff --git a/libs/ledger-live-common/src/families/mina/setup.ts b/libs/ledger-live-common/src/families/mina/setup.ts
index 967d9049ffa6..9eaafd3c4ab1 100644
--- a/libs/ledger-live-common/src/families/mina/setup.ts
+++ b/libs/ledger-live-common/src/families/mina/setup.ts
@@ -4,7 +4,7 @@ import { createBridges } from "@ledgerhq/coin-mina/bridge/js";
 import makeCliTools from "@ledgerhq/coin-mina/cli-transaction";
 import minaResolver from "@ledgerhq/coin-mina/hw-getAddress";
 import { Transaction } from "@ledgerhq/coin-mina/types";
-import { MinaLedgerJS } from "mina-ledger-js";
+import { MinaApp } from "@zondax/ledger-mina-js";
 import Transport from "@ledgerhq/hw-transport";
 import type { Bridge } from "@ledgerhq/types-live";
 import { MinaSigner } from "@ledgerhq/coin-mina/lib/signer";
@@ -15,7 +15,7 @@ import type { Resolver } from "../../hw/getAddress/types";
 import { getCurrencyConfiguration } from "../../config";
 
 const createSigner: CreateSigner<MinaSigner> = (transport: Transport) => {
-  return new MinaLedgerJS(transport as any);
+  return new MinaApp(transport as any);
 };
 
 const getCoinConfig: MinaCoinConfig = () =>

From 65bdf3445db2c9c2cc5fa1ceb9f2c94dbc30cfdf Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 10 Feb 2025 12:28:42 +0100
Subject: [PATCH 20/63] chore(mina): update rosetta node endpoint

---
 libs/ledger-live-common/src/families/mina/config.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libs/ledger-live-common/src/families/mina/config.ts b/libs/ledger-live-common/src/families/mina/config.ts
index 1d5e6104be73..adde2240eabc 100644
--- a/libs/ledger-live-common/src/families/mina/config.ts
+++ b/libs/ledger-live-common/src/families/mina/config.ts
@@ -6,7 +6,7 @@ const minaConfig: CurrencyLiveConfigDefinition = {
     default: {
       status: { type: "active" },
       infra: {
-        API_MINA_ROSETTA_NODE: "https://mina-rosetta-api-mainnet.zondax.dev",
+        API_MINA_ROSETTA_NODE: "https://mina-ledger-live.zondax.ch",
       },
     },
   },

From 1f2ace9a1b1be697a4f135f920c0bfe10dcc1f11 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 10 Feb 2025 13:28:45 +0100
Subject: [PATCH 21/63] tests(mina): update integration test snapshots

---
 .../coin-mina/src/bridge.integration.test.ts  |   8 +-
 .../bridge.integration.test.ts.snap           | 101 +-----------------
 2 files changed, 6 insertions(+), 103 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
index 422d29ddfb6c..e9b2ffc3df22 100644
--- a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
+++ b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
@@ -18,12 +18,8 @@ const mina: CurrenciesData<Transaction> = {
     {
       name: "mina seed 1",
       apdus: `
-      => e00200000400000000
-      <= 423632716b6446574a5357387a6154425a6a5456746d65553372567879556b4e7850684b4b573854324a4274706a3558666479774c534d009000
-      => e00200000400000001
-      <= 423632716b576348686f6973574443523776336776577a5836775845567547594c485871336d53796d3447457a6659586d534476333134009000
-      => e00200000400000002
-      <= 423632716d6233356642476a50714c75456f4842336242766f3834397a32707738423271335854703677765a4d4c734641336562325647009000
+      => e00201000400000000
+      <= 423632716a574c733157334a3266464769786558343977316f3756765347754d424e6f746e46687a7333505a3750627464466268646544009000
       `,
     },
   ],
diff --git a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
index 2d8198eee293..f8915b97f2ce 100644
--- a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
+++ b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
@@ -3,48 +3,16 @@
 exports[`mina currency bridge scanAccounts mina seed 1 1`] = `
 [
   {
-    "balance": "17998250000",
+    "balance": "0",
     "currencyId": "mina",
     "derivationMode": "minabip44h",
-    "freshAddress": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "freshAddress": "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD",
     "freshAddressPath": "44'/12586'/0'/0/0",
-    "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
+    "id": "js:2:mina:B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD:minabip44h",
     "index": 0,
-    "operationsCount": 2,
-    "pendingOperations": [],
-    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-    "spendableBalance": "17998250000",
-    "swapHistory": [],
-    "syncHash": undefined,
-    "used": true,
-  },
-  {
-    "balance": "0",
-    "currencyId": "mina",
-    "derivationMode": "minabip44h",
-    "freshAddress": "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-    "freshAddressPath": "44'/12586'/1'/0/0",
-    "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-    "index": 1,
-    "operationsCount": 1,
-    "pendingOperations": [],
-    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-    "spendableBalance": "0",
-    "swapHistory": [],
-    "syncHash": undefined,
-    "used": true,
-  },
-  {
-    "balance": "0",
-    "currencyId": "mina",
-    "derivationMode": "minabip44h",
-    "freshAddress": "B62qmb35fBGjPqLuEoHB3bBvo849z2pw8B2q3XTp6wvZMLsFA3eb2VG",
-    "freshAddressPath": "44'/12586'/2'/0/0",
-    "id": "js:2:mina:B62qmb35fBGjPqLuEoHB3bBvo849z2pw8B2q3XTp6wvZMLsFA3eb2VG:minabip44h",
-    "index": 2,
     "operationsCount": 0,
     "pendingOperations": [],
-    "seedIdentifier": "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+    "seedIdentifier": "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD",
     "spendableBalance": "0",
     "swapHistory": [],
     "syncHash": undefined,
@@ -55,67 +23,6 @@ exports[`mina currency bridge scanAccounts mina seed 1 1`] = `
 
 exports[`mina currency bridge scanAccounts mina seed 1 2`] = `
 [
-  [
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NLHrfB7TqGgu1SWZ8MgyJJprj9axLzYacDUeFWFGbyNefNQHkxy",
-      "blockHeight": 380027,
-      "extra": {
-        "memo": "Testing mainnet",
-      },
-      "fee": "1750000",
-      "hash": "5JtoGDxnS9wE5hKkGq64GHddNqvtyU4xWipNLSQm62Bg6E1bxngV",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5JtoGDxnS9wE5hKkGq64GHddNqvtyU4xWipNLSQm62Bg6E1bxngV-OUT",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "OUT",
-      "value": "2001750000",
-    },
-    {
-      "accountId": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h",
-      "blockHash": "3NKrat5mXN1Lp8FmSbnPmvT8nfZMKAge18AvZj4eULTqZjNL55BX",
-      "blockHeight": 378920,
-      "extra": {
-        "memo": "",
-      },
-      "fee": "200100000",
-      "hash": "5Jtu8BF3stgsnauYZVhCEgFfc2ycciMQz4UncsdYnkLENxm9ogDG",
-      "id": "js:2:mina:B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM:minabip44h-5Jtu8BF3stgsnauYZVhCEgFfc2ycciMQz4UncsdYnkLENxm9ogDG-IN",
-      "recipients": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "senders": [
-        "B62qq9yz8xR6y3bYZqYa2MTrLFF5HW7vhDtjXcWjnE4iddxCVSzRdyk",
-      ],
-      "type": "IN",
-      "value": "21200100000",
-    },
-  ],
-  [
-    {
-      "accountId": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h",
-      "blockHash": "3NLHrfB7TqGgu1SWZ8MgyJJprj9axLzYacDUeFWFGbyNefNQHkxy",
-      "blockHeight": 380027,
-      "extra": {
-        "memo": "Testing mainnet",
-      },
-      "fee": "1750000",
-      "hash": "5JtoGDxnS9wE5hKkGq64GHddNqvtyU4xWipNLSQm62Bg6E1bxngV",
-      "id": "js:2:mina:B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314:minabip44h-5JtoGDxnS9wE5hKkGq64GHddNqvtyU4xWipNLSQm62Bg6E1bxngV-IN",
-      "recipients": [
-        "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314",
-      ],
-      "senders": [
-        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
-      ],
-      "type": "IN",
-      "value": "2001750000",
-    },
-  ],
   [],
 ]
 `;

From 60d028fd7f19ffae49dbbb2e5ed8ce587fecb5d1 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Thu, 13 Feb 2025 18:36:47 +0100
Subject: [PATCH 22/63] refac(mina): add bot tests and minor fixes

---
 .../src/renderer/families/mina/MemoField.tsx  |  6 +-
 .../families/mina/SendAmountFields.tsx        | 12 +---
 .../static/i18n/en/app.json                   |  3 +
 libs/coin-modules/coin-mina/src/api/index.ts  | 12 +++-
 .../coin-mina/src/api/rosetta/index.ts        |  3 +-
 .../coin-mina/src/api/rosetta/types.ts        |  6 +-
 .../coin-mina/src/api/rosetta/utils.ts        |  4 +-
 .../coin-mina/src/bridge.integration.test.ts  |  6 ++
 .../coin-mina/src/buildTransaction.ts         |  5 +-
 libs/coin-modules/coin-mina/src/consts.ts     |  4 +-
 .../coin-mina/src/createTransaction.ts        |  1 +
 libs/coin-modules/coin-mina/src/errors.ts     |  5 ++
 .../coin-mina/src/getTransactionStatus.ts     |  7 ++-
 .../coin-mina/src/prepareTransaction.ts       |  5 +-
 libs/coin-modules/coin-mina/src/specs.ts      | 35 ++++++-----
 .../coin-mina/src/speculos-deviceActions.ts   | 61 +++++++++++--------
 .../coin-mina/src/synchronisation.ts          | 17 +++++-
 .../src/synchronisation.unit.test.ts          | 15 +++++
 libs/coin-modules/coin-mina/src/testUtils.ts  |  6 +-
 .../coin-modules/coin-mina/src/transaction.ts |  2 +
 libs/coin-modules/coin-mina/src/types.ts      |  2 +
 21 files changed, 146 insertions(+), 71 deletions(-)
 create mode 100644 libs/coin-modules/coin-mina/src/synchronisation.unit.test.ts

diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/MemoField.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/MemoField.tsx
index d981b9af314c..60a2507ba868 100644
--- a/apps/ledger-live-desktop/src/renderer/families/mina/MemoField.tsx
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/MemoField.tsx
@@ -1,10 +1,10 @@
 import React, { useCallback } from "react";
 import { getAccountBridge } from "@ledgerhq/live-common/bridge/index";
-import Input from "~/renderer/components/Input";
 import invariant from "invariant";
 import { Account } from "@ledgerhq/types-live";
 import { Transaction, TransactionStatus } from "@ledgerhq/live-common/families/mina/types";
 import { useTranslation } from "react-i18next";
+import MemoTagField from "~/newArch/features/MemoTag/components/MemoTagField";
 
 const MemoField = ({
   onChange,
@@ -32,9 +32,9 @@ const MemoField = ({
   );
 
   // We use transaction as an error here.
-  // on the ledger-live mobile
+  // on the ledger-live desktop
   return (
-    <Input
+    <MemoTagField
       warning={status.warnings.transaction}
       error={status.errors.transaction}
       value={transaction.memo}
diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
index 1250c65b3824..07e23d280ddf 100644
--- a/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
@@ -21,16 +21,8 @@ const Root = (props: {
         alignItems="center"
         justifyContent="space-between"
         style={{ width: "50%", paddingRight: 28 }}
-      >
-        <Label>
-          <LabelInfoTooltip text={<Trans i18nKey="families.mina.memoWarningText" />}>
-            <span>
-              <Trans i18nKey="families.mina.memo" />
-            </span>
-          </LabelInfoTooltip>
-        </Label>
-      </Box>
-      <Box pr={2} pl={2} mb={15} horizontal alignItems="center" justifyContent="space-between">
+      ></Box>
+      <Box mb={15} horizontal alignItems="center" justifyContent="space-between">
         <Box grow={1}>
           <MemoField {...props} />
         </Box>
diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json
index c615eeac10ad..5b9fa73df322 100644
--- a/apps/ledger-live-desktop/static/i18n/en/app.json
+++ b/apps/ledger-live-desktop/static/i18n/en/app.json
@@ -6577,6 +6577,9 @@
     }, 
     "InvalidMemoMina": {
       "title": "Memo text cannot be longer than 32 characters"
+    },
+    "AccountCreationFeeWarning": {
+      "title": "This transaction may fail if the recipient account has no previous transactions"
     }
   },
   "cryptoOrg": {
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index fd66d984fda1..5e9afd94f1db 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -72,7 +72,15 @@ export const getFees = async (txn: Transaction, address: string): Promise<BigNum
   return new BigNumber(data.suggested_fee[0].value);
 };
 
-export const getNonce = async (txn: Transaction, address: string): Promise<BigNumber> => {
+export const getNonce = async (txn: Transaction, address: string): Promise<number> => {
+  if (!txn.recipient || !isValidAddress(txn.recipient)) {
+    return txn.nonce;
+  }
+
+  if (!txn.amount || !txn.fees) {
+    return txn.nonce;
+  }
+
   const { data } = await fetchTransactionMetadata(
     address,
     txn.recipient,
@@ -80,5 +88,5 @@ export const getNonce = async (txn: Transaction, address: string): Promise<BigNu
     txn.amount.toNumber(),
   );
 
-  return new BigNumber(data.metadata.nonce);
+  return parseInt(data.metadata.nonce);
 };
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
index c4d08234509d..fc2f53930eea 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
@@ -3,7 +3,6 @@ import {
   FetchAccountBalanceResponse,
   FetchAccountTransactionsResponse,
   FetchNetworkStatusResponse,
-  RosettaBlockInfoResponse,
   RosettaMetadataResponse,
   RosettaPreprocessResponse,
   RosettaSubmitResponse,
@@ -48,6 +47,8 @@ export const fetchAccountTransactions = async (address: string) => {
 
 const rosettaPreprocess = async (from: string, to: string, feeNano: number, valueNano: number) => {
   const payload = makeTransferPayload(from, to, feeNano, valueNano);
+  // eslint-disable-next-line no-console
+  console.log("payload", JSON.stringify(payload, null, 2));
   const { data } = await network<RosettaPreprocessResponse>({
     method: "POST",
     url: getRosettaUrl("/construction/preprocess"),
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
index eec9152183e0..1641fe3d3dce 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
@@ -62,8 +62,10 @@ export type RosettaTransaction = {
         | "fee_payment"
         | "payment_source_dec"
         | "payment_receiver_inc"
-        | "account_creation_fee_via_payment";
-      status: string;
+        | "account_creation_fee_via_payment"
+        | "zkapp_fee_payer_dec"
+        | "zkapp_balance_update";
+      status: "Success" | "Failed";
       account: {
         address: string;
         metadata: {
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts b/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
index 60356dca7244..6358ff60c0f8 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/utils.ts
@@ -2,12 +2,12 @@ import {
   MINA_DECIMALS,
   MINA_SYMBOL,
   MINA_TOKEN_ID,
-  TESTNET_NETWORK_IDENTIFIER,
+  MAINNET_NETWORK_IDENTIFIER,
 } from "../../consts";
 
 export const addNetworkIdentifier = (data: any) => {
   return {
-    ...TESTNET_NETWORK_IDENTIFIER,
+    ...MAINNET_NETWORK_IDENTIFIER,
     ...data,
   };
 };
diff --git a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
index e9b2ffc3df22..5099d4a26758 100644
--- a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
+++ b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
@@ -51,6 +51,7 @@ const mina: CurrenciesData<Transaction> = {
             fees: new BigNumber(0).toString(),
             amount: "1000",
             memo: undefined,
+            nonce: 0,
           }),
           expectedStatus: {
             errors: {
@@ -67,6 +68,7 @@ const mina: CurrenciesData<Transaction> = {
             fees: new BigNumber(0).toString(),
             amount: (300 * 1e9).toString(),
             memo: undefined,
+            nonce: 0,
           }),
           expectedStatus: {
             errors: {
@@ -83,6 +85,7 @@ const mina: CurrenciesData<Transaction> = {
             fees: new BigNumber(0).toString(),
             amount: "1000",
             memo: "string greated than 32 chars is invalid",
+            nonce: 0,
           }),
           expectedStatus: {
             errors: {
@@ -99,6 +102,7 @@ const mina: CurrenciesData<Transaction> = {
             memo: undefined,
             amount: "0",
             fees: new BigNumber(0).toString(),
+            nonce: 0,
           }),
           expectedStatus: {
             errors: {
@@ -115,6 +119,7 @@ const mina: CurrenciesData<Transaction> = {
             amount: "10",
             fees: new BigNumber(0).toString(),
             memo: undefined,
+            nonce: 0,
           }),
           expectedStatus: {
             errors: {
@@ -131,6 +136,7 @@ const mina: CurrenciesData<Transaction> = {
             amount: "1000",
             fees: new BigNumber(0).toString(),
             memo: undefined,
+            nonce: 0,
           }),
           expectedStatus: {
             amount: new BigNumber("1000"),
diff --git a/libs/coin-modules/coin-mina/src/buildTransaction.ts b/libs/coin-modules/coin-mina/src/buildTransaction.ts
index c5cf3f5405c6..aa2a12157df7 100644
--- a/libs/coin-modules/coin-mina/src/buildTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/buildTransaction.ts
@@ -3,8 +3,6 @@ import type { Account } from "@ledgerhq/types-live";
 import type { MinaUnsignedTransaction, Transaction } from "./types";
 import { MINA_MAINNET_NETWORK_ID, MINA_PAYMENT_TYPE_ID } from "./consts";
 import { getAccountNumFromPath } from "./logic";
-import { getNonce } from "./api";
-import BigNumber from "bignumber.js";
 import invariant from "invariant";
 
 export const buildTransaction = async (
@@ -15,7 +13,6 @@ export const buildTransaction = async (
     // log("debug", "mina: build transaction", { account: a, transaction: t });
     const accountNum = getAccountNumFromPath(a.freshAddressPath);
     invariant(accountNum !== undefined, "mina: accountNum is required to build transaction");
-    const nonce = await getNonce(t, a.freshAddress);
     return {
       txType: MINA_PAYMENT_TYPE_ID,
       senderAccount: accountNum,
@@ -23,7 +20,7 @@ export const buildTransaction = async (
       receiverAddress: t.recipient,
       amount: t.amount.toNumber(),
       fee: t.fees.toNumber(),
-      nonce: BigNumber(nonce).toNumber(),
+      nonce: t.nonce,
       memo: t.memo ?? "",
       networkId: MINA_MAINNET_NETWORK_ID,
     };
diff --git a/libs/coin-modules/coin-mina/src/consts.ts b/libs/coin-modules/coin-mina/src/consts.ts
index 0a3968dabeb3..05c011d55336 100644
--- a/libs/coin-modules/coin-mina/src/consts.ts
+++ b/libs/coin-modules/coin-mina/src/consts.ts
@@ -1,10 +1,12 @@
-export const TESTNET_NETWORK_IDENTIFIER = {
+export const MAINNET_NETWORK_IDENTIFIER = {
   network_identifier: {
     blockchain: "mina",
     network: "mainnet",
   },
 };
 
+export const MINA_ACCOUNT_CREATION_FEE = 1 * 10 ** 9;
+
 export const MINA_MAINNET_NETWORK_ID = 1;
 export const MINA_PAYMENT_TYPE_ID = 0;
 export const MINA_TOKEN_ID = "wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf";
diff --git a/libs/coin-modules/coin-mina/src/createTransaction.ts b/libs/coin-modules/coin-mina/src/createTransaction.ts
index 0c29100a5171..ca5a91426560 100644
--- a/libs/coin-modules/coin-mina/src/createTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/createTransaction.ts
@@ -12,4 +12,5 @@ export const createTransaction: AccountBridge<
   useAllAmount: false,
   fees: new BigNumber(0),
   memo: undefined,
+  nonce: 0,
 });
diff --git a/libs/coin-modules/coin-mina/src/errors.ts b/libs/coin-modules/coin-mina/src/errors.ts
index d35063f5cbbf..f38def6be4f7 100644
--- a/libs/coin-modules/coin-mina/src/errors.ts
+++ b/libs/coin-modules/coin-mina/src/errors.ts
@@ -4,3 +4,8 @@ import { createCustomErrorClass } from "@ledgerhq/errors";
  * When the memo is greater than 32 characters
  */
 export const InvalidMemoMina = createCustomErrorClass("InvalidMemoMina");
+
+/*
+ * When the user sends less than the account creation fee of 1 MINA
+ */
+export const AccountCreationFeeWarning = createCustomErrorClass("AccountCreationFeeWarning");
diff --git a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
index 3fc6202feae3..9cb143a7863f 100644
--- a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
+++ b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
@@ -10,7 +10,8 @@ import {
 import type { Transaction, MinaAccount, TransactionStatus, StatusErrorMap } from "./types";
 import { isValidAddress, isValidMemo, getMaxAmount, getTotalSpent } from "./logic";
 import { AccountBridge } from "@ledgerhq/types-live";
-import { InvalidMemoMina } from "./errors";
+import { AccountCreationFeeWarning, InvalidMemoMina } from "./errors";
+import { MINA_ACCOUNT_CREATION_FEE } from "./consts";
 // import { fetchAccountBalance } from "./api";
 // import {} from "./constants";
 
@@ -43,6 +44,10 @@ const getTransactionStatus: AccountBridge<
     errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
   }
 
+  if (t.amount.lt(MINA_ACCOUNT_CREATION_FEE)) {
+    warnings.amount = new AccountCreationFeeWarning();
+  }
+
   const estimatedFees = t.fees || new BigNumber(0);
 
   const maxAmountWithFees = getMaxAmount(a, t, estimatedFees);
diff --git a/libs/coin-modules/coin-mina/src/prepareTransaction.ts b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
index 6ee3eb974a0d..6ebd1377e136 100644
--- a/libs/coin-modules/coin-mina/src/prepareTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
@@ -3,6 +3,7 @@ import { Account, AccountBridge } from "@ledgerhq/types-live";
 import estimateMaxSpendable from "./estimateMaxSpendable";
 import getEstimatedFees from "./getFeesForTransaction";
 import { MinaAccount, Transaction } from "./types";
+import { getNonce } from "./api";
 
 export const prepareTransaction: AccountBridge<
   Transaction,
@@ -17,5 +18,7 @@ export const prepareTransaction: AccountBridge<
       })
     : t.amount;
 
-  return updateTransaction(t, { fees, amount });
+  const nonce = await getNonce(t, a.freshAddress);
+
+  return updateTransaction(t, { fees, amount, nonce });
 };
diff --git a/libs/coin-modules/coin-mina/src/specs.ts b/libs/coin-modules/coin-mina/src/specs.ts
index c63351769748..8f3f3a40bd02 100644
--- a/libs/coin-modules/coin-mina/src/specs.ts
+++ b/libs/coin-modules/coin-mina/src/specs.ts
@@ -8,10 +8,12 @@ import { genericTestDestination, pickSiblings, botTest } from "@ledgerhq/coin-fr
 import type { AppSpec } from "@ledgerhq/coin-framework/bot/types";
 import { acceptTransaction } from "./speculos-deviceActions";
 import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/index";
+import { getRandomTransferID } from "./testUtils";
 // import {} from "./consts";
 
 const maxAccount = 6;
-const MIN_SAFE = new BigNumber(10);
+// 0.1 MINA
+const MIN_SAFE = new BigNumber(1 * 10 ** 8);
 
 const minaSpecs: AppSpec<Transaction> = {
   name: "Mina",
@@ -28,9 +30,10 @@ const minaSpecs: AppSpec<Transaction> = {
   },
   mutations: [
     {
-      name: "Send ~50%",
+      name: "Send ~50% to another account",
       maxRun: 1,
       testDestination: genericTestDestination,
+      feature: "send",
       transaction: ({ account, siblings, bridge, maxSpendable }) => {
         invariant(maxSpendable.gt(MIN_SAFE), "balance is too low");
         const sibling = pickSiblings(siblings, maxAccount);
@@ -45,11 +48,11 @@ const minaSpecs: AppSpec<Transaction> = {
           { amount },
         ];
 
-        // if (Math.random() < 0.5) {
-        //   updates.push({
-        //     transferId: getRandomTransferID(),
-        //   });
-        // }
+        if (Math.random() < 0.5) {
+          updates.push({
+            memo: getRandomTransferID(),
+          });
+        }
 
         return {
           transaction,
@@ -57,20 +60,20 @@ const minaSpecs: AppSpec<Transaction> = {
         };
       },
 
-      test: ({ accountBeforeTransaction, operation, account }) => {
+      test: ({ accountBeforeTransaction, operation, account, transaction }) => {
         botTest("account spendable balance decreased with operation", () =>
           expect(account.spendableBalance).toEqual(
-            accountBeforeTransaction.spendableBalance.minus(operation.value),
+            accountBeforeTransaction.spendableBalance.minus(operation.value.minus(operation.fee)),
           ),
         );
 
-        // if (transaction.transferId) {
-        //   botTest("operation transferId", () =>
-        //     expect(operation.extra).toMatchObject({
-        //       transferId: transaction.transferId,
-        //     }),
-        //   );
-        // }
+        if (transaction.memo) {
+          botTest("operation memo", () =>
+            expect(operation.extra).toMatchObject({
+              memo: transaction.memo,
+            }),
+          );
+        }
       },
     },
     // {
diff --git a/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts b/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
index eb3a19dd5622..9b2ec4864a5b 100644
--- a/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
+++ b/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
@@ -1,61 +1,72 @@
 import type { DeviceAction } from "@ledgerhq/coin-framework/bot/types";
 import type { Transaction } from "./types";
 import { deviceActionFlow, SpeculosButton } from "@ledgerhq/coin-framework/bot/specs";
+import { formatCurrencyUnit } from "@ledgerhq/coin-framework/lib/currencies/formatCurrencyUnit";
 
 export const acceptTransaction: DeviceAction<Transaction, any> = deviceActionFlow({
   steps: [
     {
-      title: "Get",
+      title: "Sign",
       button: SpeculosButton.RIGHT,
     },
     {
-      title: "Path",
+      title: "Type",
       button: SpeculosButton.RIGHT,
+      expectedValue: () => "Payment",
     },
     {
-      title: "Generate",
-      button: SpeculosButton.BOTH,
-    },
-    {
-      title: "Address",
-      button: SpeculosButton.BOTH,
-    },
-    {
-      title: "Approve",
-      button: SpeculosButton.BOTH,
+      title: "Sender",
+      button: SpeculosButton.RIGHT,
+      expectedValue: ({ account }) => account.freshAddress,
     },
     {
-      title: "Type",
+      title: "Receiver",
       button: SpeculosButton.RIGHT,
-      expectedValue: () => "Token transfer",
+      expectedValue: ({ transaction }) => transaction.recipient,
     },
     {
-      title: "Chain ID",
+      title: "Amount",
       button: SpeculosButton.RIGHT,
-      expectedValue: () => "casper",
+      expectedValue: ({ transaction, account }) =>
+        `MINA ${formatCurrencyUnit(account.currency.units[0], transaction.amount, {
+          dynamicSignificantDigits: 10,
+          staticSignificantDigits: 10,
+        })}`,
     },
     {
-      title: "Account",
+      title: "Fee",
       button: SpeculosButton.RIGHT,
-      expectedValue: ({ account }) => account.freshAddress,
+      expectedValue: ({ transaction, account }) =>
+        `MINA ${formatCurrencyUnit(account.currency.units[0], transaction.fees, {
+          dynamicSignificantDigits: 10,
+          staticSignificantDigits: 10,
+        })}`,
     },
     {
-      title: "Fee",
+      title: "Total",
       button: SpeculosButton.RIGHT,
-      expectedValue: ({ transaction }) => `${transaction.fees.toNumber()} mina`,
+      expectedValue: ({ transaction, account }) =>
+        `MINA ${formatCurrencyUnit(
+          account.currency.units[0],
+          transaction.fees.plus(transaction.amount),
+          {
+            dynamicSignificantDigits: 10,
+            staticSignificantDigits: 10,
+          },
+        )}`,
     },
     {
-      title: "Target",
+      title: "Memo",
       button: SpeculosButton.RIGHT,
-      expectedValue: ({ transaction }) => transaction.recipient,
+      expectedValue: ({ transaction }) => transaction.memo ?? "",
     },
     {
-      title: "Amount",
+      title: "Nonce",
       button: SpeculosButton.RIGHT,
-      expectedValue: ({ status }) => `${status.amount.toNumber()} mina`,
+      expectedValue: ({ transaction }) => transaction.nonce.toString(),
     },
     {
-      title: "APPROVE",
+      title: "Approve",
       button: SpeculosButton.BOTH,
     },
   ],
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.ts b/libs/coin-modules/coin-mina/src/synchronisation.ts
index f2f0627c2075..9416bc8fdcec 100644
--- a/libs/coin-modules/coin-mina/src/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/synchronisation.ts
@@ -10,7 +10,7 @@ import { log } from "@ledgerhq/logs";
 import invariant from "invariant";
 import { RosettaTransaction } from "./api/rosetta/types";
 
-const mapRosettaTxnToOperation = (
+export const mapRosettaTxnToOperation = (
   accountId: string,
   address: string,
   txn: RosettaTransaction,
@@ -28,8 +28,11 @@ const mapRosettaTxnToOperation = (
     let fromAccount: string = "";
     let toAccount: string = "";
     let isSending = false;
+    let failed = false;
+
     for (const op of txn.transaction.operations) {
-      const opValue = new BigNumber(op.amount.value);
+      failed = op.status === "Failed";
+      const opValue = failed ? new BigNumber(0) : new BigNumber(op.amount.value);
       switch (op.type) {
         case "fee_payment": {
           fee = fee.plus(opValue.times(-1));
@@ -47,6 +50,15 @@ const mapRosettaTxnToOperation = (
           }
           continue;
         }
+        case "zkapp_fee_payer_dec": {
+          fromAccount = op.account.address;
+          continue;
+        }
+        case "zkapp_balance_update": {
+          toAccount = op.account.address;
+          value = value.plus(opValue);
+          continue;
+        }
         case "account_creation_fee_via_payment": {
           fee = fee.plus(opValue.times(-1));
           continue;
@@ -64,6 +76,7 @@ const mapRosettaTxnToOperation = (
       value,
       fee,
       blockHeight,
+      hasFailed: failed,
       blockHash,
       accountId,
       senders: [fromAccount],
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.unit.test.ts b/libs/coin-modules/coin-mina/src/synchronisation.unit.test.ts
new file mode 100644
index 000000000000..ae42e5efc64e
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/synchronisation.unit.test.ts
@@ -0,0 +1,15 @@
+import { getTransactions } from "./api";
+import { mapRosettaTxnToOperation } from "./synchronisation";
+import { setConfig } from "./testUtils";
+
+setConfig();
+
+describe("synchronisation", () => {
+  it("should map rosetta txn to operation", async () => {
+    const txns = await getTransactions("B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM");
+    const ops = txns.flatMap(t => mapRosettaTxnToOperation("accountId", "address", t));
+
+    expect(ops.length).toBeGreaterThan(0);
+    expect(ops.filter(op => op.hasFailed).length).toBeGreaterThan(0);
+  }, 1000000);
+});
diff --git a/libs/coin-modules/coin-mina/src/testUtils.ts b/libs/coin-modules/coin-mina/src/testUtils.ts
index ca5cc97f2208..cca712701689 100644
--- a/libs/coin-modules/coin-mina/src/testUtils.ts
+++ b/libs/coin-modules/coin-mina/src/testUtils.ts
@@ -4,8 +4,12 @@ export const setConfig = () => {
   setCoinConfig((): any => {
     return {
       infra: {
-        API_MINA_ROSETTA_NODE: "https://mina-rosetta-api-devnet.zondax.dev",
+        API_MINA_ROSETTA_NODE: "https://mina-ledger-live.zondax.ch",
       },
     };
   });
 };
+
+export const getRandomTransferID = () => {
+  return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
+};
diff --git a/libs/coin-modules/coin-mina/src/transaction.ts b/libs/coin-modules/coin-mina/src/transaction.ts
index 42a07624770f..5e79bd4ca21b 100644
--- a/libs/coin-modules/coin-mina/src/transaction.ts
+++ b/libs/coin-modules/coin-mina/src/transaction.ts
@@ -36,6 +36,7 @@ export const fromTransactionRaw = (tr: TransactionRaw): Transaction => {
     fees: new BigNumber(tr.fees),
     amount: new BigNumber(tr.amount),
     memo: tr.memo,
+    nonce: tr.nonce,
   };
 };
 
@@ -48,6 +49,7 @@ const toTransactionRaw = (t: Transaction): TransactionRaw => {
     amount: t.amount.toFixed(),
     fees: t.fees.toString(),
     memo: t.memo ?? undefined,
+    nonce: t.nonce,
   };
 };
 
diff --git a/libs/coin-modules/coin-mina/src/types.ts b/libs/coin-modules/coin-mina/src/types.ts
index 335af09bb454..9427d8d13fa1 100644
--- a/libs/coin-modules/coin-mina/src/types.ts
+++ b/libs/coin-modules/coin-mina/src/types.ts
@@ -13,12 +13,14 @@ export type Transaction = TransactionCommon & {
   family: "mina";
   fees: BigNumber;
   memo: string | undefined;
+  nonce: number;
 };
 
 export type TransactionRaw = TransactionCommonRaw & {
   family: "mina";
   fees: string;
   memo: string | undefined;
+  nonce: number;
 };
 
 export type MinaAccount = Account;

From 4efbc695da7a6844081c7c4be46102e9bb41f46b Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 17 Feb 2025 16:56:29 +0100
Subject: [PATCH 23/63] feat(mina): many fixes, bot tests working and added inc
 sync

---
 .../families/mina/operationDetails.tsx        | 36 ++++++---
 .../static/i18n/en/app.json                   |  8 +-
 libs/coin-modules/coin-mina/src/api/index.ts  | 32 ++++++--
 .../coin-mina/src/api/rosetta/index.ts        | 36 ++++++---
 .../coin-mina/src/api/rosetta/types.ts        |  2 +
 .../coin-mina/src/bridge.integration.test.ts  | 30 +++++--
 .../coin-mina/src/buildTransaction.ts         |  2 +-
 libs/coin-modules/coin-mina/src/consts.ts     |  4 +-
 .../coin-mina/src/createTransaction.ts        |  5 +-
 libs/coin-modules/coin-mina/src/errors.ts     |  5 ++
 .../coin-mina/src/estimateMaxSpendable.ts     |  4 +-
 .../coin-mina/src/getFeesForTransaction.ts    | 12 ++-
 .../coin-mina/src/getTransactionStatus.ts     | 24 ++++--
 .../coin-mina/src/prepareTransaction.ts       |  8 +-
 .../coin-mina/src/signOperation.ts            | 10 ++-
 libs/coin-modules/coin-mina/src/specs.ts      | 81 +++++++++----------
 .../coin-mina/src/speculos-deviceActions.ts   |  4 +-
 .../coin-mina/src/synchronisation.ts          |  9 ++-
 .../coin-modules/coin-mina/src/transaction.ts | 10 ++-
 libs/coin-modules/coin-mina/src/types.ts      | 12 ++-
 20 files changed, 225 insertions(+), 109 deletions(-)

diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
index 463f6f983480..1932a419ac33 100644
--- a/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
@@ -14,16 +14,32 @@ type OperationDetailsExtraProps = {
 
 const OperationDetailsExtra = ({ operation }: OperationDetailsExtraProps) => {
   const { extra } = operation;
-  return !extra.memo ? null : (
-    <OpDetailsSection key={extra.memo}>
-      <OpDetailsTitle>
-        <Trans i18nKey={`operationDetails.extra.memo`} />
-      </OpDetailsTitle>
-      <OpDetailsData>
-        <Ellipsis>{extra.memo}</Ellipsis>
-      </OpDetailsData>
-    </OpDetailsSection>
-  );
+  const sections = [];
+  if (extra.memo) {
+    sections.push(
+      <OpDetailsSection key={extra.memo}>
+        <OpDetailsTitle>
+          <Trans i18nKey={`operationDetails.extra.memo`} />
+        </OpDetailsTitle>
+        <OpDetailsData>
+          <Ellipsis>{extra.memo}</Ellipsis>
+        </OpDetailsData>
+      </OpDetailsSection>,
+    );
+  }
+
+  if (extra.accountCreationFee !== "0") {
+    sections.push(
+      <OpDetailsSection key={extra.accountCreationFee}>
+        <OpDetailsTitle>
+          <Trans i18nKey={`operationDetails.extra.accountCreationFee`} />
+        </OpDetailsTitle>
+        <OpDetailsData>{extra.accountCreationFee}</OpDetailsData>
+      </OpDetailsSection>,
+    );
+  }
+
+  return sections;
 };
 
 export default {
diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json
index 5b9fa73df322..1a78db338556 100644
--- a/apps/ledger-live-desktop/static/i18n/en/app.json
+++ b/apps/ledger-live-desktop/static/i18n/en/app.json
@@ -1879,7 +1879,8 @@
       "palletMethod": "Method",
       "transferAmount": "Transfer Amount",
       "validatorsCount": "Validators ({{number}})",
-      "version": "Version"
+      "version": "Version",
+      "accountCreationFee": "Account Creation Fee"
     }
   },
   "operationList": {
@@ -6579,7 +6580,10 @@
       "title": "Memo text cannot be longer than 32 characters"
     },
     "AccountCreationFeeWarning": {
-      "title": "This transaction may fail if the recipient account has no previous transactions"
+      "title": "This transaction will incur an account creation fee of {{fee}}"
+    },
+    "AmountTooSmall": {
+      "title": "Minimum required amount for this transaction is {{amount}}"
     }
   },
   "cryptoOrg": {
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index 5e9afd94f1db..27a4dd6ccf01 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -30,9 +30,12 @@ export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
   };
 };
 
-export const getTransactions = async (address: string): Promise<RosettaTransaction[]> => {
-  const txns = await fetchAccountTransactions(address);
-  return txns.transactions.sort((a, b) => b.timestamp - a.timestamp);
+export const getTransactions = async (
+  address: string,
+  offset: number = 0,
+): Promise<RosettaTransaction[]> => {
+  const txns = await fetchAccountTransactions(address, offset);
+  return txns.sort((a, b) => b.timestamp - a.timestamp);
 };
 
 export const broadcastTransaction = async (txn: MinaSignedTransaction): Promise<string> => {
@@ -57,19 +60,32 @@ export const broadcastTransaction = async (txn: MinaSignedTransaction): Promise<
   return data.transaction_identifier.hash;
 };
 
-export const getFees = async (txn: Transaction, address: string): Promise<BigNumber> => {
+export const getFees = async (
+  txn: Transaction,
+  address: string,
+): Promise<{
+  fee: BigNumber;
+  accountCreationFee: BigNumber;
+}> => {
   if (!txn.amount || !txn.recipient || !isValidAddress(txn.recipient)) {
-    return txn.fees;
+    return { fee: txn.fees.fee, accountCreationFee: new BigNumber(0) };
   }
 
   const { data } = await fetchTransactionMetadata(
     address,
     txn.recipient,
-    txn.fees.toNumber(),
+    txn.fees.fee.toNumber(),
     txn.amount.toNumber(),
   );
 
-  return new BigNumber(data.suggested_fee[0].value);
+  const accountCreationFee = data.metadata.account_creation_fee
+    ? new BigNumber(data.metadata.account_creation_fee)
+    : new BigNumber(0);
+
+  return {
+    fee: new BigNumber(data.suggested_fee[0].value),
+    accountCreationFee,
+  };
 };
 
 export const getNonce = async (txn: Transaction, address: string): Promise<number> => {
@@ -84,7 +100,7 @@ export const getNonce = async (txn: Transaction, address: string): Promise<numbe
   const { data } = await fetchTransactionMetadata(
     address,
     txn.recipient,
-    txn.fees.toNumber(),
+    txn.fees.fee.toNumber(),
     txn.amount.toNumber(),
   );
 
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
index fc2f53930eea..c02de12f6659 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
@@ -6,9 +6,12 @@ import {
   RosettaMetadataResponse,
   RosettaPreprocessResponse,
   RosettaSubmitResponse,
+  RosettaTransaction,
 } from "./types";
 import { getCoinConfig } from "../../config";
 import { addNetworkIdentifier, buildAccountIdentifier, makeTransferPayload } from "./utils";
+import { MAX_TRANSACTIONS_PER_PAGE } from "../../consts";
+import { LiveNetworkResponse } from "@ledgerhq/live-network/lib/network";
 
 const getRosettaUrl = (route: string): string => {
   const currencyConfig = getCoinConfig();
@@ -35,20 +38,35 @@ export const fetchAccountBalance = async (address: string) => {
   return data;
 };
 
-export const fetchAccountTransactions = async (address: string) => {
-  const { data } = await network<FetchAccountTransactionsResponse>({
-    method: "POST",
-    url: getRosettaUrl("/search/transactions"),
-    data: { ...addNetworkIdentifier(buildAccountIdentifier(address)), include_timestamp: true },
-  });
+export const fetchAccountTransactions = async (
+  address: string,
+  offset: number = 0,
+): Promise<RosettaTransaction[]> => {
+  const transactions: RosettaTransaction[] = [];
+  let currentOffset: number | undefined = offset;
+  while (currentOffset !== undefined) {
+    const response: LiveNetworkResponse<FetchAccountTransactionsResponse> =
+      await network<FetchAccountTransactionsResponse>({
+        method: "POST",
+        url: getRosettaUrl("/search/transactions"),
+        data: {
+          ...addNetworkIdentifier(buildAccountIdentifier(address)),
+          offset: currentOffset,
+          limit: MAX_TRANSACTIONS_PER_PAGE,
+          include_timestamp: true,
+        },
+      });
+    const { data } = response;
+    transactions.push(...data.transactions);
 
-  return data;
+    currentOffset = data.next_offset;
+  }
+
+  return transactions;
 };
 
 const rosettaPreprocess = async (from: string, to: string, feeNano: number, valueNano: number) => {
   const payload = makeTransferPayload(from, to, feeNano, valueNano);
-  // eslint-disable-next-line no-console
-  console.log("payload", JSON.stringify(payload, null, 2));
   const { data } = await network<RosettaPreprocessResponse>({
     method: "POST",
     url: getRosettaUrl("/construction/preprocess"),
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
index 1641fe3d3dce..da76e1f5dc72 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
@@ -94,6 +94,7 @@ export type RosettaTransaction = {
 export type FetchAccountTransactionsResponse = {
   transactions: RosettaTransaction[];
   total_count: number;
+  next_offset?: number;
 };
 
 export type RosettaPreprocessResponse = {
@@ -110,6 +111,7 @@ export type RosettaMetadataResponse = {
     nonce: string;
     token_id: string;
     receiver: string;
+    account_creation_fee?: string;
   };
   suggested_fee: Array<{
     value: string;
diff --git a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
index 5099d4a26758..89a8eea8f6e5 100644
--- a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
+++ b/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
@@ -48,7 +48,10 @@ const mina: CurrenciesData<Transaction> = {
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: "novalidaddress",
-            fees: new BigNumber(0).toString(),
+            fees: {
+              fee: new BigNumber(0).toString(),
+              accountCreationFee: new BigNumber(0).toString(),
+            },
             amount: "1000",
             memo: undefined,
             nonce: 0,
@@ -65,7 +68,10 @@ const mina: CurrenciesData<Transaction> = {
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: ACCOUNT_ADDRESS_1,
-            fees: new BigNumber(0).toString(),
+            fees: {
+              fee: new BigNumber(0).toString(),
+              accountCreationFee: new BigNumber(0).toString(),
+            },
             amount: (300 * 1e9).toString(),
             memo: undefined,
             nonce: 0,
@@ -82,7 +88,10 @@ const mina: CurrenciesData<Transaction> = {
           transaction: fromTransactionRaw({
             family: "mina",
             recipient: ACCOUNT_ADDRESS_1,
-            fees: new BigNumber(0).toString(),
+            fees: {
+              fee: new BigNumber(0).toString(),
+              accountCreationFee: new BigNumber(0).toString(),
+            },
             amount: "1000",
             memo: "string greated than 32 chars is invalid",
             nonce: 0,
@@ -101,7 +110,10 @@ const mina: CurrenciesData<Transaction> = {
             recipient: ACCOUNT_ADDRESS_1,
             memo: undefined,
             amount: "0",
-            fees: new BigNumber(0).toString(),
+            fees: {
+              fee: new BigNumber(0).toString(),
+              accountCreationFee: new BigNumber(0).toString(),
+            },
             nonce: 0,
           }),
           expectedStatus: {
@@ -117,7 +129,10 @@ const mina: CurrenciesData<Transaction> = {
             family: "mina",
             recipient: ACCOUNT_ADDRESS,
             amount: "10",
-            fees: new BigNumber(0).toString(),
+            fees: {
+              fee: new BigNumber(0).toString(),
+              accountCreationFee: new BigNumber(0).toString(),
+            },
             memo: undefined,
             nonce: 0,
           }),
@@ -134,7 +149,10 @@ const mina: CurrenciesData<Transaction> = {
             family: "mina",
             recipient: ACCOUNT_ADDRESS_1,
             amount: "1000",
-            fees: new BigNumber(0).toString(),
+            fees: {
+              fee: new BigNumber(0).toString(),
+              accountCreationFee: new BigNumber(0).toString(),
+            },
             memo: undefined,
             nonce: 0,
           }),
diff --git a/libs/coin-modules/coin-mina/src/buildTransaction.ts b/libs/coin-modules/coin-mina/src/buildTransaction.ts
index aa2a12157df7..008c1e3ddd7b 100644
--- a/libs/coin-modules/coin-mina/src/buildTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/buildTransaction.ts
@@ -19,7 +19,7 @@ export const buildTransaction = async (
       senderAddress: a.freshAddress,
       receiverAddress: t.recipient,
       amount: t.amount.toNumber(),
-      fee: t.fees.toNumber(),
+      fee: t.fees.fee.toNumber(),
       nonce: t.nonce,
       memo: t.memo ?? "",
       networkId: MINA_MAINNET_NETWORK_ID,
diff --git a/libs/coin-modules/coin-mina/src/consts.ts b/libs/coin-modules/coin-mina/src/consts.ts
index 05c011d55336..d65c894e92e6 100644
--- a/libs/coin-modules/coin-mina/src/consts.ts
+++ b/libs/coin-modules/coin-mina/src/consts.ts
@@ -5,8 +5,6 @@ export const MAINNET_NETWORK_IDENTIFIER = {
   },
 };
 
-export const MINA_ACCOUNT_CREATION_FEE = 1 * 10 ** 9;
-
 export const MINA_MAINNET_NETWORK_ID = 1;
 export const MINA_PAYMENT_TYPE_ID = 0;
 export const MINA_TOKEN_ID = "wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf";
@@ -16,3 +14,5 @@ export const MINA_CURVE_TYPE = "pallas";
 
 export const MAX_MEMO_LENGTH = 32;
 export const MINA_DECODED_ADDRESS_LENGTH = 72;
+
+export const MAX_TRANSACTIONS_PER_PAGE = 100;
diff --git a/libs/coin-modules/coin-mina/src/createTransaction.ts b/libs/coin-modules/coin-mina/src/createTransaction.ts
index ca5a91426560..d87140be52af 100644
--- a/libs/coin-modules/coin-mina/src/createTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/createTransaction.ts
@@ -10,7 +10,10 @@ export const createTransaction: AccountBridge<
   amount: new BigNumber(0),
   recipient: "",
   useAllAmount: false,
-  fees: new BigNumber(0),
+  fees: {
+    fee: new BigNumber(0),
+    accountCreationFee: new BigNumber(0),
+  },
   memo: undefined,
   nonce: 0,
 });
diff --git a/libs/coin-modules/coin-mina/src/errors.ts b/libs/coin-modules/coin-mina/src/errors.ts
index f38def6be4f7..2ee763aa1a59 100644
--- a/libs/coin-modules/coin-mina/src/errors.ts
+++ b/libs/coin-modules/coin-mina/src/errors.ts
@@ -9,3 +9,8 @@ export const InvalidMemoMina = createCustomErrorClass("InvalidMemoMina");
  * When the user sends less than the account creation fee of 1 MINA
  */
 export const AccountCreationFeeWarning = createCustomErrorClass("AccountCreationFeeWarning");
+
+/*
+ * When the amount is less than the account creation fee of 1 MINA
+ */
+export const AmountTooSmall = createCustomErrorClass("AmountTooSmall");
diff --git a/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts b/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
index b8b66bdc8af4..0319b572ce31 100644
--- a/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
+++ b/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
@@ -17,9 +17,9 @@ const estimateMaxSpendable: AccountBridge<
     amount: a.spendableBalance,
   };
 
-  const fees = await getEstimatedFees(t, a.freshAddress);
+  const { fee, accountCreationFee } = await getEstimatedFees(t, a.freshAddress);
 
-  const maxSpendable = getMaxAmount(a, t, fees);
+  const maxSpendable = getMaxAmount(a, t, fee.plus(accountCreationFee));
 
   if (maxSpendable.lt(0)) {
     return new BigNumber(0);
diff --git a/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts b/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
index 10229632dbef..069a90ae222a 100644
--- a/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
@@ -2,10 +2,16 @@ import { BigNumber } from "bignumber.js";
 import { getFees } from "./api";
 import { Transaction } from "./types";
 
-const getEstimatedFees = async (transaction: Transaction, address: string): Promise<BigNumber> => {
-  const fees = await getFees(transaction, address);
+const getEstimatedFees = async (
+  transaction: Transaction,
+  address: string,
+): Promise<{
+  fee: BigNumber;
+  accountCreationFee: BigNumber;
+}> => {
+  const { fee, accountCreationFee } = await getFees(transaction, address);
 
-  return fees;
+  return { fee, accountCreationFee };
 };
 
 export default getEstimatedFees;
diff --git a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
index 9cb143a7863f..7a32549591e0 100644
--- a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
+++ b/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
@@ -10,10 +10,8 @@ import {
 import type { Transaction, MinaAccount, TransactionStatus, StatusErrorMap } from "./types";
 import { isValidAddress, isValidMemo, getMaxAmount, getTotalSpent } from "./logic";
 import { AccountBridge } from "@ledgerhq/types-live";
-import { AccountCreationFeeWarning, InvalidMemoMina } from "./errors";
-import { MINA_ACCOUNT_CREATION_FEE } from "./consts";
-// import { fetchAccountBalance } from "./api";
-// import {} from "./constants";
+import { AccountCreationFeeWarning, InvalidMemoMina, AmountTooSmall } from "./errors";
+import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies";
 
 const getTransactionStatus: AccountBridge<
   Transaction,
@@ -44,11 +42,23 @@ const getTransactionStatus: AccountBridge<
     errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
   }
 
-  if (t.amount.lt(MINA_ACCOUNT_CREATION_FEE)) {
-    warnings.amount = new AccountCreationFeeWarning();
+  if (t.fees?.accountCreationFee.gt(0)) {
+    const fee = formatCurrencyUnit(a.currency.units[0], t.fees.accountCreationFee, {
+      showCode: true,
+      disableRounding: true,
+    });
+    warnings.recipient = new AccountCreationFeeWarning(undefined, {
+      fee,
+    });
+
+    if (t.amount.lt(t.fees.accountCreationFee) && t.amount.gt(0)) {
+      errors.amount = new AmountTooSmall(undefined, {
+        amount: fee,
+      });
+    }
   }
 
-  const estimatedFees = t.fees || new BigNumber(0);
+  const estimatedFees = t.fees.fee || new BigNumber(0);
 
   const maxAmountWithFees = getMaxAmount(a, t, estimatedFees);
 
diff --git a/libs/coin-modules/coin-mina/src/prepareTransaction.ts b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
index 6ebd1377e136..114700ead003 100644
--- a/libs/coin-modules/coin-mina/src/prepareTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/prepareTransaction.ts
@@ -9,7 +9,7 @@ export const prepareTransaction: AccountBridge<
   Transaction,
   MinaAccount
 >["prepareTransaction"] = async (a: Account, t: Transaction) => {
-  const fees = await getEstimatedFees(t, a.freshAddress);
+  const { fee, accountCreationFee } = await getEstimatedFees(t, a.freshAddress);
 
   const amount = t.useAllAmount
     ? await estimateMaxSpendable({
@@ -18,7 +18,11 @@ export const prepareTransaction: AccountBridge<
       })
     : t.amount;
 
+  // if (accountCreationFee.gt(0) && amount.lt(accountCreationFee)) {
+  //   amount = accountCreationFee;
+  // }
+
   const nonce = await getNonce(t, a.freshAddress);
 
-  return updateTransaction(t, { fees, amount, nonce });
+  return updateTransaction(t, { fees: { fee, accountCreationFee }, amount, nonce });
 };
diff --git a/libs/coin-modules/coin-mina/src/signOperation.ts b/libs/coin-modules/coin-mina/src/signOperation.ts
index 46d8d9b7bdf9..0a97eedbe333 100644
--- a/libs/coin-modules/coin-mina/src/signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/signOperation.ts
@@ -23,9 +23,12 @@ const buildOptimisticOperation = (
   transaction: Transaction,
   fee: BigNumber,
 ): MinaOperation => {
-  let value = new BigNumber(transaction.amount);
+  let value = new BigNumber(transaction.amount).plus(fee);
+
+  if (transaction.fees?.accountCreationFee.gt(0)) {
+    value = value.minus(transaction.fees.accountCreationFee);
+  }
 
-  value = value.plus(fee);
   const type: OperationType = "OUT";
 
   const operation: MinaOperation = {
@@ -42,6 +45,7 @@ const buildOptimisticOperation = (
     date: new Date(),
     extra: {
       memo: transaction.memo,
+      accountCreationFee: transaction.fees.accountCreationFee.toString(),
     },
   };
 
@@ -89,7 +93,7 @@ export const buildSignOperation =
         const operation = buildOptimisticOperation(
           account,
           transaction,
-          transaction.fees ?? new BigNumber(0),
+          transaction.fees.fee ?? new BigNumber(0),
         );
         const signedSerializedTx = JSON.stringify(signedTransaction);
 
diff --git a/libs/coin-modules/coin-mina/src/specs.ts b/libs/coin-modules/coin-mina/src/specs.ts
index 8f3f3a40bd02..f4f2ccfd7694 100644
--- a/libs/coin-modules/coin-mina/src/specs.ts
+++ b/libs/coin-modules/coin-mina/src/specs.ts
@@ -4,7 +4,7 @@ import BigNumber from "bignumber.js";
 import expect from "expect";
 
 import type { Transaction } from "./types";
-import { genericTestDestination, pickSiblings, botTest } from "@ledgerhq/coin-framework/bot/specs";
+import { genericTestDestination, botTest, pickSiblings } from "@ledgerhq/coin-framework/bot/specs";
 import type { AppSpec } from "@ledgerhq/coin-framework/bot/types";
 import { acceptTransaction } from "./speculos-deviceActions";
 import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/index";
@@ -63,7 +63,7 @@ const minaSpecs: AppSpec<Transaction> = {
       test: ({ accountBeforeTransaction, operation, account, transaction }) => {
         botTest("account spendable balance decreased with operation", () =>
           expect(account.spendableBalance).toEqual(
-            accountBeforeTransaction.spendableBalance.minus(operation.value.minus(operation.fee)),
+            accountBeforeTransaction.spendableBalance.minus(operation.value),
           ),
         );
 
@@ -76,50 +76,45 @@ const minaSpecs: AppSpec<Transaction> = {
         }
       },
     },
-    // {
-    //   name: "Transfer Max",
-    //   maxRun: 1,
-    //   transaction: ({ account, siblings, bridge }) => {
-    //     const updates: Array<Partial<Transaction>> = [
-    //       {
-    //         recipient: pickSiblings(siblings, maxAccount).freshAddress,
-    //       },
-    //       {
-    //         useAllAmount: true,
-    //       },
-    //     ];
+    {
+      name: "Transfer Max",
+      maxRun: 1,
+      transaction: ({ account, siblings, bridge }) => {
+        const updates: Array<Partial<Transaction>> = [
+          {
+            recipient: pickSiblings(siblings, maxAccount).freshAddress,
+          },
+          {
+            useAllAmount: true,
+          },
+        ];
 
-    //     // if (Math.random() < 0.5) {
-    //     //   updates.push({
-    //     //     transferId: getRandomTransferID(),
-    //     //   });
-    //     // }
+        if (Math.random() < 0.5) {
+          updates.push({
+            memo: getRandomTransferID(),
+          });
+        }
 
-    //     return {
-    //       transaction: bridge.createTransaction(account),
-    //       updates,
-    //     };
-    //   },
-    //   expectStatusWarnings: _ => {
-    //     return {
-    //       amount: MayBlockAccountError,
-    //     };
-    //   },
-    //   testDestination: genericTestDestination,
-    //   test: ({ account }) => {
-    //     botTest("account spendable balance is zero", () =>
-    //       expect(account.spendableBalance.toString()).toBe("0"),
-    //     );
+        return {
+          transaction: bridge.createTransaction(account),
+          updates,
+        };
+      },
+      testDestination: genericTestDestination,
+      test: ({ account, transaction, operation }) => {
+        botTest("account spendable balance is zero", () =>
+          expect(account.spendableBalance.toString()).toBe("0"),
+        );
 
-    //     // if (transaction.transferId) {
-    //     //   botTest("operation transferId", () =>
-    //     //     expect(operation.extra).toMatchObject({
-    //     //       transferId: transaction.transferId,
-    //     //     }),
-    //     //   );
-    //     // }
-    //   },
-    // },
+        if (transaction.memo) {
+          botTest("operation memo", () =>
+            expect(operation.extra).toMatchObject({
+              memo: transaction.memo,
+            }),
+          );
+        }
+      },
+    },
   ],
 };
 
diff --git a/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts b/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
index 9b2ec4864a5b..e45a7a9ef429 100644
--- a/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
+++ b/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
@@ -37,7 +37,7 @@ export const acceptTransaction: DeviceAction<Transaction, any> = deviceActionFlo
       title: "Fee",
       button: SpeculosButton.RIGHT,
       expectedValue: ({ transaction, account }) =>
-        `MINA ${formatCurrencyUnit(account.currency.units[0], transaction.fees, {
+        `MINA ${formatCurrencyUnit(account.currency.units[0], transaction.fees.fee, {
           dynamicSignificantDigits: 10,
           staticSignificantDigits: 10,
         })}`,
@@ -48,7 +48,7 @@ export const acceptTransaction: DeviceAction<Transaction, any> = deviceActionFlo
       expectedValue: ({ transaction, account }) =>
         `MINA ${formatCurrencyUnit(
           account.currency.units[0],
-          transaction.fees.plus(transaction.amount),
+          transaction.fees.fee.plus(transaction.amount),
           {
             dynamicSignificantDigits: 10,
             staticSignificantDigits: 10,
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.ts b/libs/coin-modules/coin-mina/src/synchronisation.ts
index 9416bc8fdcec..6bf0e310b36a 100644
--- a/libs/coin-modules/coin-mina/src/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/synchronisation.ts
@@ -24,6 +24,7 @@ export const mapRosettaTxnToOperation = (
 
     let value = new BigNumber(0);
     let fee = new BigNumber(0);
+    let accountCreationFee = new BigNumber(0);
 
     let fromAccount: string = "";
     let toAccount: string = "";
@@ -60,7 +61,7 @@ export const mapRosettaTxnToOperation = (
           continue;
         }
         case "account_creation_fee_via_payment": {
-          fee = fee.plus(opValue.times(-1));
+          accountCreationFee = opValue.times(-1);
           continue;
         }
       }
@@ -84,6 +85,7 @@ export const mapRosettaTxnToOperation = (
       date,
       extra: {
         memo,
+        accountCreationFee: accountCreationFee.toString(),
       },
     };
 
@@ -92,6 +94,7 @@ export const mapRosettaTxnToOperation = (
       const type = "OUT";
       ops.push({
         ...op,
+        value: value.plus(fee),
         type,
         id: encodeOperationId(accountId, hash, type),
       });
@@ -114,7 +117,7 @@ export const mapRosettaTxnToOperation = (
   }
 };
 
-export const getAccountShape: GetAccountShape = async info => {
+export const getAccountShape: GetAccountShape<MinaAccount> = async info => {
   const { address, initialAccount, currency, derivationMode } = info;
   const oldOperations = initialAccount?.operations || [];
 
@@ -129,7 +132,7 @@ export const getAccountShape: GetAccountShape = async info => {
   // log("debug", "getAccountShape, address: ", { address });
   const { blockHeight, balance, spendableBalance } = await getAccount(address);
 
-  const rosettaTxns = await getTransactions(address);
+  const rosettaTxns = await getTransactions(address, initialAccount?.operationsCount);
   const newOperations = rosettaTxns
     .flatMap(t => mapRosettaTxnToOperation(accountId, address, t))
     .flat();
diff --git a/libs/coin-modules/coin-mina/src/transaction.ts b/libs/coin-modules/coin-mina/src/transaction.ts
index 5e79bd4ca21b..c8ea637ac193 100644
--- a/libs/coin-modules/coin-mina/src/transaction.ts
+++ b/libs/coin-modules/coin-mina/src/transaction.ts
@@ -33,7 +33,10 @@ export const fromTransactionRaw = (tr: TransactionRaw): Transaction => {
   return {
     ...common,
     family: tr.family,
-    fees: new BigNumber(tr.fees),
+    fees: {
+      fee: new BigNumber(tr.fees.fee),
+      accountCreationFee: new BigNumber(tr.fees.accountCreationFee),
+    },
     amount: new BigNumber(tr.amount),
     memo: tr.memo,
     nonce: tr.nonce,
@@ -47,7 +50,10 @@ const toTransactionRaw = (t: Transaction): TransactionRaw => {
     ...common,
     family: t.family,
     amount: t.amount.toFixed(),
-    fees: t.fees.toString(),
+    fees: {
+      fee: t.fees.fee.toString(),
+      accountCreationFee: t.fees.accountCreationFee.toString(),
+    },
     memo: t.memo ?? undefined,
     nonce: t.nonce,
   };
diff --git a/libs/coin-modules/coin-mina/src/types.ts b/libs/coin-modules/coin-mina/src/types.ts
index 9427d8d13fa1..5978f373dddc 100644
--- a/libs/coin-modules/coin-mina/src/types.ts
+++ b/libs/coin-modules/coin-mina/src/types.ts
@@ -11,14 +11,20 @@ import {
 
 export type Transaction = TransactionCommon & {
   family: "mina";
-  fees: BigNumber;
+  fees: {
+    fee: BigNumber;
+    accountCreationFee: BigNumber;
+  };
   memo: string | undefined;
   nonce: number;
 };
 
 export type TransactionRaw = TransactionCommonRaw & {
   family: "mina";
-  fees: string;
+  fees: {
+    fee: string;
+    accountCreationFee: string;
+  };
   memo: string | undefined;
   nonce: number;
 };
@@ -61,4 +67,4 @@ export interface MinaSignedTransaction {
   transaction: MinaUnsignedTransaction;
 }
 
-export type MinaOperation = Operation<{ memo: string | undefined }>;
+export type MinaOperation = Operation<{ memo: string | undefined; accountCreationFee: string }>;

From 9df1e44f61bf64bf976f1dda05e5650db54440f4 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Tue, 18 Feb 2025 19:39:23 +0100
Subject: [PATCH 24/63] refac(mina): fixes and restructure

---
 libs/coin-modules/coin-mina/package.json      | 40 ++++++++++++
 libs/coin-modules/coin-mina/src/api/index.ts  | 12 +++-
 .../coin-mina/src/api/rosetta/index.ts        | 10 +++
 .../coin-mina/src/api/rosetta/types.ts        |  9 ++-
 .../coin-mina/src/{ => bridge}/broadcast.ts   |  4 +-
 .../src/{ => bridge}/buildTransaction.ts      |  6 +-
 .../src/{ => bridge}/cli-transaction.ts       |  2 +-
 .../src/{ => bridge}/createTransaction.ts     |  2 +-
 .../{ => bridge}/deviceTransactionConfig.ts   |  2 +-
 .../coin-mina/src/{ => bridge}/errors.ts      |  0
 .../src/{ => bridge}/estimateMaxSpendable.ts  |  4 +-
 .../src/{ => bridge}/getFeesForTransaction.ts |  4 +-
 .../src/{ => bridge}/getTransactionStatus.ts  |  4 +-
 .../coin-mina/src/bridge/{js.ts => index.ts}  | 20 +++---
 .../src/{ => bridge}/prepareTransaction.ts    |  4 +-
 .../src/{ => bridge}/signOperation.ts         |  6 +-
 .../src/{ => bridge}/synchronisation.ts       | 38 ++++++++----
 .../coin-mina/src/{ => bridge}/transaction.ts |  2 +-
 .../src/{logic.ts => common-logic/index.ts}   |  4 +-
 .../getAddress.ts}                            |  4 +-
 .../coin-mina/src/signer/index.ts             |  3 +
 .../src/synchronisation.unit.test.ts          | 15 -----
 .../src/{api => test}/api.unit.test.ts        |  4 +-
 .../src/{specs.ts => test/bot-specs.ts}       |  2 +-
 .../bridgeDatasetTest.ts}                     | 10 +--
 libs/coin-modules/coin-mina/src/test/index.ts |  3 +
 .../logic.unit.test.ts}                       |  2 +-
 .../rosetta => test}/rosetta.unit.test.ts     |  4 +-
 .../src/{ => test}/speculos-deviceActions.ts  |  2 +-
 .../src/test/synchronisation.unit.test.ts     | 16 +++++
 .../coin-mina/src/{ => test}/testUtils.ts     |  2 +-
 .../src/{types.ts => types/common.ts}         |  0
 .../coin-modules/coin-mina/src/types/index.ts |  2 +
 .../coin-mina/src/{ => types}/signer.ts       |  0
 .../bridge.integration.test.ts.snap           | 62 ++++++++++++++++++-
 .../families/mina/bridge.integration.test.ts  |  2 +-
 .../src/families/mina/logic.ts                |  2 +-
 .../src/families/mina/setup.ts                |  8 +--
 38 files changed, 232 insertions(+), 84 deletions(-)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/broadcast.ts (82%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/buildTransaction.ts (87%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/cli-transaction.ts (94%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/createTransaction.ts (87%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/deviceTransactionConfig.ts (89%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/errors.ts (100%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/estimateMaxSpendable.ts (89%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/getFeesForTransaction.ts (81%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/getTransactionStatus.ts (97%)
 rename libs/coin-modules/coin-mina/src/bridge/{js.ts => index.ts} (75%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/prepareTransaction.ts (90%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/signOperation.ts (95%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/synchronisation.ts (78%)
 rename libs/coin-modules/coin-mina/src/{ => bridge}/transaction.ts (96%)
 rename libs/coin-modules/coin-mina/src/{logic.ts => common-logic/index.ts} (94%)
 rename libs/coin-modules/coin-mina/src/{hw-getAddress.ts => signer/getAddress.ts} (89%)
 create mode 100644 libs/coin-modules/coin-mina/src/signer/index.ts
 delete mode 100644 libs/coin-modules/coin-mina/src/synchronisation.unit.test.ts
 rename libs/coin-modules/coin-mina/src/{api => test}/api.unit.test.ts (93%)
 rename libs/coin-modules/coin-mina/src/{specs.ts => test/bot-specs.ts} (98%)
 rename libs/coin-modules/coin-mina/src/{bridge.integration.test.ts => test/bridgeDatasetTest.ts} (92%)
 create mode 100644 libs/coin-modules/coin-mina/src/test/index.ts
 rename libs/coin-modules/coin-mina/src/{logic.test.ts => test/logic.unit.test.ts} (97%)
 rename libs/coin-modules/coin-mina/src/{api/rosetta => test}/rosetta.unit.test.ts (78%)
 rename libs/coin-modules/coin-mina/src/{ => test}/speculos-deviceActions.ts (97%)
 create mode 100644 libs/coin-modules/coin-mina/src/test/synchronisation.unit.test.ts
 rename libs/coin-modules/coin-mina/src/{ => test}/testUtils.ts (88%)
 rename libs/coin-modules/coin-mina/src/{types.ts => types/common.ts} (100%)
 create mode 100644 libs/coin-modules/coin-mina/src/types/index.ts
 rename libs/coin-modules/coin-mina/src/{ => types}/signer.ts (100%)

diff --git a/libs/coin-modules/coin-mina/package.json b/libs/coin-modules/coin-mina/package.json
index f77e9f66fbc2..01efbe112135 100644
--- a/libs/coin-modules/coin-mina/package.json
+++ b/libs/coin-modules/coin-mina/package.json
@@ -36,10 +36,50 @@
   "exports": {
     "./lib/*": "./lib/*.js",
     "./lib-es/*": "./lib-es/*.js",
+    "./api": {
+      "require": "./lib/api/index.js",
+      "default": "./lib-es/api/index.js"
+    },
+    "./deviceTransactionConfig": {
+      "require": "./lib/bridge/deviceTransactionConfig.js",
+      "default": "./lib-es/bridge/deviceTransactionConfig.js"
+    },
+    "./logic": {
+      "require": "./lib/common-logic/index.js",
+      "default": "./lib-es/common-logic/index.js"
+    },
+    "./signer": {
+      "require": "./lib/signer/index.js",
+      "default": "./lib-es/signer/index.js"
+    },
+    "./specs": {
+      "require": "./lib/test/bot-specs.js",
+      "default": "./lib-es/test/bot-specs.js"
+    },
+    "./common-logic": {
+      "require": "./lib/common-logic/index.js",
+      "default": "./lib-es/common-logic/index.js"
+    },
+    "./bridge": {
+      "require": "./lib/bridge/index.js",
+      "default": "./lib-es/bridge/index.js"
+    },
+    "./transaction": {
+      "require": "./lib/bridge/transaction.js",
+      "default": "./lib-es/bridge/transaction.js"
+    },
+    "./types": {
+      "require": "./lib/types/index.js",
+      "default": "./lib-es/types/index.js"
+    },
     "./*": {
       "require": "./lib/*.js",
       "default": "./lib-es/*.js"
     },
+    ".": {
+      "require": "./lib/index.js",
+      "default": "./lib-es/index.js"
+    },
     "./package.json": "./package.json"
   },
   "license": "Apache-2.0",
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index 27a4dd6ccf01..61534944c2ed 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -1,15 +1,16 @@
 import BigNumber from "bignumber.js";
-import { MinaAPIAccount, MinaSignedTransaction, Transaction } from "../types";
+import { MinaAPIAccount, MinaSignedTransaction, Transaction } from "../types/common";
 import {
   fetchAccountBalance,
   fetchAccountTransactions,
   fetchNetworkStatus,
   fetchTransactionMetadata,
+  rosettaGetBlockInfo,
   rosettaSubmitTransaction,
 } from "./rosetta";
 import { MINA_TOKEN_ID } from "../consts";
-import { isValidAddress } from "../logic";
-import { RosettaTransaction } from "./rosetta/types";
+import { isValidAddress } from "../common-logic";
+import { RosettaBlockInfoResponse, RosettaTransaction } from "./rosetta/types";
 
 export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
   const networkStatus = await fetchNetworkStatus();
@@ -30,6 +31,11 @@ export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
   };
 };
 
+export const getBlockInfo = async (blockHeight: number): Promise<RosettaBlockInfoResponse> => {
+  const data = await rosettaGetBlockInfo(blockHeight);
+  return data;
+};
+
 export const getTransactions = async (
   address: string,
   offset: number = 0,
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
index c02de12f6659..03014d98a8aa 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/index.ts
@@ -3,6 +3,7 @@ import {
   FetchAccountBalanceResponse,
   FetchAccountTransactionsResponse,
   FetchNetworkStatusResponse,
+  RosettaBlockInfoResponse,
   RosettaMetadataResponse,
   RosettaPreprocessResponse,
   RosettaSubmitResponse,
@@ -65,6 +66,15 @@ export const fetchAccountTransactions = async (
   return transactions;
 };
 
+export const rosettaGetBlockInfo = async (blockHeight: number) => {
+  const { data } = await network<RosettaBlockInfoResponse>({
+    method: "POST",
+    url: getRosettaUrl("/block"),
+    data: addNetworkIdentifier({ block_identifier: { index: blockHeight } }),
+  });
+  return data;
+};
+
 const rosettaPreprocess = async (from: string, to: string, feeNano: number, valueNano: number) => {
   const payload = makeTransferPayload(from, to, feeNano, valueNano);
   const { data } = await network<RosettaPreprocessResponse>({
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
index da76e1f5dc72..7f49efc3939d 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
+++ b/libs/coin-modules/coin-mina/src/api/rosetta/types.ts
@@ -64,6 +64,7 @@ export type RosettaTransaction = {
         | "payment_receiver_inc"
         | "account_creation_fee_via_payment"
         | "zkapp_fee_payer_dec"
+        | "delegate_change"
         | "zkapp_balance_update";
       status: "Success" | "Failed";
       account: {
@@ -72,7 +73,7 @@ export type RosettaTransaction = {
           token_id: string;
         };
       };
-      amount: {
+      amount?: {
         value: string;
         currency: {
           symbol: string;
@@ -82,10 +83,14 @@ export type RosettaTransaction = {
       related_operations?: Array<{
         index: number;
       }>;
+      metadata?: {
+        delegate_change_target?: string;
+      };
     }>;
     related_transactions: Array<any>;
     metadata?: {
-      memo: string;
+      memo?: string;
+      nonce?: number;
     };
   };
   timestamp: number;
diff --git a/libs/coin-modules/coin-mina/src/broadcast.ts b/libs/coin-modules/coin-mina/src/bridge/broadcast.ts
similarity index 82%
rename from libs/coin-modules/coin-mina/src/broadcast.ts
rename to libs/coin-modules/coin-mina/src/bridge/broadcast.ts
index ae767c31dd97..c1c757818e20 100644
--- a/libs/coin-modules/coin-mina/src/broadcast.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/broadcast.ts
@@ -1,7 +1,7 @@
 import type { Operation, SignedOperation } from "@ledgerhq/types-live";
 import { patchOperationWithHash } from "@ledgerhq/coin-framework/operation";
-import { broadcastTransaction } from "./api";
-import { MinaSignedTransaction } from "./types";
+import { broadcastTransaction } from "../api";
+import { MinaSignedTransaction } from "../types/common";
 
 const broadcast = async ({
   signedOperation: { signature, operation },
diff --git a/libs/coin-modules/coin-mina/src/buildTransaction.ts b/libs/coin-modules/coin-mina/src/bridge/buildTransaction.ts
similarity index 87%
rename from libs/coin-modules/coin-mina/src/buildTransaction.ts
rename to libs/coin-modules/coin-mina/src/bridge/buildTransaction.ts
index 008c1e3ddd7b..1fb14f617564 100644
--- a/libs/coin-modules/coin-mina/src/buildTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/buildTransaction.ts
@@ -1,8 +1,8 @@
 import { log } from "@ledgerhq/logs";
 import type { Account } from "@ledgerhq/types-live";
-import type { MinaUnsignedTransaction, Transaction } from "./types";
-import { MINA_MAINNET_NETWORK_ID, MINA_PAYMENT_TYPE_ID } from "./consts";
-import { getAccountNumFromPath } from "./logic";
+import type { MinaUnsignedTransaction, Transaction } from "../types/common";
+import { MINA_MAINNET_NETWORK_ID, MINA_PAYMENT_TYPE_ID } from "../consts";
+import { getAccountNumFromPath } from "../common-logic";
 import invariant from "invariant";
 
 export const buildTransaction = async (
diff --git a/libs/coin-modules/coin-mina/src/cli-transaction.ts b/libs/coin-modules/coin-mina/src/bridge/cli-transaction.ts
similarity index 94%
rename from libs/coin-modules/coin-mina/src/cli-transaction.ts
rename to libs/coin-modules/coin-mina/src/bridge/cli-transaction.ts
index 0eb9cd47e5e7..713b155a06cd 100644
--- a/libs/coin-modules/coin-mina/src/cli-transaction.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/cli-transaction.ts
@@ -1,7 +1,7 @@
 import type { Account, AccountLike, AccountLikeArray } from "@ledgerhq/types-live";
 import invariant from "invariant";
 import flatMap from "lodash/flatMap";
-import type { Transaction } from "./types";
+import type { Transaction } from "../types/common";
 
 const options = [
   {
diff --git a/libs/coin-modules/coin-mina/src/createTransaction.ts b/libs/coin-modules/coin-mina/src/bridge/createTransaction.ts
similarity index 87%
rename from libs/coin-modules/coin-mina/src/createTransaction.ts
rename to libs/coin-modules/coin-mina/src/bridge/createTransaction.ts
index d87140be52af..698a626c3b81 100644
--- a/libs/coin-modules/coin-mina/src/createTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/createTransaction.ts
@@ -1,5 +1,5 @@
 import BigNumber from "bignumber.js";
-import { MinaAccount, Transaction } from "./types";
+import { MinaAccount, Transaction } from "../types/common";
 import { AccountBridge } from "@ledgerhq/types-live";
 
 export const createTransaction: AccountBridge<
diff --git a/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts b/libs/coin-modules/coin-mina/src/bridge/deviceTransactionConfig.ts
similarity index 89%
rename from libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts
rename to libs/coin-modules/coin-mina/src/bridge/deviceTransactionConfig.ts
index 11c2063436c8..1a04f4467adf 100644
--- a/libs/coin-modules/coin-mina/src/deviceTransactionConfig.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/deviceTransactionConfig.ts
@@ -1,5 +1,5 @@
 import type { Account, AccountLike } from "@ledgerhq/types-live";
-import type { Transaction, TransactionStatus } from "./types";
+import type { Transaction, TransactionStatus } from "../types/common";
 import type { CommonDeviceTransactionField as DeviceTransactionField } from "@ledgerhq/coin-framework/transaction/common";
 
 function getDeviceTransactionConfig(_input: {
diff --git a/libs/coin-modules/coin-mina/src/errors.ts b/libs/coin-modules/coin-mina/src/bridge/errors.ts
similarity index 100%
rename from libs/coin-modules/coin-mina/src/errors.ts
rename to libs/coin-modules/coin-mina/src/bridge/errors.ts
diff --git a/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts b/libs/coin-modules/coin-mina/src/bridge/estimateMaxSpendable.ts
similarity index 89%
rename from libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
rename to libs/coin-modules/coin-mina/src/bridge/estimateMaxSpendable.ts
index 0319b572ce31..f5b52bd180eb 100644
--- a/libs/coin-modules/coin-mina/src/estimateMaxSpendable.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/estimateMaxSpendable.ts
@@ -1,8 +1,8 @@
 import { BigNumber } from "bignumber.js";
 import type { AccountBridge } from "@ledgerhq/types-live";
-import type { Transaction, MinaAccount } from "./types";
+import type { Transaction, MinaAccount } from "../types/common";
 import { getMainAccount } from "@ledgerhq/coin-framework/account/index";
-import { getMaxAmount } from "./logic";
+import { getMaxAmount } from "../common-logic";
 import { createTransaction } from "./createTransaction";
 import getEstimatedFees from "./getFeesForTransaction";
 
diff --git a/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts b/libs/coin-modules/coin-mina/src/bridge/getFeesForTransaction.ts
similarity index 81%
rename from libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
rename to libs/coin-modules/coin-mina/src/bridge/getFeesForTransaction.ts
index 069a90ae222a..53679042b75f 100644
--- a/libs/coin-modules/coin-mina/src/getFeesForTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/getFeesForTransaction.ts
@@ -1,6 +1,6 @@
 import { BigNumber } from "bignumber.js";
-import { getFees } from "./api";
-import { Transaction } from "./types";
+import { getFees } from "../api";
+import { Transaction } from "../types/common";
 
 const getEstimatedFees = async (
   transaction: Transaction,
diff --git a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts b/libs/coin-modules/coin-mina/src/bridge/getTransactionStatus.ts
similarity index 97%
rename from libs/coin-modules/coin-mina/src/getTransactionStatus.ts
rename to libs/coin-modules/coin-mina/src/bridge/getTransactionStatus.ts
index 7a32549591e0..19019584eb53 100644
--- a/libs/coin-modules/coin-mina/src/getTransactionStatus.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/getTransactionStatus.ts
@@ -7,8 +7,8 @@ import {
   AmountRequired,
   InvalidAddressBecauseDestinationIsAlsoSource,
 } from "@ledgerhq/errors";
-import type { Transaction, MinaAccount, TransactionStatus, StatusErrorMap } from "./types";
-import { isValidAddress, isValidMemo, getMaxAmount, getTotalSpent } from "./logic";
+import type { Transaction, MinaAccount, TransactionStatus, StatusErrorMap } from "../types/common";
+import { isValidAddress, isValidMemo, getMaxAmount, getTotalSpent } from "../common-logic";
 import { AccountBridge } from "@ledgerhq/types-live";
 import { AccountCreationFeeWarning, InvalidMemoMina, AmountTooSmall } from "./errors";
 import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies";
diff --git a/libs/coin-modules/coin-mina/src/bridge/js.ts b/libs/coin-modules/coin-mina/src/bridge/index.ts
similarity index 75%
rename from libs/coin-modules/coin-mina/src/bridge/js.ts
rename to libs/coin-modules/coin-mina/src/bridge/index.ts
index 87d22790b4f1..4d9f91109b1a 100644
--- a/libs/coin-modules/coin-mina/src/bridge/js.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/index.ts
@@ -7,17 +7,17 @@ import {
 } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
 import getAddressWrapper from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
-import type { Transaction } from "../types";
-import resolver from "../hw-getAddress";
-import { sync, getAccountShape } from "../synchronisation";
-import { MinaSigner } from "../signer";
+import type { Transaction } from "../types/common";
+import resolver from "../signer/getAddress";
+import { sync, getAccountShape } from "./synchronisation";
+import { MinaSigner } from "../types/signer";
 import { MinaCoinConfig, setCoinConfig } from "../config";
-import broadcast from "../broadcast";
-import { createTransaction } from "../createTransaction";
-import estimateMaxSpendable from "../estimateMaxSpendable";
-import getTransactionStatus from "../getTransactionStatus";
-import { prepareTransaction } from "../prepareTransaction";
-import buildSignOperation from "../signOperation";
+import broadcast from "./broadcast";
+import { createTransaction } from "./createTransaction";
+import estimateMaxSpendable from "./estimateMaxSpendable";
+import getTransactionStatus from "./getTransactionStatus";
+import { prepareTransaction } from "./prepareTransaction";
+import buildSignOperation from "./signOperation";
 
 export function buildCurrencyBridge(signerContext: SignerContext<MinaSigner>): CurrencyBridge {
   const getAddress = resolver(signerContext);
diff --git a/libs/coin-modules/coin-mina/src/prepareTransaction.ts b/libs/coin-modules/coin-mina/src/bridge/prepareTransaction.ts
similarity index 90%
rename from libs/coin-modules/coin-mina/src/prepareTransaction.ts
rename to libs/coin-modules/coin-mina/src/bridge/prepareTransaction.ts
index 114700ead003..01d2d3184ab8 100644
--- a/libs/coin-modules/coin-mina/src/prepareTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/prepareTransaction.ts
@@ -2,8 +2,8 @@ import { updateTransaction } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { Account, AccountBridge } from "@ledgerhq/types-live";
 import estimateMaxSpendable from "./estimateMaxSpendable";
 import getEstimatedFees from "./getFeesForTransaction";
-import { MinaAccount, Transaction } from "./types";
-import { getNonce } from "./api";
+import { MinaAccount, Transaction } from "../types/common";
+import { getNonce } from "../api";
 
 export const prepareTransaction: AccountBridge<
   Transaction,
diff --git a/libs/coin-modules/coin-mina/src/signOperation.ts b/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
similarity index 95%
rename from libs/coin-modules/coin-mina/src/signOperation.ts
rename to libs/coin-modules/coin-mina/src/bridge/signOperation.ts
index 0a97eedbe333..87e7e23fe65a 100644
--- a/libs/coin-modules/coin-mina/src/signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
@@ -2,7 +2,7 @@ import { BigNumber } from "bignumber.js";
 import { Observable } from "rxjs";
 import { FeeNotLoaded } from "@ledgerhq/errors";
 // import * as minaAPI from "mina-ledger-js";
-import type { MinaOperation, MinaSignedTransaction, Transaction } from "./types";
+import type { MinaOperation, MinaSignedTransaction, Transaction } from "../types/common";
 import type {
   Account,
   DeviceId,
@@ -11,10 +11,10 @@ import type {
   AccountBridge,
 } from "@ledgerhq/types-live";
 import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
-import { MinaSignature, MinaSigner } from "./signer";
+import { MinaSignature, MinaSigner } from "../types/signer";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
 import { buildTransaction } from "./buildTransaction";
-import { reEncodeRawSignature } from "./logic";
+import { reEncodeRawSignature } from "../common-logic";
 import invariant from "invariant";
 // import { buildTransaction } from "./js-buildTransaction";
 
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.ts b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
similarity index 78%
rename from libs/coin-modules/coin-mina/src/synchronisation.ts
rename to libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
index 6bf0e310b36a..c325f8964649 100644
--- a/libs/coin-modules/coin-mina/src/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
@@ -2,24 +2,24 @@ import type { Account } from "@ledgerhq/types-live";
 import { encodeAccountId } from "@ledgerhq/coin-framework/account/accountId";
 import type { GetAccountShape } from "@ledgerhq/coin-framework/bridge/jsHelpers";
 import { makeSync, mergeOps } from "@ledgerhq/coin-framework/bridge/jsHelpers";
-import { getAccount, getTransactions } from "./api";
-import { MinaAccount, MinaOperation } from "./types";
+import { getAccount, getBlockInfo, getTransactions } from "../api";
+import { MinaAccount, MinaOperation } from "../types/common";
 import { encodeOperationId } from "@ledgerhq/coin-framework/operation";
 import BigNumber from "bignumber.js";
 import { log } from "@ledgerhq/logs";
 import invariant from "invariant";
-import { RosettaTransaction } from "./api/rosetta/types";
+import { RosettaTransaction } from "../api/rosetta/types";
 
-export const mapRosettaTxnToOperation = (
+export const mapRosettaTxnToOperation = async (
   accountId: string,
   address: string,
   txn: RosettaTransaction,
-): MinaOperation[] => {
+): Promise<MinaOperation[]> => {
   try {
     const hash = txn.transaction.transaction_identifier.hash;
     const blockHeight = txn.block_identifier.index;
     const blockHash = txn.block_identifier.hash;
-    const date = new Date(txn.timestamp);
+    const date = new Date(txn.timestamp ?? (await getBlockInfo(blockHeight)).block.timestamp);
     const memo = txn.transaction.metadata?.memo || "";
 
     let value = new BigNumber(0);
@@ -30,10 +30,11 @@ export const mapRosettaTxnToOperation = (
     let toAccount: string = "";
     let isSending = false;
     let failed = false;
+    let redelegateTransaction = false;
 
     for (const op of txn.transaction.operations) {
       failed = op.status === "Failed";
-      const opValue = failed ? new BigNumber(0) : new BigNumber(op.amount.value);
+      const opValue = failed ? new BigNumber(0) : new BigNumber(op.amount?.value ?? 0);
       switch (op.type) {
         case "fee_payment": {
           fee = fee.plus(opValue.times(-1));
@@ -60,6 +61,13 @@ export const mapRosettaTxnToOperation = (
           value = value.plus(opValue);
           continue;
         }
+        case "delegate_change": {
+          fromAccount = op.account.address;
+          invariant(op.metadata?.delegate_change_target, "mina: missing delegate change target");
+          toAccount = op.metadata?.delegate_change_target;
+          redelegateTransaction = true;
+          continue;
+        }
         case "account_creation_fee_via_payment": {
           accountCreationFee = opValue.times(-1);
           continue;
@@ -98,6 +106,14 @@ export const mapRosettaTxnToOperation = (
         type,
         id: encodeOperationId(accountId, hash, type),
       });
+    } else if (redelegateTransaction) {
+      // delegate change
+      const type = "REDELEGATE";
+      ops.push({
+        ...op,
+        type,
+        id: encodeOperationId(accountId, hash, type),
+      });
     } else {
       const type = "IN";
       ops.push({
@@ -133,11 +149,11 @@ export const getAccountShape: GetAccountShape<MinaAccount> = async info => {
   const { blockHeight, balance, spendableBalance } = await getAccount(address);
 
   const rosettaTxns = await getTransactions(address, initialAccount?.operationsCount);
-  const newOperations = rosettaTxns
-    .flatMap(t => mapRosettaTxnToOperation(accountId, address, t))
-    .flat();
+  const newOperations = await Promise.all(
+    rosettaTxns.flatMap(t => mapRosettaTxnToOperation(accountId, address, t)),
+  );
 
-  const operations = mergeOps(oldOperations, newOperations);
+  const operations = mergeOps(oldOperations, newOperations.flat());
 
   const shape: Partial<MinaAccount> = {
     id: accountId,
diff --git a/libs/coin-modules/coin-mina/src/transaction.ts b/libs/coin-modules/coin-mina/src/bridge/transaction.ts
similarity index 96%
rename from libs/coin-modules/coin-mina/src/transaction.ts
rename to libs/coin-modules/coin-mina/src/bridge/transaction.ts
index c8ea637ac193..444a7568fd9f 100644
--- a/libs/coin-modules/coin-mina/src/transaction.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/transaction.ts
@@ -1,4 +1,4 @@
-import type { Transaction, TransactionRaw } from "./types";
+import type { Transaction, TransactionRaw } from "../types/common";
 import { formatTransactionStatus } from "@ledgerhq/coin-framework/formatters";
 import {
   fromTransactionCommonRaw,
diff --git a/libs/coin-modules/coin-mina/src/logic.ts b/libs/coin-modules/coin-mina/src/common-logic/index.ts
similarity index 94%
rename from libs/coin-modules/coin-mina/src/logic.ts
rename to libs/coin-modules/coin-mina/src/common-logic/index.ts
index 06cb513b344c..d64a7d644996 100644
--- a/libs/coin-modules/coin-mina/src/logic.ts
+++ b/libs/coin-modules/coin-mina/src/common-logic/index.ts
@@ -1,7 +1,7 @@
 import { BigNumber } from "bignumber.js";
-import { Transaction, MinaAccount } from "./types";
+import { Transaction, MinaAccount } from "../types/common";
 import { CoinType } from "@ledgerhq/types-cryptoassets";
-import { MAX_MEMO_LENGTH, MINA_DECODED_ADDRESS_LENGTH } from "./consts";
+import { MAX_MEMO_LENGTH, MINA_DECODED_ADDRESS_LENGTH } from "../consts";
 import bs58check from "bs58check";
 
 /*
diff --git a/libs/coin-modules/coin-mina/src/hw-getAddress.ts b/libs/coin-modules/coin-mina/src/signer/getAddress.ts
similarity index 89%
rename from libs/coin-modules/coin-mina/src/hw-getAddress.ts
rename to libs/coin-modules/coin-mina/src/signer/getAddress.ts
index bb4f219d5ddb..85481efe41e2 100644
--- a/libs/coin-modules/coin-mina/src/hw-getAddress.ts
+++ b/libs/coin-modules/coin-mina/src/signer/getAddress.ts
@@ -1,8 +1,8 @@
 import { GetAddressFn } from "@ledgerhq/coin-framework/bridge/getAddressWrapper";
 import { SignerContext } from "@ledgerhq/coin-framework/signer";
 import { GetAddressOptions } from "@ledgerhq/coin-framework/derivation";
-import { GetAddressResponse, MinaSigner } from "./signer";
-import { getAccountNumFromPath } from "./logic";
+import { GetAddressResponse, MinaSigner } from "../types/signer";
+import { getAccountNumFromPath } from "../common-logic";
 import invariant from "invariant";
 import { log } from "@ledgerhq/logs";
 
diff --git a/libs/coin-modules/coin-mina/src/signer/index.ts b/libs/coin-modules/coin-mina/src/signer/index.ts
new file mode 100644
index 000000000000..9190aab92526
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/signer/index.ts
@@ -0,0 +1,3 @@
+import resolver from "./getAddress";
+
+export default resolver;
diff --git a/libs/coin-modules/coin-mina/src/synchronisation.unit.test.ts b/libs/coin-modules/coin-mina/src/synchronisation.unit.test.ts
deleted file mode 100644
index ae42e5efc64e..000000000000
--- a/libs/coin-modules/coin-mina/src/synchronisation.unit.test.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { getTransactions } from "./api";
-import { mapRosettaTxnToOperation } from "./synchronisation";
-import { setConfig } from "./testUtils";
-
-setConfig();
-
-describe("synchronisation", () => {
-  it("should map rosetta txn to operation", async () => {
-    const txns = await getTransactions("B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM");
-    const ops = txns.flatMap(t => mapRosettaTxnToOperation("accountId", "address", t));
-
-    expect(ops.length).toBeGreaterThan(0);
-    expect(ops.filter(op => op.hasFailed).length).toBeGreaterThan(0);
-  }, 1000000);
-});
diff --git a/libs/coin-modules/coin-mina/src/api/api.unit.test.ts b/libs/coin-modules/coin-mina/src/test/api.unit.test.ts
similarity index 93%
rename from libs/coin-modules/coin-mina/src/api/api.unit.test.ts
rename to libs/coin-modules/coin-mina/src/test/api.unit.test.ts
index bda073136bc9..480363adeb0b 100644
--- a/libs/coin-modules/coin-mina/src/api/api.unit.test.ts
+++ b/libs/coin-modules/coin-mina/src/test/api.unit.test.ts
@@ -1,6 +1,6 @@
-import { setConfig } from "../testUtils";
+import { setConfig } from "./testUtils";
 setConfig();
-import { getAccount, getTransactions } from ".";
+import { getAccount, getTransactions } from "../api";
 
 test("get balance for an account", async () => {
   const invalidAddress = [
diff --git a/libs/coin-modules/coin-mina/src/specs.ts b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
similarity index 98%
rename from libs/coin-modules/coin-mina/src/specs.ts
rename to libs/coin-modules/coin-mina/src/test/bot-specs.ts
index f4f2ccfd7694..2d6e68bdd053 100644
--- a/libs/coin-modules/coin-mina/src/specs.ts
+++ b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
@@ -3,7 +3,7 @@ import { DeviceModelId } from "@ledgerhq/devices";
 import BigNumber from "bignumber.js";
 import expect from "expect";
 
-import type { Transaction } from "./types";
+import type { Transaction } from "../types/common";
 import { genericTestDestination, botTest, pickSiblings } from "@ledgerhq/coin-framework/bot/specs";
 import type { AppSpec } from "@ledgerhq/coin-framework/bot/types";
 import { acceptTransaction } from "./speculos-deviceActions";
diff --git a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts b/libs/coin-modules/coin-mina/src/test/bridgeDatasetTest.ts
similarity index 92%
rename from libs/coin-modules/coin-mina/src/bridge.integration.test.ts
rename to libs/coin-modules/coin-mina/src/test/bridgeDatasetTest.ts
index 89a8eea8f6e5..5d3e81827658 100644
--- a/libs/coin-modules/coin-mina/src/bridge.integration.test.ts
+++ b/libs/coin-modules/coin-mina/src/test/bridgeDatasetTest.ts
@@ -6,11 +6,11 @@ import {
   NotEnoughBalance,
 } from "@ledgerhq/errors";
 import type { DatasetTest, CurrenciesData } from "@ledgerhq/types-live";
-import type { Transaction } from "./types";
-import { fromTransactionRaw } from "./transaction";
-import { InvalidMemoMina } from "./errors";
+import type { Transaction } from "../types/common";
+import { fromTransactionRaw } from "../bridge/transaction";
+import { InvalidMemoMina } from "../bridge/errors";
 
-const ACCOUNT_ADDRESS = "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM";
+const ACCOUNT_ADDRESS = "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD";
 const ACCOUNT_ADDRESS_1 = "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314";
 
 const mina: CurrenciesData<Transaction> = {
@@ -20,6 +20,8 @@ const mina: CurrenciesData<Transaction> = {
       apdus: `
       => e00201000400000000
       <= 423632716a574c733157334a3266464769786558343977316f3756765347754d424e6f746e46687a7333505a3750627464466268646544009000
+      => e00201000400000001
+      <= 423632716e4438387474693632364d694d6e7568504d624c69504c766664644657486a47667377795646754c5845614b644b366f344263009000
       `,
     },
   ],
diff --git a/libs/coin-modules/coin-mina/src/test/index.ts b/libs/coin-modules/coin-mina/src/test/index.ts
new file mode 100644
index 000000000000..5f9103148614
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/test/index.ts
@@ -0,0 +1,3 @@
+export * from "./bridgeDatasetTest";
+export * from "./bot-specs";
+export * from "./speculos-deviceActions";
diff --git a/libs/coin-modules/coin-mina/src/logic.test.ts b/libs/coin-modules/coin-mina/src/test/logic.unit.test.ts
similarity index 97%
rename from libs/coin-modules/coin-mina/src/logic.test.ts
rename to libs/coin-modules/coin-mina/src/test/logic.unit.test.ts
index 2c52026bdd75..80b18926dde9 100644
--- a/libs/coin-modules/coin-mina/src/logic.test.ts
+++ b/libs/coin-modules/coin-mina/src/test/logic.unit.test.ts
@@ -1,4 +1,4 @@
-import { getAccountNumFromPath, isValidAddress } from "./logic";
+import { getAccountNumFromPath, isValidAddress } from "../common-logic";
 
 describe("getAccountNumFromPath", () => {
   it("should return undefined for invalid account number", () => {
diff --git a/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts b/libs/coin-modules/coin-mina/src/test/rosetta.unit.test.ts
similarity index 78%
rename from libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
rename to libs/coin-modules/coin-mina/src/test/rosetta.unit.test.ts
index 2ff54ff8556e..76718d24b09a 100644
--- a/libs/coin-modules/coin-mina/src/api/rosetta/rosetta.unit.test.ts
+++ b/libs/coin-modules/coin-mina/src/test/rosetta.unit.test.ts
@@ -1,5 +1,5 @@
-import { fetchTransactionMetadata } from ".";
-import { setConfig } from "../../testUtils";
+import { fetchTransactionMetadata } from "../api/rosetta";
+import { setConfig } from "./testUtils";
 setConfig();
 
 test("get metadata for a transactions", async () => {
diff --git a/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts b/libs/coin-modules/coin-mina/src/test/speculos-deviceActions.ts
similarity index 97%
rename from libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
rename to libs/coin-modules/coin-mina/src/test/speculos-deviceActions.ts
index e45a7a9ef429..21f3bf3261b1 100644
--- a/libs/coin-modules/coin-mina/src/speculos-deviceActions.ts
+++ b/libs/coin-modules/coin-mina/src/test/speculos-deviceActions.ts
@@ -1,5 +1,5 @@
 import type { DeviceAction } from "@ledgerhq/coin-framework/bot/types";
-import type { Transaction } from "./types";
+import type { Transaction } from "../types/common";
 import { deviceActionFlow, SpeculosButton } from "@ledgerhq/coin-framework/bot/specs";
 import { formatCurrencyUnit } from "@ledgerhq/coin-framework/lib/currencies/formatCurrencyUnit";
 
diff --git a/libs/coin-modules/coin-mina/src/test/synchronisation.unit.test.ts b/libs/coin-modules/coin-mina/src/test/synchronisation.unit.test.ts
new file mode 100644
index 000000000000..c6332ab974e5
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/test/synchronisation.unit.test.ts
@@ -0,0 +1,16 @@
+import { getTransactions } from "../api";
+import { mapRosettaTxnToOperation } from "../bridge/synchronisation";
+import { setConfig } from "./testUtils";
+
+setConfig();
+
+describe("synchronisation", () => {
+  it("should map rosetta txn to operation", async () => {
+    const txns = await getTransactions("B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD");
+    const ops = (
+      await Promise.all(txns.flatMap(t => mapRosettaTxnToOperation("accountId", "address", t)))
+    ).flat();
+
+    expect(ops.length).toBeGreaterThan(0);
+  }, 1000000);
+});
diff --git a/libs/coin-modules/coin-mina/src/testUtils.ts b/libs/coin-modules/coin-mina/src/test/testUtils.ts
similarity index 88%
rename from libs/coin-modules/coin-mina/src/testUtils.ts
rename to libs/coin-modules/coin-mina/src/test/testUtils.ts
index cca712701689..76daf9246709 100644
--- a/libs/coin-modules/coin-mina/src/testUtils.ts
+++ b/libs/coin-modules/coin-mina/src/test/testUtils.ts
@@ -1,4 +1,4 @@
-import { setCoinConfig } from "./config";
+import { setCoinConfig } from "../config";
 
 export const setConfig = () => {
   setCoinConfig((): any => {
diff --git a/libs/coin-modules/coin-mina/src/types.ts b/libs/coin-modules/coin-mina/src/types/common.ts
similarity index 100%
rename from libs/coin-modules/coin-mina/src/types.ts
rename to libs/coin-modules/coin-mina/src/types/common.ts
diff --git a/libs/coin-modules/coin-mina/src/types/index.ts b/libs/coin-modules/coin-mina/src/types/index.ts
new file mode 100644
index 000000000000..675cc2fbca27
--- /dev/null
+++ b/libs/coin-modules/coin-mina/src/types/index.ts
@@ -0,0 +1,2 @@
+export * from "./common";
+export * from "./signer";
diff --git a/libs/coin-modules/coin-mina/src/signer.ts b/libs/coin-modules/coin-mina/src/types/signer.ts
similarity index 100%
rename from libs/coin-modules/coin-mina/src/signer.ts
rename to libs/coin-modules/coin-mina/src/types/signer.ts
diff --git a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
index f8915b97f2ce..5f186847e685 100644
--- a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
+++ b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
@@ -3,13 +3,29 @@
 exports[`mina currency bridge scanAccounts mina seed 1 1`] = `
 [
   {
-    "balance": "0",
+    "balance": "2799900000",
     "currencyId": "mina",
     "derivationMode": "minabip44h",
     "freshAddress": "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD",
     "freshAddressPath": "44'/12586'/0'/0/0",
     "id": "js:2:mina:B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD:minabip44h",
     "index": 0,
+    "operationsCount": 2,
+    "pendingOperations": [],
+    "seedIdentifier": "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD",
+    "spendableBalance": "2799900000",
+    "swapHistory": [],
+    "syncHash": undefined,
+    "used": true,
+  },
+  {
+    "balance": "0",
+    "currencyId": "mina",
+    "derivationMode": "minabip44h",
+    "freshAddress": "B62qnD88tti626MiMnuhPMbLiPLvfddFWHjGfswyVFuLXEaKdK6o4Bc",
+    "freshAddressPath": "44'/12586'/1'/0/0",
+    "id": "js:2:mina:B62qnD88tti626MiMnuhPMbLiPLvfddFWHjGfswyVFuLXEaKdK6o4Bc:minabip44h",
+    "index": 1,
     "operationsCount": 0,
     "pendingOperations": [],
     "seedIdentifier": "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD",
@@ -23,6 +39,50 @@ exports[`mina currency bridge scanAccounts mina seed 1 1`] = `
 
 exports[`mina currency bridge scanAccounts mina seed 1 2`] = `
 [
+  [
+    {
+      "accountId": "js:2:mina:B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD:minabip44h",
+      "blockHash": "3NL5Fsdbap5N5QRP7KeTUot3ps68dqVsQDkaJARVBYHJzSA9eY2a",
+      "blockHeight": 428719,
+      "extra": {
+        "accountCreationFee": "1000000000",
+        "memo": "12121",
+      },
+      "fee": "10100000",
+      "hasFailed": false,
+      "hash": "5Ju6eMsfbwUvqkBobMG2VTVt6heMckfjwxQjTuGjUchMCVXsVV3z",
+      "id": "js:2:mina:B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD:minabip44h-5Ju6eMsfbwUvqkBobMG2VTVt6heMckfjwxQjTuGjUchMCVXsVV3z-IN",
+      "recipients": [
+        "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD",
+      ],
+      "senders": [
+        "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
+      ],
+      "type": "IN",
+      "value": "4000000000",
+    },
+    {
+      "accountId": "js:2:mina:B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD:minabip44h",
+      "blockHash": "3NKanDHMoNwwkCVXrtshy7FoAUSu763WFe6zmaE2MEBRDBdweC1X",
+      "blockHeight": 428798,
+      "extra": {
+        "accountCreationFee": "0",
+        "memo": "",
+      },
+      "fee": "200100000",
+      "hasFailed": false,
+      "hash": "5JuzzSWMVWj4NFV94q6piAgUehfHpAs7f6uu74TAQbxh2cD574CZ",
+      "id": "js:2:mina:B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD:minabip44h-5JuzzSWMVWj4NFV94q6piAgUehfHpAs7f6uu74TAQbxh2cD574CZ-REDELEGATE",
+      "recipients": [
+        "B62qq3TQ8AP7MFYPVtMx5tZGF3kWLJukfwG1A1RGvaBW1jfTPTkDBW6",
+      ],
+      "senders": [
+        "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD",
+      ],
+      "type": "REDELEGATE",
+      "value": "0",
+    },
+  ],
   [],
 ]
 `;
diff --git a/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts b/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
index c7dd4767e448..bd27fc3382bf 100644
--- a/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
+++ b/libs/ledger-live-common/src/families/mina/bridge.integration.test.ts
@@ -1,5 +1,5 @@
 import "../../__tests__/test-helpers/setup";
 import { testBridge } from "../../__tests__/test-helpers/bridge";
-import { dataset } from "@ledgerhq/coin-mina/bridge.integration.test";
+import { dataset } from "@ledgerhq/coin-mina/test/index";
 
 testBridge(dataset);
diff --git a/libs/ledger-live-common/src/families/mina/logic.ts b/libs/ledger-live-common/src/families/mina/logic.ts
index a03f1e374ddd..9c48c7992d25 100644
--- a/libs/ledger-live-common/src/families/mina/logic.ts
+++ b/libs/ledger-live-common/src/families/mina/logic.ts
@@ -1 +1 @@
-export * from "@ledgerhq/coin-mina/logic";
+export * from "@ledgerhq/coin-mina/common-logic";
diff --git a/libs/ledger-live-common/src/families/mina/setup.ts b/libs/ledger-live-common/src/families/mina/setup.ts
index 9eaafd3c4ab1..1cc3209ee2b2 100644
--- a/libs/ledger-live-common/src/families/mina/setup.ts
+++ b/libs/ledger-live-common/src/families/mina/setup.ts
@@ -1,13 +1,13 @@
 // Goal of this file is to inject all necessary device/signer dependency to coin-modules
 
-import { createBridges } from "@ledgerhq/coin-mina/bridge/js";
-import makeCliTools from "@ledgerhq/coin-mina/cli-transaction";
-import minaResolver from "@ledgerhq/coin-mina/hw-getAddress";
+import { createBridges } from "@ledgerhq/coin-mina/bridge";
+import makeCliTools from "@ledgerhq/coin-mina/bridge/cli-transaction";
+import minaResolver from "@ledgerhq/coin-mina/signer";
 import { Transaction } from "@ledgerhq/coin-mina/types";
 import { MinaApp } from "@zondax/ledger-mina-js";
 import Transport from "@ledgerhq/hw-transport";
 import type { Bridge } from "@ledgerhq/types-live";
-import { MinaSigner } from "@ledgerhq/coin-mina/lib/signer";
+import { MinaSigner } from "@ledgerhq/coin-mina/types";
 import { MinaCoinConfig } from "@ledgerhq/coin-mina/lib/config";
 import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
 import { CreateSigner, createResolver, executeWithSigner } from "../../bridge/setup";

From 00f2edb38343696d1cbc484f6b9d36a34daf5326 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Tue, 18 Feb 2025 20:31:36 +0100
Subject: [PATCH 25/63] chore(mina): remove unimported files

---
 .../src/renderer/families/mina/SendAmountFields.tsx            | 3 ---
 libs/ledger-live-common/src/families/mina/logic.ts             | 1 -
 2 files changed, 4 deletions(-)
 delete mode 100644 libs/ledger-live-common/src/families/mina/logic.ts

diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
index 07e23d280ddf..2c7037b46dd3 100644
--- a/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/SendAmountFields.tsx
@@ -1,9 +1,6 @@
 import React from "react";
-import { Trans } from "react-i18next";
 import MemoField from "./MemoField";
 import Box from "~/renderer/components/Box";
-import Label from "~/renderer/components/Label";
-import LabelInfoTooltip from "~/renderer/components/LabelInfoTooltip";
 import { Transaction, TransactionStatus } from "@ledgerhq/live-common/families/mina/types";
 import { Account } from "@ledgerhq/types-live";
 
diff --git a/libs/ledger-live-common/src/families/mina/logic.ts b/libs/ledger-live-common/src/families/mina/logic.ts
deleted file mode 100644
index 9c48c7992d25..000000000000
--- a/libs/ledger-live-common/src/families/mina/logic.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from "@ledgerhq/coin-mina/common-logic";

From 2b2b07a388a686c1c3e43b20c0e565b9de97ce0a Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 24 Feb 2025 13:35:12 +0100
Subject: [PATCH 26/63] tests(mina): fix integration tests

---
 libs/coin-modules/coin-mina/src/bridge/synchronisation.ts       | 2 +-
 libs/coin-modules/coin-mina/src/test/bridgeDatasetTest.ts       | 1 +
 .../families/mina/__snapshots__/bridge.integration.test.ts.snap | 2 +-
 libs/ledger-live-common/src/generated/types.ts                  | 2 +-
 4 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
index c325f8964649..94bbfb3edaab 100644
--- a/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
@@ -148,7 +148,7 @@ export const getAccountShape: GetAccountShape<MinaAccount> = async info => {
   // log("debug", "getAccountShape, address: ", { address });
   const { blockHeight, balance, spendableBalance } = await getAccount(address);
 
-  const rosettaTxns = await getTransactions(address, initialAccount?.operationsCount);
+  const rosettaTxns = await getTransactions(address, initialAccount?.operations.length);
   const newOperations = await Promise.all(
     rosettaTxns.flatMap(t => mapRosettaTxnToOperation(accountId, address, t)),
   );
diff --git a/libs/coin-modules/coin-mina/src/test/bridgeDatasetTest.ts b/libs/coin-modules/coin-mina/src/test/bridgeDatasetTest.ts
index 5d3e81827658..fbefd652f89b 100644
--- a/libs/coin-modules/coin-mina/src/test/bridgeDatasetTest.ts
+++ b/libs/coin-modules/coin-mina/src/test/bridgeDatasetTest.ts
@@ -14,6 +14,7 @@ const ACCOUNT_ADDRESS = "B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD
 const ACCOUNT_ADDRESS_1 = "B62qkWcHhoisWDCR7v3gvWzX6wXEVuGYLHXq3mSym4GEzfYXmSDv314";
 
 const mina: CurrenciesData<Transaction> = {
+  FIXME_ignoreAccountFields: ["blockHash"],
   scanAccounts: [
     {
       name: "mina seed 1",
diff --git a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
index 5f186847e685..6780d1edf26f 100644
--- a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
+++ b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
@@ -63,7 +63,7 @@ exports[`mina currency bridge scanAccounts mina seed 1 2`] = `
     },
     {
       "accountId": "js:2:mina:B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD:minabip44h",
-      "blockHash": "3NKanDHMoNwwkCVXrtshy7FoAUSu763WFe6zmaE2MEBRDBdweC1X",
+      "blockHash": "3NKHfaXxdMSUavUsYWhTJy4fzf3Bp5KzyCpbfKUHFZbqh9VSPrGP",
       "blockHeight": 428798,
       "extra": {
         "accountCreationFee": "0",
diff --git a/libs/ledger-live-common/src/generated/types.ts b/libs/ledger-live-common/src/generated/types.ts
index 5c8e3690dfda..8d6b7ab3ff37 100644
--- a/libs/ledger-live-common/src/generated/types.ts
+++ b/libs/ledger-live-common/src/generated/types.ts
@@ -81,7 +81,7 @@ import type {
   TransactionRaw as minaTransactionRaw,
   TransactionStatus as minaTransactionStatus,
   TransactionStatusRaw as minaTransactionStatusRaw,
-} from "@ledgerhq/coin-mina/types";
+} from "@ledgerhq/coin-mina/types/index";
 import type {
   Transaction as nearTransaction,
   TransactionRaw as nearTransactionRaw,

From 1ee65001a028664d83668baf3e994f11b371bc55 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 24 Feb 2025 13:45:41 +0100
Subject: [PATCH 27/63] chore(mina): fix unimported file error on ci

---
 libs/ledger-live-common/.unimportedrc.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libs/ledger-live-common/.unimportedrc.json b/libs/ledger-live-common/.unimportedrc.json
index 871f7c81544d..f3d9190a7c39 100644
--- a/libs/ledger-live-common/.unimportedrc.json
+++ b/libs/ledger-live-common/.unimportedrc.json
@@ -110,6 +110,7 @@
     "src/families/filecoin/types.ts",
     "src/families/hedera/types.ts",
     "src/families/internet_computer/types.ts",
+    "src/families/mina/types.ts",
     "src/families/near/banner.ts",
     "src/families/near/constants.ts",
     "src/families/near/logic.ts",

From a5cf9f91600c3cc0ca33c2f124188bdf3104252d Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 24 Feb 2025 13:57:59 +0100
Subject: [PATCH 28/63] tests(mina): add bot tests app version

---
 libs/coin-modules/coin-mina/src/test/bot-specs.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libs/coin-modules/coin-mina/src/test/bot-specs.ts b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
index 2d6e68bdd053..ddd7a6d280b1 100644
--- a/libs/coin-modules/coin-mina/src/test/bot-specs.ts
+++ b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
@@ -21,6 +21,7 @@ const minaSpecs: AppSpec<Transaction> = {
   appQuery: {
     model: DeviceModelId.nanoSP,
     appName: "Mina",
+    appVersion: "1.4.1",
   },
   genericDeviceAction: acceptTransaction,
   testTimeout: 15 * 60 * 1000,

From fc1682d700c46cb83157a7ea6c7fca12fd9734f7 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 24 Feb 2025 14:04:45 +0100
Subject: [PATCH 29/63] tests(mina): fix unit tests

---
 libs/coin-modules/coin-mina/src/test/api.unit.test.ts | 1 -
 1 file changed, 1 deletion(-)

diff --git a/libs/coin-modules/coin-mina/src/test/api.unit.test.ts b/libs/coin-modules/coin-mina/src/test/api.unit.test.ts
index 480363adeb0b..85334e8580e6 100644
--- a/libs/coin-modules/coin-mina/src/test/api.unit.test.ts
+++ b/libs/coin-modules/coin-mina/src/test/api.unit.test.ts
@@ -39,7 +39,6 @@ test(
       const transactions = await getTransactions(address);
       expect(transactions).toBeDefined();
       expect(transactions.length).toBeGreaterThan(0);
-      expect(transactions[0].timestamp).toBeDefined();
     }
   },
   60 * 1000,

From a0ad5f81ac6cc029dd0a0c91e059699317767959 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 24 Feb 2025 14:16:13 +0100
Subject: [PATCH 30/63] fix(mina): unimported

---
 .../coin-modules/coin-mina/.unimportedrc.json | 54 ++++++++++++++++++-
 1 file changed, 52 insertions(+), 2 deletions(-)

diff --git a/libs/coin-modules/coin-mina/.unimportedrc.json b/libs/coin-modules/coin-mina/.unimportedrc.json
index caa4bde96225..e16ccd58c7e6 100644
--- a/libs/coin-modules/coin-mina/.unimportedrc.json
+++ b/libs/coin-modules/coin-mina/.unimportedrc.json
@@ -10,5 +10,55 @@
     "src/specs.ts",
     "src/transaction.ts"
   ],
-  "ignoreUnimported": []
-}
+  "ignoreUnimported": [
+    "src/api/index.ts",
+    "src/api/rosetta/index.ts",
+    "src/api/rosetta/types.ts",
+    "src/api/rosetta/utils.ts",
+    "src/bridge/broadcast.ts",
+    "src/bridge/buildTransaction.ts",
+    "src/bridge/cli-transaction.ts",
+    "src/bridge/createTransaction.ts",
+    "src/bridge/deviceTransactionConfig.ts",
+    "src/bridge/errors.ts",
+    "src/bridge/estimateMaxSpendable.ts",
+    "src/bridge/getFeesForTransaction.ts",
+    "src/bridge/getTransactionStatus.ts",
+    "src/bridge/index.ts",
+    "src/bridge/prepareTransaction.ts",
+    "src/bridge/signOperation.ts",
+    "src/bridge/synchronisation.ts",
+    "src/bridge/transaction.ts",
+    "src/common-logic/index.ts",
+    "src/config.ts",
+    "src/consts.ts",
+    "src/signer/getAddress.ts",
+    "src/signer/index.ts",
+    "src/test/bot-specs.ts",
+    "src/test/bridgeDatasetTest.ts",
+    "src/test/index.ts",
+    "src/test/speculos-deviceActions.ts",
+    "src/test/testUtils.ts",
+    "src/types/common.ts",
+    "src/types/index.ts",
+    "src/types/signer.ts"
+  ],
+  "ignoreUnresolved": [],
+  "ignoreUnused": [
+    "@ledgerhq/coin-framework",
+    "@ledgerhq/cryptoassets",
+    "@ledgerhq/devices",
+    "@ledgerhq/errors",
+    "@ledgerhq/live-network",
+    "@ledgerhq/logs",
+    "@ledgerhq/types-cryptoassets",
+    "@ledgerhq/types-live",
+    "bignumber.js",
+    "bs58check",
+    "expect",
+    "invariant",
+    "lodash",
+    "mina-ledger-js",
+    "rxjs"
+  ]
+}
\ No newline at end of file

From 60efa1353b6ad84196c87106b3cac9a5ea87d804 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 24 Feb 2025 14:38:44 +0100
Subject: [PATCH 31/63] tests(mina): formatCurrencyUnit test snapshot update

---
 .../formatCurrencyUnit.test.ts.snap           | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/libs/coin-framework/src/currencies/__snapshots__/formatCurrencyUnit.test.ts.snap b/libs/coin-framework/src/currencies/__snapshots__/formatCurrencyUnit.test.ts.snap
index 78752de490a5..442d558141ab 100644
--- a/libs/coin-framework/src/currencies/__snapshots__/formatCurrencyUnit.test.ts.snap
+++ b/libs/coin-framework/src/currencies/__snapshots__/formatCurrencyUnit.test.ts.snap
@@ -184,6 +184,8 @@ exports[`formatCurrencyUnit with custom options with locale de-DE should correct
 
 exports[`formatCurrencyUnit with custom options with locale de-DE should correctly format Metis unit (METIS) 1`] = `"0,012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale de-DE should correctly format Mina unit (MINA) 1`] = `"12.345.678,900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale de-DE should correctly format Monero unit (XMR) 1`] = `"12.345,678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale de-DE should correctly format Moonbeam unit (GLMR) 1`] = `"0,012345678900000000- -GLMR"`;
@@ -528,6 +530,8 @@ exports[`formatCurrencyUnit with custom options with locale en-US should correct
 
 exports[`formatCurrencyUnit with custom options with locale en-US should correctly format Metis unit (METIS) 1`] = `"0.012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale en-US should correctly format Mina unit (MINA) 1`] = `"12,345,678.900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale en-US should correctly format Monero unit (XMR) 1`] = `"12,345.678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale en-US should correctly format Moonbeam unit (GLMR) 1`] = `"0.012345678900000000- -GLMR"`;
@@ -872,6 +876,8 @@ exports[`formatCurrencyUnit with custom options with locale es-ES should correct
 
 exports[`formatCurrencyUnit with custom options with locale es-ES should correctly format Metis unit (METIS) 1`] = `"0,012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale es-ES should correctly format Mina unit (MINA) 1`] = `"12.345.678,900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale es-ES should correctly format Monero unit (XMR) 1`] = `"12.345,678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale es-ES should correctly format Moonbeam unit (GLMR) 1`] = `"0,012345678900000000- -GLMR"`;
@@ -1216,6 +1222,8 @@ exports[`formatCurrencyUnit with custom options with locale fr-FR should correct
 
 exports[`formatCurrencyUnit with custom options with locale fr-FR should correctly format Metis unit (METIS) 1`] = `"0,012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale fr-FR should correctly format Mina unit (MINA) 1`] = `"12 345 678,900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale fr-FR should correctly format Monero unit (XMR) 1`] = `"12 345,678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale fr-FR should correctly format Moonbeam unit (GLMR) 1`] = `"0,012345678900000000- -GLMR"`;
@@ -1560,6 +1568,8 @@ exports[`formatCurrencyUnit with custom options with locale ja-JP should correct
 
 exports[`formatCurrencyUnit with custom options with locale ja-JP should correctly format Metis unit (METIS) 1`] = `"0.012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale ja-JP should correctly format Mina unit (MINA) 1`] = `"12,345,678.900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale ja-JP should correctly format Monero unit (XMR) 1`] = `"12,345.678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale ja-JP should correctly format Moonbeam unit (GLMR) 1`] = `"0.012345678900000000- -GLMR"`;
@@ -1904,6 +1914,8 @@ exports[`formatCurrencyUnit with custom options with locale ko-KR should correct
 
 exports[`formatCurrencyUnit with custom options with locale ko-KR should correctly format Metis unit (METIS) 1`] = `"0.012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale ko-KR should correctly format Mina unit (MINA) 1`] = `"12,345,678.900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale ko-KR should correctly format Monero unit (XMR) 1`] = `"12,345.678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale ko-KR should correctly format Moonbeam unit (GLMR) 1`] = `"0.012345678900000000- -GLMR"`;
@@ -2248,6 +2260,8 @@ exports[`formatCurrencyUnit with custom options with locale pt-BR should correct
 
 exports[`formatCurrencyUnit with custom options with locale pt-BR should correctly format Metis unit (METIS) 1`] = `"0,012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale pt-BR should correctly format Mina unit (MINA) 1`] = `"12.345.678,900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale pt-BR should correctly format Monero unit (XMR) 1`] = `"12.345,678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale pt-BR should correctly format Moonbeam unit (GLMR) 1`] = `"0,012345678900000000- -GLMR"`;
@@ -2592,6 +2606,8 @@ exports[`formatCurrencyUnit with custom options with locale ru-RU should correct
 
 exports[`formatCurrencyUnit with custom options with locale ru-RU should correctly format Metis unit (METIS) 1`] = `"0,012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale ru-RU should correctly format Mina unit (MINA) 1`] = `"12 345 678,900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale ru-RU should correctly format Monero unit (XMR) 1`] = `"12 345,678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale ru-RU should correctly format Moonbeam unit (GLMR) 1`] = `"0,012345678900000000- -GLMR"`;
@@ -2936,6 +2952,8 @@ exports[`formatCurrencyUnit with custom options with locale tr-TR should correct
 
 exports[`formatCurrencyUnit with custom options with locale tr-TR should correctly format Metis unit (METIS) 1`] = `"0,012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale tr-TR should correctly format Mina unit (MINA) 1`] = `"12.345.678,900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale tr-TR should correctly format Monero unit (XMR) 1`] = `"12.345,678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale tr-TR should correctly format Moonbeam unit (GLMR) 1`] = `"0,012345678900000000- -GLMR"`;
@@ -3280,6 +3298,8 @@ exports[`formatCurrencyUnit with custom options with locale zh-CN should correct
 
 exports[`formatCurrencyUnit with custom options with locale zh-CN should correctly format Metis unit (METIS) 1`] = `"0.012345678900000000- -METIS"`;
 
+exports[`formatCurrencyUnit with custom options with locale zh-CN should correctly format Mina unit (MINA) 1`] = `"12,345,678.900000000- -MINA"`;
+
 exports[`formatCurrencyUnit with custom options with locale zh-CN should correctly format Monero unit (XMR) 1`] = `"12,345.678900000000- -XMR"`;
 
 exports[`formatCurrencyUnit with custom options with locale zh-CN should correctly format Moonbeam unit (GLMR) 1`] = `"0.012345678900000000- -GLMR"`;
@@ -3624,6 +3644,8 @@ exports[`formatCurrencyUnit with default options should correctly format Mantra
 
 exports[`formatCurrencyUnit with default options should correctly format Metis unit (METIS) 1`] = `"0.0123456"`;
 
+exports[`formatCurrencyUnit with default options should correctly format Mina unit (MINA) 1`] = `"12,345,678"`;
+
 exports[`formatCurrencyUnit with default options should correctly format Monero unit (XMR) 1`] = `"12,345.6"`;
 
 exports[`formatCurrencyUnit with default options should correctly format Moonbeam unit (GLMR) 1`] = `"0.0123456"`;

From 4fa0a5973413111b3d67e9c77ebcb0163c960423 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 24 Feb 2025 17:17:34 +0100
Subject: [PATCH 32/63] refac(mina): remove unused code and cleanup

---
 .../src/renderer/families/mina/AccountSubHeader.tsx        | 2 +-
 .../src/families/mina/AccountSubHeader.tsx                 | 4 ++--
 libs/coin-modules/coin-mina/src/api/index.ts               | 6 ++++++
 .../coin-mina/src/bridge/deviceTransactionConfig.ts        | 7 -------
 .../coin-mina/src/bridge/prepareTransaction.ts             | 4 ----
 libs/coin-modules/coin-mina/src/bridge/signOperation.ts    | 3 ---
 libs/coin-modules/coin-mina/src/bridge/synchronisation.ts  | 1 -
 libs/coin-modules/coin-mina/src/common-logic/index.ts      | 4 ----
 libs/coin-modules/coin-mina/src/test/bot-specs.ts          | 1 -
 libs/ledger-live-common/src/hw/actions/implementations.ts  | 2 +-
 10 files changed, 10 insertions(+), 24 deletions(-)

diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/AccountSubHeader.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/AccountSubHeader.tsx
index 9dfa9e7e9843..5ff2dc89148c 100644
--- a/apps/ledger-live-desktop/src/renderer/families/mina/AccountSubHeader.tsx
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/AccountSubHeader.tsx
@@ -1,6 +1,6 @@
 import React from "react";
 import AccountSubHeader from "../../components/AccountSubHeader/index";
 
-export default function FilecoinAccountSubHeader() {
+export default function MinaAccountSubHeader() {
   return <AccountSubHeader family="Mina" team="Zondax"></AccountSubHeader>;
 }
diff --git a/apps/ledger-live-mobile/src/families/mina/AccountSubHeader.tsx b/apps/ledger-live-mobile/src/families/mina/AccountSubHeader.tsx
index b670b9e1eb3a..d7b737b0bcb3 100644
--- a/apps/ledger-live-mobile/src/families/mina/AccountSubHeader.tsx
+++ b/apps/ledger-live-mobile/src/families/mina/AccountSubHeader.tsx
@@ -1,8 +1,8 @@
 import React from "react";
 import AccountSubHeader from "~/components/AccountSubHeader";
 
-function InternetComputerAccountSubHeader() {
+function MinaAccountSubHeader() {
   return <AccountSubHeader family="Mina" team="Zondax" />;
 }
 
-export default InternetComputerAccountSubHeader;
+export default MinaAccountSubHeader;
diff --git a/libs/coin-modules/coin-mina/src/api/index.ts b/libs/coin-modules/coin-mina/src/api/index.ts
index 61534944c2ed..ae8b4f7fa7e7 100644
--- a/libs/coin-modules/coin-mina/src/api/index.ts
+++ b/libs/coin-modules/coin-mina/src/api/index.ts
@@ -11,6 +11,7 @@ import {
 import { MINA_TOKEN_ID } from "../consts";
 import { isValidAddress } from "../common-logic";
 import { RosettaBlockInfoResponse, RosettaTransaction } from "./rosetta/types";
+import { log } from "@ledgerhq/logs";
 
 export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
   const networkStatus = await fetchNetworkStatus();
@@ -21,6 +22,11 @@ export const getAccount = async (address: string): Promise<MinaAPIAccount> => {
     balance = new BigNumber(resp.balances[0].metadata.total_balance);
     spendableBalance = new BigNumber(resp.balances[0].metadata.liquid_balance);
   } catch (e) {
+    log("info", "[mina] getAccount error:", {
+      address,
+      error: e,
+    });
+    // fail is expected for when account has no balance and no transactions
     /* empty */
   }
 
diff --git a/libs/coin-modules/coin-mina/src/bridge/deviceTransactionConfig.ts b/libs/coin-modules/coin-mina/src/bridge/deviceTransactionConfig.ts
index 1a04f4467adf..7795a5228d78 100644
--- a/libs/coin-modules/coin-mina/src/bridge/deviceTransactionConfig.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/deviceTransactionConfig.ts
@@ -9,13 +9,6 @@ function getDeviceTransactionConfig(_input: {
   status: TransactionStatus;
 }): Array<DeviceTransactionField> {
   const fields: Array<DeviceTransactionField> = [];
-
-  // fields.push({
-  //   type: "text",
-  //   label: "Memo",
-  //   value: input.transaction.memo ?? "",
-  // });
-
   return fields;
 }
 
diff --git a/libs/coin-modules/coin-mina/src/bridge/prepareTransaction.ts b/libs/coin-modules/coin-mina/src/bridge/prepareTransaction.ts
index 01d2d3184ab8..105116694bb9 100644
--- a/libs/coin-modules/coin-mina/src/bridge/prepareTransaction.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/prepareTransaction.ts
@@ -18,10 +18,6 @@ export const prepareTransaction: AccountBridge<
       })
     : t.amount;
 
-  // if (accountCreationFee.gt(0) && amount.lt(accountCreationFee)) {
-  //   amount = accountCreationFee;
-  // }
-
   const nonce = await getNonce(t, a.freshAddress);
 
   return updateTransaction(t, { fees: { fee, accountCreationFee }, amount, nonce });
diff --git a/libs/coin-modules/coin-mina/src/bridge/signOperation.ts b/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
index 87e7e23fe65a..b419bdc47cc7 100644
--- a/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
@@ -1,7 +1,6 @@
 import { BigNumber } from "bignumber.js";
 import { Observable } from "rxjs";
 import { FeeNotLoaded } from "@ledgerhq/errors";
-// import * as minaAPI from "mina-ledger-js";
 import type { MinaOperation, MinaSignedTransaction, Transaction } from "../types/common";
 import type {
   Account,
@@ -16,7 +15,6 @@ import { SignerContext } from "@ledgerhq/coin-framework/signer";
 import { buildTransaction } from "./buildTransaction";
 import { reEncodeRawSignature } from "../common-logic";
 import invariant from "invariant";
-// import { buildTransaction } from "./js-buildTransaction";
 
 const buildOptimisticOperation = (
   account: Account,
@@ -79,7 +77,6 @@ export const buildSignOperation =
         const { signature } = (await signerContext(deviceId, signer =>
           signer.signTransaction(unsigned),
         )) as MinaSignature;
-        // log("debug", "requesting user signature", { signature, unsigned });
         invariant(signature, "signature should be defined if user accepted");
         const encodedSignature = reEncodeRawSignature(signature);
 
diff --git a/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
index 94bbfb3edaab..e11aa28ca57b 100644
--- a/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
@@ -145,7 +145,6 @@ export const getAccountShape: GetAccountShape<MinaAccount> = async info => {
     derivationMode,
   });
 
-  // log("debug", "getAccountShape, address: ", { address });
   const { blockHeight, balance, spendableBalance } = await getAccount(address);
 
   const rosettaTxns = await getTransactions(address, initialAccount?.operations.length);
diff --git a/libs/coin-modules/coin-mina/src/common-logic/index.ts b/libs/coin-modules/coin-mina/src/common-logic/index.ts
index d64a7d644996..98330a7b7b7c 100644
--- a/libs/coin-modules/coin-mina/src/common-logic/index.ts
+++ b/libs/coin-modules/coin-mina/src/common-logic/index.ts
@@ -23,10 +23,6 @@ export const isValidMemo = (memo: string): boolean => {
   return memo.length <= MAX_MEMO_LENGTH;
 };
 
-export const isImplicitAccount = (address: string): boolean => {
-  return !address.includes(".");
-};
-
 // Get the account number from the path
 export const getAccountNumFromPath = (path: string): number | undefined => {
   const parts = path.split("'/");
diff --git a/libs/coin-modules/coin-mina/src/test/bot-specs.ts b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
index ddd7a6d280b1..46058c65c31d 100644
--- a/libs/coin-modules/coin-mina/src/test/bot-specs.ts
+++ b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
@@ -9,7 +9,6 @@ import type { AppSpec } from "@ledgerhq/coin-framework/bot/types";
 import { acceptTransaction } from "./speculos-deviceActions";
 import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/index";
 import { getRandomTransferID } from "./testUtils";
-// import {} from "./consts";
 
 const maxAccount = 6;
 // 0.1 MINA
diff --git a/libs/ledger-live-common/src/hw/actions/implementations.ts b/libs/ledger-live-common/src/hw/actions/implementations.ts
index a92cf46e2e12..63470b675db5 100644
--- a/libs/ledger-live-common/src/hw/actions/implementations.ts
+++ b/libs/ledger-live-common/src/hw/actions/implementations.ts
@@ -63,7 +63,7 @@ export const defaultImplementationConfig: PollingImplementationConfig = {
   pollingFrequency: 2000,
   initialWaitTime: 5000,
   reconnectWaitTime: 5000,
-  connectionTimeout: getEnv("MOCK") ? 60000 : 1200000,
+  connectionTimeout: getEnv("DETOX") ? 60000 : 20000,
 };
 type Implementation = <EmittedEvent, GenericRequestType>(
   params: PollingImplementationParams<GenericRequestType, EmittedEvent>,

From 51a81249771c8d2b863efaf56befdcff114c12a9 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Tue, 25 Feb 2025 17:21:57 +0100
Subject: [PATCH 33/63] tests(mina): fix app not found on bot tests

---
 libs/coin-modules/coin-mina/src/test/bot-specs.ts | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/test/bot-specs.ts b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
index 46058c65c31d..c784853d9201 100644
--- a/libs/coin-modules/coin-mina/src/test/bot-specs.ts
+++ b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
@@ -18,9 +18,8 @@ const minaSpecs: AppSpec<Transaction> = {
   name: "Mina",
   currency: getCryptoCurrencyById("mina"),
   appQuery: {
-    model: DeviceModelId.nanoSP,
+    model: DeviceModelId.nanoS,
     appName: "Mina",
-    appVersion: "1.4.1",
   },
   genericDeviceAction: acceptTransaction,
   testTimeout: 15 * 60 * 1000,

From ac2e7e38b9e1bf88aab60f03222374a728ea4220 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Wed, 26 Feb 2025 14:33:03 +0100
Subject: [PATCH 34/63] tests(mina): fix bot test

---
 .../coin-mina/src/test/speculos-deviceActions.ts     | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/test/speculos-deviceActions.ts b/libs/coin-modules/coin-mina/src/test/speculos-deviceActions.ts
index 21f3bf3261b1..ce6ac1b08d51 100644
--- a/libs/coin-modules/coin-mina/src/test/speculos-deviceActions.ts
+++ b/libs/coin-modules/coin-mina/src/test/speculos-deviceActions.ts
@@ -29,8 +29,8 @@ export const acceptTransaction: DeviceAction<Transaction, any> = deviceActionFlo
       button: SpeculosButton.RIGHT,
       expectedValue: ({ transaction, account }) =>
         `MINA ${formatCurrencyUnit(account.currency.units[0], transaction.amount, {
-          dynamicSignificantDigits: 10,
-          staticSignificantDigits: 10,
+          dynamicSignificantDigits: 11,
+          staticSignificantDigits: 11,
         })}`,
     },
     {
@@ -38,8 +38,8 @@ export const acceptTransaction: DeviceAction<Transaction, any> = deviceActionFlo
       button: SpeculosButton.RIGHT,
       expectedValue: ({ transaction, account }) =>
         `MINA ${formatCurrencyUnit(account.currency.units[0], transaction.fees.fee, {
-          dynamicSignificantDigits: 10,
-          staticSignificantDigits: 10,
+          dynamicSignificantDigits: 11,
+          staticSignificantDigits: 11,
         })}`,
     },
     {
@@ -50,8 +50,8 @@ export const acceptTransaction: DeviceAction<Transaction, any> = deviceActionFlo
           account.currency.units[0],
           transaction.fees.fee.plus(transaction.amount),
           {
-            dynamicSignificantDigits: 10,
-            staticSignificantDigits: 10,
+            dynamicSignificantDigits: 11,
+            staticSignificantDigits: 11,
           },
         )}`,
     },

From 1f52032283a9a6dffb64a3fc2aa29690fd7033e6 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Wed, 26 Feb 2025 20:57:42 +0100
Subject: [PATCH 35/63] refac(mina): change operation value calc

---
 .../coin-mina/src/bridge/signOperation.ts          |  2 +-
 .../coin-mina/src/bridge/synchronisation.ts        |  3 ++-
 libs/coin-modules/coin-mina/src/test/bot-specs.ts  |  5 ++++-
 .../src/test/synchronisation.unit.test.ts          | 14 ++++++++++++++
 4 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/bridge/signOperation.ts b/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
index b419bdc47cc7..67d6bdf448d9 100644
--- a/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
@@ -21,7 +21,7 @@ const buildOptimisticOperation = (
   transaction: Transaction,
   fee: BigNumber,
 ): MinaOperation => {
-  let value = new BigNumber(transaction.amount).plus(fee);
+  let value = new BigNumber(transaction.amount);
 
   if (transaction.fees?.accountCreationFee.gt(0)) {
     value = value.minus(transaction.fees.accountCreationFee);
diff --git a/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
index e11aa28ca57b..7e2db8084335 100644
--- a/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
@@ -102,7 +102,7 @@ export const mapRosettaTxnToOperation = async (
       const type = "OUT";
       ops.push({
         ...op,
-        value: value.plus(fee),
+        value: value.minus(accountCreationFee),
         type,
         id: encodeOperationId(accountId, hash, type),
       });
@@ -118,6 +118,7 @@ export const mapRosettaTxnToOperation = async (
       const type = "IN";
       ops.push({
         ...op,
+        value: value.minus(accountCreationFee),
         type,
         id: encodeOperationId(accountId, hash, type),
       });
diff --git a/libs/coin-modules/coin-mina/src/test/bot-specs.ts b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
index c784853d9201..e49531eadd68 100644
--- a/libs/coin-modules/coin-mina/src/test/bot-specs.ts
+++ b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
@@ -62,7 +62,10 @@ const minaSpecs: AppSpec<Transaction> = {
       test: ({ accountBeforeTransaction, operation, account, transaction }) => {
         botTest("account spendable balance decreased with operation", () =>
           expect(account.spendableBalance).toEqual(
-            accountBeforeTransaction.spendableBalance.minus(operation.value),
+            accountBeforeTransaction.spendableBalance
+              .minus(operation.value)
+              .minus(operation.fee)
+              .minus((operation.extra as any).accountCreationFee),
           ),
         );
 
diff --git a/libs/coin-modules/coin-mina/src/test/synchronisation.unit.test.ts b/libs/coin-modules/coin-mina/src/test/synchronisation.unit.test.ts
index c6332ab974e5..410e5a9929a6 100644
--- a/libs/coin-modules/coin-mina/src/test/synchronisation.unit.test.ts
+++ b/libs/coin-modules/coin-mina/src/test/synchronisation.unit.test.ts
@@ -1,3 +1,4 @@
+import invariant from "invariant";
 import { getTransactions } from "../api";
 import { mapRosettaTxnToOperation } from "../bridge/synchronisation";
 import { setConfig } from "./testUtils";
@@ -14,3 +15,16 @@ describe("synchronisation", () => {
     expect(ops.length).toBeGreaterThan(0);
   }, 1000000);
 });
+
+test("get transaction", async () => {
+  const address = "B62qqP3a8sYEFKnDU3tdhUfmSqAP2MRqpn72jUKVEvSRVPM4bkcAV5c";
+  const txs = await getTransactions(address);
+  const txHash = "5JuL2ErRKXVNqN48KsYJTjsCmhbj5ufgmjDNSdH5rDU8vvC55EBD";
+
+  const tx = txs.find(tx => tx.transaction.transaction_identifier.hash === txHash);
+  invariant(tx, "tx not found");
+
+  const op = await mapRosettaTxnToOperation("accountId", address, tx);
+
+  expect(op).toBeDefined();
+}, 1000000);

From a193a9cc98895565e81f07c3b0eba1a0b772cf68 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Wed, 26 Feb 2025 21:19:22 +0100
Subject: [PATCH 36/63] refac(mina): format fee add and minor changes

---
 .../renderer/families/mina/operationDetails.tsx | 11 ++++++++++-
 .../src/families/mina/operationDetails.tsx      | 17 +++++++++++++++--
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
index 1932a419ac33..2a466279fc4e 100644
--- a/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
+++ b/apps/ledger-live-desktop/src/renderer/families/mina/operationDetails.tsx
@@ -7,6 +7,9 @@ import {
 } from "~/renderer/drawers/OperationDetails/styledComponents";
 import Ellipsis from "~/renderer/components/Ellipsis";
 import { MinaOperation } from "@ledgerhq/live-common/families/mina/types";
+import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/formatCurrencyUnit";
+import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
+import BigNumber from "bignumber.js";
 
 type OperationDetailsExtraProps = {
   operation: MinaOperation;
@@ -34,7 +37,13 @@ const OperationDetailsExtra = ({ operation }: OperationDetailsExtraProps) => {
         <OpDetailsTitle>
           <Trans i18nKey={`operationDetails.extra.accountCreationFee`} />
         </OpDetailsTitle>
-        <OpDetailsData>{extra.accountCreationFee}</OpDetailsData>
+        <OpDetailsData>
+          {formatCurrencyUnit(
+            getCryptoCurrencyById("mina").units[0],
+            new BigNumber(extra.accountCreationFee),
+            { showCode: true },
+          )}
+        </OpDetailsData>
       </OpDetailsSection>,
     );
   }
diff --git a/apps/ledger-live-mobile/src/families/mina/operationDetails.tsx b/apps/ledger-live-mobile/src/families/mina/operationDetails.tsx
index cfc394906d5e..b1cf401e3629 100644
--- a/apps/ledger-live-mobile/src/families/mina/operationDetails.tsx
+++ b/apps/ledger-live-mobile/src/families/mina/operationDetails.tsx
@@ -1,10 +1,13 @@
 import React from "react";
 import { useTranslation } from "react-i18next";
 import Section from "~/screens/OperationDetails/Section";
-import { InternetComputerOperation } from "@ledgerhq/live-common/families/internet_computer/types";
+import { MinaOperation } from "@ledgerhq/live-common/families/mina/types";
+import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index";
+import { getCryptoCurrencyById } from "@ledgerhq/live-common/currencies/index";
+import BigNumber from "bignumber.js";
 
 type Props = {
-  operation: InternetComputerOperation;
+  operation: MinaOperation;
 };
 
 function OperationDetailsExtra({ operation }: Props) {
@@ -14,6 +17,16 @@ function OperationDetailsExtra({ operation }: Props) {
       {operation.extra.memo && (
         <Section title={t("operationDetails.extra.memo")} value={operation.extra.memo} />
       )}
+      {operation.extra.accountCreationFee && (
+        <Section
+          title={t("operationDetails.extra.accountCreationFee")}
+          value={formatCurrencyUnit(
+            getCryptoCurrencyById("mina").units[0],
+            new BigNumber(operation.extra.accountCreationFee),
+            { showCode: true },
+          )}
+        />
+      )}
     </>
   );
 }

From 243fd98d4ce38321bd2a9dc3b26fa0cd9d6e2abb Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Wed, 26 Feb 2025 21:31:46 +0100
Subject: [PATCH 37/63] test(mina): final bot tests fix

---
 libs/coin-modules/coin-mina/src/bridge/signOperation.ts   | 2 +-
 libs/coin-modules/coin-mina/src/bridge/synchronisation.ts | 2 +-
 libs/coin-modules/coin-mina/src/test/bot-specs.ts         | 1 -
 3 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/libs/coin-modules/coin-mina/src/bridge/signOperation.ts b/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
index 67d6bdf448d9..b419bdc47cc7 100644
--- a/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/signOperation.ts
@@ -21,7 +21,7 @@ const buildOptimisticOperation = (
   transaction: Transaction,
   fee: BigNumber,
 ): MinaOperation => {
-  let value = new BigNumber(transaction.amount);
+  let value = new BigNumber(transaction.amount).plus(fee);
 
   if (transaction.fees?.accountCreationFee.gt(0)) {
     value = value.minus(transaction.fees.accountCreationFee);
diff --git a/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
index 7e2db8084335..806fc13c8ed6 100644
--- a/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
+++ b/libs/coin-modules/coin-mina/src/bridge/synchronisation.ts
@@ -102,7 +102,7 @@ export const mapRosettaTxnToOperation = async (
       const type = "OUT";
       ops.push({
         ...op,
-        value: value.minus(accountCreationFee),
+        value: value.minus(accountCreationFee).plus(fee),
         type,
         id: encodeOperationId(accountId, hash, type),
       });
diff --git a/libs/coin-modules/coin-mina/src/test/bot-specs.ts b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
index e49531eadd68..ca76b2701c60 100644
--- a/libs/coin-modules/coin-mina/src/test/bot-specs.ts
+++ b/libs/coin-modules/coin-mina/src/test/bot-specs.ts
@@ -64,7 +64,6 @@ const minaSpecs: AppSpec<Transaction> = {
           expect(account.spendableBalance).toEqual(
             accountBeforeTransaction.spendableBalance
               .minus(operation.value)
-              .minus(operation.fee)
               .minus((operation.extra as any).accountCreationFee),
           ),
         );

From d53dd7190102ae99ce80a69c82b61d45f7dc61c5 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Thu, 27 Feb 2025 17:40:31 +0100
Subject: [PATCH 38/63] tests(mina): integration test snapshot update

---
 .../families/mina/__snapshots__/bridge.integration.test.ts.snap | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
index 6780d1edf26f..1ac7904169e1 100644
--- a/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
+++ b/libs/ledger-live-common/src/families/mina/__snapshots__/bridge.integration.test.ts.snap
@@ -59,7 +59,7 @@ exports[`mina currency bridge scanAccounts mina seed 1 2`] = `
         "B62qkdFWJSW8zaTBZjTVtmeU3rVxyUkNxPhKKW8T2JBtpj5XfdywLSM",
       ],
       "type": "IN",
-      "value": "4000000000",
+      "value": "3000000000",
     },
     {
       "accountId": "js:2:mina:B62qjWLs1W3J2fFGixeX49w1o7VvSGuMBNotnFhzs3PZ7PbtdFbhdeD:minabip44h",

From 276f3d7f45ad10f5f00a0fb3f4fece8e167c7c85 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Mon, 3 Mar 2025 14:34:33 +0100
Subject: [PATCH 39/63] chore(mina): post rebase updates

---
 .../ledger-live-common/src/generated/types.ts | 20 ++--
 pnpm-lock.yaml                                | 97 ++++++++++++++++++-
 2 files changed, 104 insertions(+), 13 deletions(-)

diff --git a/libs/ledger-live-common/src/generated/types.ts b/libs/ledger-live-common/src/generated/types.ts
index 8d6b7ab3ff37..9990cbb3fab8 100644
--- a/libs/ledger-live-common/src/generated/types.ts
+++ b/libs/ledger-live-common/src/generated/types.ts
@@ -70,18 +70,18 @@ import type {
   TransactionStatus as internet_computerTransactionStatus,
   TransactionStatusRaw as internet_computerTransactionStatusRaw,
 } from "@ledgerhq/coin-internet_computer/types/index";
-import type {
-  Transaction as multiversxTransaction,
-  TransactionRaw as multiversxTransactionRaw,
-  TransactionStatus as multiversxTransactionStatus,
-  TransactionStatusRaw as multiversxTransactionStatusRaw,
-} from "@ledgerhq/coin-multiversx/types";
 import type {
   Transaction as minaTransaction,
   TransactionRaw as minaTransactionRaw,
   TransactionStatus as minaTransactionStatus,
   TransactionStatusRaw as minaTransactionStatusRaw,
 } from "@ledgerhq/coin-mina/types/index";
+import type {
+  Transaction as multiversxTransaction,
+  TransactionRaw as multiversxTransactionRaw,
+  TransactionStatus as multiversxTransactionStatus,
+  TransactionStatusRaw as multiversxTransactionStatusRaw,
+} from "@ledgerhq/coin-multiversx/types";
 import type {
   Transaction as nearTransaction,
   TransactionRaw as nearTransactionRaw,
@@ -156,8 +156,8 @@ export type Transaction =
   | hederaTransaction
   | iconTransaction
   | internet_computerTransaction
-  | multiversxTransaction
   | minaTransaction
+  | multiversxTransaction
   | nearTransaction
   | polkadotTransaction
   | solanaTransaction
@@ -182,8 +182,8 @@ export type TransactionRaw =
   | hederaTransactionRaw
   | iconTransactionRaw
   | internet_computerTransactionRaw
-  | multiversxTransactionRaw
   | minaTransactionRaw
+  | multiversxTransactionRaw
   | nearTransactionRaw
   | polkadotTransactionRaw
   | solanaTransactionRaw
@@ -208,8 +208,8 @@ export type TransactionStatus =
   | hederaTransactionStatus
   | iconTransactionStatus
   | internet_computerTransactionStatus
-  | multiversxTransactionStatus
   | minaTransactionStatus
+  | multiversxTransactionStatus
   | nearTransactionStatus
   | polkadotTransactionStatus
   | solanaTransactionStatus
@@ -234,8 +234,8 @@ export type TransactionStatusRaw =
   | hederaTransactionStatusRaw
   | iconTransactionStatusRaw
   | internet_computerTransactionStatusRaw
-  | multiversxTransactionStatusRaw
   | minaTransactionStatusRaw
+  | multiversxTransactionStatusRaw
   | nearTransactionStatusRaw
   | polkadotTransactionStatusRaw
   | solanaTransactionStatusRaw
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 501cb1a56f88..b5fb3b1d1f17 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -2754,6 +2754,73 @@ importers:
         specifier: ^29.1.1
         version: 29.1.5(jest@29.7.0)(typescript@5.4.3)
 
+  libs/coin-modules/coin-mina:
+    dependencies:
+      '@ledgerhq/coin-framework':
+        specifier: workspace:^
+        version: link:../../coin-framework
+      '@ledgerhq/cryptoassets':
+        specifier: workspace:^
+        version: link:../../ledgerjs/packages/cryptoassets
+      '@ledgerhq/devices':
+        specifier: workspace:*
+        version: link:../../ledgerjs/packages/devices
+      '@ledgerhq/errors':
+        specifier: workspace:^
+        version: link:../../ledgerjs/packages/errors
+      '@ledgerhq/live-network':
+        specifier: workspace:^
+        version: link:../../live-network
+      '@ledgerhq/logs':
+        specifier: workspace:^
+        version: link:../../ledgerjs/packages/logs
+      '@ledgerhq/types-cryptoassets':
+        specifier: workspace:^
+        version: link:../../ledgerjs/packages/types-cryptoassets
+      '@ledgerhq/types-live':
+        specifier: workspace:^
+        version: link:../../ledgerjs/packages/types-live
+      bignumber.js:
+        specifier: ^9.1.2
+        version: 9.1.2
+      bs58check:
+        specifier: ^2.1.2
+        version: 2.1.2
+      expect:
+        specifier: ^27.4.6
+        version: 27.5.1
+      invariant:
+        specifier: ^2.2.2
+        version: 2.2.4
+      lodash:
+        specifier: ^4.17.21
+        version: 4.17.21
+      mina-ledger-js:
+        specifier: ^1.0.7
+        version: 1.0.7
+      rxjs:
+        specifier: ^7.8.1
+        version: 7.8.1
+    devDependencies:
+      '@types/bs58check':
+        specifier: ^2.1.2
+        version: 2.1.2
+      '@types/invariant':
+        specifier: ^2.2.2
+        version: 2.2.37
+      '@types/jest':
+        specifier: ^29.5.10
+        version: 29.5.14
+      '@types/lodash':
+        specifier: ^4.14.191
+        version: 4.17.14
+      jest:
+        specifier: ^29.7.0
+        version: 29.7.0
+      ts-jest:
+        specifier: ^29.1.1
+        version: 29.2.5(jest@29.7.0)(typescript@5.4.3)
+
   libs/coin-modules/coin-module-boilerplate:
     dependencies:
       '@ledgerhq/coin-framework':
@@ -4152,6 +4219,9 @@ importers:
       '@ledgerhq/coin-internet_computer':
         specifier: workspace:^
         version: link:../coin-modules/coin-internet_computer
+      '@ledgerhq/coin-mina':
+        specifier: workspace:^
+        version: link:../coin-modules/coin-mina
       '@ledgerhq/coin-multiversx':
         specifier: workspace:^
         version: link:../coin-modules/coin-multiversx
@@ -4365,6 +4435,9 @@ importers:
       '@zondax/ledger-icp':
         specifier: ^0.7.0
         version: 0.7.0
+      '@zondax/ledger-mina-js':
+        specifier: 0.0.2
+        version: 0.0.2
       '@zondax/ledger-stacks':
         specifier: ^1.0.2
         version: 1.0.4
@@ -4413,9 +4486,6 @@ importers:
       lodash:
         specifier: ^4.17.21
         version: 4.17.21
-      mina-ledger-js:
-        specifier: ^1.0.6
-        version: 1.0.6
       minimatch:
         specifier: ^5.1.0
         version: 5.1.6
@@ -17497,6 +17567,12 @@ packages:
   '@zondax/ledger-js@0.8.2':
     resolution: {integrity: sha512-U/lzNzcJwfYGhhpwUviazihXzIv8w3rM31HbgKWOwF/xVS4/hHSLCGpONEGVwtgYUNDF7L0YfSy95/0H+tGtFA==}
 
+  '@zondax/ledger-js@1.2.0':
+    resolution: {integrity: sha512-HGvDU0s4zg0scu8ebGenFHFB6g5SLDqmrctncZUY9ie5pGibOU8C0VdjZSHbttSOCyh+IloLi/a4jyMPOEQGuQ==}
+
+  '@zondax/ledger-mina-js@0.0.2':
+    resolution: {integrity: sha512-6tB4voId5NOfn1XzYivyQnjq8A7eoz/2D+Ay0IDCimkF4wX2dWC0KKzatRnJmC80z8b37Hsi5/roSvkZUQ/bgw==}
+
   '@zondax/ledger-stacks@1.0.4':
     resolution: {integrity: sha512-R8CB0CZ2poTzpcG0jhzzXZvXF7axIsmZFhp06aHCUjgz+1df63YbC4tUzyzmseekwqNWnaebWFejQKJ99WiHZA==}
 
@@ -25324,6 +25400,9 @@ packages:
     resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
     engines: {node: '>=4'}
 
+  mina-ledger-js@1.0.7:
+    resolution: {integrity: sha512-qKueVN8V0UyBCJciPNlAlbvrgrAy+ZC0FimlBu0SPzacGDIQ/Ut5VMnQn9TpjcebU5ResxDTvxY95Fihl0hPEA==}
+
   mini-css-extract-plugin@2.8.1:
     resolution: {integrity: sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==}
     engines: {node: '>= 12.13.0'}
@@ -47862,6 +47941,14 @@ snapshots:
     dependencies:
       '@ledgerhq/hw-transport': 6.30.6
 
+  '@zondax/ledger-js@1.2.0':
+    dependencies:
+      '@ledgerhq/hw-transport': 6.31.4
+
+  '@zondax/ledger-mina-js@0.0.2':
+    dependencies:
+      '@zondax/ledger-js': 1.2.0
+
   '@zondax/ledger-stacks@1.0.4':
     dependencies:
       '@babel/runtime': 7.24.1
@@ -59677,6 +59764,10 @@ snapshots:
 
   min-indent@1.0.1: {}
 
+  mina-ledger-js@1.0.7:
+    dependencies:
+      buffer: 6.0.3(patch_hash=2xnca52oxhztvr7iaoovwclcze)
+
   mini-css-extract-plugin@2.8.1(webpack@5.94.0(metro@0.80.12)):
     dependencies:
       schema-utils: 4.2.0

From 1d144e9e7b8fe6db9ac75272fe02c5ccc507ac89 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Wed, 12 Mar 2025 11:09:38 +0100
Subject: [PATCH 40/63] chore(mina): post refac update

---
 .../src/screens/AddAccounts/01-SelectCrypto.tsx                 | 2 +-
 libs/ledgerjs/packages/types-cryptoassets/src/index.ts          | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.tsx b/apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.tsx
index 6929663d0aad..c1f0d4623f40 100644
--- a/apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.tsx
+++ b/apps/ledger-live-mobile/src/screens/AddAccounts/01-SelectCrypto.tsx
@@ -173,7 +173,7 @@ export default function AddAccountsSelectCrypto({ navigation, route }: Props) {
       zenrock,
       sonic,
       sonic_blaze: sonicBlaze,
-      mina: mina,
+      mina,
     }),
     [
       aptos,
diff --git a/libs/ledgerjs/packages/types-cryptoassets/src/index.ts b/libs/ledgerjs/packages/types-cryptoassets/src/index.ts
index 12a4c702a2a5..df5b0866c878 100644
--- a/libs/ledgerjs/packages/types-cryptoassets/src/index.ts
+++ b/libs/ledgerjs/packages/types-cryptoassets/src/index.ts
@@ -173,7 +173,7 @@ export type CryptoCurrencyId =
   | "xion"
   | "zenrock"
   | "sonic"
-  | "sonic_blaze";
+  | "sonic_blaze"
   | "mina";
 
 export type LedgerExplorerId =

From f3813e12f2ecc6b6ebf4facbcc6b856af9377106 Mon Sep 17 00:00:00 2001
From: Prateek Rathod <emaillawrathod@gmail.com>
Date: Fri, 14 Mar 2025 18:00:49 +0100
Subject: [PATCH 41/63] chore(mina): add new warnings for llm

---
 apps/ledger-live-mobile/src/locales/en/common.json | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/apps/ledger-live-mobile/src/locales/en/common.json b/apps/ledger-live-mobile/src/locales/en/common.json
index 67c8837a0897..d5a3235b79db 100644
--- a/apps/ledger-live-mobile/src/locales/en/common.json
+++ b/apps/ledger-live-mobile/src/locales/en/common.json
@@ -1063,6 +1063,12 @@
     },
     "InvalidMemoMina": {
       "title": "Memo text cannot be longer than 32 characters"
+    },
+    "AccountCreationFeeWarning": {
+      "title": "This transaction will incur an account creation fee of {{fee}}"
+    },
+    "AmountTooSmall": {
+      "title": "Minimum required amount for this transaction is {{amount}}"
     }
   },
   "crash": {
@@ -2596,7 +2602,8 @@
       "gasLimit": "Gas Limit",
       "id": "Id",
       "autoClaimedRewards": "Auto Claimed Rewards",
-      "stakedAmount": "Staked amount"
+      "stakedAmount": "Staked amount",
+      "accountCreationFee": "Account Creation Fee"
     },
     "multipleAddresses": "Why multiple addresses?",
     "tokenName": "Token Name",

From f4c603222a607a89e5f69b3e84f09e021418453a Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:24 +0000
Subject: [PATCH 42/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to zh-CN locale

---
 .../static/i18n/zh/app.json                   | 96 +++++++------------
 1 file changed, 37 insertions(+), 59 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/zh/app.json b/apps/ledger-live-desktop/static/i18n/zh/app.json
index b64851078934..43cb48ab316b 100644
--- a/apps/ledger-live-desktop/static/i18n/zh/app.json
+++ b/apps/ledger-live-desktop/static/i18n/zh/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "Ledger Nano S™ 与 {{provider}} 不兼容",
-      "description" : "Ledger Nano S 与 {{provider}} 不兼容。您可以使用 Ledger Nano S Plus、Ledger Nano X、Ledger Stax 或 Ledger Flex 通过 Ledger Live 体验 {{provider}} 的跨链互换",
+      "description" : "Ledger Nano S™ 与 {{provider}} 不兼容。您可以使用 Ledger Nano S Plus™、Ledger Nano X™、Ledger Stax™ 或 Ledger Flex™ 通过 Ledger Live 体验 {{provider}} 的跨链互换",
       "cta" : "浏览兼容设备",
       "changeProvider" : "使用其他提供商进行互换"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "要互换 TON,请使用任何其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
       "spl_tokens_title" : "Ledger Nano S™ 不支持互换 Solana 代币",
       "spl_tokens_description" : "要互换 Solana 代币,请使用任何其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "Ledger Nano S™ 不支持互换 Sui 代币",
+      "sui_tokens_description" : "要互换 Sui 代币,请使用任何其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
       "near_title" : "Ledger Nano S™ 不支持互换 Near",
       "near_description" : "要互换 Near,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
       "ada_title" : "Ledger Nano S™ 不支持互换 Cardano",
@@ -459,12 +459,12 @@
       "apt_description" : "要互换 Aptos,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
       "cosmos_title" : "Ledger Nano S™ 不支持互换 Cosmos",
       "cosmos_description" : "要互换 Cosmos,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "Ledger Nano S™ 不支持互换 Osmosis",
+      "osmo_description" : "要互换 Osmosis,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
+      "dydx_title" : "Ledger Nano S™ 不支持互换 dYdX",
+      "dydx_description" : "要互换 dYdX,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
+      "sui_title" : "Ledger Nano S™ 不支持互换 Sui",
+      "sui_description" : "要互换 Sui,请使用任何其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。"
     },
     "providers" : {
       "title" : "选择一个供应方来互换加密货币",
@@ -776,6 +776,10 @@
         "description3Link" : "此集成由 <1><0>{{team}}</0></1> 与 Ledger 协作实施"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} 正在迁移至 {{to}}。请点击此<0>链接</0>了解详情,如需帮助,请联系客服。",
+      "contactSupport" : "联系客服"
+    },
     "featureUnavailable" : {
       "title" : "以下功能暂不可用:{{feature}}。如需了解更多信息,请联系 {{support}}",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "方法",
       "transferAmount" : "转移数额",
       "validatorsCount" : "验证者 ({{number}})",
-      "version" : "版本"
+      "version" : "版本",
+      "accountCreationFee" : "账户创建费"
     }
   },
   "operationList" : {
@@ -5511,6 +5516,11 @@
       "memo" : "标签/备忘标签",
       "memoPlaceholder" : "可选",
       "requiredMemoPlaceholder" : "必填"
+    },
+    "mina" : {
+      "memoPlaceholder" : "可选",
+      "memo" : "备忘标签",
+      "memoWarningText" : "备忘标签的值可以是小于或等于 32 个字符的字符串"
     }
   },
   "errors" : {
@@ -6541,6 +6551,15 @@
         "swap" : "互换",
         "deposit" : "存款"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "备忘标签文本不可超过 32 个字符"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "此交易将产生 {{fee}} 的账户创建费"
+    },
+    "AmountTooSmall" : {
+      "title" : "此交易的最低数额要求为 {{amount}}"
     }
   },
   "cryptoOrg" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "现在就是升级的好时机",
-          "description" : "升级到我们的最新设备,立享 <0>{{discount}}% 折扣优惠</0>,加强安全保护,享受顺畅体验。",
-          "cta" : "升级我的钱包",
-          "linkText" : "了解更多"
-        },
-        "optOut" : {
-          "title" : "现在就是升级的好时机",
-          "description" : "升级到我们的最新设备,立享 <0>{{discount}}% 折扣优惠</0>,加强安全保护,享受顺畅体验。",
-          "cta" : "升级我的钱包",
-          "linkText" : "了解更多"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "现在就是升级的好时机",
-          "description" : "Ledger Nano S 更新活动即将结束。升级到我们的最新设备,立享 <0>{{discount}}% 折扣优惠</0>。",
-          "cta" : "升级我的钱包",
-          "linkText" : "了解更多"
-        },
-        "optOut" : {
-          "title" : "现在就是升级的好时机",
-          "description" : "Ledger Nano S 更新活动即将结束。升级到我们的最新设备,立享 <0>{{discount}}% 折扣优惠</0>。",
-          "cta" : "升级我的钱包",
-          "linkText" : "了解更多"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "现在就是升级的好时机",
-          "description" : "升级到我们的最新设备,立享 <0>{{discount}}% 折扣优惠</0>,加强安全保护,享受顺畅体验。",
-          "cta" : "升级我的钱包",
-          "linkText" : "了解更多"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "更新活动即将结束。立即升级,享受顺畅体验,更有 {{discount}}% 折扣优惠。",
-          "cta" : "升级我的钱包",
-          "linkText" : "了解更多"
-        },
-        "optOut" : {
-          "description" : "更新活动即将结束。立即升级,享受顺畅体验,更有 {{discount}}% 折扣优惠。",
-          "cta" : "升级我的钱包",
-          "linkText" : "了解更多"
-        }
-      }
+    "opted_in" : {
+      "title" : "内存有限,体验受限",
+      "description" : "将您的 Ledger Nano S 升级到 Ledger Flex 等新款 Ledger 设备,即可享受<0>省 {{discount}}% 专属折扣</>,解锁更多内存、全新功能和最新增强安全保护。",
+      "cta" : "升级 Ledger 设备"
+    },
+    "opted_out" : {
+      "description" : "Ledger Nano S 内存有限,影响您访问最新功能、区块链变更和增强安全保护。为保证长期使用体验,请升级到新款 Ledger 设备。",
+      "cta" : "了解更多"
     }
   }
 }

From af4839602f52fe39359aef8d69d0646c0d309b39 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:26 +0000
Subject: [PATCH 43/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to ru-RU locale

---
 .../src/locales/ru/common.json                | 30 ++++++++++++++-----
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/ru/common.json b/apps/ledger-live-mobile/src/locales/ru/common.json
index 530eac7b1250..fd2c2986db32 100644
--- a/apps/ledger-live-mobile/src/locales/ru/common.json
+++ b/apps/ledger-live-mobile/src/locales/ru/common.json
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "Не удалось загрузить приложение Swap Live"
+    },
+    "InvalidMemoMina" : {
+      "title" : "Содержимое Memo не может быть длиннее 32 символов"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Эта транзакция предполагает списание комиссии за создание счёта в {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "Минимальная необходимая сумма для этой транзакции — {{amount}}"
     }
   },
   "crash" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "Лимит Газа",
       "id" : "ID",
       "autoClaimedRewards" : "Автоматически запрошенные вознаграждения",
-      "stakedAmount" : "В стейкинге"
+      "stakedAmount" : "В стейкинге",
+      "accountCreationFee" : "Комиссия за создание счёта"
     },
     "multipleAddresses" : "Почему несколько адресов?",
     "tokenName" : "Название токена",
@@ -2626,6 +2636,10 @@
         "description3Link" : "Эта интеграция проведена <1><0>{{team}}</0></1> в сотрудничестве с Ledger."
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} становится {{to}}. Перейдите по <0>ссылке</0>, чтобы узнать больше или связаться с Поддержкой при необходимости.",
+      "contactSupport" : "Написать в Поддержку"
+    },
     "willBedeprecatedBanner" : {
       "title" : "{{currencyName}} не будет поддерживаться в Ledger Live с {{deprecatedDate}} для оптимизации работы. При этом устройства Ledger по-прежнему смогут взаимодействовать с этим криптоактивом. Обратитесь в Поддержку Ledger, если понадобится помощь по данному вопросу.",
       "contactSupport" : "Написать в Поддержку"
@@ -3534,12 +3548,12 @@
         "apt_description" : "Для обмена Aptos используйте любое другое устройство Ledger. Это может быть Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ или Ledger Stax™.",
         "cosmos_title" : "Ledger Nano S™ не поддерживает обмен Cosmos",
         "cosmos_description" : "Для обмена Cosmos используйте любое другое устройство Ledger. Это может быть Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ или Ledger Stax™.",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "Ledger Nano S™ не поддерживает обмен Osmosis",
+        "osmo_description" : "Используйте другие совместимые устройства Ledger для обмена Osmosis. Это Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ и Ledger Stax™.",
+        "dydx_title" : "Ledger Nano S™ не поддерживает обмен dYdX",
+        "dydx_description" : "Используйте другие совместимые устройства Ledger для обмена dYdX. Это Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ и Ledger Stax™.",
+        "sui_title" : "Ledger Nano S™ не поддерживает обмен Sui",
+        "sui_description" : "Используйте другие совместимые устройства Ledger для обмена Sui. Это Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ и Ledger Stax™."
       }
     },
     "lending" : {
@@ -3739,7 +3753,7 @@
     },
     "recover" : {
       "title" : "Ledger Recover",
-      "description" : "Восстановить кошелёк теперь проще простого",
+      "description" : "Восстановить кошелёк теперь проще простого.",
       "tag" : "Месяц в подарок"
     }
   },

From ef6a823cdbf46c930c652fb257e90530f0362cb5 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:27 +0000
Subject: [PATCH 44/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to de-DE locale

---
 .../static/i18n/de/app.json                   | 108 +++++++-----------
 1 file changed, 43 insertions(+), 65 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/de/app.json b/apps/ledger-live-desktop/static/i18n/de/app.json
index acc02aff18a8..043d5ff17d44 100644
--- a/apps/ledger-live-desktop/static/i18n/de/app.json
+++ b/apps/ledger-live-desktop/static/i18n/de/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "Ledger Nano S™ ist nicht mit {{provider}} kompatibel",
-      "description" : "Ledger Nano S ist nicht mit {{provider}} kompatibel. Du kannst Ledger Nano S Plus, Ledger Nano X, Ledger Stax oder Ledger Flex verwenden, um blockchainübergreifende Swaps bei {{provider}} über Ledger Live durchzuführen.",
+      "description" : "Ledger Nano S™ ist nicht mit {{provider}} kompatibel. Du kannst Ledger Nano S Plus™, Ledger Nano X™, Ledger Stax™ oder Ledger Flex™ verwenden, um blockchainübergreifende Swaps bei {{provider}} über Ledger Live durchzuführen.",
       "cta" : "Kompatible Geräte entdecken",
       "changeProvider" : "Bei anderem Anbieter swappen"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "Zum Swappen von Ton kannst du jedes sonstige kompatible Ledger-Gerät nutzen, z. B. Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ oder Ledger Stax™.",
       "spl_tokens_title" : "Die Ledger Nano S™ unterstützt das Swappen von Solana-Token nicht",
       "spl_tokens_description" : "Zum Swappen von Solana-Token kannst du jedes sonstige kompatible Ledger-Gerät nutzen, z. B. Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ oder Ledger Stax™.",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "Die Ledger Nano S™ unterstützt das Swappen von Sui-Token nicht",
+      "sui_tokens_description" : "Zum Swappen von Sui-Token kannst du jedes sonstige kompatible Ledger-Gerät nutzen, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
       "near_title" : "Ledger Nano S™ unterstützt das Swappen von Near nicht",
       "near_description" : "Zum Swappen müsstest du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
       "ada_title" : "Die Ledger Nano S™ unterstützt das Swappen von Cardano nicht",
@@ -459,12 +459,12 @@
       "apt_description" : "Zum Swappen von Aptos müsstest du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
       "cosmos_title" : "Ledger Nano S™ unterstützt das Swappen von Cosmos nicht",
       "cosmos_description" : "Zum Swappen von Cosmos müsstest du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "Ledger Nano S™ unterstützt das Swappen von Osmosis nicht",
+      "osmo_description" : "Zum Swappen von Osmosis musst du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
+      "dydx_title" : "Ledger Nano S™ unterstützt das Swappen von dYdX nicht",
+      "dydx_description" : "Zum Swappen von dYdX musst du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
+      "sui_title" : "Die Ledger Nano S™ unterstützt das Swappen von Sui nicht",
+      "sui_description" : "Zum Swappen von Sui kannst du jedes sonstige kompatible Ledger-Gerät nutzen, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™."
     },
     "providers" : {
       "title" : "Wähle einen Anbieter für das Swappen von Kryptowährungen",
@@ -776,6 +776,10 @@
         "description3Link" : "Diese Integration wurde von <1><0>{{team}}</0></1> in Zusammenarbeit mit Ledger durchgeführt"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} migriert zu {{to}}. Folge diesem <0>Link</0>, um mehr zu erfahren, oder wende dich an den Kundenservice, falls du Hilfe benötigst.",
+      "contactSupport" : "Support kontaktieren"
+    },
     "featureUnavailable" : {
       "title" : "Die folgende Funktion ist momentan nicht verfügbar: {{feature}}. Weitere Informationen erhältst du vom {{support}}.",
       "feature" : {
@@ -1786,7 +1790,7 @@
     "successDescription_plural" : "Andere Konten hinzufügen oder zum Portfolio zurückkehren",
     "createNewAccount" : {
       "noOperationOnLastAccount" : "Du kannst erst dann ein neues Konto hinzufügen, wenn du Guthaben auf deinem <1><0>{{accountName}}</0></1>-Konto empfangen hast",
-      "noAccountToCreate" : "Es wurde kein <1><0>{{currencyName}}}}</0></1> Konto gefunden, das erstellt werden kann",
+      "noAccountToCreate" : "Es wurde kein <1><0>{{currencyName}}</0></1> Konto gefunden, das erstellt werden kann",
       "showAllAddressTypes" : "Alle Adresstypen anzeigen",
       "showAllAddressTypesTooltip" : "Ändere den Adresstyp nur dann, wenn du {{family}} in anderen Adressformaten erhalten möchtest."
     },
@@ -1875,7 +1879,8 @@
       "palletMethod" : "Methode",
       "transferAmount" : "Betrag transferieren",
       "validatorsCount" : "Validatoren ({{number}})",
-      "version" : "Version"
+      "version" : "Version",
+      "accountCreationFee" : "Kontoerstellungsgebühr"
     }
   },
   "operationList" : {
@@ -4882,7 +4887,7 @@
             "rules" : {
               "1" : "Planen Sie 30 Minuten ein und nehmen Sie sich Zeit.",
               "2" : "Nehmen Sie einen Stift zum Schreiben.",
-              "3" : "Bleiben Sie allein, und wählen Sie eine sichere und ruhige Umgebung."
+              "3" : "Sei allein und wähle eine sichere und ruhige Umgebung."
             },
             "buttons" : {
               "next" : "OK, ich bin bereit!",
@@ -5511,6 +5516,11 @@
       "memo" : "Tag/Memo",
       "memoPlaceholder" : "Optional",
       "requiredMemoPlaceholder" : "Erforderlich"
+    },
+    "mina" : {
+      "memoPlaceholder" : "Optional",
+      "memo" : "Memo",
+      "memoWarningText" : "Der Wert von Memo kann eine Zeichenfolge mit maximal 32 Zeichen sein"
     }
   },
   "errors" : {
@@ -5943,7 +5953,7 @@
       "description" : "Bitte versuche es noch einmal oder wende dich an den Ledger-Kundenservice."
     },
     "DeviceShouldStayInApp" : {
-      "title" : "Bitte öffnen Sie die {{appName}} App",
+      "title" : "Bitte öffne die {{appName}} App",
       "description" : "Lassen Sie die App {{appName}} geöffnet, während wir Ihre Konten finden"
     },
     "UnexpectedBootloader" : {
@@ -6111,7 +6121,7 @@
     },
     "BtcUnmatchedApp" : {
       "title" : "Das ist die falsche App",
-      "description" : "Öffnen Sie die App „{{managerAppName}}“ auf Ihrem Gerät"
+      "description" : "Öffne die App „{{managerAppName}}“ auf deinem Gerät"
     },
     "DeviceNameInvalid" : {
       "title" : "Bitte wählen Sie einen Gerätenamen ohne '{{invalidCharacters}}'"
@@ -6220,7 +6230,7 @@
       "title" : "Kontostand darf nicht unter {{minimumAmount}} liegen"
     },
     "WrongAppForCurrency" : {
-      "title" : "Bitte öffnen Sie die {{expected}} App"
+      "title" : "Bitte öffne die {{expected}} App"
     },
     "FeeTooHigh" : {
       "title" : "Die Netzwerkgebühren liegen über 10 % des Betrags"
@@ -6541,6 +6551,15 @@
         "swap" : "Swappen",
         "deposit" : "Einzahlen"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "Der Memotext darf nicht länger als 32 Zeichen sein."
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Für diese Transaktion fällt eine Kontoerstellungsgebühr in Höhe von {{fee}} an"
+    },
+    "AmountTooSmall" : {
+      "title" : "Der Mindestbetrag für diese Transaktion beläuft sich auf {{amount}}"
     }
   },
   "cryptoOrg" : {
@@ -6637,7 +6656,7 @@
     },
     "progress" : {
       "loading" : "Lade Daten...",
-      "progress" : "Bleiben Sie auf Ledger Live, während die Apps installiert werden.",
+      "progress" : "Bleibe auf Ledger Live, während die Apps installiert werden.",
       "disclaimer" : "Sie können jederzeit Apps aus Ledger Live hinzufügen oder entfernen.",
       "skippedInfo" : "Einige Apps sind nicht verfügbar. Sie müssen noch entwickelt werden für {{ productName }}.",
       "skipped" : "Noch nicht verfügbar für {{ productName }}",
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "Zeit für ein Upgrade",
-          "description" : "Jetzt auf eines unserer aktuellen Geräte aufrüsten: <0>{{discount}} % Rabatt</0> für mehr Sicherheit und ein nahtloses Erlebnis.",
-          "cta" : "Neue Wallet zulegen",
-          "linkText" : "Weitere Informationen"
-        },
-        "optOut" : {
-          "title" : "Zeit für ein Upgrade",
-          "description" : "Jetzt auf eines unserer aktuellen Geräte aufrüsten: <0>{{discount}} % Rabatt</0> für mehr Sicherheit und ein nahtloses Erlebnis.",
-          "cta" : "Neue Wallet zulegen",
-          "linkText" : "Weitere Informationen"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "Zeit für ein Upgrade",
-          "description" : "Bald gibt es keine Updates mehr für die Ledger Nano S. Jetzt auf eines unserer aktuellen Geräte aufrüsten – mit <0>{{discount}} % Rabatt</0>.",
-          "cta" : "Neue Wallet zulegen",
-          "linkText" : "Weitere Informationen"
-        },
-        "optOut" : {
-          "title" : "Zeit für ein Upgrade",
-          "description" : "Bald gibt es keine Updates mehr für die Ledger Nano S. Jetzt auf eines unserer aktuellen Geräte aufrüsten – mit <0>{{discount}} % Rabatt</0>.",
-          "cta" : "Neue Wallet zulegen",
-          "linkText" : "Weitere Informationen"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "Zeit für ein Upgrade",
-          "description" : "Jetzt auf eines unserer aktuellen Geräte aufrüsten: <0>{{discount}} % Rabatt</0> für mehr Sicherheit und ein nahtloses Erlebnis.",
-          "cta" : "Neue Wallet zulegen",
-          "linkText" : "Weitere Informationen"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "Updates gibt es nicht mehr lange. Jetzt aufrüsten: <0>{{discount}} % Rabatt</0> für ein nahtloses Erlebnis.",
-          "cta" : "Neue Wallet zulegen",
-          "linkText" : "Weitere Informationen"
-        },
-        "optOut" : {
-          "description" : "Updates gibt es nicht mehr lange. Jetzt aufrüsten: <0>{{discount}} % Rabatt</0> für ein nahtloses Erlebnis.",
-          "cta" : "Neue Wallet zulegen",
-          "linkText" : "Weitere Informationen"
-        }
-      }
+    "opted_in" : {
+      "title" : "Eingeschränkter Speicher, eingeschränkte Nutzung",
+      "description" : "Führe ein Upgrade deiner Ledger Nano S auf ein neueres Ledger-Gerät durch – z. B. die Ledger Flex – und profitiere von mehr Speicherplatz, den neuesten Sicherheitsverbesserungen, innovativen Funktionen und <0>einem exklusiven Rabatt in Höhe von {{discount}} %</>.",
+      "cta" : "Ledger-Upgrade durchführen"
+    },
+    "opted_out" : {
+      "description" : "Der begrenzte Speicher deiner Ledger Nano S schränkt deinen Zugang zu aktuellen Funktionen, Blockchain-Änderungen und Sicherheitsverbesserungen ein. Für die längerfristige Nutzung solltest du auf ein neueres Ledger-Gerät aufrüsten.",
+      "cta" : "Weitere Informationen"
     }
   }
 }

From aaf009d43a538a112b0c6f78367dd5a26b700053 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:29 +0000
Subject: [PATCH 45/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to th-TH locale

---
 .../static/i18n/th/app.json                   | 95 +++++++++++--------
 1 file changed, 55 insertions(+), 40 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/th/app.json b/apps/ledger-live-desktop/static/i18n/th/app.json
index 02abbba8298f..d8595c67e069 100644
--- a/apps/ledger-live-desktop/static/i18n/th/app.json
+++ b/apps/ledger-live-desktop/static/i18n/th/app.json
@@ -179,7 +179,7 @@
       "UNDELEGATE_RESOURCE" : "Undelegate แล้ว",
       "WITHDRAW_EXPIRE_UNFREEZE" : "การถอน",
       "LEGACYUNFREEZE" : "ไม่ได้ถูกระงับ",
-      "REWARD" : "Reward ที่ขอรับแล้ว",
+      "REWARD" : "Reward ที่เคลมแล้ว",
       "FEES" : "ค่าธรรมเนียม",
       "OPT_IN" : "เลือกเข้าร่วม",
       "OPT_OUT" : "เลือกไม่เข้าร่วม",
@@ -288,7 +288,7 @@
     "menu" : "เมนู",
     "stars" : "บัญชีที่ติดดาว",
     "accounts" : "บัญชี",
-    "manager" : "My Ledger",
+    "manager" : "Ledger ของฉัน",
     "earn" : "Earn",
     "exchange" : "ซื้อ / ขาย",
     "swap" : "Swap",
@@ -299,7 +299,7 @@
     "recover" : "[L] Recover"
   },
   "stars" : {
-    "placeholder" : "ติดดาวที่บัญชีเพื่อแสดงให้เห็นตรงนี้",
+    "placeholder" : "ติดดาวบัญชีเพื่อให้แสดงที่นี่",
     "tooltip" : "ติดดาวบัญชี"
   },
   "bridge" : {
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "Ledger Nano S™ ไม่สามารถใช้ได้กับ {{provider}}",
-      "description" : "Ledger Nano S ไม่สามารถใช้ได้กับ {{provider}} คุณสามารถใช้ Ledger Nano S Plus, Ledger Nano X, Ledger Stax, หรือ Ledger Flex เพื่อสัมผัสประสบการณ์ Swap แบบ Cross-Chain บน {{provider}} ผ่าน Ledger Live",
+      "description" : "Ledger Nano S™ ไม่สามารถใช้ได้กับ {{provider}} คุณสามารถใช้ Ledger Nano S Plus™, Ledger Nano X™, Ledger Stax™ หรือ Ledger Flex™ เพื่อสัมผัสประสบการณ์ Swap แบบ Cross-Chain บน {{provider}} ผ่าน Ledger Live",
       "cta" : "สำรวจอุปกรณ์ที่เข้ากันได้",
       "changeProvider" : "Swap กับผู้ให้บริการรายอื่น"
     },
@@ -792,7 +792,7 @@
         "sending_tokens" : "กำลังส่งโทเคน",
         "receiving_tokens" : "กำลังรับโทเคน",
         "staking" : "กำลัง Stake",
-        "claiming_staking_rewards" : "กำลังรับ Reward จากการ Stake"
+        "claiming_staking_rewards" : "กำลังเคลม Reward จากการ Stake"
       },
       "support" : "การสนับสนุน"
     },
@@ -1310,7 +1310,7 @@
           "contactSupportCTA" : "ติดต่อ Ledger Support",
           "notFoundEntityError" : {
             "title" : "เริ่ม Genuine Check อีกครั้ง",
-            "description" : "คุณต้องปิดใช้งานการตั้งค่า \"ผู้ให้บริการ My Ledger ({{providerNumber}}})\" ก่อน หากต้องการปิดใช้งาน ให้เปิด “การตั้งค่า” บน Ledger Live แล้วเลือก “Experimental Features” แล้ว Toggle เพื่อปิด “ผู้ให้บริการ My Ledger”"
+            "description" : "คุณต้องปิดใช้งานการตั้งค่า \"ผู้ให้บริการ My Ledger ({{providerNumber}})\" ก่อน หากต้องการปิดใช้งาน ให้เปิด “การตั้งค่า” บน Ledger Live แล้วเลือก “Experimental Features” แล้ว Toggle เพื่อปิด “ผู้ให้บริการ My Ledger”"
           },
           "deviceNotGenuineError" : {
             "title" : "{{productName}} นี้ไม่ใช่ของแท้",
@@ -1606,7 +1606,7 @@
       "desc" : "เพิ่มบัญชีเพื่อจัดการสินทรัพย์คริปโตของคุณ คุณต้องติดตั้งแอปบนอุปกรณ์ของคุณเพื่อจัดการสินทรัพย์คริปโตของคุณ",
       "buttons" : {
         "addAccount" : "เพิ่มบัญชี",
-        "installApp" : "ไปที่ My Ledger เพื่อติดตั้งแอป",
+        "installApp" : "ไปที่ Ledger ของฉันเพื่อติดตั้งแอป",
         "help" : "ช่วยเหลือ"
       }
     }
@@ -1667,10 +1667,10 @@
       "1M_label" : "1M",
       "1Y_label" : "1Y",
       "1h" : "1h",
-      "24h" : "24h",
-      "7d" : "7d",
+      "24h" : "24H",
+      "7d" : "7D",
       "30d" : "30D",
-      "1y" : "1y",
+      "1y" : "1Y",
       "1H_selectorLabel" : "1 ชั่วโมงที่ผ่านมา",
       "1D_selectorLabel" : "24 ชั่วโมงที่ผ่านมา",
       "1W_selectorLabel" : "สัปดาห์ที่ผ่านมา",
@@ -1704,7 +1704,7 @@
         "tokenAddress" : "Address โทเคน",
         "tokenId" : "ID โทเคน",
         "quantity" : "ปริมาณ",
-        "floorPrice" : "ราคาพื้น"
+        "floorPrice" : "ราคาฟลอร์"
       }
     },
     "collections" : {
@@ -1872,14 +1872,15 @@
       "memo" : "Memo",
       "assetId" : "ID สินทรัพย์",
       "rewards" : "Reward ที่ได้รับ",
-      "autoClaimedRewards" : "Reward ที่ได้รับอัตโนมัติ",
+      "autoClaimedRewards" : "Reward ที่เคลมโดยอัตโนมัติ",
       "bondedAmount" : "จำนวนที่ผูกมัด",
       "unbondedAmount" : "จำนวนที่ไม่ได้ผูกมัด",
       "withdrawUnbondedAmount" : "จำนวนที่ถอน",
       "palletMethod" : "วิธีการ",
       "transferAmount" : "จำนวนที่โอน",
       "validatorsCount" : "({{number}}) ผู้ตรวจสอบ ",
-      "version" : "เวอร์ชัน"
+      "version" : "เวอร์ชัน",
+      "accountCreationFee" : "Account Creation Fee"
     }
   },
   "operationList" : {
@@ -1903,7 +1904,7 @@
     "openManager" : "เปิด My Ledger",
     "openOnboarding" : "ตั้งค่าอุปกรณ์",
     "outdated" : "เวอร์ชันแอปล้าสมัย",
-    "outdatedDesc" : "มีการอัปเดตที่สำคัญสำหรับแอปพลิเคชัน {{appName}} บนอุปกรณ์ของคุณ โปรดไปที่ My Ledger เพื่ออัปเดต",
+    "outdatedDesc" : "มีการอัปเดตที่สำคัญสำหรับแอปพลิเคชัน {{appName}} บนอุปกรณ์ของคุณ โปรดไปที่ Ledger ของฉันเพื่ออัปเดต",
     "installApp" : "การติดตั้งแอป {{appName}}",
     "installAppDescription" : "โปรดรอสักครู่จนกว่าการติดตั้งจะเสร็จสิ้น",
     "listApps" : "กำลังตรวจสอบการขึ้นต่อกันของแอป",
@@ -1951,7 +1952,7 @@
     "disconnected" : {
       "title" : "ดูเหมือนว่าแอปจะเปิดอยู่บนอุปกรณ์ของคุณ",
       "subtitle" : "การเปิด My Ledger อีกครั้งจะเป็นการปิดแอปบนอุปกรณ์ของคุณ",
-      "ctaReopen" : "เปิด My Ledger อีกครั้ง",
+      "ctaReopen" : "เปิด Ledger ของฉันอีกครั้ง",
       "ctaPortfolio" : "กลับไปยังพอร์ตโฟลิโอ"
     },
     "deviceStorage" : {
@@ -2011,7 +2012,7 @@
         "uninstall" : "ถอนการติดตั้ง",
         "notEnoughSpace" : "พื้นที่เก็บข้อมูลไม่เพียงพอ",
         "supported" : "รองรับ Ledger Live",
-        "not_supported" : "ต้องมี Wallet ของบุคคลที่สาม",
+        "not_supported" : "ต้องมีวอลเล็ตของบุคคลที่สาม",
         "addAccount" : "เพิ่มบัญชี",
         "addAccountTooltip" : "เพิ่มบัญชี {{appName}}",
         "addAccountWarn" : "โปรดรอให้การประมวลผลเสร็จสิ้น",
@@ -2053,7 +2054,7 @@
       "dontHaveSeed" : "ไม่มี Recovery Phrase? ",
       "followTheGuide" : "ทำตามคำแนะนำการอัปเดตทีละขั้นตอนของเรา",
       "removeApps" : "ถอนการติดตั้งทุกแอปก่อนการอัปเดต",
-      "update" : "การอัปเดต {{productName} OS",
+      "update" : "การอัปเดต {{productName}} OS",
       "updateBtn" : "อัปเดตระบบปฏิบัติการ",
       "installUpdate" : "ติดตั้งการอัปเดต",
       "banner" : {
@@ -2130,14 +2131,14 @@
         "boot" : "กดค้างที่ปุ่มด้านข้างจนกว่า {{option}} จะปรากฏ",
         "recoveryMode" : "แตะโหมด {{mode}} รอจนกว่าแดชบอร์ดจะปรากฏ",
         "third" : "3. ถอนการติดตั้งแอปทั้งหมด",
-        "openLive" : "เปิด My Ledger ใน Ledger Live",
+        "openLive" : "เปิด Ledger ของฉันใน Ledger Live",
         "uninstall" : "คลิกที่ไอคอนถังขยะสีเทาสำหรับแอปทั้งหมดที่ติดตั้งอยู่ในปัจจุบันใน {{deviceName}} ทำให้มีพื้นที่สำหรับตัวติดตั้งเฟิร์มแวร์",
         "disclaimer" : "หมายเหตุ: เงินทุนของคุณจะไม่ได้รับผลกระทบจากการดำเนินการนี้ โดย Private Key ที่ใช้เข้าถึงสินทรัพย์คริปโตของคุณในบล็อกเชนจะยังคงปลอดภัยบน Recovery Sheet"
       }
     }
   },
   "claimReward" : {
-    "title" : "ขอรับ Reward",
+    "title" : "เคลม Reward",
     "steps" : {
       "rewards" : {
         "title" : "Reward",
@@ -2150,7 +2151,7 @@
       "confirmation" : {
         "title" : "การยืนยัน",
         "success" : {
-          "title" : "รับ Reward แล้ว",
+          "title" : "เคลม Reward แล้ว",
           "text" : "Reward ของคุณได้รับการเพิ่มเข้าไปในยอดคงเหลือในบัญชีที่คุณใช้ได้แล้ว",
           "cta" : "ดูรายละเอียด",
           "done" : "เสร็จสิ้น"
@@ -2460,7 +2461,7 @@
     "chooseName" : "เลือกชื่อ",
     "placeholder" : "Tony's Stax",
     "remainingCharacters" : "เหลืออีก {{ remainingCharacters }} ตัวอักษร",
-    "renamed" : "{{ productName }} เปลี่ยนชื่อเป็น \n“{{ name }}}” แล้ว "
+    "renamed" : "{{ productName }} เปลี่ยนชื่อเป็น \n“{{ name }}” แล้ว "
   },
   "removeCustomLockscreen" : {
     "title" : "นำภาพ Lock Screen Picture ออก",
@@ -2548,7 +2549,7 @@
         "delegation" : "รับ Reward"
       },
       "commission" : "คอมมิชชัน",
-      "claimRewards" : "ขอรับ Reward",
+      "claimRewards" : "เคลม Reward",
       "header" : "Delegation",
       "noRewards" : "ไม่สามารถใช้ Reward ได้",
       "delegate" : "Delegate",
@@ -2556,7 +2557,7 @@
       "redelegateDisabledTooltip" : "คุณสามารถมอบหมายใหม่ได้ในอีก <0>{{days}}</0> วัน",
       "redelegateMaxDisabledTooltip" : "คุณไม่สามารถ Redelegate ได้มากกว่า <0>7</0> ผู้ตรวจสอบต่อครั้ง",
       "undelegateDisabledTooltip" : "คุณไม่สามารถ Redelegate ได้มากกว่า <0>7</0> ผู้ตรวจสอบต่อครั้ง",
-      "reward" : "ขอรับ Reward",
+      "reward" : "เคลม Reward",
       "currentDelegation" : "Delegate แล้ว: <0>{{amount}}</0>",
       "apr" : "อัตราร้อยละต่อปี",
       "totalStake" : "จำนวน Stake ทั้งหมด",
@@ -2604,13 +2605,13 @@
     },
     "claimRewards" : {
       "flow" : {
-        "title" : "ขอรับ Reward",
+        "title" : "เคลม Reward",
         "steps" : {
           "claimRewards" : {
             "title" : "Reward",
             "compound" : "Compound Reward",
-            "claim" : "ขอรับ Reward",
-            "compoundOrClaim" : "ทำการทบต้น Reward หรือรับ Reward เลย",
+            "claim" : "เคลม Reward",
+            "compoundOrClaim" : "จะทบต้น Reward หรือเคลม Reward เลย",
             "compoundDescription" : "Reward จะถูกเพิ่มเข้าไปในจำนวนที่ Delegate",
             "claimDescription" : "Reward จะถูกเพิ่มเข้าไปในยอดคงเหลือที่ใช้ได้",
             "compoundInfo" : "คุณได้รับ <0>{{amount}}</0> แล้ว การคลิกดำเนินการต่อจะถือว่ากำลังมีการขอรับทันที และจะมีการ Delegate โดยอัตโนมัติให้กับผู้ให้บริการ Staking เดียวกัน",
@@ -2624,7 +2625,7 @@
             "title" : "การยืนยัน",
             "label" : "การยืนยัน",
             "success" : {
-              "title" : "ขอรับ Reward เรียบร้อยแล้ว",
+              "title" : "เคลม Reward เรียบร้อยแล้ว",
               "titleCompound" : "ทำการทบต้น Reward เรียบร้อยแล้ว",
               "text" : "มีการเพิ่ม Reward เข้าไปในยอดคงเหลือที่คุณใช้ได้แล้ว",
               "textCompound" : "ธุรกรรม Reward ที่ทบต้นจำนวน <0>{{amount}}</0> EGLD ไปยัง <0>{{validator}}</0> ได้รับการดำเนินการเรียบร้อยแล้ว",
@@ -2651,7 +2652,7 @@
           "amount" : {
             "title" : "จำนวน",
             "subtitle" : "กระบวนการ Undelegate ใช้เวลา <0>10 วัน</0> จึงจะแล้วเสร็จ",
-            "warning" : "จะมีการขอรับ Reward โดยอัตโนมัติ การ Undelegate เป็นกระบวนการ 2 ขั้นตอน: การร้องขอการ Undelegate ตามด้วย<0>ช่วงเวลาการยกเลิกการผูกมัด 10 วัน</0> ซึ่งหลังจากนั้น คุณสามารถดำเนินการถอนให้เสร็จสิ้น และจำนวนที่ Undelegate จะได้รับการโอนไปยังยอดคงเหลือที่ใช้ได้",
+            "warning" : "จะมีการเคลม Reward โดยอัตโนมัติ การ Undelegate เป็นกระบวนการ 2 ขั้นตอน: การร้องขอการ Undelegate ตามด้วย<0>ช่วงเวลาการยกเลิกการผูกมัด 10 วัน</0> ซึ่งหลังจากนั้น คุณสามารถดำเนินการถอนให้เสร็จสิ้น และจำนวนที่ Undelegate จะได้รับการโอนไปยังยอดคงเหลือที่ใช้ได้",
             "fields" : {
               "validator" : "ผู้ให้บริการ Staking",
               "amount" : "จำนวนที่จะ Undelegate"
@@ -2786,9 +2787,9 @@
       "warnEarnRewards" : "คุณต้องการอย่างน้อย {{amount}} เพื่อเริ่มรับ Reward",
       "warnDisableStaking" : "ไม่สามารถใช้ได้",
       "warnDisableStakingMessage" : "ฟีเจอร์ Staking สำหรับ Tron ไม่สามารถใช้งานได้ในตอนนี้",
-      "claimRewards" : "ขอรับ Reward",
+      "claimRewards" : "เคลม Reward",
       "nextRewardsDate" : "สามารถขอรับ Reward ได้ในวันที่ {{date}}",
-      "claimAvailableRewards" : "ขอรับ {{amount}}",
+      "claimAvailableRewards" : "เคลม {{amount}}",
       "header" : "การโหวต",
       "percentageTP" : "% การลงคะแนนไปแล้วของการโหวต",
       "noRewards" : "ไม่มี Reward",
@@ -3152,7 +3153,7 @@
       },
       "commission" : "คอมมิชชัน",
       "totalStake" : "จำนวน Stake ทั้งหมด",
-      "claimRewards" : "ขอรับ Reward",
+      "claimRewards" : "เคลม Reward",
       "header" : "การ Delegation",
       "noRewards" : "ไม่มี Reward",
       "delegate" : "เพิ่ม",
@@ -3161,7 +3162,7 @@
       "redelegateDisabledTooltip" : "คุณสามารถ Redelegate ได้ในอีก <0>{{days}}</0> วัน",
       "redelegateMaxDisabledTooltip" : "คุณไม่สามารถ Redelegate ได้มากกว่า <0>7</0> ผู้ตรวจสอบต่อครั้ง",
       "undelegateDisabledTooltip" : "คุณไม่สามารถ Redelegate ได้มากกว่า <0>7</0> ผู้ตรวจสอบต่อครั้ง",
-      "reward" : "ขอรับ Reward",
+      "reward" : "เคลม Reward",
       "currentDelegation" : "Delegate แล้ว: <0>{{amount}}</0>",
       "estYield" : "ผลตอบแทนโดยประมาณ",
       "activeTooltip" : "จำนวนที่ Delegate จะส่งผลต่อจำนวน Reward ที่ได้",
@@ -3200,7 +3201,7 @@
     },
     "claimRewards" : {
       "flow" : {
-        "title" : "ขอรับ Reward",
+        "title" : "เคลม Reward",
         "steps" : {
           "claimRewards" : {
             "title" : "Reward",
@@ -3331,10 +3332,10 @@
     "claimRewards" : {
       "header" : "Reward",
       "tooltip" : "Reward ของ Algorand จะได้รับการกระจายเป็นประจำ และสามารถรับได้โดยอัตโนมัติเมื่อคุณทำธุรกรรม",
-      "cta" : "ขอรับ Reward",
+      "cta" : "เคลม Reward",
       "rewardsDisabledTooltip" : "คุณไม่มี Reward ใด ๆ สามารถขอรับ Reward ของ Algorand ได้โดยอัตโนมัติเมื่อคุณทำธุรกรรม รับ ALGO เพื่อเริ่มรับ Reward",
       "flow" : {
-        "title" : "ขอรับ Reward",
+        "title" : "เคลม Reward",
         "steps" : {
           "starter" : {
             "description" : "รับ Reward ของ Algorand ได้เพียงแค่ถือ Algorand เพื่อการควบคุมสินทรัพย์ของคุณ",
@@ -3359,7 +3360,7 @@
           "confirmation" : {
             "title" : "การยืนยัน",
             "success" : {
-              "title" : "ขอรับ Reward เรียบร้อยแล้ว!",
+              "title" : "เคลม Reward เรียบร้อยแล้ว!",
               "text" : "Reward ของคุณได้รับการเพิ่มเข้าไปในยอดคงเหลือที่คุณใช้ได้แล้ว",
               "cta" : "ดูรายละเอียด"
             },
@@ -4494,7 +4495,7 @@
           "description" : "ลิมิตช่องว่างที่กำหนดเองสำหรับทุกบัญชี การเพิ่มค่านี้ให้สูงกว่าค่าเริ่มต้น (20) จะสแกน Address สาธารณะที่ไม่ได้ใช้งานเพิ่มเติมเพื่อค้นหาเหรียญ สำหรับผู้ใช้ที่เชี่ยวชาญเท่านั้น สิ่งนี้อาจทำให้มีปัญหาเข้ากันไม่ได้ในการกู้คืนบัญชีของคุณ"
         },
         "forceProvider" : {
-          "title" : "ผู้ให้บริการ My Ledger",
+          "title" : "ผู้ให้บริการ Ledger ของฉัน",
           "description" : "การเปลี่ยนผู้ให้บริการแอปใน My Ledger อาจทำให้ไม่สามารถติดตั้งหรือถอนการติดตั้งแอปบนอุปกรณ์ Ledger ของคุณได้"
         },
         "testAnimations" : {
@@ -5330,7 +5331,7 @@
         "anotherComputer" : {
           "title" : "ลองใช้คอมพิวเตอร์เครื่องอื่น",
           "bullets" : {
-            "0" : "ไปที่ <0>{{link}}}</0> บนคอมพิวเตอร์เครื่องอื่นเพื่อดาวน์โหลดและติดตั้ง Ledger Live",
+            "0" : "ไปที่ <0>{{link}}</0> บนคอมพิวเตอร์เครื่องอื่นเพื่อดาวน์โหลดและติดตั้ง Ledger Live",
             "1" : "เชื่อมต่อและปลดล็อกอุปกรณ์ของคุณเพื่อดูว่าตรวจพบหรือไม่"
           }
         }
@@ -5515,6 +5516,11 @@
       "memo" : "Tag / Memo",
       "memoPlaceholder" : "ไม่บังคับ",
       "requiredMemoPlaceholder" : "จำเป็น"
+    },
+    "mina" : {
+      "memoPlaceholder" : "ไม่บังคับ",
+      "memo" : "Memo",
+      "memoWarningText" : "Memo Value ต้องเป็นสตริงที่สั้นกว่าหรือเท่ากับ 32 อักขระ"
     }
   },
   "errors" : {
@@ -5780,7 +5786,7 @@
         "description" : "การออกจาก My Ledger จะยุติการอัปเดตแอปที่กำลังดำเนินการ",
         "stay" : "อัปเดตให้เสร็จสิ้น"
       },
-      "quit" : "ปิด My Ledger"
+      "quit" : "ปิด Ledger ของฉัน"
     },
     "ManagerUninstallBTCDep" : {
       "title" : "ขออภัย ต้องมีแอปนี้",
@@ -6118,7 +6124,7 @@
       "description" : "เปิดแอป '{{managerAppName}}' บนอุปกรณ์ของคุณ"
     },
     "DeviceNameInvalid" : {
-      "title" : "โปรดเลือกชื่ออุปกรณ์ที่ไม่มี '{{invalidCharacters}}}'"
+      "title" : "โปรดเลือกชื่ออุปกรณ์ที่ไม่มี '{{invalidCharacters}}'"
     },
     "LedgerAPIErrorWithMessage" : {
       "title" : "{{message}}",
@@ -6545,6 +6551,15 @@
         "swap" : "Swap",
         "deposit" : "ฝาก"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "Memo ไม่สามารถยาวเกิน 32 ตัวอักษร"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "This transaction will incur an account creation fee of {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "Minimum required amount for this transaction is {{amount}}"
     }
   },
   "cryptoOrg" : {

From 3dfb0f2e5f1b63b7d424df7531dc0aad4bd31d58 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:31 +0000
Subject: [PATCH 46/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to ar-AE locale

---
 .../src/locales/ar/common.json                | 108 ++++++++++--------
 1 file changed, 61 insertions(+), 47 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/ar/common.json b/apps/ledger-live-mobile/src/locales/ar/common.json
index 639e612c0a2a..e04085536152 100644
--- a/apps/ledger-live-mobile/src/locales/ar/common.json
+++ b/apps/ledger-live-mobile/src/locales/ar/common.json
@@ -831,11 +831,11 @@
       "title" : "ربما تكون معاملتك قد فشلت. يُرجى الانتظار لحظة ثم تحقق من سجل المعاملات قبل المحاولة مرة أخرى."
     },
     "SolanaRecipientMemoIsRequired" : {
-      "title" : "Memo is required for recipient address"
+      "title" : "الملاحظة (تسمية الوجهة) مطلوبة من أجل عنوان المستلم"
     },
     "SolanaTokenNonTransferable" : {
-      "title" : "Token is non-transferable",
-      "description" : "Such tokens are \"soul-bound\" and cannot be transferred"
+      "title" : "رمز التوكن غير قابل للتحويل",
+      "description" : "رموز التوكن تلك هي ”soul-bound (رموز مرتبطة بالروح)“ ولا يمكن تحويلها"
     },
     "CardanoMinAmountError" : {
       "title" : "الحد الأدنى للمبلغ القابل للإرسال هو {{amount}} ADA"
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "فشل تحميل تطبيق Swap Live"
+    },
+    "InvalidMemoMina" : {
+      "title" : "نص علامة الملاحظة (تسمية الوجهة) لا يمكن أن يكون أطول من 32 حرفاً"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "هذه المعاملة ستُكلّف رسوم إنشاء حساب بقيمة {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "الحد الأدنى للمبلغ المطلوب لهذه المعاملة هو {{amount}}"
     }
   },
   "crash" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "حد الغاز",
       "id" : "المُعرّف",
       "autoClaimedRewards" : "المكافآت المطالب بها تلقائياً",
-      "stakedAmount" : "المبلغ المُكدَّس"
+      "stakedAmount" : "المبلغ المُكدَّس",
+      "accountCreationFee" : "رسوم إنشاء الحساب"
     },
     "multipleAddresses" : "لماذا عناوين متعددة؟",
     "tokenName" : "اسم رمز التوكن",
@@ -2626,6 +2636,10 @@
         "description3Link" : "هذا الدمج تم تنفيذه من قِبل <1><0>{{team}}</1></0> بالتعاون مع Ledger"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} تُرحَّل إلى {{to}}. اتبع هذا <0>الرابط</0> لمعرفة المزيد أو تواصل مع الدعم إذا كنت بحاجة إلى مساعدة.",
+      "contactSupport" : "تواصل مع الدعم"
+    },
     "willBedeprecatedBanner" : {
       "title" : "لتحسين الكفاءة، {{currencyName}} لن تكون مدعومةً على Ledger Live بدءاً من {{deprecatedDate}}. مع ذلك، ستظل مدعومةً على محافظ أجهزة Ledger. يُرجى التواصل مع دعم عملاء Ledger إذا كنت ترغب في الحصول على مساعدة حول ذلك.",
       "contactSupport" : "تواصل مع الدعم"
@@ -3534,12 +3548,12 @@
         "apt_description" : "لمبادلة Aptos، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
         "cosmos_title" : "™Ledger Nano S لا تدعم مبادلة Cosmos",
         "cosmos_description" : "لمبادلة Cosmos، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "™Ledger Nano S لا تدعم مبادلة Osmosis",
+        "osmo_description" : "لمبادلة Osmosis، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
+        "dydx_title" : "™Ledger Nano S لا تدعم مبادلة dYdX",
+        "dydx_description" : "لمبادلة dYdX، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
+        "sui_title" : "™Ledger Nano S لا تدعم مبادلة Sui",
+        "sui_description" : "لمبادلة Sui، استخدِم أي جهاز Ledger آخر متوافق مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax."
       }
     },
     "lending" : {
@@ -6037,63 +6051,63 @@
       "frozenStateWarning" : "تمّ تجميد أصول الحساب!",
       "transferWarning" : "للتحقق من عنوان المستلم لرموز سولانا (Solana) باستخدام ™Ledger Nano S، <0>يرجى اتباع هذه التعليمات.</0>",
       "transferFees" : {
-        "title" : "Transfer fees",
-        "feesPercentHint" : "Token has {{feePercent}}% ({{feeBps}}bps) transfer fee ({{maxFee}} max)",
-        "notice" : "Transfer fee {{fee}}%",
-        "tooltipHint" : "Percentage of transfer withheld for token creator"
+        "title" : "رسوم التحويل",
+        "feesPercentHint" : "رمز التوكن عليه رسوم تحويل %{{feePercent}} ({{feeBps}} نقطة أساس) ({{maxFee}} بحد أقصى)",
+        "notice" : "رسوم التحويل %{{fee}}",
+        "tooltipHint" : "النسبة المئوية من التحويل المحتجزة من أجل منشئ رمز التوكن"
       },
       "nonTransferable" : {
-        "notice" : "Token is non-transferable"
+        "notice" : "رمز التوكن غير قابل للتحويل"
       },
       "interestRate" : {
-        "notice" : "Interest rate {{rate}}%",
-        "tooltipHint" : "For cosmetic purposes only, no new tokens are created as a result of the interest"
+        "notice" : "مُعدل الفائدة %{{rate}}",
+        "tooltipHint" : "من أجل الأغراض التجميلية فقط، لم يتم إنشاء أي رموز توكن جديدة نتيجةً للفائدة"
       },
       "permanentDelegate" : {
-        "notice" : "Permanent delegate authority is enabled",
-        "initializationNotice" : "Permanent delegate authority is initialized but not enabled",
-        "initializedNoticeTooltipHint" : "The delegate has the ability transfer or burn this token from your account",
-        "tooltipHint" : "{{delegateAddress}}<0></0> has the ability transfer or burn this token from your account"
+        "notice" : "سُلطة المُفوِّض الدائم (Permanent delegate) مُمكّنة",
+        "initializationNotice" : "سُلطة المُفوِّض الدائم (Permanent delegate) بدأت لكنها غير مُمكّنة",
+        "initializedNoticeTooltipHint" : "المُفوِّض لديه القدرة على تحويل أو حرق رمز التوكن هذا من حسابك",
+        "tooltipHint" : "{{delegateAddress}}<0></0> لديه القدرة على تحويل أو حرق رمز التوكن هذا من حسابك"
       },
       "requiredMemoOnTransfer" : {
-        "notice" : "Required memo on transfer is enabled",
-        "tooltipHint" : "All incoming transfers to this account must have a memo"
+        "notice" : "الملاحظة (تسمية الوجهة) الإلزامية على التحويل مُمكّنة",
+        "tooltipHint" : "كل التحويلات الواردة إلى هذا الحساب يجب أن تكون مصحوبةً بملاحظة (تسمية الوجهة)"
       },
       "transferHook" : {
-        "notice" : "Transfer hook is enabled",
-        "initializationNotice" : "Transfer hook is initialized but not enabled",
-        "tooltipHint" : "Token has extra functionality handled by {{programAddress}}<0></0>"
+        "notice" : "خُطّاف التحويل (Transfer hook) مُمكّن",
+        "initializationNotice" : "خُطّاف التحويل (Transfer hook) بدأ لكنه غير مُمكّن",
+        "tooltipHint" : "رمز التوكن له وظيفة إضافية يتم التعامل معها بواسطة {{programAddress}}<0></0>"
       },
       "extensionsInfo" : {
-        "title" : "Solana token extensions",
-        "commonInfo" : "Token extensions are the next generation of the Solana Token standard. They introduce a new set of ways to extend the normal token functionality with additional features such as confidential transfers, permanent delegate, custom transfer logic, extended metadata, and much more.",
+        "title" : "ملحقات رموز سولانا (Solana)",
+        "commonInfo" : "ملحقات الرموز هي الجيل القادم من معيار رمز سولانا (Solana). إنها تقدّم مجموعة جديدة من الطرق لتمديد وظيفة رمز التوكن العادية بميزات إضافية؛ مثل التحويلات السرية، والمُفوِّض الدائم (Permanent Delegate)، ومنطق التحويل المخصص، والبيانات الوصفية الممتدة، والكثير غير ذلك.",
         "permanentDelegate" : {
-          "title" : "Permanent delegate",
-          "permanentDelegateAddress" : "Current delegate authority is {{address}}",
-          "permanentDelegateNotSetup" : "Current delegate authority is not set up.",
-          "description" : "Permanent delegate is an authority which has unlimited delegate privileges over any account for that mint. The delegate could burn or transfer any amount of tokens, at any time, on their own authority."
+          "title" : "المُفوِّض الدائم (Permanent Delegate)",
+          "permanentDelegateAddress" : "سلطة المُفوِّض الحالية هي {{address}}",
+          "permanentDelegateNotSetup" : "سلطة المُفوِّض الحالية لم يتم إعدادها.",
+          "description" : "المُفوِّض الدائم (Permanent Delegate) هو سلطة لديها امتيازات تفويض غير محدودة على أي حساب من أجل ذلك السكّ. المُفوِّض يمكن أن يقوم بحرق أو تحويل أي مبلغ من رموز التوكن، في أي وقت، ضمن سلطته."
         },
         "nonTransferable" : {
-          "title" : "Non-Transferrable Tokens",
-          "description" : "Such tokens are \"soul-bound\" and cannot be moved or burned, except by the token issuer."
+          "title" : "الرموز غير القابلة للتحويل",
+          "description" : "رموز التوكن تلك هي ”soul-bound (رموز مرتبطة بالروح)“ ولا يمكن نقلها أو حرقها إلا بواسطة مُصدر رمز التوكن."
         },
         "transferHook" : {
-          "title" : "Transfer hook",
-          "transferHookAddress" : "Current transfer hook program is {{address}}",
-          "transferHookNotSetup" : "Current transfer hook program is not set up.",
-          "description" : "Transfer hook gives a token issuers an ability to dictate how users and tokens interact. Instead of a normal transfer, issuer can insert custom logic into a program to be used with the transfer hook extension."
+          "title" : "خُطّاف التحويل (Transfer hook)",
+          "transferHookAddress" : "برنامج خُطّاف التحويل (Transfer hook) الحالي هو {{address}}",
+          "transferHookNotSetup" : "برنامج خُطّاف التحويل (Transfer hook) الحالي لم يتم إعداده.",
+          "description" : "خُطّاف التحويل (Transfer hook) يمنح مُصدري رموز التوكن قدرة على إملاء كيفية تفاعل المستخدمين ورموز التوكن. بدلاً من التحويل العادي، يمكن للمُصدر أن يُدخِل منطقاً مخصصاً في برنامج سيتم استخدامه مع ملحق خُطّاف التحويل (Transfer hook)."
         },
         "transferFee" : {
-          "title" : "Transfer Fee",
-          "currentTransferFee" : "Current transfer fee is {{feePercent}}% ({{feeBps}}bps). Max {{maxFee}}.",
-          "description" : "Fees are charged on every transfer of a token and withheld on the recipient account, untouchable by the recipient."
+          "title" : "رسوم التحويل",
+          "currentTransferFee" : "رسوم التحويل الحالية هي %{{feePercent}} ({{feeBps}} نقطة أساس (bps) ). أقصى حد {{maxFee}}.",
+          "description" : "يتم فرض الرسوم على كل تحويل لرمز توكن وتُحجز على حساب المستلم، ولا يمكن للمستلم المساس بها."
         },
         "interestBearing" : {
-          "title" : "Interest-Bearing Tokens",
-          "currentInterestRate" : "Current interest rate is {{rate}}%.",
-          "accruedDelta" : "Accrued {{delta}}.",
-          "interestRateNotSetup" : "Current interest rate is set up to 0%.",
-          "description" : "Tokens that constantly grow or decrease in value according on its interest rate. No new tokens are ever created, the feature is entirely cosmetic."
+          "title" : "رموز التوكن المُدرة للفائدة",
+          "currentInterestRate" : "مُعدل الفائدة الحالي هو %{{rate}}.",
+          "accruedDelta" : "المتراكمة {{delta}}.",
+          "interestRateNotSetup" : "مُعدل الفائدة الحالي تم تعيينه ليكون %0.",
+          "description" : "رموز التوكن التي تنمو أو تنخفض قيمتها باستمرار وفقاً لمعدل فائدتها. لا يتم إنشاء أي رموز توكن جديدة على الإطلاق، الميزة تجميلية بشكل كامل."
         }
       }
     }
@@ -6795,7 +6809,7 @@
         "hide" : "إخفاء {{count}} مجموعة",
         "hiddenCollections" : "المجموعات المخفية",
         "hide_plural" : "إخفاء {{count}} مجموعة",
-        "empty" : "No Hidden collections to show",
+        "empty" : "ليس هناك مجموعات مخفية لعرضها",
         "alertHide" : "تم إخفاء 1 مجموعة. يمكنك إلغاء إخفائها في أي وقت من تصفية المعرض.",
         "alertHide_plural" : "تم إخفاء {{count}} مجموعة. يمكنك إلغاء إخفائها في أي وقت من تصفية المعرض."
       },

From da4da6d38a34cda6bf6f1c92cf5b0778f0747155 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:32 +0000
Subject: [PATCH 47/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to fr-FR locale

---
 .../static/i18n/fr/app.json                   | 94 +++++++------------
 1 file changed, 36 insertions(+), 58 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/fr/app.json b/apps/ledger-live-desktop/static/i18n/fr/app.json
index 19368c14283e..8b93d41cb632 100644
--- a/apps/ledger-live-desktop/static/i18n/fr/app.json
+++ b/apps/ledger-live-desktop/static/i18n/fr/app.json
@@ -449,8 +449,8 @@
       "ton_description" : "Pour échanger des TON, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
       "spl_tokens_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de tokens Solana",
       "spl_tokens_description" : "Pour échanger des tokens Solana, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de tokens Sui",
+      "sui_tokens_description" : "Pour échanger des tokens Sui, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
       "near_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de NEAR",
       "near_description" : "Pour échanger des NEAR, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
       "ada_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de Cardano",
@@ -459,12 +459,12 @@
       "apt_description" : "Pour échanger des Aptos, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
       "cosmos_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de Cosmos",
       "cosmos_description" : "Pour échanger des Cosmos, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange d’Osmosis",
+      "osmo_description" : "Pour échanger des Osmosis, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
+      "dydx_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de dYdX",
+      "dydx_description" : "Pour échanger des dYdX, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
+      "sui_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de Sui",
+      "sui_description" : "Pour échanger des Sui, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™."
     },
     "providers" : {
       "title" : "Choisir un prestataire pour le swap",
@@ -776,6 +776,10 @@
         "description3Link" : "Cette intégration a été réalisée par <1><0>{{team}}</0></1> en collaboration avec Ledger."
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} migre vers {{to}}. Cliquez <0>ici</0> pour en savoir plus ou contactez l’Assistance si vous avez besoin d’aide.",
+      "contactSupport" : "Contacter l’Assistance"
+    },
     "featureUnavailable" : {
       "title" : "La fonctionnalité suivante est temporairement indisponible : {{feature}}. Pour plus d’informations, veuillez contacter l’{{support}}.",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "Méthode",
       "transferAmount" : "Montant transféré",
       "validatorsCount" : "Validateurs ({{number}})",
-      "version" : "Version"
+      "version" : "Version",
+      "accountCreationFee" : "Frais de création de compte"
     }
   },
   "operationList" : {
@@ -5511,6 +5516,11 @@
       "memo" : "Tag/mémo",
       "memoPlaceholder" : "Facultatif",
       "requiredMemoPlaceholder" : "Requis"
+    },
+    "mina" : {
+      "memoPlaceholder" : "Facultatif",
+      "memo" : "Mémo",
+      "memoWarningText" : "Le mémo peut être une séquence de caractères inférieure ou égale à 32 caractères"
     }
   },
   "errors" : {
@@ -6541,6 +6551,15 @@
         "swap" : "Échangez",
         "deposit" : "Déposez"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "Le mémo ne peut pas dépasser 32 caractères"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Les frais de création de compte pour cette transaction s’élèveront à {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "Le montant minimal requis pour cette transaction est {{amount}}"
     }
   },
   "cryptoOrg" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "Passez au niveau supérieur",
-          "description" : "Bénéficiez de <0>-{{discount}}% de réduction</0> sur nos wallets dernière génération. Passez à une expérience plus fluide et plus sécurisée dès maintenant.",
-          "cta" : "Choisir mon nouveau wallet",
-          "linkText" : "En savoir plus"
-        },
-        "optOut" : {
-          "title" : "Passez au niveau supérieur",
-          "description" : "Bénéficiez de <0>-{{discount}}% de réduction</0> sur nos wallets dernière génération. Passez à une expérience plus fluide et plus sécurisée dès maintenant.",
-          "cta" : "Choisir mon nouveau wallet",
-          "linkText" : "En savoir plus"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "Passez au niveau supérieur",
-          "description" : "Le Ledger Nano S ne recevra bientôt plus de mises à jour. Bénéficiez de <0>-{{discount}}% de réduction</0> sur nos derniers wallets.",
-          "cta" : "Choisir mon nouveau wallet",
-          "linkText" : "En savoir plus"
-        },
-        "optOut" : {
-          "title" : "Passez au niveau supérieur",
-          "description" : "Le Ledger Nano S ne recevra bientôt plus de mises à jour. Bénéficiez de <0>-{{discount}}% de réduction</0> sur nos derniers wallets.",
-          "cta" : "Choisir mon nouveau wallet",
-          "linkText" : "En savoir plus"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "Passez au niveau supérieur",
-          "description" : "Bénéficiez de <0>-{{discount}}% de réduction</0> sur nos wallets dernière génération. Passez à une expérience plus fluide et plus sécurisée dès maintenant.",
-          "cta" : "Choisir mon nouveau wallet",
-          "linkText" : "En savoir plus"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "Les mises à jour s’arrêtent bientôt. Pour une expérience fluide, passez à un wallet supérieur, avec -{{discount}}% de réduction.",
-          "cta" : "Choisir mon nouveau wallet",
-          "linkText" : "En savoir plus"
-        },
-        "optOut" : {
-          "description" : "Les mises à jour s’arrêtent bientôt. Pour une expérience fluide, passez à un wallet supérieur, avec -{{discount}}% de réduction.",
-          "cta" : "Choisir mon nouveau wallet",
-          "linkText" : "En savoir plus"
-        }
-      }
+    "opted_in" : {
+      "title" : "Mémoire limitée, expérience limitée",
+      "description" : "Passez du Ledger Nano S à un modèle plus récent, tel que le Ledger Flex. À la clé : plus de mémoire, les dernières améliorations de sécurité, de nouvelles fonctionnalités et <0>une réduction exclusive de {{discount}}%</0>.",
+      "cta" : "Choisir mon wallet"
+    },
+    "opted_out" : {
+      "description" : "Avec sa mémoire limitée, votre Ledger Nano S vous prive des dernières fonctionnalités, innovations blockchain et améliorations de sécurité. Pour en bénéficier, choisissez un wallet Ledger plus récent.",
+      "cta" : "En savoir plus"
     }
   }
 }

From 6a7dbf36d9afdc60f77712b6f9233c31ba618ae7 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:34 +0000
Subject: [PATCH 48/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to ja-JP locale

---
 .../static/i18n/ja/app.json                   | 98 +++++++------------
 1 file changed, 38 insertions(+), 60 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/ja/app.json b/apps/ledger-live-desktop/static/i18n/ja/app.json
index 374b298bb4b3..c67af546e728 100644
--- a/apps/ledger-live-desktop/static/i18n/ja/app.json
+++ b/apps/ledger-live-desktop/static/i18n/ja/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "Ledger Nano S™は、{{provider}}に対応していません",
-      "description" : "Ledger Nano Sは、{{provider}}に対応していませんLedger Nano S Plus、Ledger Nano X、Ledger Stax、またはLedger Flexを使用して、Ledger Liveから{{provider}}でのクロスチェーンスワップが可能です",
+      "description" : "Ledger Nano S™は、{{provider}}に対応していません。Ledger Nano S Plus™、Ledger Nano X™、Ledger Stax™、またはLedger Flex™を使用して、Ledger Liveから{{provider}}でのクロスチェーンスワップが可能です",
       "cta" : "対応デバイスを探す",
       "changeProvider" : "別のプロバイダーでスワップ"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "Tonをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、またはLedger Stax™など、他の対応するLedgerデバイスをご使用ください。",
       "spl_tokens_title" : "Ledger Nano S™はSolanaトークンのスワップに対応していません",
       "spl_tokens_description" : "Solanaトークンをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、またはLedger Stax™など、他の対応するLedgerデバイスをご使用ください。",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "Ledger Nano S™は、Suiトークンのスワップに対応していません",
+      "sui_tokens_description" : "Suiトークンをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、またはLedger Stax™など、他の対応するLedgerデバイスをご使用ください。",
       "near_title" : "Ledger Nano S™はNearのスワップに対応していません",
       "near_description" : "Nearをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
       "ada_title" : "Ledger Nano S™はCardanoのスワップに対応していません",
@@ -459,12 +459,12 @@
       "apt_description" : "Aptosをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
       "cosmos_title" : "Ledger Nano S™はCosmosのスワップに対応していません",
       "cosmos_description" : "Cosmosをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "Ledger Nano S™は、Osmosisのスワップに対応していません",
+      "osmo_description" : "Osmosisをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
+      "dydx_title" : "Ledger Nano S™は、dYdXのスワップに対応していません",
+      "dydx_description" : "dYdXをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
+      "sui_title" : "Ledger Nano S™は、Suiのスワップに対応していません",
+      "sui_description" : "Suiをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、またはLedger Stax™など、他の対応するLedgerデバイスをご使用ください。"
     },
     "providers" : {
       "title" : "暗号資産のスワップに利用するプロバイダーを選択",
@@ -776,6 +776,10 @@
         "description3Link" : "この統合は、<1><0>{{team}}</0></1>がLedgerと共同で実施しました"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}}は{{to}}に移行しています。詳細については、こちらの<0>リンク</0>をご参照いただくか、必要に応じてサポートにお問い合わせください。",
+      "contactSupport" : "サポートへお問い合わせ"
+    },
     "featureUnavailable" : {
       "title" : "次の機能は一時的にご利用いただけません:{{feature}}。詳しくは{{support}}をご覧ください",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "方法",
       "transferAmount" : "送付額",
       "validatorsCount" : "バリデータ({{number}})",
-      "version" : "バージョン"
+      "version" : "バージョン",
+      "accountCreationFee" : "アカウント作成手数料"
     }
   },
   "operationList" : {
@@ -2049,7 +2054,7 @@
       "dontHaveSeed" : "リカバリーフレーズをお持ちでないですか? ",
       "followTheGuide" : "アップデートの手順はこちらをご覧ください。",
       "removeApps" : "アップデート前に全アプリをアンインストールする",
-      "update" : "{{productName}} OSアップデート",
+      "update" : "{{productName}}OSアップデート",
       "updateBtn" : "ファームウェアをアップデート",
       "installUpdate" : "アップデートをインストール",
       "banner" : {
@@ -5511,6 +5516,11 @@
       "memo" : "タグ/メモ",
       "memoPlaceholder" : "任意",
       "requiredMemoPlaceholder" : "必須"
+    },
+    "mina" : {
+      "memoPlaceholder" : "任意",
+      "memo" : "メモ",
+      "memoWarningText" : "メモの値は32文字以内の文字列で入力可能です"
     }
   },
   "errors" : {
@@ -6541,6 +6551,15 @@
         "swap" : "スワップ",
         "deposit" : "入金"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "メモに入力できる文字数は32文字以内です"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "このトランザクションには、{{fee}}のアカウント作成手数料が発生します"
+    },
+    "AmountTooSmall" : {
+      "title" : "このトランザクションに最低限必要な金額は、{{amount}}です"
     }
   },
   "cryptoOrg" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "アップグレードに絶好のチャンス!",
-          "description" : "<0>{{discount}}%割引</0>で、当社の最新のデバイスにアップグレードしましょう!より使いやすく、強化されたセキュリティをお楽しみいただけます。",
-          "cta" : "ウォレットをレベルアップ",
-          "linkText" : "詳細はこちら"
-        },
-        "optOut" : {
-          "title" : "アップグレードに絶好のチャンス!",
-          "description" : "<0>{{discount}}%割引</0>で、当社の最新のデバイスにアップグレードしましょう!より使いやすく、強化されたセキュリティをお楽しみいただけます。",
-          "cta" : "ウォレットをレベルアップ",
-          "linkText" : "詳細はこちら"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "絶好のアップグレードチャンス!",
-          "description" : "Ledger Nano Sのアップデートが間もなく終了します。<0>{{discount}}%OFF</0>で、最新デバイスにアップグレードしましょう。",
-          "cta" : "ウォレットをレベルアップ",
-          "linkText" : "詳細はこちら"
-        },
-        "optOut" : {
-          "title" : "絶好のアップグレードチャンス!",
-          "description" : "Ledger Nano Sのキャンペーンは間もなく終了です。<0>{{discount}}%OFF</0>で、当社の最新デバイスにアップグレードできます。",
-          "cta" : "ウォレットをレベルアップ",
-          "linkText" : "詳細はこちら"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "アップグレードに絶好のチャンス!",
-          "description" : "<0>{{discount}}%割引</0>で、最新のデバイスにアップグレードしましょう!より使いやすく、強化されたセキュリティをお楽しみいただけます。",
-          "cta" : "ウォレットをレベルアップ",
-          "linkText" : "詳細はこちら"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "キャンペーンがまもなく終了します。今ならデバイスのアップグレードが{{discount}}%OFF!より快適な体験をお楽しみいただけます。",
-          "cta" : "ウォレットをレベルアップ",
-          "linkText" : "詳細はこちら"
-        },
-        "optOut" : {
-          "description" : "キャンペーンは間もなく終了します。今ならデバイスのアップグレードが{{discount}}%OFF!より快適な体験をお楽しみいただけます。",
-          "cta" : "ウォレットをレベルアップ",
-          "linkText" : "詳細はこちら"
-        }
-      }
+    "opted_in" : {
+      "title" : "メモリ不足による制限",
+      "description" : "お持ちのLedger Nano Sを最新のLedger(Ledger Flexなど)にアップグレードしましょう!より多くのメモリ、最新のセキュリティ強化、複数の新機能をお楽しみいただけます。今なら、<0>{{discount}}%OFF</0>。",
+      "cta" : "Ledgerをアップグレード"
+    },
+    "opted_out" : {
+      "description" : "Ledger Nano Sの限られたメモリでは、複数の最新機能、ブロックチェーンの変更、セキュリティ強化も制限されます。ぜひ、新しいLedgerデバイスへのアップグレードをご検討ください。",
+      "cta" : "詳細はこちら"
     }
   }
 }

From 04fe035565765313f7d512732a97a69fbf439f7b Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:36 +0000
Subject: [PATCH 49/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to ko-KR locale

---
 .../static/i18n/ko/app.json                   | 98 +++++++------------
 1 file changed, 38 insertions(+), 60 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/ko/app.json b/apps/ledger-live-desktop/static/i18n/ko/app.json
index 1f6b2cead8fb..51c7d38196e0 100644
--- a/apps/ledger-live-desktop/static/i18n/ko/app.json
+++ b/apps/ledger-live-desktop/static/i18n/ko/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "Ledger Nano S™는 {{provider}}와(과) 호환되지 않습니다",
-      "description" : "Ledger Nano S는 {{provider}}와(과) 호환되지 않습니다 Ledger Nano S Plus, Ledger Nano X, Ledger Stax, 또는 Ledger Flex로 Ledger Live를 통해 {{provider}}에서 크로스체인 스왑을 경험할 수 있습니다",
+      "description" : "Ledger Nano S™는 {{provider}}와(과) 호환되지 않습니다 Ledger Nano S Plus™, Ledger Nano X™, Ledger Stax™, 또는 Ledger Flex™로 Ledger Live를 통해 {{provider}}에서 크로스체인 스왑을 경험할 수 있습니다",
       "cta" : "호환 가능한 장치 탐색",
       "changeProvider" : "다른 공급자를 통해 스왑"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "Ton을 스왑하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 호환 Ledger 장치를 사용하세요.",
       "spl_tokens_title" : "Ledger Nano S™는 솔라나 토큰 스왑을 지원하지 않습니다.",
       "spl_tokens_description" : "솔라노 토큰을 스왑하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 호환 Ledger 장치를 사용하세요.",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "Ledger Nano S™는 Sui 토큰 스왑을 지원하지 않습니다.",
+      "sui_tokens_description" : "Sui 토큰을 스왑하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 호환 Ledger 장치를 사용하세요.",
       "near_title" : "Ledger Nano S™는 Near 스왑을 지원하지 않습니다.",
       "near_description" : "Near 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
       "ada_title" : "Ledger Nano S™는 카르다노 스왑을 지원하지 않습니다.",
@@ -459,12 +459,12 @@
       "apt_description" : "Aptos 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
       "cosmos_title" : "Ledger Nano S™는 Cosmos 스왑을 지원하지 않습니다.",
       "cosmos_description" : "Cosmos 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "Ledger Nano S™는 Osmosis 스왑을 지원하지 않습니다.",
+      "osmo_description" : "Osmosis 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
+      "dydx_title" : "Ledger Nano S™는 dYdX 스왑을 지원하지 않습니다.",
+      "dydx_description" : "dYdX 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
+      "sui_title" : "Ledger Nano S™는 Sui 스왑을 지원하지 않습니다",
+      "sui_description" : "Sui 스왑 거래를 수행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 호환 Ledger 장치를 사용하세요."
     },
     "providers" : {
       "title" : "암호화폐를 스왑할 공급자를 선택하세요",
@@ -776,6 +776,10 @@
         "description3Link" : "이 통합은 Ledger와 협력을 통해 <1><0>{{team}}</0></1>에서 수행했습니다."
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}}가 {{to}}으로 마이그레이션되고 있습니다. <0>이 링크</0>에서 자세한 내용을 알아보고, 도움이 필요한 경우 지원팀에 문의하세요.",
+      "contactSupport" : "지원 부서 연락"
+    },
     "featureUnavailable" : {
       "title" : "다음의 {{feature}} 기능은 현재 이용하실 수 없습니다. 자세한 내용은 {{support}}에 문의하세요",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "방법",
       "transferAmount" : "이전 금액",
       "validatorsCount" : "검증인 ({{number}})",
-      "version" : "버전"
+      "version" : "버전",
+      "accountCreationFee" : "계정 생성 수수료"
     }
   },
   "operationList" : {
@@ -2049,7 +2054,7 @@
       "dontHaveSeed" : "복구 문구가 없나요? ",
       "followTheGuide" : "단계별 업데이트 가이드를 따르세요",
       "removeApps" : "모든 앱을 삭제하고 업데이트하세요",
-      "update" : "{{productName} OS 업데이트",
+      "update" : "{{productName}} OS 업데이트",
       "updateBtn" : "펌웨어를 업데이트하세요",
       "installUpdate" : "업데이트 설치",
       "banner" : {
@@ -5511,6 +5516,11 @@
       "memo" : "태그 / 메모",
       "memoPlaceholder" : "선택 사항",
       "requiredMemoPlaceholder" : "필수 항목"
+    },
+    "mina" : {
+      "memoPlaceholder" : "선택 사항",
+      "memo" : "메모",
+      "memoWarningText" : "메모 값은 32자 이하의 문자열일 수 있습니다."
     }
   },
   "errors" : {
@@ -6541,6 +6551,15 @@
         "swap" : "스왑",
         "deposit" : "입금"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "메모 텍스트는 32자를 초과할 수 없습니다."
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "이 트랜잭션에는 {{fee}}의 계정 생성 수수료가 부과됩니다."
+    },
+    "AmountTooSmall" : {
+      "title" : "이 트랜잭션에 필요한 최소 금액은 {{amount}}입니다"
     }
   },
   "cryptoOrg" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "장치 업그레이드 기회",
-          "description" : "최신 장치로 업그레이드하고 <0>{{discount}}% 할인 혜택</0>은 물론, 더 향상된 보안력과 원활한 사용자 경험을 누려보세요.",
-          "cta" : "내 지갑 업그레이드하기",
-          "linkText" : "자세히 알아보기"
-        },
-        "optOut" : {
-          "title" : "장치 업그레이드 기회",
-          "description" : "최신 장치로 업그레이드하고 <0>{{discount}}% 할인 혜택</0>은 물론, 더 향상된 보안력과 원활한 사용자 경험을 누려보세요.",
-          "cta" : "내 지갑 업그레이드하기",
-          "linkText" : "자세히 알아보기"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "장치 업그레이드 기회",
-          "description" : "Ledger Nano S 업데이트가 곧 종료됩니다. 최신 장치로 업그레이드하고 <0>{{discount}}% 할인 혜택</0>까지 누리세요.",
-          "cta" : "내 지갑 업그레이드하기",
-          "linkText" : "자세히 알아보기"
-        },
-        "optOut" : {
-          "title" : "장치 업그레이드 기회",
-          "description" : "Ledger Nano S 업데이트가 곧 종료됩니다. 최신 장치로 업그레이드하고 <0>{{discount}}% 할인 혜택</0>까지 누리세요.",
-          "cta" : "내 지갑 업그레이드하기",
-          "linkText" : "자세히 알아보기"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "장치 업그레이드 기회",
-          "description" : "최신 장치로 업그레이드하고 <0>{{discount}}% 할인 혜택</0>은 물론, 더 향상된 보안력과 원활한 사용자 경험을 누려보세요.",
-          "cta" : "내 지갑 업그레이드하기",
-          "linkText" : "자세히 알아보기"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "업데이트가 곧 종료됩니다. 지급 업그레이드하고 {{discount}}% 할인 혜택은 물론, 더 원활한 사용자 경험을 즐겨보세요.",
-          "cta" : "내 지갑 업그레이드하기",
-          "linkText" : "자세히 알아보기"
-        },
-        "optOut" : {
-          "description" : "업데이트가 곧 종료됩니다. 지급 업그레이드하고 {{discount}}% 할인 혜택은 물론, 더 원활한 사용자 경험을 즐겨보세요.",
-          "cta" : "내 지갑 업그레이드하기",
-          "linkText" : "자세히 알아보기"
-        }
-      }
+    "opted_in" : {
+      "title" : "메모리가 제한되면 경험도 제한되니까요",
+      "description" : "Ledger Nano S를 Ledger Flex와 같은 최신 Ledger 장치로 업그레이드하여 더 커진 메모리, 최신 보안 업데이트, 새로운 기능 및 <0>독점 {{discount}}% 할인 혜택</>까지 모두 누려보세요.",
+      "cta" : "내 Ledger 업그레이드"
+    },
+    "opted_out" : {
+      "description" : "Ledger Nano S의 제한된 메모리로 인해 최신 기능, 블록체인 변경 사항 및 보안 업데이트에 대한 액세스가 제한됩니다. 장기적으로 사용하려면 최신 Ledger 장치로 업그레이드하세요.",
+      "cta" : "자세히 알아보기"
     }
   }
 }

From 61ce1db5f955202ccc8cd2f467d716b0d01b9ce3 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:37 +0000
Subject: [PATCH 50/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to tr-TR locale

---
 .../static/i18n/tr/app.json                   | 98 +++++++------------
 1 file changed, 38 insertions(+), 60 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/tr/app.json b/apps/ledger-live-desktop/static/i18n/tr/app.json
index fe91422de466..44658b411bc4 100644
--- a/apps/ledger-live-desktop/static/i18n/tr/app.json
+++ b/apps/ledger-live-desktop/static/i18n/tr/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "Ledger Nano S™, {{provider}} ile uyumlu değildir",
-      "description" : "Ledger Nano S, {{provider}} ile uyumlu değildir. Ledger Live üzerinden {{provider}} aracılığıyla zincirler arası takas işlemleri yapmak için Ledger Nano S Plus, Ledger Nano X, Ledger Stax veya Ledger Flex cihazlarını kullanabilirsiniz",
+      "description" : "Ledger Nano S™, {{provider}} ile uyumlu değildir. Ledger Live üzerinden {{provider}} aracılığıyla zincirler arası takas işlemleri yapmak için Ledger Nano S Plus™, Ledger Nano X™, Ledger Stax™ veya Ledger Flex™ cihazlarını kullanabilirsiniz",
       "cta" : "Uyumlu cihazları keşfedin",
       "changeProvider" : "Başka bir sağlayıcıyla takas edin"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "Ton takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi diğer herhangi bir uyumlu Ledger cihazını kullanın.",
       "spl_tokens_title" : "Ledger Nano S™, Solana token takasını desteklemez",
       "spl_tokens_description" : "Solana token'larını takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi diğer herhangi bir uyumlu Ledger cihazını kullanın.",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "Ledger Nano S™, Sui token takasını desteklemez",
+      "sui_tokens_description" : "Sui token'larını takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi diğer herhangi bir uyumlu Ledger cihazını kullanın.",
       "near_title" : "Ledger Nano S™, Near takasını desteklemez",
       "near_description" : "Near takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazı kullanın.",
       "ada_title" : "Ledger Nano S™, Cardano takasını desteklemez",
@@ -459,12 +459,12 @@
       "apt_description" : "Aptos takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazı kullanın.",
       "cosmos_title" : "Ledger Nano S™, Cosmos takasını desteklemez",
       "cosmos_description" : "Cosmos takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazı kullanın.",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "Ledger Nano S™, Osmosis takasını desteklemez",
+      "osmo_description" : "Osmosis takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazını kullanın.",
+      "dydx_title" : "Ledger Nano S™, dYdX takasını desteklemez",
+      "dydx_description" : "dYdX takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazını kullanın.",
+      "sui_title" : "Ledger Nano S™, Sui takasını desteklemez",
+      "sui_description" : "Sui takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi diğer herhangi bir uyumlu Ledger cihazını kullanın."
     },
     "providers" : {
       "title" : "Kripto takası işlemleri için bir sağlayıcı seçin",
@@ -776,6 +776,10 @@
         "description3Link" : "Bu entegrasyon, <1><0>{{team}}</0></1> tarafından Ledger ile iş birliği yapılarak gerçekleştirilmiştir"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}}, şuraya taşınıyor: {{to}}. Daha fazla bilgi edinmek için bu <0>bağlantıyı</0> takip edin veya yardıma ihtiyacınız varsa destek ekibiyle iletişime geçin.",
+      "contactSupport" : "Destek al"
+    },
     "featureUnavailable" : {
       "title" : "Şu özellik an itibarıyla kullanılamıyor: {{feature}}. Daha fazla bilgi için lütfen {{support}} bakın.",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "Yöntem",
       "transferAmount" : "Transfer Tutarı",
       "validatorsCount" : "Doğrulayıcılar ({{number}})",
-      "version" : "Sürüm"
+      "version" : "Sürüm",
+      "accountCreationFee" : "Hesap Oluşturma Ücreti"
     }
   },
   "operationList" : {
@@ -2049,7 +2054,7 @@
       "dontHaveSeed" : "Kurtarma ifadeniz yok mu? ",
       "followTheGuide" : "Adım adım güncelleme kılavuzumuzu uygulayın",
       "removeApps" : "Güncellemeden önce tüm uygulamaları kaldırın",
-      "update" : "{{productName} işletim sistemi güncellemesi",
+      "update" : "{{productName}} İşletim Sistemi Güncellemesi",
       "updateBtn" : "Donanım yazılımını güncelle",
       "installUpdate" : "Güncellemeyi yükle",
       "banner" : {
@@ -5511,6 +5516,11 @@
       "memo" : "Etiket / Memo",
       "memoPlaceholder" : "Opsiyonel",
       "requiredMemoPlaceholder" : "Gerekli"
+    },
+    "mina" : {
+      "memoPlaceholder" : "Tercihe bağlı",
+      "memo" : "Memo",
+      "memoWarningText" : "Memo değeri, en fazla 32 karakterlik bir dize olabilir"
     }
   },
   "errors" : {
@@ -6541,6 +6551,15 @@
         "swap" : "takas edin",
         "deposit" : "yatırın"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "Memo metni 32 karakterden uzun olamaz"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Bu işlem için {{fee}} tutarında bir hesap oluşturma ücreti alınacaktır"
+    },
+    "AmountTooSmall" : {
+      "title" : "Bu işlem için gerekli minimum tutar: {{amount}}"
     }
   },
   "cryptoOrg" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "Model yükseltme zamanı",
-          "description" : "Yüksek güvenlik ve sorunsuz bir deneyim için en yeni cihazlarımıza <0>%{{discount}} indirimle</0> model yükseltin.",
-          "cta" : "Cüzdanımın modelini yükselt",
-          "linkText" : "Daha fazla bilgi"
-        },
-        "optOut" : {
-          "title" : "Model yükseltme zamanı",
-          "description" : "Yüksek güvenlik ve sorunsuz bir deneyim için en yeni cihazlarımıza <0>%{{discount}} indirimle</0> model yükseltin.",
-          "cta" : "Cüzdanımın modelini yükselt",
-          "linkText" : "Daha fazla bilgi"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "Model yükseltme zamanı",
-          "description" : "Ledger Nano S model yükseltme teklifleri yakında sona eriyor. En yeni cihazlarımıza <0>%{{discount}} indirimle</0> model yükseltin.",
-          "cta" : "Cüzdanımın modelini yükselt",
-          "linkText" : "Daha fazla bilgi"
-        },
-        "optOut" : {
-          "title" : "Model yükseltme zamanı",
-          "description" : "Ledger Nano S model yükseltme teklifleri yakında sona eriyor. En yeni cihazlarımıza <0>%{{discount}} indirimle</0> model yükseltin.",
-          "cta" : "Cüzdanımın modelini yükselt",
-          "linkText" : "Daha fazla bilgi"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "Model yükseltme zamanı",
-          "description" : "Yüksek güvenlik ve sorunsuz bir deneyim için en yeni cihazlarımıza <0>%{{discount}} indirimle</0> model yükseltin.",
-          "cta" : "Cüzdan modelini yükselt",
-          "linkText" : "Daha fazla bilgi"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "Cihaz güncellemeleri yakında sona eriyor. Sorunsuz bir deneyim için %{{discount}} indirimle hemen model yükseltin.",
-          "cta" : "Cüzdanımın modelini yükselt",
-          "linkText" : "Daha fazla bilgi"
-        },
-        "optOut" : {
-          "description" : "Cihaz güncellemeleri yakında sona eriyor. Sorunsuz bir deneyim için %{{discount}} indirimle hemen model yükseltin.",
-          "cta" : "Cüzdanımın modelini yükselt",
-          "linkText" : "Daha fazla bilgi"
-        }
-      }
+    "opted_in" : {
+      "title" : "Sınırlı bellek, sınırlı deneyim",
+      "description" : "Daha fazla bellek, en son güvenlik güncellemeleri, yeni özellikler ve <0>%{{discount}} oranında özel bir indirim</> için Ledger Nano S cihazınızın modelini Ledger Flex gibi daha yeni bir Ledger modeline yükseltin.",
+      "cta" : "Ledger modelimi yükselt"
+    },
+    "opted_out" : {
+      "description" : "Ledger Nano S cihazınızdaki sınırlı bellek en yeni özelliklere, blok zinciri değişikliklerine ve güvenlik güncellemelerine erişiminizi kısıtlar. Uzun vadeli kullanım için daha yeni bir Ledger cihazına model yükseltin.",
+      "cta" : "Daha fazla bilgi"
     }
   }
 }

From 8b3d60fd21c004bf1d5c9f55d8e2b2bac65ab618 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:39 +0000
Subject: [PATCH 51/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to ko-KR locale

---
 .../src/locales/ko/common.json                | 28 ++++++++++++++-----
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/ko/common.json b/apps/ledger-live-mobile/src/locales/ko/common.json
index 6622b799c659..4ae52818c7a6 100644
--- a/apps/ledger-live-mobile/src/locales/ko/common.json
+++ b/apps/ledger-live-mobile/src/locales/ko/common.json
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "Swap Live 앱을 로드하지 못했습니다"
+    },
+    "InvalidMemoMina" : {
+      "title" : "메모 텍스트는 32자를 초과할 수 없습니다."
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "이 트랜잭션에는 {{fee}}의 계정 생성 수수료가 부과됩니다."
+    },
+    "AmountTooSmall" : {
+      "title" : "이 트랜잭션에 필요한 최소 금액은 {{amount}}입니다"
     }
   },
   "crash" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "가스 한도",
       "id" : "Id",
       "autoClaimedRewards" : "자동으로 청구된 보상",
-      "stakedAmount" : "스테이킹 금액"
+      "stakedAmount" : "스테이킹 금액",
+      "accountCreationFee" : "계정 생성 수수료"
     },
     "multipleAddresses" : "왜 주소가 여러 개인가요?",
     "tokenName" : "토큰명",
@@ -2626,6 +2636,10 @@
         "description3Link" : "이 통합은 Ledger와 협력을 통해 <1><0>{{team}}</0></1>에서 수행했습니다."
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}}가 {{to}}으로 마이그레이션되고 있습니다. <0>이 링크</0>에서 자세한 내용을 알아보고, 도움이 필요한 경우 지원팀에 문의하세요.",
+      "contactSupport" : "지원 부서 연락"
+    },
     "willBedeprecatedBanner" : {
       "title" : "효율성을 최적화하기 위해 {{currencyName}}은 {{deprecatedDate}}부터 Ledger Live에서 지원되지 않습니다. 그러나 Ledger 하드웨어 지갑에서는 계속 지원됩니다. 이와 관련하여 도움이 필요하다면 Ledger 고객 지원팀에 문의하세요.",
       "contactSupport" : "지원 부서 연락"
@@ -3534,12 +3548,12 @@
         "apt_description" : "Aptos 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
         "cosmos_title" : "Ledger Nano S™는 Cosmos 스왑을 지원하지 않습니다.",
         "cosmos_description" : "Cosmos 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "Ledger Nano S™는 Osmosis 스왑을 지원하지 않습니다.",
+        "osmo_description" : "Osmosis 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
+        "dydx_title" : "Ledger Nano S™는 dYdX 스왑을 지원하지 않습니다.",
+        "dydx_description" : "dYdX 스왑 거래를 실행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 Ledger 장치를 사용하세요.",
+        "sui_title" : "Ledger Nano S™는 Sui 스왑을 지원하지 않습니다",
+        "sui_description" : "Sui 스왑 거래를 수행하려면 Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ 또는 Ledger Stax™와 같은 다른 호환 Ledger 장치를 사용하세요."
       }
     },
     "lending" : {

From 6292671b5426e69fdbc64e1e349c49da96237223 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:41 +0000
Subject: [PATCH 52/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to tr-TR locale

---
 .../src/locales/tr/common.json                | 32 +++++++++++++------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/tr/common.json b/apps/ledger-live-mobile/src/locales/tr/common.json
index bf30c94fb86d..e11969f41adf 100644
--- a/apps/ledger-live-mobile/src/locales/tr/common.json
+++ b/apps/ledger-live-mobile/src/locales/tr/common.json
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "Takas Live Uygulaması yüklenemedi"
+    },
+    "InvalidMemoMina" : {
+      "title" : "Memo metni 32 karakterden uzun olamaz"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Bu işlem için {{fee}} tutarında bir hesap oluşturma ücreti alınacaktır"
+    },
+    "AmountTooSmall" : {
+      "title" : "Bu işlem için gerekli minimum tutar: {{amount}}"
     }
   },
   "crash" : {
@@ -1396,7 +1405,7 @@
         "desc" : "Ledger'la tamamen entegre olan Web 3.0'ı keşfedin"
       },
       "earn" : {
-        "title" : "Kazanın",
+        "title" : "Kazan",
         "desc" : "Kriptolarınızı stake ederek ve borç vererek artırın."
       },
       "mint" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "Gas limiti",
       "id" : "Kimlik (ID)",
       "autoClaimedRewards" : "Otomatik Alınan Ödüller",
-      "stakedAmount" : "Stake edilen miktar"
+      "stakedAmount" : "Stake edilen miktar",
+      "accountCreationFee" : "Hesap Oluşturma Ücreti"
     },
     "multipleAddresses" : "Neden birden fazla adres var?",
     "tokenName" : "Token Adı",
@@ -2626,6 +2636,10 @@
         "description3Link" : "Bu entegrasyon, <1><0>{{team}}</0></1> tarafından Ledger ile iş birliği yapılarak gerçekleştirilmiştir"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}}, şuraya taşınıyor: {{to}}. Daha fazla bilgi edinmek için bu <0>bağlantıyı</0> takip edin veya yardıma ihtiyacınız varsa destek ekibiyle iletişime geçin.",
+      "contactSupport" : "Destek al"
+    },
     "willBedeprecatedBanner" : {
       "title" : "Verimliliği iyileştirmek için {{deprecatedDate}} tarihinden itibaren {{currencyName}} artık Ledger Live'da desteklenmeyecektir. Ancak Ledger donanım cüzdanlarında desteklenmeye devam edecektir. Bu konuda yardım almak isterseniz Ledger Müşteri Destek ekibiyle lütfen iletişime geçin.",
       "contactSupport" : "Destek al"
@@ -2782,7 +2796,7 @@
         "description" : "Bu hesapla {{actionName}} işlemi yapmak için elinizde {{currencyTicker}} olmalı."
       }
     },
-    "earn" : "Kazanın",
+    "earn" : "Kazan",
     "quickActions" : "Hızlı işlemler",
     "referralProgram" : "Bizi arkadaşınıza önerin ve $20 değerinde Bitcoin kazanın",
     "banner" : {
@@ -3534,12 +3548,12 @@
         "apt_description" : "Aptos takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazı kullanın.",
         "cosmos_title" : "Ledger Nano S™, Cosmos takasını desteklemez",
         "cosmos_description" : "Cosmos takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazı kullanın.",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "Ledger Nano S™, Osmosis takasını desteklemez",
+        "osmo_description" : "Osmosis takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazını kullanın.",
+        "dydx_title" : "Ledger Nano S™, dYdX takasını desteklemez",
+        "dydx_description" : "dYdX takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi başka bir uyumlu Ledger cihazını kullanın.",
+        "sui_title" : "Ledger Nano S™, Sui takasını desteklemez",
+        "sui_description" : "Sui takas etmek için Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ veya Ledger Stax™ gibi diğer herhangi bir uyumlu Ledger cihazını kullanın."
       }
     },
     "lending" : {

From 43d99aa051a7a3869e2ff23a8b9166a2f032ce77 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:43 +0000
Subject: [PATCH 53/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to fr-FR locale

---
 .../src/locales/fr/common.json                | 28 ++++++++++++++-----
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/fr/common.json b/apps/ledger-live-mobile/src/locales/fr/common.json
index f4bed980dd32..31891d976469 100644
--- a/apps/ledger-live-mobile/src/locales/fr/common.json
+++ b/apps/ledger-live-mobile/src/locales/fr/common.json
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "Échec du chargement de l’app Live Swap"
+    },
+    "InvalidMemoMina" : {
+      "title" : "Le mémo ne peut pas dépasser 32 caractères"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Les frais de création de compte pour cette transaction s’élèveront à {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "Le montant minimal requis pour cette transaction est {{amount}}"
     }
   },
   "crash" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "Limite de gaz",
       "id" : "Identifiant (ID)",
       "autoClaimedRewards" : "Récompenses automatiques",
-      "stakedAmount" : "Montant en staking"
+      "stakedAmount" : "Montant en staking",
+      "accountCreationFee" : "Frais de création de compte"
     },
     "multipleAddresses" : "Pourquoi plusieurs adresses ?",
     "tokenName" : "Nom du token",
@@ -2626,6 +2636,10 @@
         "description3Link" : "Cette intégration a été réalisée par <1><0>{{team}}</0></1> en collaboration avec Ledger."
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} migre vers {{to}}. Cliquez <0>ici</0> pour en savoir plus ou contactez l’Assistance si vous avez besoin d’aide.",
+      "contactSupport" : "Contacter l’Assistance"
+    },
     "willBedeprecatedBanner" : {
       "title" : "Pour une meilleure performance, Ledger Live ne prendra plus en charge {{currencyName}} à partir du {{deprecatedDate}}. Cette monnaie restera prise en charge par les wallets physiques Ledger. Veuillez contacter l’Assistance Ledger pour toute question.",
       "contactSupport" : "Contacter l’Assistance"
@@ -3534,12 +3548,12 @@
         "apt_description" : "Pour échanger des Aptos, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
         "cosmos_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de Cosmos",
         "cosmos_description" : "Pour échanger des Cosmos, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange d’Osmosis",
+        "osmo_description" : "Pour échanger des Osmosis, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
+        "dydx_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de dYdX",
+        "dydx_description" : "Pour échanger des dYdX, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
+        "sui_title" : "Le Ledger Nano S™ ne prend pas en charge l’échange de Sui",
+        "sui_description" : "Pour échanger des Sui, utilisez un autre appareil Ledger compatible, tel que le Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™."
       }
     },
     "lending" : {

From f70bf068ecddd3ad3531dfb0dfba0e96265ac337 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:44 +0000
Subject: [PATCH 54/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to th-TH locale

---
 .../src/locales/th/common.json                | 74 +++++++++++--------
 1 file changed, 42 insertions(+), 32 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/th/common.json b/apps/ledger-live-mobile/src/locales/th/common.json
index bb3a7201598e..30c124ccd0c4 100644
--- a/apps/ledger-live-mobile/src/locales/th/common.json
+++ b/apps/ledger-live-mobile/src/locales/th/common.json
@@ -453,7 +453,7 @@
         "description" : "การออกจะเป็นการยกเลิกการอัปเดตแอปที่อยู่ระหว่างดำเนินการ",
         "stay" : "ดำเนินการอัปเดตต่อ"
       },
-      "quit" : "ออกจาก My Ledger"
+      "quit" : "ออกจาก Ledger ของฉัน"
     },
     "ManagerUninstallBTCDep" : {
       "title" : "ขออภัย ต้องมีแอปนี้",
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "โหลดแอป Swap Live ไม่สำเร็จ"
+    },
+    "InvalidMemoMina" : {
+      "title" : "Memo ไม่สามารถยาวเกิน 32 ตัวอักษร"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "ธุรกรรมนี้จะมีค่าธรรมเนียมการสร้างบัญชี {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "จำนวนขั้นต่ำที่กำหนดสำหรับธุรกรรมนี้คือ {{amount}}"
     }
   },
   "crash" : {
@@ -1246,7 +1255,7 @@
       },
       "vote" : {
         "title" : "โหวตด้วย Ledger ของคุณ",
-        "description" : "โหวตโดยตรงจาก Ledger Wallet ของคุณ"
+        "description" : "โหวตได้โดยตรงจากวอลเล็ทของคุณ"
       },
       "lending" : {
         "title" : "ให้ยืมคริปโต",
@@ -1461,7 +1470,7 @@
         "subtitle" : "เลือกว่า Ledger ของคุณเป็นอุปกรณ์เครื่องใหม่หรือได้รับการรีเซ็ตมาก่อน"
       },
       "accessWallet" : {
-        "title" : "เข้าถึง Wallet ของคุณ",
+        "title" : "เข้าถึงวอลเล็ทของคุณ",
         "subtitle" : "เลือกว่าติดตั้ง Ledger ของคุณแล้วหรือไม่"
       },
       "buyNano" : {
@@ -1529,7 +1538,7 @@
       "or" : "หรือ",
       "firstUse" : {
         "section" : "ติดตั้ง Ledger {{model}} ของคุณ",
-        "title" : "สร้าง Wallet ใหม่",
+        "title" : "สร้างวอลเล็ตใหม่",
         "subTitle" : "ซึ่งจะเป็นการสร้าง Secret Recovery Phrase ใหม่",
         "desc" : "มาเริ่มต้นและติดตั้งอุปกรณ์ของคุณกันเลย!",
         "label" : "30 นาที"
@@ -2333,10 +2342,10 @@
     }
   },
   "tabs" : {
-    "portfolio" : "Wallet",
+    "portfolio" : "วอลเล็ต",
     "accounts" : "บัญชี",
     "transfer" : "การโอน",
-    "manager" : "My Ledger",
+    "manager" : "Ledger ของฉัน",
     "settings" : "การตั้งค่า",
     "platform" : "แอป Live",
     "discover" : "Discover",
@@ -2505,7 +2514,7 @@
       "UNDELEGATE_RESOURCE" : "Undelegate แล้ว",
       "WITHDRAW_EXPIRE_UNFREEZE" : "การถอน",
       "LEGACYUNFREEZE" : "Unfreeze แล้ว",
-      "REWARD" : "Reward ที่ขอรับแล้ว",
+      "REWARD" : "Reward ที่เคลมแล้ว",
       "FEES" : "ค่าธรรมเนียม",
       "OPT_IN" : "เลือกเข้าร่วม",
       "OPT_OUT" : "เลือกไม่เข้าร่วม",
@@ -2592,8 +2601,9 @@
       "storageLimit" : "พื้นที่เก็บสูงสุด",
       "gasLimit" : "จำนวน Gas สูงสุดที่ยอมจ่าย",
       "id" : "Id",
-      "autoClaimedRewards" : "Reward ที่ขอรับอัตโนมัติ",
-      "stakedAmount" : "จำนวนที่ Stake แล้ว"
+      "autoClaimedRewards" : "Reward ที่เคลมโดยอัตโนมัติ",
+      "stakedAmount" : "จำนวนที่ Stake แล้ว",
+      "accountCreationFee" : "ค่าธรรมเนียมการสร้างบัญชี"
     },
     "multipleAddresses" : "ทำไมต้องหลาย Address?",
     "tokenName" : "ชื่อโทเคน",
@@ -2764,7 +2774,7 @@
     },
     "claimReward" : {
       "sectionLabel" : "Reward",
-      "cta" : "ขอรับ"
+      "cta" : "เคลม"
     },
     "undelegation" : {
       "sectionLabel" : "การ Undelegate"
@@ -3087,7 +3097,7 @@
           "description" : "แสดงแอปของนักพัฒนาและ Testnet ใน My Ledger"
         },
         "managerProvider" : {
-          "title" : "ผู้ให้บริการ My Ledger",
+          "title" : "ผู้ให้บริการ Ledger ของฉัน",
           "description" : "การเปลี่ยนผู้ให้บริการแอปใน My Ledger อาจทำให้ไม่สามารถติดตั้งหรือถอนการติดตั้งแอปบนอุปกรณ์ Ledger ของคุณได้"
         },
         "experimentalExplorers" : {
@@ -3739,11 +3749,11 @@
     },
     "walletConnect" : {
       "title" : "WalletConnect",
-      "description" : "เชื่อมต่อ Wallet ของคุณกับ DApps"
+      "description" : "เชื่อมต่อวอลเล็ทของคุณกับ DApps"
     },
     "recover" : {
       "title" : "Ledger Recover",
-      "description" : "กู้คืน Wallet ได้ง่าย ๆ",
+      "description" : "กู้คืนวอลเล็ทได้ง่าย ๆ",
       "tag" : "ฟรี 1 เดือน"
     }
   },
@@ -4101,7 +4111,7 @@
       },
       "segwit" : {
         "title" : "Segwit",
-        "desc" : "ค่าธรรมเนียมต่อธุรกรรมสูงกว่า Native Segwit รองรับ Lightning รองรับโดย Wallet ส่วนใหญ่"
+        "desc" : "ค่าธรรมเนียมต่อธุรกรรมสูงกว่า Native Segwit รองรับ Lightning รองรับโดยวอลเล็ทส่วนใหญ่"
       },
       "legacy" : {
         "title" : "Legacy",
@@ -4161,7 +4171,7 @@
     "connectAnotherDevice" : "เชื่อมต่อกับ Ledger เครื่องอื่น",
     "unlockDevice" : "ปลดล็อกอุปกรณ์ของคุณ",
     "outdated" : "เวอร์ชันแอปล้าสมัยแล้ว",
-    "outdatedDesc" : "มีการอัปเดตที่สำคัญสำหรับแอปพลิเคชัน {{appName}} บนอุปกรณ์ของคุณ โปรดไปที่ My Ledger เพื่ออัปเดต",
+    "outdatedDesc" : "มีการอัปเดตที่สำคัญสำหรับแอปพลิเคชัน {{appName}} บนอุปกรณ์ของคุณ โปรดไปที่ Ledger ของฉันเพื่ออัปเดต",
     "quitApp" : "ออกจากแอปพลิเคชันบนอุปกรณ์ของคุณ",
     "appNotInstalled" : "โปรดติดตั้งแอป {{appName}}",
     "appNotInstalled_plural" : "โปรดติดตั้งแอป {{appName}}",
@@ -4323,8 +4333,8 @@
     }
   },
   "manager" : {
-    "tabTitle" : "My Ledger",
-    "title" : "My Ledger",
+    "tabTitle" : "Ledger ของฉัน",
+    "title" : "Ledger ของฉัน",
     "selectDevice" : {
       "title" : "อุปกรณ์",
       "addALedger" : "เพิ่ม Ledger",
@@ -4735,7 +4745,7 @@
     "token" : "ASA (สินทรัพย์)",
     "claimRewards" : {
       "title" : "Reward",
-      "button" : "ขอรับ",
+      "button" : "เคลม",
       "stepperHeader" : {
         "info" : "รับ Reward",
         "starter" : "Reward",
@@ -4763,7 +4773,7 @@
           },
           "verification" : {
             "success" : {
-              "title" : "รับ Reward เรียบร้อยแล้ว!",
+              "title" : "เคลม Reward เรียบร้อยแล้ว!",
               "text" : "Reward ของคุณได้รับการเพิ่มเข้าไปในยอดคงเหลือในบัญชีที่คุณใช้ได้แล้ว",
               "cta" : "ไปที่บัญชี"
             },
@@ -5195,15 +5205,15 @@
     "delegation" : {
       "delegationEarn" : "คุณสามารถรับ Reward {{ticker}} ได้ด้วยการ Delegate สินทรัพย์ของคุณ",
       "info" : "Delegation ทำงานยังไง",
-      "claimRewards" : "ขอรับ Reward",
-      "claimAvailableRewards" : "ขอรับ {{amount}}",
+      "claimRewards" : "เคลม Reward",
+      "claimAvailableRewards" : "เคลม {{amount}}",
       "header" : "การ Delegate",
       "Amount" : "จำนวน",
       "noRewards" : "ไม่มี Reward",
       "delegate" : "Delegate",
       "undelegate" : "Undelegate",
       "redelegate" : "Redelegate",
-      "reward" : "ขอรับ Reward",
+      "reward" : "เคลม Reward",
       "estYield" : "ผลตอบแทนโดยประมาณ",
       "totalStake" : "จำนวน Stake ทั้งหมด",
       "commission" : "คอมมิชชัน",
@@ -5341,7 +5351,7 @@
     "claimRewards" : {
       "stepperHeader" : {
         "validator" : "เลือก Reward ที่จะเก็บ",
-        "method" : "ขอรับ Reward",
+        "method" : "เคลม Reward",
         "summary" : "สรุป",
         "selectDevice" : "เลือกอุปกรณ์",
         "connectDevice" : "เชื่อมต่ออุปกรณ์",
@@ -5400,14 +5410,14 @@
     "delegation" : {
       "delegationEarn" : "Stake EGLD ของคุณเพื่อรักษาความปลอดภัยของเครือข่ายและรับส่วนแบ่ง Reward ของคุณ",
       "info" : "Staking คืออะไรและทำงานอย่างไร?",
-      "claimRewards" : "ขอรับ Reward",
-      "claimAvailableRewards" : "ขอรับ {{amount}}",
+      "claimRewards" : "เคลม Reward",
+      "claimAvailableRewards" : "เคลม {{amount}}",
       "header" : "Stake ของฉัน",
       "Amount" : "จำนวน",
       "noRewards" : "ไม่มี Reward",
       "delegate" : "Restake",
       "undelegate" : "Unstake",
-      "reward" : "ขอรับ Reward",
+      "reward" : "เคลม Reward",
       "commission" : "คอมมิชชัน",
       "iDelegate" : "ฉัน Delegate",
       "totalStake" : "Stake ทั้งหมด",
@@ -5480,7 +5490,7 @@
     "claimRewards" : {
       "stepperHeader" : {
         "validator" : "เลือก Reward ที่จะเก็บ",
-        "method" : "ขอรับ Reward",
+        "method" : "เคลม Reward",
         "summary" : "สรุป",
         "selectDevice" : "เลือกอุปกรณ์",
         "connectDevice" : "เชื่อมต่ออุปกรณ์",
@@ -5491,11 +5501,11 @@
           "method" : {
             "youEarned" : "คุณได้รับ",
             "byDelegationAssetsTo" : "โดยการ Stake สินทรัพย์ไปยัง",
-            "claimRewards" : "ขอรับ Reward",
+            "claimRewards" : "เคลม Reward",
             "reDelegateRewards" : "Stake Reward",
             "claimRewardsInfo" : "ระบบจะรับให้ตอนนี้และเพิ่มไปยังยอดคงเหลือที่ใช้ได้ของคุณ",
             "reDelegateRewardsInfo" : "ระบบจะรับให้ตอนนี้และ Stake ไปยังผู้ให้บริการ Staking คนเดียวกันโดยอัตโนมัติ",
-            "compoundOrCashIn" : "Stake Reward หรือรับ Reward?",
+            "compoundOrCashIn" : "Stake Reward ต่อหรือเคลม Reward เลย?",
             "claimRewardsTooltip" : "Reward จะถูกเพิ่มเข้าไปในยอดคงเหลือที่ใช้ได้",
             "reDelegateRewardsTooltip" : "Reward จะถูกเพิ่มเข้าไปในจำนวนที่ Stake",
             "cta" : "ดำเนินการต่อ"
@@ -5549,7 +5559,7 @@
     "withdraw" : {
       "stepperHeader" : {
         "validator" : "เลือก Reward ที่จะเก็บ",
-        "method" : "ขอรับ Reward",
+        "method" : "เคลม Reward",
         "summary" : "สรุป",
         "selectDevice" : "เลือกอุปกรณ์",
         "connectDevice" : "เชื่อมต่ออุปกรณ์",
@@ -5594,7 +5604,7 @@
       "delegationEarn" : "ตอนนี้คุณสามารถรับ Reward ได้โดยการ Freeze และการโหวต",
       "howItWorks" : "วิธีใช้งานการโหวต",
       "startEarning" : "รับ Reward",
-      "title" : "ขอรับ Reward",
+      "title" : "เคลม Reward",
       "header" : "โหวต ({{total}})",
       "Amount" : "จำนวน",
       "noRewards" : "ไม่มี Reward",
@@ -5606,7 +5616,7 @@
       },
       "rewards" : {
         "title" : "Reward การโหวต",
-        "button" : "ขอรับ"
+        "button" : "เคลม"
       },
       "manageVotes" : "จัดการการโหวต",
       "remainingVotes" : {

From 3b540eee931c29ee49847a8faeb23c6f7df1c177 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:46 +0000
Subject: [PATCH 55/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to ru-RU locale

---
 .../static/i18n/ru/app.json                   | 96 +++++++------------
 1 file changed, 37 insertions(+), 59 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/ru/app.json b/apps/ledger-live-desktop/static/i18n/ru/app.json
index 4bb163024211..1a2b4496ee6f 100644
--- a/apps/ledger-live-desktop/static/i18n/ru/app.json
+++ b/apps/ledger-live-desktop/static/i18n/ru/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "Ledger Nano S™ не поддерживает {{provider}}.",
-      "description" : "Ledger Nano S™ не поддерживает {{provider}}. Для проведения кроссчейн-обмена через {{provider}} внутри Ledger Live используйте Ledger Nano S Plus, Ledger Nano X, Ledger Stax или Ledger Flex.",
+      "description" : "Ledger Nano S™ не поддерживает {{provider}}. Для проведения кроссчейн-обмена через {{provider}} внутри Ledger Live используйте Ledger Nano S Plus™, Ledger Nano X™, Ledger Stax™ или Ledger Flex™.",
       "cta" : "Совместимые устройства",
       "changeProvider" : "Поменять оператора"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "Используйте другие совместимые устройства Ledger для обмена TON. Это Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ и Ledger Stax™.",
       "spl_tokens_title" : "Ledger Nano S™ не поддерживает обмен токенов сети Solana",
       "spl_tokens_description" : "Используйте другие совместимые устройства Ledger для обмена токенов сети Solana. Это Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ и Ledger Stax™.",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "Ledger Nano S™ не поддерживает обмен токенов сети Sui",
+      "sui_tokens_description" : "Используйте другие совместимые устройства Ledger для обмена токенов сети Sui. Это Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ и Ledger Stax™.",
       "near_title" : "Ledger Nano S™ не поддерживает обмен Near",
       "near_description" : "Для обмена Near используйте любое другое устройство Ledger. Это может быть Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ или Ledger Stax™.",
       "ada_title" : "Ledger Nano S™ не поддерживает обмен Cardano",
@@ -459,12 +459,12 @@
       "apt_description" : "Для обмена Aptos используйте любое другое устройство Ledger. Это может быть Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ или Ledger Stax™.",
       "cosmos_title" : "Ledger Nano S™ не поддерживает обмен Cosmos",
       "cosmos_description" : "Для обмена Cosmos используйте любое другое устройство Ledger. Это может быть Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ или Ledger Stax™.",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "Ledger Nano S™ не поддерживает обмен Osmosis",
+      "osmo_description" : "Для обмена Osmosis используйте любое другое устройство Ledger. Это может быть Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ или Ledger Stax™.",
+      "dydx_title" : "Ledger Nano S™ не поддерживает обмен dYdX",
+      "dydx_description" : "Используйте другие совместимые устройства Ledger для обмена dYdX. Это Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ и Ledger Stax™.",
+      "sui_title" : "Ledger Nano S™ не поддерживает обмен Sui",
+      "sui_description" : "Используйте другие совместимые устройства Ledger для обмена Sui. Это Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ и Ledger Stax™."
     },
     "providers" : {
       "title" : "Выберите поставщика услуг по обмену криптовалюты",
@@ -776,6 +776,10 @@
         "description3Link" : "Эта интеграция проведена <1><0>{{team}}</0></1> в сотрудничестве с Ledger."
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} становится {{to}}. Перейдите по <0>ссылке</0>, чтобы узнать больше или связаться с Поддержкой при необходимости.",
+      "contactSupport" : "Написать в Поддержку"
+    },
     "featureUnavailable" : {
       "title" : "В данный момент недоступна эта функция: {{feature}}. Обратитесь в {{support}} за подробностями.",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "Метод",
       "transferAmount" : "Сумма",
       "validatorsCount" : "Валидаторов: {{number}}",
-      "version" : "Версия приложения"
+      "version" : "Версия приложения",
+      "accountCreationFee" : "Комиссия за создание счёта"
     }
   },
   "operationList" : {
@@ -5511,6 +5516,11 @@
       "memo" : "Тег примечания/Memo",
       "memoPlaceholder" : "Опционально",
       "requiredMemoPlaceholder" : "Обязательное поле"
+    },
+    "mina" : {
+      "memoPlaceholder" : "Опционально",
+      "memo" : "Memo",
+      "memoWarningText" : "Значение Memo может быть строкой, длина которой не превышает или равна 32 символам"
     }
   },
   "errors" : {
@@ -6541,6 +6551,15 @@
         "swap" : "Обменяйте",
         "deposit" : "Пополните"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "Содержимое Memo не может быть длиннее 32 символов"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Эта транзакция предполагает списание комиссии за создание счёта в {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "Минимальная необходимая сумма для этой транзакции — {{amount}}"
     }
   },
   "cryptoOrg" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "Пора обновиться",
-          "description" : "Перейдите на наши новые устройства со <0>скидкой {{discount}}%</0> для продвинутой безопасности и удобства использования.",
-          "cta" : "Прокачать кошелёк",
-          "linkText" : "Подробнее..."
-        },
-        "optOut" : {
-          "title" : "Пора обновиться",
-          "description" : "Перейдите на наши новые устройства со <0>скидкой {{discount}}%</0> для продвинутой безопасности и удобства использования.",
-          "cta" : "Прокачать кошелёк",
-          "linkText" : "Подробнее..."
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "Пора обновиться",
-          "description" : "Ledger Nano S скоро перестанет обновляться. Перейдите на наши новые устройства со <0>скидкой {{discount}}%</0>.",
-          "cta" : "Прокачать кошелёк",
-          "linkText" : "Подробнее..."
-        },
-        "optOut" : {
-          "title" : "Пора обновиться",
-          "description" : "Ledger Nano S скоро перестанет обновляться. Перейдите на наши новые устройства со <0>скидкой {{discount}}%</0>.",
-          "cta" : "Прокачать кошелёк",
-          "linkText" : "Подробнее..."
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "Пора обновиться",
-          "description" : "Перейдите на наши новые устройства со <0>скидкой {{discount}}%</0> для ещё лучшей безопасности и удобства использования.",
-          "cta" : "Прокачать кошелёк",
-          "linkText" : "Подробнее..."
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "Апдейты скоро прекратятся. Обновитесь сейчас со скидкой {{discount}}%, чтобы и дальше наслаждаться использованием.",
-          "cta" : "Прокачать кошелёк",
-          "linkText" : "Подробнее..."
-        },
-        "optOut" : {
-          "description" : "Апдейты скоро прекратятся. Обновитесь сейчас со скидкой {{discount}}%, чтобы и дальше наслаждаться использованием.",
-          "cta" : "Прокачать кошелёк",
-          "linkText" : "Подробнее..."
-        }
-      }
+    "opted_in" : {
+      "title" : "Ограниченная память — ограниченные впечатления",
+      "description" : "Перейдите с вашего Ledger Nano S на новое устройство – например, Ledger Flex. Вы получите бóльший объём памяти, актуальные улучшения безопасности, самые новые функции и <0>эксклюзивную скидку {{discount}}%</>.",
+      "cta" : "Обновиться"
+    },
+    "opted_out" : {
+      "description" : "У Ledger Nano S ограниченный объём памяти, что не позволяет владельцам аппаратного кошелька использовать актуальные функции и изменения в блокчейне, а также наслаждаться улучшениями безопасности. Перейдите на новое устройство Ledger, и пользуйтесь им ещё долгие годы.",
+      "cta" : "Подробнее..."
     }
   }
 }

From 062c335c3f4fa60a4e83c098a77f8523e06b1b7b Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:48 +0000
Subject: [PATCH 56/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to pt-BR locale

---
 .../src/locales/pt/common.json                | 28 ++++++++++++++-----
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/pt/common.json b/apps/ledger-live-mobile/src/locales/pt/common.json
index e430dab36124..cbd702f764ad 100644
--- a/apps/ledger-live-mobile/src/locales/pt/common.json
+++ b/apps/ledger-live-mobile/src/locales/pt/common.json
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "Falha ao carregar o aplicativo Swap Live"
+    },
+    "InvalidMemoMina" : {
+      "title" : "O texto do memo não pode ter mais de 32 caracteres"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Esta transação incorrerá em uma taxa de criação de conta de {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "A quantia mínima exigida para esta transação é {{amount}}"
     }
   },
   "crash" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "Limite de gas",
       "id" : "Id",
       "autoClaimedRewards" : "Recompensas automaticamente resgatadas",
-      "stakedAmount" : "Quantia aplicada"
+      "stakedAmount" : "Quantia aplicada",
+      "accountCreationFee" : "Taxa de Criação de Conta"
     },
     "multipleAddresses" : "Por que múltiplos endereços?",
     "tokenName" : "Nome do token",
@@ -2626,6 +2636,10 @@
         "description3Link" : "Esta integração foi realizada por <1><0>{{team}}</0></1> em colaboração com a Ledger"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} está migrando para {{to}}. Siga este <0>link</0> para saber mais ou entre em contato com o suporte se precisar de ajuda.",
+      "contactSupport" : "Falar com o suporte"
+    },
     "willBedeprecatedBanner" : {
       "title" : "Para otimizar a eficiência, {{currencyName}} não será mais compatível com o Ledger Live a partir de {{deprecatedDate}}. No entanto, este ativo ainda será compatível com as carteiras hardware Ledger. Fale com o Suporte ao Cliente Ledger para obter ajuda com isso.",
       "contactSupport" : "Falar com o suporte"
@@ -3534,12 +3548,12 @@
         "apt_description" : "Para trocar o ativo APTOS, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
         "cosmos_title" : "A Ledger Nano S™ não é compatível com a troca de Cosmos",
         "cosmos_description" : "Para trocar Cosmos, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "A Ledger Nano S™ não é compatível com a troca de Osmosis",
+        "osmo_description" : "Para trocar Osmosis, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
+        "dydx_title" : "A Ledger Nano S™ não é compatível com trocas de dYdX",
+        "dydx_description" : "Para trocar o ativo dYdX, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
+        "sui_title" : "A Ledger Nano S™ não é compatível com a troca de Sui",
+        "sui_description" : "Para trocar Sui, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™."
       }
     },
     "lending" : {

From fea9379996d0b267a138623f220668201de8d427 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:49 +0000
Subject: [PATCH 57/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to ja-JP locale

---
 .../src/locales/ja/common.json                | 28 ++++++++++++++-----
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/ja/common.json b/apps/ledger-live-mobile/src/locales/ja/common.json
index b0962b1834ed..a95ec2cac189 100644
--- a/apps/ledger-live-mobile/src/locales/ja/common.json
+++ b/apps/ledger-live-mobile/src/locales/ja/common.json
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "スワップLiveアプリの読み込みに失敗しました"
+    },
+    "InvalidMemoMina" : {
+      "title" : "メモに入力できる文字数は32文字以内です"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "このトランザクションには、{{fee}}のアカウント作成手数料が発生します"
+    },
+    "AmountTooSmall" : {
+      "title" : "このトランザクションに最低限必要な金額は、{{amount}}です"
     }
   },
   "crash" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "ガスリミット",
       "id" : "ID",
       "autoClaimedRewards" : "自動獲得報酬",
-      "stakedAmount" : "ステーキング済み量"
+      "stakedAmount" : "ステーキング済み量",
+      "accountCreationFee" : "アカウント作成手数料"
     },
     "multipleAddresses" : "なぜ複数のアドレスがあるのですか?",
     "tokenName" : "トークン名",
@@ -2626,6 +2636,10 @@
         "description3Link" : "この統合は、<1><0>{{team}}</0></1>がLedgerと共同で実施しました"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}}は{{to}}に移行しています。詳細については、こちらの<0>リンク</0>をご参照いただくか、サポートがご必要な場合はサポートにご連絡ください。",
+      "contactSupport" : "サポートへお問い合わせ"
+    },
     "willBedeprecatedBanner" : {
       "title" : "効率を最適化するため、{{deprecatedDate}}以降、{{currencyName}}はLedger Liveではサポートされなくなります。ただし、Ledgerハードウェアウォレットでは引き続きサポートされます。この件に関してご不明な点などがございましたら、Ledgerカスタマーサポートまでご連絡ください。",
       "contactSupport" : "サポートへお問い合わせ"
@@ -3534,12 +3548,12 @@
         "apt_description" : "Aptosをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
         "cosmos_title" : "Ledger Nano S™はCosmosのスワップに対応していません",
         "cosmos_description" : "Cosmosをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "Ledger Nano S™は、Osmosisのスワップに対応していません",
+        "osmo_description" : "Osmosisをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
+        "dydx_title" : "Ledger Nano S™は、dYdXのスワップに対応していません",
+        "dydx_description" : "dYdXをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、Ledger Stax™など、対応する他のLedgerデバイスをご使用ください。",
+        "sui_title" : "Ledger Nano S™は、Suiのスワップに対応していません",
+        "sui_description" : "Suiをスワップするには、Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™、またはLedger Stax™など、他の対応するLedgerデバイスをご使用ください。"
       }
     },
     "lending" : {

From ce61e98049414ff8cd0f7d61013a31a6792f2de1 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:51 +0000
Subject: [PATCH 58/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to ar-AE locale

---
 .../static/i18n/ar/app.json                   | 192 ++++++++----------
 1 file changed, 85 insertions(+), 107 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/ar/app.json b/apps/ledger-live-desktop/static/i18n/ar/app.json
index 7a52413b1f30..b22f2623585f 100644
--- a/apps/ledger-live-desktop/static/i18n/ar/app.json
+++ b/apps/ledger-live-desktop/static/i18n/ar/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "™Ledger Nano S ليست متوافقة مع {{provider}}",
-      "description" : "Ledger Nano S ليست متوافقة مع {{provider}}. يمكنك استخدام Ledger Nano S Plus أو Ledger Nano X أو Ledger Stax أو Ledger Flex لتجربة المبادلات عبر سلاسل الكتل المختلفة على {{provider}} عبر Ledger Live",
+      "description" : "™Ledger Nano S ليست متوافقة مع {{provider}}. يمكنك استخدام ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Stax أو ™Ledger Flex لتجربة المبادلات عبر سلاسل الكتل المختلفة على {{provider}} عبر Ledger Live",
       "cta" : "استكشف الأجهزة المتوافقة",
       "changeProvider" : "قم بالمبادلة مع مزود آخر"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "لمبادلة Ton، استخدِم أي جهاز Ledger آخر متوافق مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
       "spl_tokens_title" : "™Ledger Nano S لا تدعم مبادلة رموز سولانا (Solana)",
       "spl_tokens_description" : "لمبادلة رموز سولانا (Solana)، استخدِم أي جهاز Ledger آخر متوافق مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "™Ledger Nano S لا تدعم مبادلة رموز Sui",
+      "sui_tokens_description" : "لمبادلة رموز Sui، استخدِم أي جهاز Ledger آخر متوافق مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
       "near_title" : "™Ledger Nano S لا تدعم مبادلة Near",
       "near_description" : "لمبادلة Near، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
       "ada_title" : "™Ledger Nano S لا تدعم مبادلة كاردانو (Cardano)",
@@ -459,12 +459,12 @@
       "apt_description" : "لمبادلة Aptos، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
       "cosmos_title" : "™Ledger Nano S لا تدعم مبادلة Cosmos",
       "cosmos_description" : "لمبادلة Cosmos، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "™Ledger Nano S لا تدعم مبادلة Osmosis",
+      "osmo_description" : "لمبادلة Osmosis، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
+      "dydx_title" : "™Ledger Nano S لا تدعم مبادلة dYdX",
+      "dydx_description" : "لمبادلة dYdX، استخدم أي جهاز Ledger متوافق آخر مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax.",
+      "sui_title" : "™Ledger Nano S لا تدعم مبادلة Sui",
+      "sui_description" : "لمبادلة Sui، استخدم أي جهاز Ledger آخر متوافق مثل ™Ledger Nano S Plus أو ™Ledger Nano X أو ™Ledger Flex أو ™Ledger Stax."
     },
     "providers" : {
       "title" : "اختر أحد المزودين لمبادلة الأصول المشفرة",
@@ -776,6 +776,10 @@
         "description3Link" : "هذا الدمج تم تنفيذه من قِبل <1><0>{{team}}</1></0> بالتعاون مع Ledger"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} تُرحَّل إلى {{to}}. اتبع هذا <0>الرابط</0> لمعرفة المزيد أو تواصل مع الدعم إذا كنت بحاجة إلى مساعدة.",
+      "contactSupport" : "تواصل مع الدعم"
+    },
     "featureUnavailable" : {
       "title" : "الميزة التالية غير متاحة بشكل مؤقت : {{feature}}. لمعرفة المزيد يُرجى الرجوع إلى {{support}}",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "الطريقة",
       "transferAmount" : "مبلغ التحويل",
       "validatorsCount" : "({{number}}) مدقق",
-      "version" : "الإصدار"
+      "version" : "الإصدار",
+      "accountCreationFee" : "رسوم إنشاء الحساب"
     }
   },
   "operationList" : {
@@ -2049,7 +2054,7 @@
       "dontHaveSeed" : "ليست لديك عبارة الاسترداد الخاصة بك؟ ",
       "followTheGuide" : "اتبع دليل الخطوة بخطوة للتحديث",
       "removeApps" : "قم بإلغاء تثبيت جميع التطبيقات قبل التحديث",
-      "update" : "تحديث نظام تشغيل {{productName}",
+      "update" : "تحديث نظام تشغيل {{productName}}",
       "updateBtn" : "قم بتحديث البرنامج الثابت",
       "installUpdate" : "تثبيت التحديث",
       "banner" : {
@@ -3763,62 +3768,62 @@
       "frozenStateWarning" : "تمّ تجميد أصول الحساب!",
       "transferWarning" : "للتحقق من عنوان المستلم لرموز سولانا (Solana) باستخدام ™Ledger Nano S، <0>يرجى اتباع هذه التعليمات.</0>",
       "transferFees" : {
-        "feesPercentHint" : "Token has {{feePercent}}% ({{feeBps}}bps) transfer fee. {{maxFee}} max",
-        "notice" : "Transfer fee {{fee}}%",
-        "tooltipHint" : "Percentage of transfer withheld for token creator",
-        "transferFeesLabel" : "Transfer fees"
+        "feesPercentHint" : "رمز التوكن له %{{feePercent}} ({{feeBps}} نقطة أساس (bps) ) رسوم تحويل. {{maxFee}} بحد أقصى",
+        "notice" : "رسوم التحويل %{{fee}}",
+        "tooltipHint" : "النسبة المئوية من التحويل المحتجزة من أجل منشئ رمز التوكن",
+        "transferFeesLabel" : "رسوم التحويل"
       },
       "nonTransferable" : {
-        "notice" : "Token is non-transferable"
+        "notice" : "رمز التوكن غير قابل للتحويل"
       },
       "interestRate" : {
-        "notice" : "Interest rate: {{rate}}%",
-        "tooltipHint" : "For cosmetic purposes only, no new tokens are created as a result of the interest"
+        "notice" : "مُعدل الفائدة: %{{rate}}",
+        "tooltipHint" : "من أجل الأغراض التجميلية فقط، لم يتم إنشاء أي رموز توكن جديدة نتيجةً للفائدة"
       },
       "permanentDelegate" : {
-        "notice" : "Permanent delegate authority is enabled",
-        "initializationNotice" : "Permanent delegate authority is initialized but not enabled",
-        "tooltipHint" : "The delegate has the ability transfer or burn this token from your account"
+        "notice" : "سُلطة المُفوِّض الدائم (Permanent delegate) مُمكّنة",
+        "initializationNotice" : "سُلطة المُفوِّض الدائم (Permanent delegate) بدأت لكنها غير مُمكّنة",
+        "tooltipHint" : "المُفوِّض لديه القدرة على تحويل أو حرق رمز التوكن هذا من حسابك"
       },
       "requiredMemoOnTransfer" : {
-        "notice" : "Required memo on transfer is enabled",
-        "tooltipHint" : "All incoming transfers to this account must have a memo"
+        "notice" : "الملاحظة (تسمية الوجهة) الإلزامية على التحويل مُمكّنة",
+        "tooltipHint" : "كل التحويلات الواردة إلى هذا الحساب يجب أن تكون مصحوبةً بملاحظة (تسمية الوجهة)"
       },
       "transferHook" : {
-        "notice" : "Transfer hook is enabled",
-        "initializationNotice" : "Transfer hook is initialized but not enabled",
-        "tooltipHint" : "Token has extra functionality handled by {{programAddress}} program"
+        "notice" : "خُطّاف التحويل (Transfer hook) مُمكّن",
+        "initializationNotice" : "خُطّاف التحويل (Transfer hook) بدأ لكنه غير مُمكّن",
+        "tooltipHint" : "رمز التوكن له وظيفة إضافية يتم التعامل معها بواسطة برنامج {{programAddress}}"
       },
       "extensionsInfo" : {
-        "title" : "Solana token extensions",
-        "commonInfo" : "Token extensions are the next generation of the Solana Token standard. They introduce a new set of ways to extend the normal token functionality with additional features such as confidential transfers, permanent delegate, custom transfer logic, extended metadata, and much more.",
+        "title" : "ملحقات رموز سولانا (Solana)",
+        "commonInfo" : "ملحقات الرموز هي الجيل القادم من معيار رمز سولانا (Solana). إنها تقدّم مجموعة جديدة من الطرق لتمديد وظيفة رمز التوكن العادية بميزات إضافية؛ مثل التحويلات السرية، والمُفوِّض الدائم (Permanent Delegate)، ومنطق التحويل المخصص، والبيانات الوصفية الممتدة، والكثير غير ذلك.",
         "permanentDelegate" : {
-          "title" : "Permanent delegate",
-          "permanentDelegateAddress" : "Current delegate authority is {{address}}",
-          "permanentDelegateNotSetup" : "Current delegate authority is not set up.",
-          "description" : "Permanent delegate is an authority which has unlimited delegate privileges over any account for that mint. The delegate could burn or transfer any amount of tokens, at any time, on their own authority."
+          "title" : "المُفوِّض الدائم (Permanent Delegate)",
+          "permanentDelegateAddress" : "سلطة المُفوِّض الحالية هي {{address}}",
+          "permanentDelegateNotSetup" : "سلطة المُفوِّض الحالية لم يتم إعدادها.",
+          "description" : "المُفوِّض الدائم (Permanent Delegate) هو سلطة لديها امتيازات تفويض غير محدودة على أي حساب من أجل ذلك السكّ. المُفوِّض يمكن أن يقوم بحرق أو تحويل أي مبلغ من رموز التوكن، في أي وقت، ضمن سلطته."
         },
         "nonTransferable" : {
-          "title" : "Non-Transferrable Tokens",
-          "description" : "Such tokens are \"soul-bound\" and cannot be moved or burned, except by the token issuer."
+          "title" : "الرموز غير القابلة للتحويل",
+          "description" : "رموز التوكن تلك هي ”soul-bound (رموز مرتبطة بالروح)“ ولا يمكن نقلها أو حرقها إلا بواسطة مُصدر رمز التوكن."
         },
         "transferHook" : {
-          "title" : "Transfer hook",
-          "transferHookAddress" : "Current transfer hook program is {{address}}",
-          "transferHookNotSetup" : "Current transfer hook program is not set up.",
-          "description" : "Transfer hook gives a token issuers an ability to dictate how users and tokens interact. Instead of a normal transfer, issuer can insert custom logic into a program to be used with the transfer hook extension."
+          "title" : "خُطّاف التحويل (Transfer hook)",
+          "transferHookAddress" : "برنامج خُطّاف التحويل (Transfer hook) الحالي هو {{address}}",
+          "transferHookNotSetup" : "برنامج خُطّاف التحويل (Transfer hook) الحالي لم يتم إعداده.",
+          "description" : "خُطّاف التحويل (Transfer hook) يمنح مُصدري رموز التوكن قدرة على إملاء كيفية تفاعل المستخدمين ورموز التوكن. بدلاً من التحويل العادي، يمكن للمُصدر أن يُدخِل منطقاً مخصصاً في برنامج سيتم استخدامه مع ملحق خُطّاف التحويل (Transfer hook)."
         },
         "transferFee" : {
-          "title" : "Transfer Fee",
-          "currentTransferFee" : "Current transfer fee is {{feePercent}}% ({{feeBps}}bps). Max {{maxFee}}.",
-          "description" : "Fees are charged on every transfer of a token and withheld on the recipient account, untouchable by the recipient."
+          "title" : "رسوم التحويل",
+          "currentTransferFee" : "رسوم التحويل الحالية هي %{{feePercent}} ({{feeBps}} نقطة أساس (bps) ). أقصى حد {{maxFee}}.",
+          "description" : "يتم فرض الرسوم على كل تحويل لرمز توكن وتُحجز على حساب المستلم، ولا يمكن للمستلم المساس بها."
         },
         "interestBearing" : {
-          "title" : "Interest-Bearing Tokens",
-          "currentInterestRate" : "Current interest rate is {{rate}}%.",
-          "accruedDelta" : "Accrued {{delta}}.",
-          "interestRateNotSetup" : "Current interest rate is set up to 0%.",
-          "description" : "Tokens that constantly grow or decrease in value according on its interest rate. No new tokens are ever created, the feature is entirely cosmetic."
+          "title" : "رموز التوكن المُدرة للفائدة",
+          "currentInterestRate" : "مُعدل الفائدة الحالي هو %{{rate}}.",
+          "accruedDelta" : "المتراكمة {{delta}}.",
+          "interestRateNotSetup" : "مُعدل الفائدة الحالي تم تعيينه ليكون %0.",
+          "description" : "رموز التوكن التي تنمو أو تنخفض قيمتها باستمرار وفقاً لمعدل فائدتها. لا يتم إنشاء أي رموز توكن جديدة على الإطلاق، الميزة تجميلية بشكل كامل."
         }
       }
     }
@@ -5510,7 +5515,12 @@
     "solana" : {
       "memo" : "علامة/ملاحظة (تسمية الوجهة)",
       "memoPlaceholder" : "اختياري",
-      "requiredMemoPlaceholder" : "Required"
+      "requiredMemoPlaceholder" : "مطلوب"
+    },
+    "mina" : {
+      "memoPlaceholder" : "اختياري",
+      "memo" : "ملاحظة (تسمية الوجهة)",
+      "memoWarningText" : "قيمة الملاحظة يمكن أن تكون سلسلةً أقصر من أو تساوي 32 حرفاً"
     }
   },
   "errors" : {
@@ -6323,11 +6333,11 @@
       "title" : "ربما تكون معاملتك قد فشلت. يُرجى الانتظار لحظة ثم تحقق من سجل المعاملات قبل المحاولة مرة أخرى."
     },
     "SolanaRecipientMemoIsRequired" : {
-      "title" : "Memo is required for recipient address"
+      "title" : "الملاحظة (تسمية الوجهة) مطلوبة من أجل عنوان المستلم"
     },
     "SolanaTokenNonTransferable" : {
-      "title" : "Token is non-transferable",
-      "description" : "Such tokens are \"soul-bound\" and cannot be transferred"
+      "title" : "رمز التوكن غير قابل للتحويل",
+      "description" : "رموز التوكن تلك هي ”soul-bound (رموز مرتبطة بالروح)“ ولا يمكن تحويلها"
     },
     "NotEnoughNftOwned" : {
       "title" : "لقد تجاوزت عدد رموز التوكن المتاحة"
@@ -6541,6 +6551,15 @@
         "swap" : "مبادلة",
         "deposit" : "إيداع"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "نص علامة الملاحظة (تسمية الوجهة) لا يمكن أن يكون أطول من 32 حرفاً"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "هذه المعاملة ستُكلّف رسوم إنشاء حساب بقيمة {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "الحد الأدنى للمبلغ المطلوب لهذه المعاملة هو {{amount}}"
     }
   },
   "cryptoOrg" : {
@@ -6747,20 +6766,20 @@
     },
     "entryPoints" : {
       "accounts" : {
-        "title" : "Activate Ledger Sync"
+        "title" : "تنشيط مزامنة Ledger Sync"
       },
       "manager" : {
-        "title" : "Ledger Sync",
-        "description" : "Sync your accounts automatically, even when switching to a new phone.",
-        "cta" : "Turn on Ledger Sync"
+        "title" : "مزامنة Ledger Sync",
+        "description" : "قم بمزامنة حساباتك تلقائياً، حتى عند التبديل إلى هاتف جديد.",
+        "cta" : "تشغيل مزامنة Ledger Sync"
       },
       "settings" : {
-        "title" : "Ledger Sync",
-        "description" : "Sync your accounts automatically, even when switching to a new phone.",
-        "cta" : "Turn on Ledger Sync"
+        "title" : "مزامنة Ledger Sync",
+        "description" : "قم بمزامنة حساباتك تلقائياً، حتى عند التبديل إلى هاتف جديد.",
+        "cta" : "تشغيل مزامنة Ledger Sync"
       },
       "onboarding" : {
-        "title" : "Sync with another Ledger Live app"
+        "title" : "المزامنة مع تطبيق Ledger Live آخر"
       }
     },
     "manage" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "حان وقت الترقية",
-          "description" : "قم بالترقية إلى أحدث أجهزتنا مع خصم <0>{{discount}}%</0> من أجل أمان مُحسّن وتجربة سلسة.",
-          "cta" : "ترقية محفظتي",
-          "linkText" : "تعرّف على المزيد"
-        },
-        "optOut" : {
-          "title" : "حان وقت الترقية",
-          "description" : "قم بالترقية إلى أحدث أجهزتنا مع خصم <0>{{discount}}%</0> من أجل أمان مُحسّن وتجربة سلسة.",
-          "cta" : "ترقية محفظتي",
-          "linkText" : "تعرّف على المزيد"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "حان وقت الترقية",
-          "description" : "تحديثات Ledger Nano S ستنتهي قريباً. قم بالترقية إلى أحدث أجهزتنا مع خصم <0>{{discount}}%</0>",
-          "cta" : "ترقية محفظتي",
-          "linkText" : "تعرّف على المزيد"
-        },
-        "optOut" : {
-          "title" : "حان وقت الترقية",
-          "description" : "تحديثات Ledger Nano S ستنتهي قريباً. قم بالترقية إلى أحدث أجهزتنا مع خصم <0>{{discount}}%</0>",
-          "cta" : "ترقية محفظتي",
-          "linkText" : "تعرّف على المزيد"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "حان وقت الترقية",
-          "description" : "قم بالترقية إلى أحدث أجهزتنا مع خصم <0>{{discount}}%</0> من أجل أمان مُحسّن وتجربة سلسة.",
-          "cta" : "ترقية محفظتي",
-          "linkText" : "تعرّف على المزيد"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "التحديثات ستنتهي قريباً. قم بالترقية الآن مع خصم {{discount}}% من أجل تجربة سلسة.",
-          "cta" : "ترقية محفظتي",
-          "linkText" : "تعرّف على المزيد"
-        },
-        "optOut" : {
-          "description" : "التحديثات ستنتهي قريباً. قم بالترقية الآن مع خصم {{discount}}% من أجل تجربة سلسة.",
-          "cta" : "ترقية محفظتي",
-          "linkText" : "تعرّف على المزيد"
-        }
-      }
+    "opted_in" : {
+      "title" : "ذاكرة محدودة، تجربة محدودة",
+      "description" : "قم بترقية Ledger Nano S الخاصة بك إلى جهاز Ledger جديد — مثل Ledger Flex — من أجل المزيد من الذاكرة، وأحدث تحسينات الأمان، وميزات جديدة <0>وخصم حصري %{{discount}}</>.",
+      "cta" : "ترقية جهاز Ledger الخاص بي"
+    },
+    "opted_out" : {
+      "description" : "الذاكرة المحدودة في ledger Nano S الخاصة بك تُقيد وصولك إلى أحدث الميزات، ومتغيّرات سلاسل الكتل، وتحسينات الأمان. من أجل الاستخدام على المدى الطويل، قم بالترقية إلى جهاز Ledger أحدث.",
+      "cta" : "تعرّف على المزيد"
     }
   }
 }

From 0ac07cfe1bcc2f4493ce049a630f62649132c7e6 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:53 +0000
Subject: [PATCH 59/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to de-DE locale

---
 .../src/locales/de/common.json                | 58 ++++++++++++-------
 1 file changed, 36 insertions(+), 22 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/de/common.json b/apps/ledger-live-mobile/src/locales/de/common.json
index dee4208fce95..ff1949b5f455 100644
--- a/apps/ledger-live-mobile/src/locales/de/common.json
+++ b/apps/ledger-live-mobile/src/locales/de/common.json
@@ -127,7 +127,7 @@
     },
     "BluetoothRequired" : {
       "title" : "Entschuldigung, Bluetooth ist deaktiviert",
-      "description" : "Bitte aktivieren Sie Bluetooth in den Einstellungen Ihres Telefons. ({{state}} Status)"
+      "description" : "Bitte aktiviere Bluetooth in den Einstellungen deines Telefons. ({{state}} Status)"
     },
     "BitcoinInfrastructureError" : {
       "title" : "Bei unserer Bitcoin-Infrastruktur ist ein Problem aufgetreten. Versuche es bitte später noch einmal."
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "Fehler beim Laden der Swap Live-App"
+    },
+    "InvalidMemoMina" : {
+      "title" : "Der Memotext darf nicht länger als 32 Zeichen sein."
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Für diese Transaktion fällt eine Kontoerstellungsgebühr in Höhe von {{fee}} an"
+    },
+    "AmountTooSmall" : {
+      "title" : "Der Mindestbetrag für diese Transaktion beläuft sich auf {{amount}}"
     }
   },
   "crash" : {
@@ -1069,9 +1078,9 @@
     "required" : "Entschuldigung, es sieht so aus, als ob Bluetooth deaktiviert ist",
     "locationRequiredTitle" : "Standort ist für Bluetooth LE erforderlich",
     "locationRequiredMessage" : "Unter Android ist eine Standortfreigabe erforderlich, um Bluetooth LE-Geräte aufzulisten.",
-    "checkEnabled" : "Bitte aktivieren Sie Bluetooth in den Einstellungen Ihres Telefons.",
+    "checkEnabled" : "Bitte aktivier Bluetooth in den Einstellungen deines Telefons.",
     "tryEnablingAgain" : "Versuchen Sie, Bluetooth erneut zu aktivieren",
-    "openSettings" : "Öffnen Sie die Bluetooth-Einstellungen"
+    "openSettings" : "Öffne die Bluetooth-Einstellungen"
   },
   "webview" : {
     "noConnectionError" : {
@@ -1430,7 +1439,7 @@
     },
     "ongoing" : {
       "resolving" : "Auflösen von Abhängigkeiten",
-      "progress" : "Bleiben Sie auf Ledger Live, während die Apps installiert werden.",
+      "progress" : "Bleibe auf Ledger Live, während die Apps installiert werden.",
       "skippedInfo" : "Einige Apps sind nicht verfügbar. Sie müssen noch entwickelt werden für {{ productName }}.",
       "skipped" : "Noch nicht verfügbar für {{ productName }}"
     }
@@ -1610,7 +1619,7 @@
             "label" : "Nehmen Sie einen Stift zum Schreiben."
           },
           "2" : {
-            "label" : "Bleiben Sie allein, und wählen Sie eine sichere und ruhige Umgebung."
+            "label" : "Sei allein und wähle eine sichere und ruhige Umgebung."
           }
         },
         "cta" : "Weiter",
@@ -2369,9 +2378,9 @@
         "title" : "Erste Schritte",
         "description" : "Sie können entweder Kryptowährungen von unseren Partnern kaufen oder Ihre eigene Wallet einrichten"
       },
-      "title" : "Legen Sie zunächst Ihre bevorzugten Vermögenswerte in Ihrer Wallet ab",
+      "title" : "Füge zu Beginn deine Assets zu deiner Wallet hinzu",
       "subtitle" : "Ledger unterstützt mehr als 6.000 Coins und Token",
-      "addAccount" : "oder fügen Sie ein Konto hinzu"
+      "addAccount" : "oder füge ein Konto hinzu"
     },
     "noOpState" : {
       "title" : "Noch keine Aktionen?",
@@ -2593,7 +2602,8 @@
       "gasLimit" : "Gaslimit",
       "id" : "ID",
       "autoClaimedRewards" : "Automatisch beanspruchte Prämien",
-      "stakedAmount" : "Betrag gestaked"
+      "stakedAmount" : "Betrag gestaked",
+      "accountCreationFee" : "Kontoerstellungsgebühr"
     },
     "multipleAddresses" : "Warum mehrere Adressen?",
     "tokenName" : "Token-Name",
@@ -2626,6 +2636,10 @@
         "description3Link" : "Diese Integration wurde von <1><0>{{team}}</0></1> in Zusammenarbeit mit Ledger durchgeführt"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} migriert zu {{to}}. Folge diesem <0>Link</0>, um mehr zu erfahren, oder wende dich an den Kundenservice, falls du Hilfe benötigst.",
+      "contactSupport" : "Support kontaktieren"
+    },
     "willBedeprecatedBanner" : {
       "title" : "Um die Effizienz zu steigern, wird {{currencyName}} ab dem {{deprecatedDate}} nicht mehr in Ledger Live unterstützt. Auf den Hardware-Wallets von Ledger bleibt die Unterstützung jedoch bestehen. Wenn du Hilfe benötigst, wende dich bitte an den Ledger-Kundenservice.",
       "contactSupport" : "Support kontaktieren"
@@ -3174,7 +3188,7 @@
   "notifications" : {
     "prompt" : {
       "title" : "Benachrichtigungen aktivieren",
-      "desc" : "Erhalten Sie die neuesten Updates zu Ledger Live, Ledger-Produkten, dem Markt und personalisierte Empfehlungen. Sie können sich jederzeit in den Einstellungen wieder abmelden",
+      "desc" : "Erhalte die neuesten Updates zu Ledger Live, Ledger-Produkten, dem Markt und personalisierte Empfehlungen. Du kannst dich jederzeit in den Einstellungen wieder abmelden",
       "allow" : "Benachrichtigungen zulassen",
       "later" : "Vielleicht später"
     },
@@ -3534,12 +3548,12 @@
         "apt_description" : "Zum Swappen von Aptos müsstest du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
         "cosmos_title" : "Ledger Nano S™ unterstützt das Swappen von Cosmos nicht",
         "cosmos_description" : "Zum Swappen von Cosmos müsstest du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "Ledger Nano S™ unterstützt das Swappen von Osmosis nicht",
+        "osmo_description" : "Zum Swappen von Osmosis musst du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
+        "dydx_title" : "Ledger Nano S™ unterstützt das Swappen von dYdX nicht",
+        "dydx_description" : "Zum Swappen von dYdX musst du ein anderes kompatibles Ledger-Gerät verwenden, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™.",
+        "sui_title" : "Die Ledger Nano S™ unterstützt das Swappen von Sui nicht",
+        "sui_description" : "Zum Swappen von Sui kannst du jedes sonstige kompatible Ledger-Gerät nutzen, z. B. eine Ledger Nano S Plus™, eine Ledger Nano X™, eine Ledger Flex™ oder eine Ledger Stax™."
       }
     },
     "lending" : {
@@ -4144,8 +4158,8 @@
     "chooseAccountToFund" : "Wähle ein Konto aus, um Guthaben hinzuzufügen"
   },
   "DeviceAction" : {
-    "stayInTheAppPlz" : "Bleiben Sie in der Ledger Live-App und halten Sie Ihr Ledger-Gerät bereit.",
-    "allowAppPermission" : "Öffnen Sie die {{wording}} App auf Ihrem Gerät",
+    "stayInTheAppPlz" : "Bleib in der Ledger Live-App und halte dein Ledger-Gerät bereit.",
+    "allowAppPermission" : "Öffne die {{wording}} App auf deinem Gerät",
     "allowAppPermissionSubtitleToken" : "zum Verwalten Ihrer {{token}}-Tokens",
     "allowManagerPermission" : "Lassen Sie eine sichere Verbindung mit Ledger zu",
     "allowRenaming" : "Umbenennen auf deinem {{productName}}-Gerät zulassen",
@@ -4242,7 +4256,7 @@
         "title" : "Zurück zum Dashboard auf Ihrem {{productName}}"
       },
       "currencyApp" : {
-        "title" : "Öffnen Sie die App {{managerAppName}} auf Ihrem {{productName}}",
+        "title" : "Öffne die App {{managerAppName}} auf deinem {{productName}}",
         "description" : "",
         "footer" : {
           "appInstalled" : "Sie haben die App nicht installiert",
@@ -4250,7 +4264,7 @@
         }
       },
       "accountApp" : {
-        "title" : "Öffnen Sie die App {{managerAppName}} auf Ihrem {{productName}}",
+        "title" : "Öffne die App {{managerAppName}} auf deinem {{productName}}",
         "description" : ""
       },
       "receiveVerify" : {
@@ -4345,7 +4359,7 @@
     "installedApps" : "Installierte Apps",
     "noAppNeededForToken" : "Installieren Sie die App {{appName}} für {{tokenName}}",
     "tokenAppDisclaimer" : "{{tokenName}} ist ein {{tokenType}} -Token mit der {{appName}} -App. Um {{tokenName}} zu verwalten, <1>installieren Sie die {{appName}} -App</1> und senden Sie die Token <3>zu Ihrem {{appName}}-Konto</3>.",
-    "tokenAppDisclaimerInstalled" : "{{tokenName}} ist ein {{tokenType}}-Token mit der {{appName}}-App. Um {{tokenName}} zu verwalten, <1>öffnen Sie die {{appName}}-App</1> und senden Sie die Token <3>zu Ihrem {{appName}}-Konto</3>.",
+    "tokenAppDisclaimerInstalled" : "{{tokenName}} ist ein {{tokenType}}-Token mit der {{appName}}-App. Um {{tokenName}} zu verwalten, <1>öffne die {{appName}}-App</1> und sende die Token <3>zu deinem {{appName}}-Konto</3>.",
     "goToAccounts" : "Zu den Konten gehen",
     "intallParentApp" : "{{appName}} App installieren",
     "readOnly" : {
@@ -6748,9 +6762,9 @@
       "viewWallet" : "Portfolio entdecken"
     },
     "entryPointCard" : {
-      "title" : "Was gibt es noch für Ihr {{productName}}?",
+      "title" : "Was gibt es noch für deine {{productName}}?",
       "description" : "Übertrage deine Vermögenswerte von jeder Börse oder Wallet, kaufe Kryptowährungen, gestalte deinen Sperrbildschirm individuell oder abonniere Ledger Recover.",
-      "buttonLabel" : "Schauen Sie, was als nächstes kommt"
+      "buttonLabel" : "Schaue, was als nächstes kommt"
     },
     "actions" : {
       "assetsTransfer" : {

From e595d02eaad8a4f9763bcc0d9d3712b786fd3ebd Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:54 +0000
Subject: [PATCH 60/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to es-ES locale

---
 .../static/i18n/es/app.json                   | 98 +++++++------------
 1 file changed, 38 insertions(+), 60 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/es/app.json b/apps/ledger-live-desktop/static/i18n/es/app.json
index 321ad8d29fd7..5de2177f5eb9 100644
--- a/apps/ledger-live-desktop/static/i18n/es/app.json
+++ b/apps/ledger-live-desktop/static/i18n/es/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "El Ledger Nano S™ no es compatible con {{provider}}",
-      "description" : "El Ledger Nano S no es compatible con {{provider}}. Puedes usar el Ledger Nano S Plus, el Ledger Nano X, el Ledger Stax o el Ledger Flex para permutas intercadena en {{provider}} desde Ledger Live.",
+      "description" : "El Ledger Nano S™ no es compatible con {{provider}}. Puedes usar el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Stax™ o el Ledger Flex™ para permutas intercadena en {{provider}} desde Ledger Live.",
       "cta" : "Explorar dispositivos compatibles",
       "changeProvider" : "Permutar con otro proveedor"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "Para permutar Ton, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
       "spl_tokens_title" : "No es posible utilizar el Ledger Nano S™ para permutar tokens de Solana",
       "spl_tokens_description" : "Para permutar tokens de Solana, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "No es posible utilizar el Ledger Nano S™ para permutar tokens de Sui",
+      "sui_tokens_description" : "Para permutar tokens de Sui, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
       "near_title" : "No es posible usar el Ledger Nano S™ para permutar Near",
       "near_description" : "Para permutar Near, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
       "ada_title" : "No es posible utilizar el Ledger Nano S™ para permutar Cardano",
@@ -459,12 +459,12 @@
       "apt_description" : "Para permutar Aptos, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
       "cosmos_title" : "No es posible usar el Ledger Nano S™ para permutar Cosmos",
       "cosmos_description" : "Para permutar Cosmos, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "No es posible usar el Ledger Nano S™ para permutar Osmosis",
+      "osmo_description" : "Para permutar Osmosis, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
+      "dydx_title" : "No es posible usar el Ledger Nano S™ para permutar dYdX",
+      "dydx_description" : "Para permutar dYdX, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
+      "sui_title" : "No es posible utilizar el Ledger Nano S™ para permutar Sui",
+      "sui_description" : "Para permutar Sui, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™."
     },
     "providers" : {
       "title" : "Elige un proveedor para permutar cripto",
@@ -776,6 +776,10 @@
         "description3Link" : "Esta integración la ha realizado <1><0>{{team}}</0></1> en colaboración con Ledger"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} está migrando a {{to}}. Visita este <0>enlace</0> para obtener más información o contacta con el equipo de soporte si necesitas ayuda.",
+      "contactSupport" : "Ponte en contacto con Soporte"
+    },
     "featureUnavailable" : {
       "title" : "La siguiente opción está temporalmente deshabilitada: {{feature}}. Si quieres obtener más información, contacta con {{support}}.",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "Método",
       "transferAmount" : "Transferir importe",
       "validatorsCount" : "Validadores ({{number}})",
-      "version" : "Versión"
+      "version" : "Versión",
+      "accountCreationFee" : "Tarifa de creación de cuenta"
     }
   },
   "operationList" : {
@@ -2049,7 +2054,7 @@
       "dontHaveSeed" : "¿No tienes tu Frase de Recuperación? ",
       "followTheGuide" : "Sigue nuestra Guía de actualización paso a paso",
       "removeApps" : "Desinstalar todas las aplicaciones antes de actualizar",
-      "update" : "Actualización del SO del {{productName}",
+      "update" : "Actualización de SO de {{productName}}",
       "updateBtn" : "Actualizar firmware",
       "installUpdate" : "Instalar actualización",
       "banner" : {
@@ -5511,6 +5516,11 @@
       "memo" : "Etiqueta/memo",
       "memoPlaceholder" : "Opcional",
       "requiredMemoPlaceholder" : "Obligatoria"
+    },
+    "mina" : {
+      "memoPlaceholder" : "Opcional",
+      "memo" : "Memo",
+      "memoWarningText" : "El valor de un memo debe ser una cadena de 32 caracteres como máximo"
     }
   },
   "errors" : {
@@ -6541,6 +6551,15 @@
         "swap" : "Permutar",
         "deposit" : "Depositar"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "El texto de un memo no debe superar los 32 caracteres"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Esta transacción conlleva asociada una tarifa de creación de cuenta de {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "La cantidad mínima necesaria para esta transacción es de {{amount}}"
     }
   },
   "cryptoOrg" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "Es hora de actualizar",
-          "description" : "Pásate a uno de nuestros nuevos dispositivos con un <0>{{discount}}% de descuento</0> y disfruta de más seguridad sin complicaciones.",
-          "cta" : "Renovar mi billetera",
-          "linkText" : "Más información"
-        },
-        "optOut" : {
-          "title" : "Es hora de actualizar",
-          "description" : "Pásate a uno de nuestros nuevos dispositivos con un <0>{{discount}}% de descuento</0> y disfruta de más seguridad sin complicaciones.",
-          "cta" : "Renovar mi billetera",
-          "linkText" : "Más información"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "Es hora de actualizar",
-          "description" : "Pronto dejará de haber actualizaciones para el Ledger Nano S. Pásate a uno de nuestros nuevos dispositivos con un <0>{{discount}}% de descuento</0>.",
-          "cta" : "Renovar mi billetera",
-          "linkText" : "Más información"
-        },
-        "optOut" : {
-          "title" : "Es hora de actualizar",
-          "description" : "Pronto dejará de haber actualizaciones para el Ledger Nano S. Pásate a uno de nuestros nuevos dispositivos con un <0>{{discount}}% de descuento</0>.",
-          "cta" : "Renovar mi billetera",
-          "linkText" : "Más información"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "Es hora de actualizar",
-          "description" : "Pásate a uno de nuestros nuevos dispositivos con un <0>{{discount}}% de descuento</0> y disfruta de más seguridad sin complicaciones.",
-          "cta" : "Renovar mi billetera",
-          "linkText" : "Más información"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "Pronto dejará de haber actualizaciones. Renueva ahora con un {{discount}}% de descuento y disfruta de una experiencia más fluida.",
-          "cta" : "Renovar mi billetera",
-          "linkText" : "Más información"
-        },
-        "optOut" : {
-          "description" : "Pronto dejará de haber actualizaciones. Renueva ahora con un {{discount}}% de descuento y disfruta de una experiencia más fluida.",
-          "cta" : "Renovar mi billetera",
-          "linkText" : "Más información"
-        }
-      }
+    "opted_in" : {
+      "title" : "Si la memoria es limitada, la experiencia también lo será",
+      "description" : "Actualiza tu Ledger Nano S a un dispositivo Ledger más moderno, como el Ledger Flex, para disponer de más memoria, mejoras de seguridad más recientes y nuevas funciones. También tenemos reservado, sólo para ti, un <0>{{discount}}% de descuento</>.",
+      "cta" : "Renovar mi Ledger"
+    },
+    "opted_out" : {
+      "description" : "La memoria limitada de tu Ledger Nano S restringe tu acceso a las opciones más recientes, a cambios en la blockchain y a mejoras de seguridad. Cambia a un dispositivo Ledger más moderno para garantizar un uso prolongado.",
+      "cta" : "Más información"
     }
   }
 }

From 4a93ade919aff1d5fc1d3701fc909d8506faeead Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:57 +0000
Subject: [PATCH 61/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to zh-CN locale

---
 .../src/locales/zh/common.json                | 28 ++++++++++++++-----
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/zh/common.json b/apps/ledger-live-mobile/src/locales/zh/common.json
index 44cf27f9fb98..18315dec4f0a 100644
--- a/apps/ledger-live-mobile/src/locales/zh/common.json
+++ b/apps/ledger-live-mobile/src/locales/zh/common.json
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "无法加载 Swap Live 应用程序"
+    },
+    "InvalidMemoMina" : {
+      "title" : "备忘标签文本不可超过 32 个字符"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "此交易将产生 {{fee}} 的账户创建费"
+    },
+    "AmountTooSmall" : {
+      "title" : "此交易的最低数额要求为 {{amount}}"
     }
   },
   "crash" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "矿工费限值",
       "id" : "Id",
       "autoClaimedRewards" : "自动领取的奖励",
-      "stakedAmount" : "权益质押数额"
+      "stakedAmount" : "权益质押数额",
+      "accountCreationFee" : "账户创建费"
     },
     "multipleAddresses" : "为什么有多个地址?",
     "tokenName" : "代币名称",
@@ -2626,6 +2636,10 @@
         "description3Link" : "此集成由 <1><0>{{team}}</0></1> 与 Ledger 协作实施"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} 正在迁移至 {{to}}。请点击此<0>链接</0>了解详情,如需帮助,请联系客服。",
+      "contactSupport" : "联系客服"
+    },
     "willBedeprecatedBanner" : {
       "title" : "为了优化效率,自 {{deprecatedDate}} 起,Ledger Live 将不再支持 {{currencyName}}。但 Ledger 硬件钱包将继续支持该币种。如需这方面的帮助,请联系 Ledger 客服。",
       "contactSupport" : "联系客服"
@@ -3534,12 +3548,12 @@
         "apt_description" : "要互换 Aptos,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
         "cosmos_title" : "Ledger Nano S™ 不支持互换 Cosmos",
         "cosmos_description" : "要互换 Cosmos,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "Ledger Nano S™ 不支持互换 Osmosis",
+        "osmo_description" : "要互换 Osmosis,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
+        "dydx_title" : "Ledger Nano S™ 不支持互换 dYdX",
+        "dydx_description" : "要互换 dYdX,请使用其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。",
+        "sui_title" : "Ledger Nano S™ 不支持互换 Sui",
+        "sui_description" : "要互换 Sui,请使用任何其他兼容的 Ledger 设备,例如 Ledger Nano S Plus™、Ledger Nano X™、Ledger Flex™ 或 Ledger Stax™。"
       }
     },
     "lending" : {

From 3ab0b3cf5f84a1dbd36ed380f6b6e5146411ebe5 Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:41:59 +0000
Subject: [PATCH 62/63] File apps/ledger-live-desktop/static/i18n/en/app.json
 was translated to pt-BR locale

---
 .../static/i18n/pt/app.json                   | 98 +++++++------------
 1 file changed, 38 insertions(+), 60 deletions(-)

diff --git a/apps/ledger-live-desktop/static/i18n/pt/app.json b/apps/ledger-live-desktop/static/i18n/pt/app.json
index 14c4e7c1823e..1e6d2bb4c972 100644
--- a/apps/ledger-live-desktop/static/i18n/pt/app.json
+++ b/apps/ledger-live-desktop/static/i18n/pt/app.json
@@ -440,7 +440,7 @@
     },
     "wrongDevice" : {
       "title" : "A Ledger Nano S™ não é compatível com {{provider}}",
-      "description" : "A Ledger Nano S não é compatível com {{provider}}. Você pode usar a Ledger Nano S Plus, a Ledger Nano X, Ledger Stax ou a Ledger Flex para realizar trocas cross-chain via {{provider}} através do Ledger Live",
+      "description" : "A Ledger Nano S™ não é compatível com {{provider}}. Você pode usar a Ledger Nano S Plus™, a Ledger Nano X™, Ledger Stax™ ou a Ledger Flex™ para realizar trocas cross-chain via {{provider}} através do Ledger Live",
       "cta" : "Conheça os dispositivos compatíveis",
       "changeProvider" : "Trocar com outro provedor"
     },
@@ -449,8 +449,8 @@
       "ton_description" : "Para trocar Ton, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
       "spl_tokens_title" : "A Ledger Nano S™ não é compatível com a troca de tokens Solana",
       "spl_tokens_description" : "Para trocar tokens Solana, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
-      "sui_tokens_title" : "Ledger Nano S™ does not support swapping Sui tokens",
-      "sui_tokens_description" : "To swap Sui tokens, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
+      "sui_tokens_title" : "A Ledger Nano S™ não é compatível com a troca de tokens Sui",
+      "sui_tokens_description" : "Para trocar tokens Sui, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
       "near_title" : "A Ledger Nano S™ não é compatível com trocas de Near",
       "near_description" : "Para trocar o ativo Near, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
       "ada_title" : "A Ledger Nano S™ não é compatível com a troca de Cardano",
@@ -459,12 +459,12 @@
       "apt_description" : "Para trocar o ativo APTOS, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
       "cosmos_title" : "A Ledger Nano S™ não é compatível com a troca de Cosmos",
       "cosmos_description" : "Para trocar Cosmos, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
-      "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-      "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-      "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-      "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-      "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+      "osmo_title" : "A Ledger Nano S™ não é compatível com a troca de Osmosis",
+      "osmo_description" : "Para trocar Osmosis, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
+      "dydx_title" : "A Ledger Nano S™ não é compatível com trocas de dYdX",
+      "dydx_description" : "Para trocar o ativo dYdX, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™.",
+      "sui_title" : "A Ledger Nano S™ não é compatível com a troca de Sui",
+      "sui_description" : "Para trocar Sui, use qualquer outro dispositivo Ledger compatível, como a Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ ou Ledger Stax™."
     },
     "providers" : {
       "title" : "Escolha um provedor para trocar cripto",
@@ -776,6 +776,10 @@
         "description3Link" : "Esta integração foi realizada por <1><0>{{team}}</0></1> em colaboração com a Ledger"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} está migrando para {{to}}. Siga este <0>link</0> para saber mais ou entre em contato com o suporte se precisar de ajuda.",
+      "contactSupport" : "Falar com o suporte"
+    },
     "featureUnavailable" : {
       "title" : "O seguinte recurso está momentaneamente indisponível: {{feature}}. Para saber mais, consulte o {{support}}",
       "feature" : {
@@ -1875,7 +1879,8 @@
       "palletMethod" : "Método",
       "transferAmount" : "Transferir Quantia",
       "validatorsCount" : "Validadores ({{number}})",
-      "version" : "Versão"
+      "version" : "Versão",
+      "accountCreationFee" : "Taxa de Criação de Conta"
     }
   },
   "operationList" : {
@@ -2049,7 +2054,7 @@
       "dontHaveSeed" : "Não está com sua frase de recuperação? ",
       "followTheGuide" : "Siga nosso guia passo a passo de atualização",
       "removeApps" : "Desinstale todos os aplicativos antes de atualizar",
-      "update" : "Atualização do sistema operacional da {{productName}}",
+      "update" : "Atualização de OS da {{productName}}",
       "updateBtn" : "Atualizar Firmware",
       "installUpdate" : "Instalar atualização",
       "banner" : {
@@ -5511,6 +5516,11 @@
       "memo" : "Tag / Memo",
       "memoPlaceholder" : "Opcional",
       "requiredMemoPlaceholder" : "Obrigatório"
+    },
+    "mina" : {
+      "memoPlaceholder" : "Opcional",
+      "memo" : "Memo",
+      "memoWarningText" : "O valor do memo pode ser uma string menor ou igual a 32 caracteres"
     }
   },
   "errors" : {
@@ -6541,6 +6551,15 @@
         "swap" : "Trocar",
         "deposit" : "Depositar"
       }
+    },
+    "InvalidMemoMina" : {
+      "title" : "O texto do memo não pode ter mais de 32 caracteres"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Esta transação incorrerá em uma taxa de criação de conta de {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "A quantia mínima exigida para esta transação é {{amount}}"
     }
   },
   "cryptoOrg" : {
@@ -6991,55 +7010,14 @@
     }
   },
   "lnsUpsell" : {
-    "banner" : {
-      "manager" : {
-        "optIn" : {
-          "title" : "É hora de subir de nível",
-          "description" : "Mude para os nossos dispositivos mais recentes com <0>{{discount}}% de desconto</0> e tenha uma segurança aprimorada e uma experiência perfeita.",
-          "cta" : "Avançar de carteira",
-          "linkText" : "Saiba mais"
-        },
-        "optOut" : {
-          "title" : "É hora de subir de nível",
-          "description" : "Avance para um dos nossos dispositivos mais recentes com <0>{{discount}}% de desconto</0> e tenha uma segurança aprimorada e uma experiência perfeita.",
-          "cta" : "Avançar para uma carteira melhor",
-          "linkText" : "Saiba mais"
-        }
-      },
-      "accounts" : {
-        "optIn" : {
-          "title" : "É hora de subir de nível",
-          "description" : "As atualizações da Ledger Nano S serão encerradas em breve. Mude para os nossos dispositivos mais recentes com <0>{{discount}}% de desconto</0>.",
-          "cta" : "Avançar de carteira",
-          "linkText" : "Saiba mais"
-        },
-        "optOut" : {
-          "title" : "É hora de subir de nível",
-          "description" : "As atualizações da Ledger Nano S serão encerradas em breve. Mude para nossos dispositivos mais recentes com <0>{{discount}}% de desconto</0>.",
-          "cta" : "Avançar de carteira",
-          "linkText" : "Saiba mais"
-        }
-      },
-      "portfolio" : {
-        "optOut" : {
-          "title" : "É hora de subir de nível",
-          "description" : "Mude para os nossos dispositivos mais recentes com <0>{{discount}}% de desconto</0> e tenha uma segurança aprimorada e uma experiência perfeita.",
-          "cta" : "Avançar de carteira",
-          "linkText" : "Saiba mais"
-        }
-      },
-      "notifications" : {
-        "optIn" : {
-          "description" : "As atualizações serão encerradas em breve. Suba de nível com {{discount}}% de desconto para ter uma experiência perfeita.",
-          "cta" : "Avançar de carteira",
-          "linkText" : "Saiba mais"
-        },
-        "optOut" : {
-          "description" : "As atualizações serão encerradas em breve. Suba de nível agora com {{discount}}% de desconto para ter uma experiência perfeita.",
-          "cta" : "Avançar de carteira",
-          "linkText" : "Saiba mais"
-        }
-      }
+    "opted_in" : {
+      "title" : "Memória limitada, experiência limitada",
+      "description" : "Atualize sua Ledger Nano S para uma Ledger mais nova — como a Ledger Flex — para ter mais memória, melhorias recentes de segurança, novos recursos e <0>um desconto exclusivo de {{discount}}%</>.",
+      "cta" : "Atualizar minha Ledger"
+    },
+    "opted_out" : {
+      "description" : "A memória limitada da Ledger Nano S restringe seu acesso aos últimos recursos, mudanças em blockchains e aprimoramentos de segurança. Para uso prolongado, atualize para um dispositivo Ledger mais recente.",
+      "cta" : "Saiba mais"
     }
   }
 }

From c91c5d17889cc7d737d78c2b43b858f28729e41e Mon Sep 17 00:00:00 2001
From: "smartling-github-connector[bot]"
 <165276057+smartling-github-connector[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 11:42:01 +0000
Subject: [PATCH 63/63] File apps/ledger-live-mobile/src/locales/en/common.json
 was translated to es-ES locale

---
 .../src/locales/es/common.json                | 28 ++++++++++++++-----
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/apps/ledger-live-mobile/src/locales/es/common.json b/apps/ledger-live-mobile/src/locales/es/common.json
index 3ca1a1b44e4e..b669c3f2c325 100644
--- a/apps/ledger-live-mobile/src/locales/es/common.json
+++ b/apps/ledger-live-mobile/src/locales/es/common.json
@@ -1060,6 +1060,15 @@
     },
     "AppManifestNotFoundError" : {
       "title" : "Error al cargar Aplicación Permuta de Live"
+    },
+    "InvalidMemoMina" : {
+      "title" : "El texto de un memo no debe superar los 32 caracteres"
+    },
+    "AccountCreationFeeWarning" : {
+      "title" : "Esta transacción conlleva asociada una tarifa de creación de cuenta de {{fee}}"
+    },
+    "AmountTooSmall" : {
+      "title" : "La cantidad mínima necesaria para esta transacción es de {{amount}}"
     }
   },
   "crash" : {
@@ -2593,7 +2602,8 @@
       "gasLimit" : "Límite de gas",
       "id" : "Id",
       "autoClaimedRewards" : "Recompensas Autoreclamadas",
-      "stakedAmount" : "Cantidad en participación"
+      "stakedAmount" : "Cantidad en participación",
+      "accountCreationFee" : "Tarifa de creación de cuenta"
     },
     "multipleAddresses" : "¿Por qué hay múltiples direcciones?",
     "tokenName" : "Nombre del token",
@@ -2626,6 +2636,10 @@
         "description3Link" : "Esta integración la ha realizado <1><0>{{team}}</0></1> en colaboración con Ledger"
       }
     },
+    "migrationBanner" : {
+      "title" : "{{from}} está migrando a {{to}}. Visita este <0>enlace</0> para obtener más información o contacta con el equipo de soporte si necesitas ayuda.",
+      "contactSupport" : "Ponte en contacto con Soporte"
+    },
     "willBedeprecatedBanner" : {
       "title" : "Por razones de optimización de eficiencia, {{currencyName}} dejará de ser compatible con Ledger Live el {{deprecatedDate}}. No obstante, seguirá siendo compatible con las billeteras de hardware de Ledger. Ponte en contacto con el servicio de soporte al cliente de Ledger si necesitas ayuda con esto.",
       "contactSupport" : "Ponte en contacto con Soporte"
@@ -3534,12 +3548,12 @@
         "apt_description" : "Para permutar Aptos, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
         "cosmos_title" : "No es posible usar el Ledger Nano S™ para permutar Cosmos",
         "cosmos_description" : "Para permutar Cosmos, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
-        "osmo_title" : "Ledger Nano S™ does not support swapping Osmosis",
-        "osmo_description" : "To swap Osmosis, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "dydx_title" : "Ledger Nano S™ does not support swapping dYdX",
-        "dydx_description" : "To swap dYdX, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™.",
-        "sui_title" : "Ledger Nano S™ does not support swapping Sui",
-        "sui_description" : "To swap Sui, use any other compatible Ledger device, such as the Ledger Nano S Plus™, Ledger Nano X™, Ledger Flex™ or Ledger Stax™."
+        "osmo_title" : "No es posible usar el Ledger Nano S™ para permutar Osmosis",
+        "osmo_description" : "Para permutar Osmosis, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
+        "dydx_title" : "No es posible usar el Ledger Nano S™ para permutar dYdX",
+        "dydx_description" : "Para permutar dYdX, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™.",
+        "sui_title" : "No es posible utilizar el Ledger Nano S™ para permutar Sui",
+        "sui_description" : "Para permutar Sui, usa cualquier otro dispositivo Ledger compatible, como el Ledger Nano S Plus™, el Ledger Nano X™, el Ledger Flex™ o el Ledger Stax™."
       }
     },
     "lending" : {