From b693d876c9c53455d96545b9fc0c0053c67f21bb Mon Sep 17 00:00:00 2001 From: Sarah Gliner <105934250+sgliner-ledger@users.noreply.github.com> Date: Tue, 27 Feb 2024 17:24:43 +0100 Subject: [PATCH 01/46] [auto] Update screenshot --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 98b720f..f2fb620 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,5 +4,5 @@ - [ ] Target branch is `develop` - [ ] Application version has been bumped - From 355d7e73449a7aa484ac9faa205c06de0374c75c Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Wed, 27 Mar 2024 18:30:23 +0100 Subject: [PATCH 02/46] Updated to the latest plugin SDK --- ethereum-plugin-sdk | 2 +- src/handle_provide_parameter.c | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ethereum-plugin-sdk b/ethereum-plugin-sdk index 0a98664..8fe6572 160000 --- a/ethereum-plugin-sdk +++ b/ethereum-plugin-sdk @@ -1 +1 @@ -Subproject commit 0a98664deba849f05a51407d8a3edb05cd83d464 +Subproject commit 8fe6572458355828097fa5183a41c83ccb25fece diff --git a/src/handle_provide_parameter.c b/src/handle_provide_parameter.c index 4bff9e4..89c883e 100644 --- a/src/handle_provide_parameter.c +++ b/src/handle_provide_parameter.c @@ -65,12 +65,11 @@ int find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t *context) { uint8_t buffer[ADDRESS_LENGTH]; char address_buffer[ADDRESS_STR_LEN]; - cx_sha3_t sha3; switch (context->next_param) { case LR_DEPOSIT_INTO_STRATEGY_STRATEGY: copy_address(buffer, msg->parameter, sizeof(buffer)); - getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), &sha3, 0); + getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); context->param_data.lr_deposit.strategy_to_display = find_lr_known_strategy(address_buffer); @@ -78,7 +77,7 @@ void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t break; case LR_DEPOSIT_INTO_STRATEGY_TOKEN: copy_address(buffer, msg->parameter, sizeof(buffer)); - getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), &sha3, 0); + getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); context->param_data.lr_deposit.erc20_to_display = find_lr_known_erc20(address_buffer); context->next_param = LR_DEPOSIT_INTO_STRATEGY_AMOUNT; @@ -98,8 +97,6 @@ void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t } void handle_lr_queue_withdrawal(ethPluginProvideParameter_t *msg, context_t *context) { - cx_sha3_t sha3; - // queueWithdrawal(uint256[],address[],uint256[],address,bool // example for queue withdrawal with 2 strategies indexes, contracts and shares // [0] selector @@ -164,7 +161,6 @@ void handle_lr_queue_withdrawal(ethPluginProvideParameter_t *msg, context_t *con getEthDisplayableAddress(buffer, context->param_data.lr_queue_withdrawal.withdrawer, sizeof(context->param_data.lr_queue_withdrawal.withdrawer), - &sha3, 0); context->next_param = LR_QUEUE_WITHDRAWAL_UNDELEGATEIFPOSSIBLE; break; From 760c826e2122ab50370ea054f50a19f9f13a353a Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Wed, 29 May 2024 18:33:00 +0200 Subject: [PATCH 03/46] Add recursive option to Ethereum checkout in CI --- .github/workflows/ci-workflow.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 9caba5b..48ca6f7 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -117,6 +117,7 @@ jobs: with: repository: LedgerHQ/app-ethereum ref: ${{ ((github.base_ref || github.ref_name) == 'main' && 'master') || (github.base_ref || github.ref_name) }} + submodules: recursive - name: Build run: | From e6f10927ee998c35fa9b580ab87208c50aec0bdc Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Wed, 17 Apr 2024 19:05:14 +0200 Subject: [PATCH 04/46] feat(lr): add delegateTo support --- src/contract.c | 7 +- src/handle_finalize.c | 4 ++ src/handle_init_contract.c | 3 + src/handle_provide_parameter.c | 41 ++++++++++++ src/handle_query_contract_id.c | 4 ++ src/handle_query_contract_ui.c | 31 +++++++++ src/kiln_plugin.h | 19 +++++- ...53d51b77dc0d36036fc1fcc8cb819df8ef37a.json | 37 +++++++++++ tests/cal/b2c.json | 10 +++ tests/src/lrDelegateTo.test.js | 66 +++++++++++++++++++ 10 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 tests/cal/abis/0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a.json create mode 100644 tests/src/lrDelegateTo.test.js diff --git a/src/contract.c b/src/contract.c index 213e8c2..2ff934c 100644 --- a/src/contract.c +++ b/src/contract.c @@ -36,6 +36,8 @@ static const uint32_t KILN_LR_QUEUE_WITHDRAWAL_SELECTOR = 0xf123991e; // --- cast sig // "completeQueuedWithdrawal((address[],uint256[],address,(address,uint96),uint32,address),address[],uint256,bool)" static const uint32_t KILN_LR_COMPLETE_QUEUED_WITHDRAWAL_SELECTOR = 0xf3be65d3; +// --- cast sig "delegateTo(address,(bytes,uint256),bytes32)" +static const uint32_t KILN_LR_DELEGATE_TO_SELECTOR = 0xeea9064b; const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { // V1 @@ -56,6 +58,7 @@ const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { KILN_LR_DEPOSIT_INTO_STRATEGY_SELECTOR, KILN_LR_QUEUE_WITHDRAWAL_SELECTOR, KILN_LR_COMPLETE_QUEUED_WITHDRAWAL_SELECTOR, + KILN_LR_DELEGATE_TO_SELECTOR, }; const char lr_strategy_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN] = { @@ -96,4 +99,6 @@ const char lr_tickers[LR_STRATEGIES_COUNT][MAX_TICKER_LEN] = {"cbETH", "swETH", "wBETH", "sfrxETH", - "mETH"}; \ No newline at end of file + "mETH"}; + +const char lr_kiln_operator_address[ADDRESS_STR_LEN] = "0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662"; \ No newline at end of file diff --git a/src/handle_finalize.c b/src/handle_finalize.c index 3d12efd..b3c25b2 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -33,6 +33,10 @@ void handle_finalize(ethPluginFinalize_t *msg) { msg->numScreens = 1; msg->result = ETH_PLUGIN_RESULT_OK; break; + case KILN_LR_DELEGATE_TO: + msg->numScreens = 2; + msg->result = ETH_PLUGIN_RESULT_OK; + break; default: PRINTF("Selector Index not supported: %d\n", context->selectorIndex); msg->result = ETH_PLUGIN_RESULT_ERROR; diff --git a/src/handle_init_contract.c b/src/handle_init_contract.c index 7d27e3d..6bd1154 100644 --- a/src/handle_init_contract.c +++ b/src/handle_init_contract.c @@ -65,6 +65,9 @@ void handle_init_contract(ethPluginInitContract_t *msg) { case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: context->next_param = LR_COMPLETE_QUEUED_WITHDRAWAL_QUEUEDWITHDRAWAL_OFFSET; break; + case KILN_LR_DELEGATE_TO: + context->next_param = LR_DELEGATE_TO_OPERATOR; + break; default: PRINTF("Missing selectorIndex: %d\n", context->selectorIndex); diff --git a/src/handle_provide_parameter.c b/src/handle_provide_parameter.c index 89c883e..9b2c072 100644 --- a/src/handle_provide_parameter.c +++ b/src/handle_provide_parameter.c @@ -254,6 +254,44 @@ void handle_lr_complete_queued_withdrawal(ethPluginProvideParameter_t *msg, cont msg->result = ETH_PLUGIN_RESULT_OK; } +void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) { + // delegateTo(address,(bytes,uint256),bytes32) + // example + // [0] selector + // [4] operator + // [36] signature_offset + // [68] approver_salt + + uint8_t buffer[ADDRESS_LENGTH]; + lr_delegate_to_t *params = &context->param_data.lr_delegate_to; + + switch (context->next_param) { + case LR_DELEGATE_TO_OPERATOR: + copy_address(buffer, msg->parameter, sizeof(buffer)); + getEthDisplayableAddress(buffer, + params->operator_address, + sizeof(params->operator_address), + 0); + + params->is_kiln = false; + if (compare_addresses((const char *) buffer, lr_kiln_operator_address)) { + params->is_kiln = true; + } + context->next_param = LR_DELEGATE_TO_SIGNATURE_OFFSET; + break; + case LR_DELEGATE_TO_SIGNATURE_OFFSET: + context->next_param = LR_DELEGATE_TO_APPROVER_SALT; + break; + case LR_DELEGATE_TO_APPROVER_SALT: + context->next_param = LR_DELEGATE_TO_UNEXPECTED_PARAMETER; + break; + default: + PRINTF("Param not supported: %d\n", context->next_param); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } +} + void handle_provide_parameter(ethPluginProvideParameter_t *msg) { context_t *context = (context_t *) msg->pluginContext; @@ -300,6 +338,9 @@ void handle_provide_parameter(ethPluginProvideParameter_t *msg) { case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: handle_lr_complete_queued_withdrawal(msg, context); break; + case KILN_LR_DELEGATE_TO: + handle_lr_delegate_to(msg, context); + break; default: PRINTF("Selector Index not supported: %d\n", context->selectorIndex); diff --git a/src/handle_query_contract_id.c b/src/handle_query_contract_id.c index 2ef87e1..2d56106 100644 --- a/src/handle_query_contract_id.c +++ b/src/handle_query_contract_id.c @@ -56,6 +56,10 @@ void handle_query_contract_id(ethQueryContractID_t *msg) { strlcpy(msg->version, "Liquid Restaking", msg->versionLength); break; + case KILN_LR_DELEGATE_TO: + strlcpy(msg->version, "EigenLayer Delegate", msg->versionLength); + break; + default: PRINTF("Selector Index not supported: %d\n", context->selectorIndex); msg->result = ETH_PLUGIN_RESULT_ERROR; diff --git a/src/handle_query_contract_ui.c b/src/handle_query_contract_ui.c index afcf28a..ff744f9 100644 --- a/src/handle_query_contract_ui.c +++ b/src/handle_query_contract_ui.c @@ -254,6 +254,33 @@ static bool complete_queued_withdrawal_ui_lr(ethQueryContractUI_t *msg) { return ret; } +static bool complete_delegate_to_ui_lr(ethQueryContractUI_t *msg, context_t *context) { + bool ret = false; + lr_delegate_to_t *params = &context->param_data.lr_delegate_to; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "EigenLayer", msg->titleLength); + strlcpy(msg->msg, "Delegate To", msg->msgLength); + ret = true; + break; + case 1: + strlcpy(msg->title, "Operator", msg->titleLength); + if (params->is_kiln) { + strlcpy(msg->msg, "Kiln", msg->msgLength); + } else { + strlcpy(msg->msg, params->operator_address, msg->msgLength); + } + ret = true; + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + void handle_query_contract_ui(ethQueryContractUI_t *msg) { context_t *context = (context_t *) msg->pluginContext; bool ret = false; @@ -310,6 +337,10 @@ void handle_query_contract_ui(ethQueryContractUI_t *msg) { ret = complete_queued_withdrawal_ui_lr(msg); break; + case KILN_LR_DELEGATE_TO: + ret = complete_delegate_to_ui_lr(msg, context); + break; + default: PRINTF("Selector Index not supported: %d\n", context->selectorIndex); break; diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 9b83491..1576f4b 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -30,8 +30,9 @@ // --- 13. queueWithdrawal(uint256[],address[],uint256[],address,bool) // --- 14. // completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool) +// --- 15. delegateTo(address,(bytes,uint256),bytes32) // -#define NUM_SELECTORS 15 +#define NUM_SELECTORS 16 // Selectors available (see mapping above). typedef enum { @@ -50,6 +51,7 @@ typedef enum { KILN_LR_DEPOSIT_INTO_STRATEGY, KILN_LR_QUEUE_WITHDRAWAL, KILN_LR_COMPLETE_QUEUED_WITHDRAWAL, + KILN_LR_DELEGATE_TO, } selector_t; extern const uint32_t KILN_SELECTORS[NUM_SELECTORS]; @@ -92,11 +94,20 @@ typedef enum { LR_COMPLETE_QUEUED_WITHDRAWAL_UNEXPECTED_PARAMETER } lr_complete_queued_withdrawal_parameters; +// Parameters for LR delegate to selector. +typedef enum { + LR_DELEGATE_TO_OPERATOR = 0, + LR_DELEGATE_TO_SIGNATURE_OFFSET, + LR_DELEGATE_TO_APPROVER_SALT, + LR_DELEGATE_TO_UNEXPECTED_PARAMETER +} lr_delegate_to_parameters; + #define LR_STRATEGIES_COUNT 11 extern const char lr_strategy_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN]; extern const char lr_erc20_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN]; extern const char lr_tickers[LR_STRATEGIES_COUNT][MAX_TICKER_LEN]; +extern const char lr_kiln_operator_address[ADDRESS_STR_LEN]; // max number of strategies / erc20 to display #define MAX_DISPLAY_COUNT 3 @@ -119,6 +130,11 @@ typedef struct { bool go_to_offset; } lr_complete_queued_withdrawal_t; +typedef struct { + char operator_address[ADDRESS_STR_LEN]; + bool is_kiln; +} lr_delegate_to_t; + typedef struct context_t { uint8_t next_param; @@ -126,6 +142,7 @@ typedef struct context_t { lr_complete_queued_withdrawal_t lr_complete_queued_withdrawal; lr_deposit_t lr_deposit; lr_queue_withdrawal_t lr_queue_withdrawal; + lr_delegate_to_t lr_delegate_to; } param_data; selector_t selectorIndex; diff --git a/tests/cal/abis/0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a.json b/tests/cal/abis/0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a.json new file mode 100644 index 0000000..7fc797b --- /dev/null +++ b/tests/cal/abis/0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a.json @@ -0,0 +1,37 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + } + ], + "internalType": "struct ISignatureUtils.SignatureWithExpiry", + "name": "approverSignatureAndExpiry", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "approverSalt", + "type": "bytes32" + } + ], + "name": "delegateTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/tests/cal/b2c.json b/tests/cal/b2c.json index 8f9d8d8..0ac4f82 100644 --- a/tests/cal/b2c.json +++ b/tests/cal/b2c.json @@ -88,6 +88,16 @@ "plugin": "Kiln" } } + }, + { + "address": "0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a", + "contractName": "EigenLayerDelegationManager", + "selectors": { + "0xeea9064b": { + "method": "delegateTo", + "plugin": "Kiln" + } + } } ], "name": "Kiln" diff --git a/tests/src/lrDelegateTo.test.js b/tests/src/lrDelegateTo.test.js new file mode 100644 index 0000000..016682e --- /dev/null +++ b/tests/src/lrDelegateTo.test.js @@ -0,0 +1,66 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + kilnJSON, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from './test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a'; // delegation manager + +const pluginName = 'Kiln'; +const abi_path = `../cal/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] LR Delegate To - is Kiln', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.delegateTo( + '0x1f8c8b1d78d01bcc42ebdd34fae60181bd697662', // kiln operator + { + signature: '0x', + expiry: 0, + }, + 0 + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 7 : 5; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_delegate_to_is_kiln', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); +}); From 056910250057a1110cf6e306fc41993c979850ae Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 18 Apr 2024 11:28:57 +0200 Subject: [PATCH 05/46] feat(lr): complete delegate to testsuite --- tests/src/lrDelegateTo.test.js | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/src/lrDelegateTo.test.js b/tests/src/lrDelegateTo.test.js index 016682e..3c21391 100644 --- a/tests/src/lrDelegateTo.test.js +++ b/tests/src/lrDelegateTo.test.js @@ -63,4 +63,48 @@ nano_models.forEach(function (model) { }), 30000 ); + + test( + '[Nano ' + model.letter + '] LR Delegate To - is NOT Kiln', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.delegateTo( + '0x645a845f80576a25f1b412330a108780f6c4573d', // kiln operator + { + signature: '0x', + expiry: 0, + }, + 0 + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 7 : 5; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_delegate_to_is_not_kiln', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); }); From 95d50343e1af0f422967c3ac5acf7172d3675475 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 18 Apr 2024 11:50:40 +0200 Subject: [PATCH 06/46] feat(lr): add undelegate support --- src/contract.c | 3 + src/handle_finalize.c | 4 ++ src/handle_init_contract.c | 2 + src/handle_provide_parameter.c | 4 ++ src/handle_query_contract_id.c | 4 ++ src/handle_query_contract_ui.c | 25 +++++++- src/kiln_plugin.h | 4 +- ...53d51b77dc0d36036fc1fcc8cb819df8ef37a.json | 19 ++++++ tests/cal/b2c.json | 9 ++- tests/src/lrDelegateTo.test.js | 4 +- tests/src/lrUndelegate.test.js | 61 +++++++++++++++++++ 11 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 tests/src/lrUndelegate.test.js diff --git a/src/contract.c b/src/contract.c index 2ff934c..537eda4 100644 --- a/src/contract.c +++ b/src/contract.c @@ -38,6 +38,8 @@ static const uint32_t KILN_LR_QUEUE_WITHDRAWAL_SELECTOR = 0xf123991e; static const uint32_t KILN_LR_COMPLETE_QUEUED_WITHDRAWAL_SELECTOR = 0xf3be65d3; // --- cast sig "delegateTo(address,(bytes,uint256),bytes32)" static const uint32_t KILN_LR_DELEGATE_TO_SELECTOR = 0xeea9064b; +// -- cast sig "undelegate(address)" +static const uint32_t KILN_LR_UNDELEGATE_SELECTOR = 0xda8be864; const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { // V1 @@ -59,6 +61,7 @@ const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { KILN_LR_QUEUE_WITHDRAWAL_SELECTOR, KILN_LR_COMPLETE_QUEUED_WITHDRAWAL_SELECTOR, KILN_LR_DELEGATE_TO_SELECTOR, + KILN_LR_UNDELEGATE_SELECTOR, }; const char lr_strategy_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN] = { diff --git a/src/handle_finalize.c b/src/handle_finalize.c index b3c25b2..12e78dc 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -37,6 +37,10 @@ void handle_finalize(ethPluginFinalize_t *msg) { msg->numScreens = 2; msg->result = ETH_PLUGIN_RESULT_OK; break; + case KILN_LR_UNDELEGATE: + msg->numScreens = 1; + msg->result = ETH_PLUGIN_RESULT_OK; + break; default: PRINTF("Selector Index not supported: %d\n", context->selectorIndex); msg->result = ETH_PLUGIN_RESULT_ERROR; diff --git a/src/handle_init_contract.c b/src/handle_init_contract.c index 6bd1154..19b2266 100644 --- a/src/handle_init_contract.c +++ b/src/handle_init_contract.c @@ -68,6 +68,8 @@ void handle_init_contract(ethPluginInitContract_t *msg) { case KILN_LR_DELEGATE_TO: context->next_param = LR_DELEGATE_TO_OPERATOR; break; + case KILN_LR_UNDELEGATE: + break; default: PRINTF("Missing selectorIndex: %d\n", context->selectorIndex); diff --git a/src/handle_provide_parameter.c b/src/handle_provide_parameter.c index 9b2c072..e6a9b5d 100644 --- a/src/handle_provide_parameter.c +++ b/src/handle_provide_parameter.c @@ -290,6 +290,7 @@ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) msg->result = ETH_PLUGIN_RESULT_ERROR; return; } + msg->result = ETH_PLUGIN_RESULT_OK; } void handle_provide_parameter(ethPluginProvideParameter_t *msg) { @@ -341,6 +342,9 @@ void handle_provide_parameter(ethPluginProvideParameter_t *msg) { case KILN_LR_DELEGATE_TO: handle_lr_delegate_to(msg, context); break; + case KILN_LR_UNDELEGATE: + msg->result = ETH_PLUGIN_RESULT_OK; + break; default: PRINTF("Selector Index not supported: %d\n", context->selectorIndex); diff --git a/src/handle_query_contract_id.c b/src/handle_query_contract_id.c index 2d56106..1f147c7 100644 --- a/src/handle_query_contract_id.c +++ b/src/handle_query_contract_id.c @@ -60,6 +60,10 @@ void handle_query_contract_id(ethQueryContractID_t *msg) { strlcpy(msg->version, "EigenLayer Delegate", msg->versionLength); break; + case KILN_LR_UNDELEGATE: + strlcpy(msg->version, "EigenLayer Undelegate", msg->versionLength); + break; + default: PRINTF("Selector Index not supported: %d\n", context->selectorIndex); msg->result = ETH_PLUGIN_RESULT_ERROR; diff --git a/src/handle_query_contract_ui.c b/src/handle_query_contract_ui.c index ff744f9..6edc296 100644 --- a/src/handle_query_contract_ui.c +++ b/src/handle_query_contract_ui.c @@ -254,7 +254,7 @@ static bool complete_queued_withdrawal_ui_lr(ethQueryContractUI_t *msg) { return ret; } -static bool complete_delegate_to_ui_lr(ethQueryContractUI_t *msg, context_t *context) { +static bool delegate_to_ui_lr(ethQueryContractUI_t *msg, context_t *context) { bool ret = false; lr_delegate_to_t *params = &context->param_data.lr_delegate_to; @@ -281,6 +281,23 @@ static bool complete_delegate_to_ui_lr(ethQueryContractUI_t *msg, context_t *con return ret; } +static bool undelegate_ui_lr(ethQueryContractUI_t *msg) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "EigenLayer", msg->titleLength); + strlcpy(msg->msg, "Undelegate all", msg->msgLength); + ret = true; + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + void handle_query_contract_ui(ethQueryContractUI_t *msg) { context_t *context = (context_t *) msg->pluginContext; bool ret = false; @@ -338,7 +355,11 @@ void handle_query_contract_ui(ethQueryContractUI_t *msg) { break; case KILN_LR_DELEGATE_TO: - ret = complete_delegate_to_ui_lr(msg, context); + ret = delegate_to_ui_lr(msg, context); + break; + + case KILN_LR_UNDELEGATE: + ret = undelegate_ui_lr(msg); break; default: diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 1576f4b..5d1d80d 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -31,8 +31,9 @@ // --- 14. // completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool) // --- 15. delegateTo(address,(bytes,uint256),bytes32) +// --- 16. undelegate(address) // -#define NUM_SELECTORS 16 +#define NUM_SELECTORS 17 // Selectors available (see mapping above). typedef enum { @@ -52,6 +53,7 @@ typedef enum { KILN_LR_QUEUE_WITHDRAWAL, KILN_LR_COMPLETE_QUEUED_WITHDRAWAL, KILN_LR_DELEGATE_TO, + KILN_LR_UNDELEGATE, } selector_t; extern const uint32_t KILN_SELECTORS[NUM_SELECTORS]; diff --git a/tests/cal/abis/0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a.json b/tests/cal/abis/0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a.json index 7fc797b..a0d39a4 100644 --- a/tests/cal/abis/0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a.json +++ b/tests/cal/abis/0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a.json @@ -33,5 +33,24 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "staker", + "type": "address" + } + ], + "name": "undelegate", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "withdrawalRoots", + "type": "bytes32[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" } ] \ No newline at end of file diff --git a/tests/cal/b2c.json b/tests/cal/b2c.json index 0ac4f82..418129b 100644 --- a/tests/cal/b2c.json +++ b/tests/cal/b2c.json @@ -96,9 +96,14 @@ "0xeea9064b": { "method": "delegateTo", "plugin": "Kiln" + }, + "0xda8be864": { + "method": "undelegate", + "plugin": "Kiln" } } } - ], - "name": "Kiln" + } +], +"name": "Kiln" } \ No newline at end of file diff --git a/tests/src/lrDelegateTo.test.js b/tests/src/lrDelegateTo.test.js index 3c21391..51ab428 100644 --- a/tests/src/lrDelegateTo.test.js +++ b/tests/src/lrDelegateTo.test.js @@ -58,7 +58,7 @@ nano_models.forEach(function (model) { '.', model.name + '_delegate_to_is_kiln', [right_clicks, 0] - ); + ); await tx; }), 30000 @@ -70,7 +70,7 @@ nano_models.forEach(function (model) { const contract = new ethers.Contract(contractAddr, abi); const { data } = await contract.populateTransaction.delegateTo( - '0x645a845f80576a25f1b412330a108780f6c4573d', // kiln operator + '0x645a845f80576a25f1b412330a108780f6c4573d', // not kiln operator { signature: '0x', expiry: 0, diff --git a/tests/src/lrUndelegate.test.js b/tests/src/lrUndelegate.test.js new file mode 100644 index 0000000..81bed55 --- /dev/null +++ b/tests/src/lrUndelegate.test.js @@ -0,0 +1,61 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + kilnJSON, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from './test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a'; // delegation manager + +const pluginName = 'Kiln'; +const abi_path = `../cal/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] LR Undelegate', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.undelegate( + '0x645a845f80576a25f1b412330a108780f6c4573d' + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 7 : 5; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lr_undelegate', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); +}); From fc048745f16fef2413cdcd3b6c3be708d61b4acc Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 18 Apr 2024 18:10:15 +0200 Subject: [PATCH 07/46] feat(lr): add queueWithdrawals support --- src/contract.c | 6 +- src/handle_finalize.c | 13 +- src/handle_init_contract.c | 4 +- src/handle_provide_parameter.c | 169 +++++++++++------- src/handle_query_contract_id.c | 2 +- src/handle_query_contract_ui.c | 34 ++-- src/kiln_plugin.h | 35 ++-- ...646372cc42e1a627fce94aa7a7033e7cf075a.json | 66 ++++--- tests/src/lrQueueWithdrawal.test.js | 68 ------- tests/src/lrQueueWithdrawals.test.js | 123 +++++++++++++ 10 files changed, 328 insertions(+), 192 deletions(-) delete mode 100644 tests/src/lrQueueWithdrawal.test.js create mode 100644 tests/src/lrQueueWithdrawals.test.js diff --git a/src/contract.c b/src/contract.c index 537eda4..87e7b77 100644 --- a/src/contract.c +++ b/src/contract.c @@ -31,8 +31,8 @@ static const uint32_t KILN_V2_CLAIM_SELECTOR = 0xadcf1163; // RESTAKING - Liquid Restaking // --- cast sig "depositIntoStrategy(address,address,uint256)" static const uint32_t KILN_LR_DEPOSIT_INTO_STRATEGY_SELECTOR = 0xe7a050aa; -// --- cast sig "queueWithdrawal(uint256[],address[],uint256[],address,bool)" -static const uint32_t KILN_LR_QUEUE_WITHDRAWAL_SELECTOR = 0xf123991e; +// --- cast sig "queueWithdrawals((address[],uint256[],address)[])" +static const uint32_t KILN_LR_QUEUE_WITHDRAWALS_SELECTOR = 0x0dd8dd02; // --- cast sig // "completeQueuedWithdrawal((address[],uint256[],address,(address,uint96),uint32,address),address[],uint256,bool)" static const uint32_t KILN_LR_COMPLETE_QUEUED_WITHDRAWAL_SELECTOR = 0xf3be65d3; @@ -58,7 +58,7 @@ const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { KILN_V2_CLAIM_SELECTOR, // LR KILN_LR_DEPOSIT_INTO_STRATEGY_SELECTOR, - KILN_LR_QUEUE_WITHDRAWAL_SELECTOR, + KILN_LR_QUEUE_WITHDRAWALS_SELECTOR, KILN_LR_COMPLETE_QUEUED_WITHDRAWAL_SELECTOR, KILN_LR_DELEGATE_TO_SELECTOR, KILN_LR_UNDELEGATE_SELECTOR, diff --git a/src/handle_finalize.c b/src/handle_finalize.c index 12e78dc..d88f0d9 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -25,8 +25,17 @@ void handle_finalize(ethPluginFinalize_t *msg) { msg->numScreens = 3; msg->result = ETH_PLUGIN_RESULT_OK; break; - case KILN_LR_QUEUE_WITHDRAWAL: - msg->numScreens = 2; + case KILN_LR_QUEUE_WITHDRAWALS: + msg->numScreens = 1; + + lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; + params->queued_withdrawals_nb = 0; + for (size_t i = 0; i < LR_STRATEGIES_COUNT; i += 1) { + if (params->strategies[i]) { + msg->numScreens += 1; + params->queued_withdrawals_nb += 1; + } + } msg->result = ETH_PLUGIN_RESULT_OK; break; case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: diff --git a/src/handle_init_contract.c b/src/handle_init_contract.c index 19b2266..ea54b41 100644 --- a/src/handle_init_contract.c +++ b/src/handle_init_contract.c @@ -59,8 +59,8 @@ void handle_init_contract(ethPluginInitContract_t *msg) { case KILN_LR_DEPOSIT_INTO_STRATEGY: context->next_param = LR_DEPOSIT_INTO_STRATEGY_STRATEGY; break; - case KILN_LR_QUEUE_WITHDRAWAL: - context->next_param = LR_QUEUE_WITHDRAWAL_STRATEGY_INDEXES_OFFSET; + case KILN_LR_QUEUE_WITHDRAWALS: + context->next_param = LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET; break; case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: context->next_param = LR_COMPLETE_QUEUED_WITHDRAWAL_QUEUEDWITHDRAWAL_OFFSET; diff --git a/src/handle_provide_parameter.c b/src/handle_provide_parameter.c index e6a9b5d..722c476 100644 --- a/src/handle_provide_parameter.c +++ b/src/handle_provide_parameter.c @@ -96,84 +96,115 @@ void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t msg->result = ETH_PLUGIN_RESULT_OK; } -void handle_lr_queue_withdrawal(ethPluginProvideParameter_t *msg, context_t *context) { - // queueWithdrawal(uint256[],address[],uint256[],address,bool - // example for queue withdrawal with 2 strategies indexes, contracts and shares - // [0] selector - // [4] strat_i_offset -- starting here - // [36] strat_offset - // [68] shares_offset - // [100] withdrawal - // [132] undelegateIfPossible - // [164] strat_i_length - // [196] strat_i[0] - // [228] strat_i[1] - // [260] strat_length - // [292] strat[0] - // [324] strat[1] - // [356] shares_length - // [388] shares[0] - // [420] shares[1] +void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *context) { + // queuedWithdrawals = (address strategies[],uint256 shares[],address withdrawer) + // queueWithdrawals(queuedWithdrawals[]) + // example for queue withdrawals with 2 strategies + // [ 0] selector + // [ 36] queuedWithdrawals_offset + // [ 68] queuedWithdrawals_length + // [100] queuedWithdrawals_0 + // [100] strategies_offset + // [132] shares_offset + // [164] withdrawer + // [196] strategies_length + // [228] strategies_0 + // [260] strategies_1 + // [292] shares_length + // [324] shares_0 + // [356] shares_1 + // [388] queuedWithdrawals_1 + // [388] strategies_offset + // [420] shares_offset + // [452] withdrawer + // [484] strategies_length + // [516] strategies_0 + // [548] strategies_1 + // [580] shares_length + // [612] shares_0 + // [644] shares_1 uint8_t buffer[ADDRESS_LENGTH]; - lr_queue_withdrawal_t *params = &context->param_data.lr_queue_withdrawal; - - if (params->skip_offset != 0 && params->go_to_offset == false && - msg->parameterOffset == params->skip_offset + SELECTOR_LENGTH) { - // if we reach offset, we get the size of the array and skip parsing it - // in the condition of the default switch case - - // with the example above: - // before: - // [356] shares_length -- skip_offset - // [388] shares[0] - // [420] shares[1] - params->skip_offset += - U2BE(msg->parameter, PARAMETER_LENGTH - sizeof(params->skip_offset)) * PARAMETER_LENGTH; - // after: - // [356] shares_length - // [388] shares[0] - // [420] shares[1] -- skip_offset - params->go_to_offset = true; - } + lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; switch (context->next_param) { - case LR_QUEUE_WITHDRAWAL_STRATEGY_INDEXES_OFFSET: - params->go_to_offset = false; - context->next_param = LR_QUEUE_WITHDRAWAL_STRATEGIES_OFFSET; + // 1. queuedWithdrawals array setup + case LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET: + context->next_param = LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH; break; - case LR_QUEUE_WITHDRAWAL_STRATEGIES_OFFSET: - context->next_param = LR_QUEUE_WITHDRAWAL_SHARES_OFFSET; + case LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH: + params->queued_withdrawals_nb = U2BE(msg->parameter, PARAMETER_LENGTH); + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET; break; - case LR_QUEUE_WITHDRAWAL_SHARES_OFFSET: - // before: - // skip_offset = 0 - params->skip_offset = - U2BE(msg->parameter, PARAMETER_LENGTH - sizeof(params->skip_offset)); - // after: - // [356] shares_length -- skip_offset - // [388] shares[0] - // [420] shares[1] - context->next_param = LR_QUEUE_WITHDRAWAL_WITHDRAWER; + + // 2. entering a queuedWithdrawal + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET: + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET; + break; + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET: + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER; break; - case LR_QUEUE_WITHDRAWAL_WITHDRAWER: + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER: + // EigenLayer contract does not allow withdrawer to be different than msg.sender + // https://github.com/Layr-Labs/eigenlayer-contracts/blob/7229f2b426b6f2a24c7795 + // b1a4687a010eac8ef2/src/contracts/core/DelegationManager.sol#L275 + // so we can only copy it once + if (params->withdrawer[0] == '\0') { + copy_address(buffer, msg->parameter, sizeof(buffer)); + getEthDisplayableAddress(buffer, params->withdrawer, sizeof(params->withdrawer), 0); + } + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH; + break; + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH: + // get number of item to parse + params->current_item_nb = U2BE(msg->parameter, PARAMETER_LENGTH); + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM; + break; + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM: + // get strategy we need to display copy_address(buffer, msg->parameter, sizeof(buffer)); - getEthDisplayableAddress(buffer, - context->param_data.lr_queue_withdrawal.withdrawer, - sizeof(context->param_data.lr_queue_withdrawal.withdrawer), - 0); - context->next_param = LR_QUEUE_WITHDRAWAL_UNDELEGATEIFPOSSIBLE; + char address_buffer[ADDRESS_STR_LEN]; + getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); + + int strategy_index = find_lr_known_strategy(address_buffer); + if (strategy_index != -1) { + params->strategies[strategy_index] = true; + } + + // we just processed one strategy item + params->current_item_nb -= 1; + if (params->current_item_nb == 0) { + // when we arrive at the end of the strategies array we go to the shares array + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH; + } break; - case LR_QUEUE_WITHDRAWAL_UNDELEGATEIFPOSSIBLE: - context->next_param = LR_QUEUE_WITHDRAWAL_UNEXPECTED_PARAMETER; + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH: + // get number of item to parse + params->current_item_nb = U2BE(msg->parameter, PARAMETER_LENGTH); + + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__SHARES_ITEM; break; - default: - if (msg->parameterOffset <= params->skip_offset + SELECTOR_LENGTH) { - // as we don't want to display the strategy indexes, strategies and shares amount - // we skip parsing them until skip_offset is reached - msg->result = ETH_PLUGIN_RESULT_OK; - return; + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__SHARES_ITEM: + // we skip parsing shares item as they are not needed for clearsigning + // as not having ETH / ERC20 amount to display would confuse users + params->current_item_nb -= 1; + if (params->current_item_nb == 0) { + // here we arrive at the end of the queuedWithdrawal array element + + // check if there are other queuedWithdrawals to parse + params->queued_withdrawals_nb -= 1; + if (params->queued_withdrawals_nb == 0) { + // if not we finished parsing + context->next_param = LR_QUEUE_WITHDRAWALS_UNEXPECTED_PARAMETER; + } else { + // if there are other queuedWithdrawals we go back to parsing the strategies + // offset + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET; + } } + break; + + default: PRINTF("Param not supported: %d\n", context->next_param); msg->result = ETH_PLUGIN_RESULT_ERROR; return; @@ -333,8 +364,8 @@ void handle_provide_parameter(ethPluginProvideParameter_t *msg) { case KILN_LR_DEPOSIT_INTO_STRATEGY: handle_lr_deposit_into_strategy(msg, context); break; - case KILN_LR_QUEUE_WITHDRAWAL: - handle_lr_queue_withdrawal(msg, context); + case KILN_LR_QUEUE_WITHDRAWALS: + handle_lr_queue_withdrawals(msg, context); break; case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: handle_lr_complete_queued_withdrawal(msg, context); diff --git a/src/handle_query_contract_id.c b/src/handle_query_contract_id.c index 1f147c7..aca6df5 100644 --- a/src/handle_query_contract_id.c +++ b/src/handle_query_contract_id.c @@ -48,7 +48,7 @@ void handle_query_contract_id(ethQueryContractID_t *msg) { strlcpy(msg->version, "Liquid Restaking", msg->versionLength); break; - case KILN_LR_QUEUE_WITHDRAWAL: + case KILN_LR_QUEUE_WITHDRAWALS: strlcpy(msg->version, "Liquid Restaking", msg->versionLength); break; diff --git a/src/handle_query_contract_ui.c b/src/handle_query_contract_ui.c index 6edc296..08d1798 100644 --- a/src/handle_query_contract_ui.c +++ b/src/handle_query_contract_ui.c @@ -213,24 +213,36 @@ static bool deposit_into_stragey_ui_lr(ethQueryContractUI_t *msg, context_t *con return ret; } -static bool queue_withdrawal_ui_lr(ethQueryContractUI_t *msg, context_t *context) { +static bool queue_withdrawals_ui_lr(ethQueryContractUI_t *msg, context_t *context) { bool ret = false; - lr_queue_withdrawal_t *params = &context->param_data.lr_queue_withdrawal; + lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; switch (msg->screenIndex) { case 0: strlcpy(msg->title, "EigenLayer", msg->titleLength); - strlcpy(msg->msg, "Queue Withdrawal", msg->msgLength); - ret = true; - break; - - case 1: - strlcpy(msg->title, "Withdrawer", msg->titleLength); - strlcpy(msg->msg, params->withdrawer, msg->msgLength); + strlcpy(msg->msg, "Queue Withdrawals", msg->msgLength); ret = true; break; default: + if (params->queued_withdrawals_nb > 0) { + strlcpy(msg->title, "Strategy", msg->titleLength); + + // process the first displayable strategy and remove it from the list + for (size_t i = 0; i < LR_STRATEGIES_COUNT; i += 1) { + if (params->strategies[i]) { + strlcpy(msg->msg, lr_tickers[i], msg->msgLength); + params->strategies[i] = false; + break; + } + } + + params->queued_withdrawals_nb -= 1; + + ret = true; + break; + } + PRINTF("Received an invalid screenIndex\n"); break; } @@ -346,8 +358,8 @@ void handle_query_contract_ui(ethQueryContractUI_t *msg) { ret = deposit_into_stragey_ui_lr(msg, context); break; - case KILN_LR_QUEUE_WITHDRAWAL: - ret = queue_withdrawal_ui_lr(msg, context); + case KILN_LR_QUEUE_WITHDRAWALS: + ret = queue_withdrawals_ui_lr(msg, context); break; case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 5d1d80d..d81d6a0 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -27,7 +27,7 @@ // // LR selectors // --- 12. depositIntoStrategy(address,address,uint256) -// --- 13. queueWithdrawal(uint256[],address[],uint256[],address,bool) +// --- 13. queueWithdrawals((address[],uint256[],address)[]) // --- 14. // completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool) // --- 15. delegateTo(address,(bytes,uint256),bytes32) @@ -50,7 +50,7 @@ typedef enum { KILN_V2_MULTICLAIM, KILN_V2_CLAIM, KILN_LR_DEPOSIT_INTO_STRATEGY, - KILN_LR_QUEUE_WITHDRAWAL, + KILN_LR_QUEUE_WITHDRAWALS, KILN_LR_COMPLETE_QUEUED_WITHDRAWAL, KILN_LR_DELEGATE_TO, KILN_LR_UNDELEGATE, @@ -77,15 +77,19 @@ typedef enum { LR_DEPOSIT_INTO_STRATEGY_UNEXPECTED_PARAMETER, } lr_deposit_into_strategy_parameters; -// Parameters for LR queue withdrawal selector. +// Parameters for LR queue withdrawals selector. typedef enum { - LR_QUEUE_WITHDRAWAL_STRATEGY_INDEXES_OFFSET = 0, - LR_QUEUE_WITHDRAWAL_STRATEGIES_OFFSET, - LR_QUEUE_WITHDRAWAL_SHARES_OFFSET, - LR_QUEUE_WITHDRAWAL_WITHDRAWER, - LR_QUEUE_WITHDRAWAL_UNDELEGATEIFPOSSIBLE, - LR_QUEUE_WITHDRAWAL_UNEXPECTED_PARAMETER -} lr_queue_withdrawal_parameters; + LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET = 0, + LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH, + LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET, + LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET, + LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER, + LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH, + LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM, + LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH, + LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__SHARES_ITEM, + LR_QUEUE_WITHDRAWALS_UNEXPECTED_PARAMETER +} lr_queue_withdrawals_parameters; // Parameters for LR complete queued withdrawal selector. typedef enum { @@ -122,10 +126,13 @@ typedef struct { } lr_deposit_t; typedef struct { - uint16_t skip_offset; - bool go_to_offset; + // utils + uint16_t queued_withdrawals_nb; + uint16_t current_item_nb; + // display char withdrawer[ADDRESS_STR_LEN]; -} lr_queue_withdrawal_t; + bool strategies[LR_STRATEGIES_COUNT]; +} lr_queue_withdrawals_t; typedef struct { uint16_t skip_offset; @@ -143,7 +150,7 @@ typedef struct context_t { union { lr_complete_queued_withdrawal_t lr_complete_queued_withdrawal; lr_deposit_t lr_deposit; - lr_queue_withdrawal_t lr_queue_withdrawal; + lr_queue_withdrawals_t lr_queue_withdrawals; lr_delegate_to_t lr_delegate_to; } param_data; diff --git a/tests/cal/abis/0x858646372cc42e1a627fce94aa7a7033e7cf075a.json b/tests/cal/abis/0x858646372cc42e1a627fce94aa7a7033e7cf075a.json index 5c7da95..61309d3 100644 --- a/tests/cal/abis/0x858646372cc42e1a627fce94aa7a7033e7cf075a.json +++ b/tests/cal/abis/0x858646372cc42e1a627fce94aa7a7033e7cf075a.json @@ -25,33 +25,55 @@ { "inputs": [ { - "internalType": "uint256[]", - "name": "strategyIndexes", - "type": "uint256[]" - }, - { - "internalType": "address[]", - "name": "strategies", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "shares", - "type": "uint256[]" - }, - { - "internalType": "address", - "name": "withdrawer", - "type": "address" - }, + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "pendingWithdrawals", + "outputs": [ { "internalType": "bool", - "name": "undelegateIfPossible", + "name": "", "type": "bool" } ], - "name": "queueWithdrawal", - "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IStrategy[]", + "name": "strategies", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "shares", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "withdrawer", + "type": "address" + } + ], + "internalType": "struct IDelegationManager.QueuedWithdrawalParams[]", + "name": "queuedWithdrawalParams", + "type": "tuple[]" + } + ], + "name": "queueWithdrawals", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], "stateMutability": "nonpayable", "type": "function" }, diff --git a/tests/src/lrQueueWithdrawal.test.js b/tests/src/lrQueueWithdrawal.test.js deleted file mode 100644 index 0eb8910..0000000 --- a/tests/src/lrQueueWithdrawal.test.js +++ /dev/null @@ -1,68 +0,0 @@ -import 'core-js/stable'; -import 'regenerator-runtime/runtime'; -import { - waitForAppScreen, - kilnJSON, - zemu, - genericTx, - nano_models, - SPECULOS_ADDRESS, - txFromEtherscan, -} from './test.fixture'; -import { ethers } from 'ethers'; -import { parseEther, parseUnits } from 'ethers/lib/utils'; -import { ledgerService } from '@ledgerhq/hw-app-eth'; - -const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager - -const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; -const abi = require(abi_path); - -nano_models.forEach(function (model) { - test( - '[Nano ' + model.letter + '] LR Queue Withdrawal', - zemu(model, async (sim, eth) => { - const contract = new ethers.Contract(contractAddr, abi); - - const { data } = await contract.populateTransaction.queueWithdrawal( - [1, 2], - [ - '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH strat - '0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff', // ankrETH strat - ], - [42, 54], - '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // withdrawer - true // undelegateIfPossible - ); - - let unsignedTx = genericTx; - - unsignedTx.to = contractAddr; - unsignedTx.data = data; - unsignedTx.value = parseEther('0'); - - const serializedTx = ethers.utils - .serializeTransaction(unsignedTx) - .slice(2); - const resolution = await ledgerService.resolveTransaction( - serializedTx, - eth.loadConfig, - { - externalPlugins: true, - } - ); - const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 7 : 5; - - await waitForAppScreen(sim); - await sim.navigateAndCompareSnapshots( - '.', - model.name + '_lrQueueWithdrawal', - [right_clicks, 0] - ); - await tx; - }), - 30000 - ); -}); diff --git a/tests/src/lrQueueWithdrawals.test.js b/tests/src/lrQueueWithdrawals.test.js new file mode 100644 index 0000000..88c74fd --- /dev/null +++ b/tests/src/lrQueueWithdrawals.test.js @@ -0,0 +1,123 @@ +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { + waitForAppScreen, + kilnJSON, + zemu, + genericTx, + nano_models, + SPECULOS_ADDRESS, + txFromEtherscan, +} from './test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; + +const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager + +const pluginName = 'Kiln'; +const abi_path = `../cal/abis/${contractAddr}.json`; +const abi = require(abi_path); + +nano_models.forEach(function (model) { + test( + '[Nano ' + model.letter + '] LR Queue Withdrawals 1-2 dimension', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.queueWithdrawals([ + { + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff', // ankrETH + ], + shares: [parseEther('0.1'), parseEther('0.2')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + ]); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 7 : 5; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrQueueWithdrawals_1_2_dimension', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] LR Queue Withdrawals 2-3 dimension', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.queueWithdrawals([ + { + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff', // ankrETH + '0x57ba429517c3473B6d34CA9aCd56c0e735b94c02', // osETH + ], + shares: [parseEther('0.1'), parseEther('0.2'), parseEther('0.3')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + { + strategies: [ + '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa', // mETH + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH + ], + shares: [parseEther('0.5'), parseEther('0.1'), parseEther('0.2')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + ]); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 7 : 5; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrQueueWithdrawals_2_3_dimension', + [right_clicks, 0] + ); + await tx; + }), + +}); From 19537ac68b3536c65cc6e7d751638f17193213a1 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 22 Apr 2024 02:29:03 +0200 Subject: [PATCH 08/46] fix(lr/queueWithdrawal): invalid state transitions --- .gitmodules | 3 + app-ethereum | 1 + src/handle_finalize.c | 19 +++--- src/handle_provide_parameter.c | 96 +++++++++++++++++----------- src/handle_query_contract_ui.c | 59 ++++++++++------- src/kiln_plugin.h | 21 ++++-- tests/build_local_test_elfs.sh | 2 +- tests/cal/b2c.json | 9 ++- tests/src/lrQueueWithdrawals.test.js | 82 ++++++++++++++++++------ 9 files changed, 193 insertions(+), 99 deletions(-) create mode 160000 app-ethereum diff --git a/.gitmodules b/.gitmodules index 4318fd4..60c0a2f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "ethereum-plugin-sdk"] path = ethereum-plugin-sdk url = git@github.com:LedgerHQ/ethereum-plugin-sdk.git +[submodule "app-ethereum"] + path = app-ethereum + url = git@github.com:LedgerHQ/app-ethereum.git diff --git a/app-ethereum b/app-ethereum new file mode 160000 index 0000000..985dd92 --- /dev/null +++ b/app-ethereum @@ -0,0 +1 @@ +Subproject commit 985dd92cc2b23c65e609bf577a4f46624a75198d diff --git a/src/handle_finalize.c b/src/handle_finalize.c index d88f0d9..bdcdd89 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -25,19 +25,18 @@ void handle_finalize(ethPluginFinalize_t *msg) { msg->numScreens = 3; msg->result = ETH_PLUGIN_RESULT_OK; break; - case KILN_LR_QUEUE_WITHDRAWALS: - msg->numScreens = 1; - - lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; - params->queued_withdrawals_nb = 0; - for (size_t i = 0; i < LR_STRATEGIES_COUNT; i += 1) { - if (params->strategies[i]) { - msg->numScreens += 1; - params->queued_withdrawals_nb += 1; - } + case KILN_LR_QUEUE_WITHDRAWALS: { + { + lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; + // function + withdrawer screens + msg->numScreens = 2; + // one screen per withdrawal + msg->numScreens += params->strategies_count; + PRINTF("--- Queue Withdrawals: %d\n", params->strategies_count); } msg->result = ETH_PLUGIN_RESULT_OK; break; + } case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: msg->numScreens = 1; msg->result = ETH_PLUGIN_RESULT_OK; diff --git a/src/handle_provide_parameter.c b/src/handle_provide_parameter.c index 722c476..7a0c187 100644 --- a/src/handle_provide_parameter.c +++ b/src/handle_provide_parameter.c @@ -20,11 +20,11 @@ bool compare_addresses(const char a[ADDRESS_STR_LEN], const char b[ADDRESS_STR_L /* * If address is a known erc20, update lr display context with its name - * otherwise set it to unkwown (-1) + * otherwise set it to unkwown (UNKNOW_LR_STRATEGY) * * @param address: address to compare * - * @returns index of the erc20 in the context or -1 if not found + * @returns index of the erc20 in the context or UNKNOW_LR_STRATEGY if not found */ int find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { for (size_t i = 0; i < LR_STRATEGIES_COUNT; i++) { @@ -33,16 +33,16 @@ int find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { } } // if unknown erc20, indicate it - return -1; + return UNKNOW_LR_STRATEGY; } /* * If address is a known strategy, update lr display context with its name - * otherwise set it to unkwown (-1) + * otherwise set it to unkwown (UNKNOW_LR_STRATEGY) * * @param address: address to compare * - * @returns index of the strategy in the context or -1 if not found + * @returns index of the strategy in the context or UNKNOW_LR_STRATEGY if not found */ int find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { for (size_t i = 0; i < LR_STRATEGIES_COUNT; i++) { @@ -51,7 +51,7 @@ int find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { } } // if unknown strategy, indicate it - return -1; + return UNKNOW_LR_STRATEGY; } /* @@ -99,20 +99,22 @@ void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *context) { // queuedWithdrawals = (address strategies[],uint256 shares[],address withdrawer) // queueWithdrawals(queuedWithdrawals[]) - // example for queue withdrawals with 2 strategies + // example for 2 queue withdrawals with 2 strategies each (2x2 dimension) // [ 0] selector - // [ 36] queuedWithdrawals_offset - // [ 68] queuedWithdrawals_length - // [100] queuedWithdrawals_0 - // [100] strategies_offset - // [132] shares_offset - // [164] withdrawer - // [196] strategies_length - // [228] strategies_0 - // [260] strategies_1 - // [292] shares_length - // [324] shares_0 - // [356] shares_1 + // [ 4] queuedWithdrawals_offset + // [ 36] queuedWithdrawals_length + // [ 68] queuedWithdrawals_0_offset + // [100] queuedWithdrawals_1_offset + // [132] queuedWithdrawals_0 + // [132] strategies_offset + // [164] shares_offset + // [196] withdrawer + // [228] strategies_length + // [260] strategies_0 + // [292] strategies_1 + // [324] shares_length + // [356] shares_0 + // [388] shares_1 // [388] queuedWithdrawals_1 // [388] strategies_offset // [420] shares_offset @@ -133,16 +135,32 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH; break; case LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH: - params->queued_withdrawals_nb = U2BE(msg->parameter, PARAMETER_LENGTH); - context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET; + U2BE_from_parameter(msg->parameter, ¶ms->queued_withdrawals_count); + params->current_item_count = params->queued_withdrawals_count; + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET; break; // 2. entering a queuedWithdrawal + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET: + // we skip all the queuewithdrawal structs offsets + PRINTF("CURRENT ITEM COUNT: %d\n", params->current_item_count); + if (params->current_item_count > 0) { + params->current_item_count -= 1; + } + + if (params->current_item_count == 0) { + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET; + } + break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET: context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET: - context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER; + if (params->withdrawer[0] == '\0') { + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER; + } else { + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH; + } break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER: // EigenLayer contract does not allow withdrawer to be different than msg.sender @@ -157,7 +175,8 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH: // get number of item to parse - params->current_item_nb = U2BE(msg->parameter, PARAMETER_LENGTH); + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM: @@ -167,39 +186,42 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); int strategy_index = find_lr_known_strategy(address_buffer); - if (strategy_index != -1) { - params->strategies[strategy_index] = true; - } + params->strategies[params->strategies_count] = + (strategy_index != UNKNOW_LR_STRATEGY) ? strategy_index + 1 : UNKNOW_LR_STRATEGY; + PRINTF("STRATEGY #: %d STRATEGY: %d\n", params->strategies_count, strategy_index); // we just processed one strategy item - params->current_item_nb -= 1; - if (params->current_item_nb == 0) { + params->strategies_count += 1; + params->current_item_count -= 1; + if (params->current_item_count == 0) { // when we arrive at the end of the strategies array we go to the shares array context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH; } break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH: - // get number of item to parse - params->current_item_nb = U2BE(msg->parameter, PARAMETER_LENGTH); + // get number of items to parse + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__SHARES_ITEM; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__SHARES_ITEM: // we skip parsing shares item as they are not needed for clearsigning // as not having ETH / ERC20 amount to display would confuse users - params->current_item_nb -= 1; - if (params->current_item_nb == 0) { + if (params->current_item_count > 0) { + params->current_item_count -= 1; + } + if (params->current_item_count == 0) { // here we arrive at the end of the queuedWithdrawal array element // check if there are other queuedWithdrawals to parse - params->queued_withdrawals_nb -= 1; - if (params->queued_withdrawals_nb == 0) { + params->queued_withdrawals_count -= 1; + if (params->queued_withdrawals_count == 0) { // if not we finished parsing context->next_param = LR_QUEUE_WITHDRAWALS_UNEXPECTED_PARAMETER; } else { - // if there are other queuedWithdrawals we go back to parsing the strategies - // offset - context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET; + // if there are other queuedWithdrawals we go back to parsing the + // next queueWithdrawal struct offset + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET; } } break; diff --git a/src/handle_query_contract_ui.c b/src/handle_query_contract_ui.c index 08d1798..7ef2c94 100644 --- a/src/handle_query_contract_ui.c +++ b/src/handle_query_contract_ui.c @@ -185,7 +185,7 @@ static bool deposit_into_stragey_ui_lr(ethQueryContractUI_t *msg, context_t *con break; case 1: strlcpy(msg->title, "Strategy", msg->titleLength); - if (params->strategy_to_display == -1 || + if (params->strategy_to_display == UNKNOW_LR_STRATEGY || params->strategy_to_display >= LR_STRATEGIES_COUNT) { strlcpy(msg->msg, "UNKNOWN", msg->msgLength); } else { @@ -195,15 +195,15 @@ static bool deposit_into_stragey_ui_lr(ethQueryContractUI_t *msg, context_t *con break; case 2: strlcpy(msg->title, "Amount", msg->titleLength); - amountToString( - params->erc20_amount_to_display, - sizeof(params->erc20_amount_to_display), - ERC20_DECIMALS, - params->erc20_to_display == -1 || params->erc20_to_display >= LR_STRATEGIES_COUNT - ? "UNKNOWN" - : lr_tickers[params->erc20_to_display], - msg->msg, - msg->msgLength); + amountToString(params->erc20_amount_to_display, + sizeof(params->erc20_amount_to_display), + ERC20_DECIMALS, + params->erc20_to_display == UNKNOW_LR_STRATEGY || + params->erc20_to_display >= LR_STRATEGIES_COUNT + ? "UNKNOWN" + : lr_tickers[params->erc20_to_display], + msg->msg, + msg->msgLength); ret = true; break; default: @@ -224,27 +224,40 @@ static bool queue_withdrawals_ui_lr(ethQueryContractUI_t *msg, context_t *contex ret = true; break; - default: - if (params->queued_withdrawals_nb > 0) { - strlcpy(msg->title, "Strategy", msg->titleLength); - - // process the first displayable strategy and remove it from the list - for (size_t i = 0; i < LR_STRATEGIES_COUNT; i += 1) { - if (params->strategies[i]) { - strlcpy(msg->msg, lr_tickers[i], msg->msgLength); - params->strategies[i] = false; - break; + case 1: + strlcpy(msg->title, "Withdrawer", msg->titleLength); + strlcpy(msg->msg, params->withdrawer, msg->msgLength); + ret = true; + break; + + default: { + { + // removing the first screen to current screen index + // to get the index of the withdrawal + uint8_t withdrawal_index = msg->screenIndex - 2; + + if (withdrawal_index < params->strategies_count) { + strlcpy(msg->title, "Strategy", msg->titleLength); + uint8_t strategy = params->strategies[withdrawal_index]; + + if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { + char x[4] = {65 + strategy, + 65 + withdrawal_index, + 65 + params->strategies_count, + '\0'}; + + strlcpy(msg->msg, x, msg->msgLength); + } else { + strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); } } - params->queued_withdrawals_nb -= 1; - ret = true; break; } - PRINTF("Received an invalid screenIndex\n"); break; + } } return ret; } diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index d81d6a0..4478d85 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -81,6 +81,7 @@ typedef enum { typedef enum { LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET = 0, LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH, + LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET, LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET, LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET, LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER, @@ -125,13 +126,23 @@ typedef struct { uint8_t erc20_amount_to_display[INT256_LENGTH]; } lr_deposit_t; +#define UNKNOW_LR_STRATEGY 255 + typedef struct { - // utils - uint16_t queued_withdrawals_nb; - uint16_t current_item_nb; - // display + // -- utils + uint16_t queued_withdrawals_count; + uint16_t current_item_count; + // -- display + uint8_t strategies_count; char withdrawer[ADDRESS_STR_LEN]; - bool strategies[LR_STRATEGIES_COUNT]; + // list of strategies indexes **INCREMENTED BY 1** to display in the UI + // 0 is reserved for end of array + // UNKNOW_LR_STRATEGY is used to display the "unknown" strategy + // (i) in practice, we should not encounter more than + // LR_STRATEGIES_COUNT +~ a few potential unsupported + // strategies in the plugin. So * 3 should be a good enough buffer. + // (ii) in practice there should not be more than (2 ** 8) - 2 known strategies + uint8_t strategies[LR_STRATEGIES_COUNT * 3]; } lr_queue_withdrawals_t; typedef struct { diff --git a/tests/build_local_test_elfs.sh b/tests/build_local_test_elfs.sh index 19b583b..f87a185 100755 --- a/tests/build_local_test_elfs.sh +++ b/tests/build_local_test_elfs.sh @@ -3,7 +3,7 @@ # FILL THESE WITH YOUR OWN SDKs PATHS and APP-ETHEREUM's ROOT NANOS_SDK=$NANOS_SDK NANOX_SDK=$NANOX_SDK -APP_ETHEREUM=${APP_ETHEREUM:-"/plugin_dev/app-ethereum"} +APP_ETHEREUM=${APP_ETHEREUM:-"../app-ethereum"} set -e diff --git a/tests/cal/b2c.json b/tests/cal/b2c.json index 418129b..0c14430 100644 --- a/tests/cal/b2c.json +++ b/tests/cal/b2c.json @@ -79,8 +79,8 @@ "method": "depositIntoStrategy", "plugin": "Kiln" }, - "0xf123991e": { - "method": "queueWithdrawal", + "0x0dd8dd02": { + "method": "queueWithdrawals", "plugin": "Kiln" }, "0xf3be65d3": { @@ -103,7 +103,6 @@ } } } - } -], -"name": "Kiln" + ], + "name": "Kiln" } \ No newline at end of file diff --git a/tests/src/lrQueueWithdrawals.test.js b/tests/src/lrQueueWithdrawals.test.js index 88c74fd..3b1706d 100644 --- a/tests/src/lrQueueWithdrawals.test.js +++ b/tests/src/lrQueueWithdrawals.test.js @@ -1,21 +1,12 @@ import 'core-js/stable'; import 'regenerator-runtime/runtime'; -import { - waitForAppScreen, - kilnJSON, - zemu, - genericTx, - nano_models, - SPECULOS_ADDRESS, - txFromEtherscan, -} from './test.fixture'; +import { waitForAppScreen, zemu, genericTx, nano_models } from './test.fixture'; import { ethers } from 'ethers'; -import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { parseEther } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager -const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; const abi = require(abi_path); @@ -74,18 +65,18 @@ nano_models.forEach(function (model) { const { data } = await contract.populateTransaction.queueWithdrawals([ { strategies: [ - '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH - '0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff', // ankrETH - '0x57ba429517c3473B6d34CA9aCd56c0e735b94c02', // osETH + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff', // ankrETH + '0x57ba429517c3473B6d34CA9aCd56c0e735b94c02', // osETH ], shares: [parseEther('0.1'), parseEther('0.2'), parseEther('0.3')], withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', }, { strategies: [ - '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa', // mETH - '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH - '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH + '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa', // mETH + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH ], shares: [parseEther('0.5'), parseEther('0.1'), parseEther('0.2')], withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', @@ -118,6 +109,61 @@ nano_models.forEach(function (model) { [right_clicks, 0] ); await tx; - }), + }) + ); + + test( + '[Nano ' + model.letter + '] LR Queue Withdrawals unknown strategy', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + + const { data } = await contract.populateTransaction.queueWithdrawals([ + { + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // unkwown strategy + '0x57ba429517c3473B6d34CA9aCd56c0e735b94c02', // osETH + ], + shares: [parseEther('0.1'), parseEther('0.2'), parseEther('0.3')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + { + strategies: [ + '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa', // mETH + '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH + '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // unkwown strategy + ], + shares: [parseEther('0.5'), parseEther('0.1'), parseEther('0.2')], + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + }, + ]); + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 9 : 7; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrQueueWithdrawals_2_3_dimension_with_unknowns', + [right_clicks, 0] + ); + await tx; + }) + ); }); From e9b75c6a00f57318591bb1b44ad0c9236eb35013 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 22 Apr 2024 11:10:41 +0200 Subject: [PATCH 09/46] fix(lr/queueWithdrawals): invalid state transition --- src/handle_provide_parameter.c | 19 ++++++++++-------- src/handle_query_contract_ui.c | 7 +------ .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 380 bytes .../00002.png | Bin 0 -> 432 bytes .../00003.png | Bin 0 -> 509 bytes .../00004.png | Bin 0 -> 497 bytes .../00005.png | Bin 0 -> 438 bytes .../00006.png | Bin 0 -> 349 bytes .../00007.png | Bin 0 -> 368 bytes .../00008.png | Bin 0 -> 358 bytes .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 380 bytes .../00002.png | Bin 0 -> 432 bytes .../00003.png | Bin 0 -> 509 bytes .../00004.png | Bin 0 -> 497 bytes .../00005.png | Bin 0 -> 438 bytes .../00006.png | Bin 0 -> 349 bytes .../00007.png | Bin 0 -> 368 bytes .../00008.png | Bin 0 -> 353 bytes .../00009.png | Bin 0 -> 341 bytes .../00010.png | Bin 0 -> 349 bytes .../00011.png | Bin 0 -> 345 bytes .../00012.png | Bin 0 -> 358 bytes .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 380 bytes .../00002.png | Bin 0 -> 432 bytes .../00003.png | Bin 0 -> 509 bytes .../00004.png | Bin 0 -> 497 bytes .../00005.png | Bin 0 -> 438 bytes .../00006.png | Bin 0 -> 349 bytes .../00007.png | Bin 0 -> 396 bytes .../00008.png | Bin 0 -> 353 bytes .../00009.png | Bin 0 -> 341 bytes .../00010.png | Bin 0 -> 345 bytes .../00011.png | Bin 0 -> 396 bytes .../00012.png | Bin 0 -> 358 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 426 bytes .../00002.png | Bin 0 -> 507 bytes .../00003.png | Bin 0 -> 811 bytes .../00004.png | Bin 0 -> 402 bytes .../00005.png | Bin 0 -> 418 bytes .../00006.png | Bin 0 -> 415 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 426 bytes .../00002.png | Bin 0 -> 507 bytes .../00003.png | Bin 0 -> 811 bytes .../00004.png | Bin 0 -> 402 bytes .../00005.png | Bin 0 -> 418 bytes .../00006.png | Bin 0 -> 410 bytes .../00007.png | Bin 0 -> 392 bytes .../00008.png | Bin 0 -> 402 bytes .../00009.png | Bin 0 -> 393 bytes .../00010.png | Bin 0 -> 415 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 426 bytes .../00002.png | Bin 0 -> 507 bytes .../00003.png | Bin 0 -> 811 bytes .../00004.png | Bin 0 -> 402 bytes .../00005.png | Bin 0 -> 445 bytes .../00006.png | Bin 0 -> 410 bytes .../00007.png | Bin 0 -> 392 bytes .../00008.png | Bin 0 -> 393 bytes .../00009.png | Bin 0 -> 445 bytes .../00010.png | Bin 0 -> 415 bytes tests/src/lrQueueWithdrawals.test.js | 14 ++++++------- 67 files changed, 19 insertions(+), 21 deletions(-) create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00000.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00002.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00005.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00006.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00008.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00000.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00001.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00002.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00003.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00004.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00005.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00006.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00007.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00008.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00009.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00010.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00011.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00012.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00000.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00001.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00002.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00004.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00008.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00009.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00010.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00000.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00001.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00002.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00004.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00000.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00001.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00002.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00003.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00004.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00005.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00006.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00007.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00008.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00009.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00010.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00000.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00001.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00002.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00004.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00008.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00009.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00010.png diff --git a/src/handle_provide_parameter.c b/src/handle_provide_parameter.c index 7a0c187..92a410e 100644 --- a/src/handle_provide_parameter.c +++ b/src/handle_provide_parameter.c @@ -156,11 +156,7 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET: - if (params->withdrawer[0] == '\0') { - context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER; - } else { - context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH; - } + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER: // EigenLayer contract does not allow withdrawer to be different than msg.sender @@ -171,13 +167,20 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co copy_address(buffer, msg->parameter, sizeof(buffer)); getEthDisplayableAddress(buffer, params->withdrawer, sizeof(params->withdrawer), 0); } + PRINTF("WITHDRAWER: %s\n", params->withdrawer); context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH: // get number of item to parse U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + PRINTF("STRATEGIES LENGTH: %d\n", params->current_item_count); - context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM; + if (params->current_item_count == 0) { + // if no strategies we go to the shares array + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH; + } else { + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM; + } break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM: // get strategy we need to display @@ -220,8 +223,8 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS_UNEXPECTED_PARAMETER; } else { // if there are other queuedWithdrawals we go back to parsing the - // next queueWithdrawal struct offset - context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET; + // next queueWithdrawal struct + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET; } } break; diff --git a/src/handle_query_contract_ui.c b/src/handle_query_contract_ui.c index 7ef2c94..38207ec 100644 --- a/src/handle_query_contract_ui.c +++ b/src/handle_query_contract_ui.c @@ -241,12 +241,7 @@ static bool queue_withdrawals_ui_lr(ethQueryContractUI_t *msg, context_t *contex uint8_t strategy = params->strategies[withdrawal_index]; if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { - char x[4] = {65 + strategy, - 65 + withdrawal_index, - 65 + params->strategies_count, - '\0'}; - - strlcpy(msg->msg, x, msg->msgLength); + strlcpy(msg->msg, "UNKNOWN", msg->msgLength); } else { strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); } diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00000.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..8d84cc70fea8013b7e8b25c0982ce142fa103d5c GIT binary patch literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..c978af0baf12daf4747b904387f03ec16315336b GIT binary patch literal 380 zcmV-?0fYXDP)A?o1(9QaD50hV0000?&F2u(JOS>)wsm9y-rfVa z!skfau0E!-66Dpa#1Vj-Tcng}Ebqpu)M@C07Slkw*;uQH?&t>y9?#gOrL_cd#yO3Pwgx}%-; zw>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE$za67WO)7|KVzNRA5z3jdyO~NB^7P| zRx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw<_EZ2vs=insa=EO(EcW1FfP*)lDibP zyIOeAjv2HAw3AJnl`++hU}s&0AHsEy;_m4{bc3_A#x1Yqc)vne7qkii4`E;In*;y= agyIWiG1|MBe_I9s0000ZyZE5m%{7svIb8lbY#2H~>OdR=9o(D@eRB z&a@@AvWOud9pnGD=9t#ny=XsTBzC3UiqC3r6AL;d9(XozFWhug&n5*Z+4eW?`wG#c1nV%)07t z)`i+5HF#Cn-cgIG906DWpJ24FYQH!r)f#+24F|!L2ymozz=IP+qbiXw@{5(LEkF{7 ziADItJbcWsN41sJOH;cn_KDuMv*;djhhjzL zhO?jME&$TH=j|*)Xf@Npe?f>w*14eL+Yj>9%ZE6@6z;fWISxl)Y#pGGB z)~KDf-t+WiOYkl+9;!w+y6>tW2!bF8g4^%~Jr#&C0X|@d00000NkvXXu0mjf{gm*e literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..53e7aa041e7dc3e9453476b700c868cce35e5416 GIT binary patch literal 497 zcmVgw{{Ii|qAqrhIbg5g(6!>ZN=5JsbVQUSNs=V}yq=ritjGk^UQM+_DTda; zOS@$j>g>J(HV0NI#ne_HJQVLZ!36!>kE>|&deZXPc*FAe{4T{JEV~!6x^*pQ5&3;7l?Koym5Q7p0j!t=O)}7aQ$A^0172|KV31 zlTqJ=%p9muZK+RBqkcR#RlkX5_5=70b}37)1_-;FEMrr%&Bn}V#{h^Z{zJ@?ZZrnE z$(hSKWjoRC;SIn^U=r)7es%)279VPUuc|eymvOo6$HEd+2YNukJ26lrk(DW_@@*6K+tZ(XZNmzKc< zwfGOfQA4Y;zp`ur`vl8v746!KUDOe(hh(%iF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZ zm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&UrW?S65vFYo8Ui;l}^tK&E^OPGD3n~}% zzKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwnj)ts`EeQhpElb~sdp$$e=-@EA;PGdQ zz3p^DyDGy&n>?kIJ*6TBEXF)9>x0<=fCNVR*w7DjV%w_KJ&oA`$f3stP4Z~Tstlc0 zY}4(*)Bxxusr|U;YuaSnlI`8#<1+NL11P;#C_I^bcwgKF0M4i g5(GgI1VL~G-U}%#VS}wMHUIzs07*qoM6N<$f<$)Cr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00006.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..827de905d9c320a7426bc6a64da96948880e1ecd GIT binary patch literal 349 zcmV-j0iyniP)e2@4OhMANgYis7ZIHZA%u`s*`g;PA|mJUZEx?mc`S<- zz#Hj*b|_$0fDU}KAW~Pii(UP!=^C@*d)MVWtfzFh7~^TMXnCs<$}4&TBJvxp^^k0O z4a2SdUG&x z9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^91y0p6x1M+wXzTz4JQL?;1#JlxtkHM z;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35KaS{Q?cF0TUes$K1?Z%6HF*CtV6eAM v$dgcjU?5XaeyLeZ_w(+|gb+dqA=C2#1oN!@#*^C^00000NkvXXu0mjf1xT3z literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..1f3bd76943eb3d66ccc709e45f8ad422d63be352 GIT binary patch literal 368 zcmV-$0gwKPP)NOyFrpGVg?kOcS>%=JZP3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0 zJ@6fyN3Z$0y00cPn@5OMg z^E=RfJOr`!O)g+B<9N&fTy`!P0{FR|1^_9DPD%y0Sd)_^Ns=Tpy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBK?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00001.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..c978af0baf12daf4747b904387f03ec16315336b GIT binary patch literal 380 zcmV-?0fYXDP)A?o1(9QaD50hV0000?&F2u(JOS>)wsm9y-rfVa z!skfau0E!-66Dpa#1Vj-Tcng}Ebqpu)M@C07Slkw*;uQH?&t>y9?#gOrL_cd#yO3Pwgx}%-; zw>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE$za67WO)7|KVzNRA5z3jdyO~NB^7P| zRx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw<_EZ2vs=insa=EO(EcW1FfP*)lDibP zyIOeAjv2HAw3AJnl`++hU}s&0AHsEy;_m4{bc3_A#x1Yqc)vne7qkii4`E;In*;y= agyIWiG1|MBe_I9s0000ZyZE5m%{7svIb8lbY#2H~>OdR=9o(D@eRB z&a@@AvWOud9pnGD=9t#ny=XsTBzC3UiqC3r6AL;d9(XozFWhug&n5*Z+4eW?`wG#c1nV%)07t z)`i+5HF#Cn-cgIG906DWpJ24FYQH!r)f#+24F|!L2ymozz=IP+qbiXw@{5(LEkF{7 ziADItJbcWsN41sJOH;cn_KDuMv*;djhhjzL zhO?jME&$TH=j|*)Xf@Npe?f>w*14eL+Yj>9%ZE6@6z;fWISxl)Y#pGGB z)~KDf-t+WiOYkl+9;!w+y6>tW2!bF8g4^%~Jr#&C0X|@d00000NkvXXu0mjf{gm*e literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00004.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..53e7aa041e7dc3e9453476b700c868cce35e5416 GIT binary patch literal 497 zcmVgw{{Ii|qAqrhIbg5g(6!>ZN=5JsbVQUSNs=V}yq=ritjGk^UQM+_DTda; zOS@$j>g>J(HV0NI#ne_HJQVLZ!36!>kE>|&deZXPc*FAe{4T{JEV~!6x^*pQ5&3;7l?Koym5Q7p0j!t=O)}7aQ$A^0172|KV31 zlTqJ=%p9muZK+RBqkcR#RlkX5_5=70b}37)1_-;FEMrr%&Bn}V#{h^Z{zJ@?ZZrnE z$(hSKWjoRC;SIn^U=r)7es%)279VPUuc|eymvOo6$HEd+2YNukJ26lrk(DW_@@*6K+tZ(XZNmzKc< zwfGOfQA4Y;zp`ur`vl8v746!KUDOe(hh(%iF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZ zm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&UrW?S65vFYo8Ui;l}^tK&E^OPGD3n~}% zzKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwnj)ts`EeQhpElb~sdp$$e=-@EA;PGdQ zz3p^DyDGy&n>?kIJ*6TBEXF)9>x0<=fCNVR*w7DjV%w_KJ&oA`$f3stP4Z~Tstlc0 zY}4(*)Bxxusr|U;YuaSnlI`8#<1+NL11P;#C_I^bcwgKF0M4i g5(GgI1VL~G-U}%#VS}wMHUIzs07*qoM6N<$f<$)Cr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00006.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..827de905d9c320a7426bc6a64da96948880e1ecd GIT binary patch literal 349 zcmV-j0iyniP)e2@4OhMANgYis7ZIHZA%u`s*`g;PA|mJUZEx?mc`S<- zz#Hj*b|_$0fDU}KAW~Pii(UP!=^C@*d)MVWtfzFh7~^TMXnCs<$}4&TBJvxp^^k0O z4a2SdUG&x z9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^91y0p6x1M+wXzTz4JQL?;1#JlxtkHM z;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35KaS{Q?cF0TUes$K1?Z%6HF*CtV6eAM v$dgcjU?5XaeyLeZ_w(+|gb+dqA=C2#1oN!@#*^C^00000NkvXXu0mjf1xT3z literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..1f3bd76943eb3d66ccc709e45f8ad422d63be352 GIT binary patch literal 368 zcmV-$0gwKPP)NOyFrpGVg?kOcS>%=JZP3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0 zJ@6fyN3Z$0y00cPn@5OMg z^E=RfJOr`!O)g+B<9N&fTy`!P0{FR|1^_9DPD%y0Sd)_^Ns=T{u2q zfHvY^n+lj6zyn`wh}PxpVVAEJT`_I=+;us2=_%eF#&{bX&itwo$}`#kBDzMa9g??R z!*Ht~3;|9=N-?I9?&w}WkFIeb3GgR`>zm9Nl3)m6WO*&3hcm^AE#_l*{Elon)IvMh z1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=UZQ**SBzRHJffPVPBv9v8(7rTa@VK7> zf++ROLLLE5rqcj21v!hFlOD@OQ4~c{6f5usKe?e^Qb@cb00000NkvXXu0mjf(BPQ< literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00009.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9f05a0a8b72e6003ed4c63b990c15e5cc59db4 GIT binary patch literal 341 zcmV-b0jmCqP)MAqyx$ANsI#PMp%<(j6TK?1s n3J}b&C1~DlnGiwe2@4OhMANgYis7ZIHZA%u`s*`g;PA|mJUZEx?mc`S<- zz#Hj*b|_$0fDU}KAW~Pii(UP!=^C@*d)MVWtfzFh7~^TMXnCs<$}4&TBJvxp^^k0O z4a2SdUG&x z9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^91y0p6x1M+wXzTz4JQL?;1#JlxtkHM z;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35KaS{Q?cF0TUes$K1?Z%6HF*CtV6eAM v$dgcjU?5XaeyLeZ_w(+|gb+dqA=C2#1oN!@#*^C^00000NkvXXu0mjf1xT3z literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00011.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..bceed68d6a9b6e6ceee1ec9be8c8912b8456c5cf GIT binary patch literal 345 zcmV-f0jB9KbEBy zz#AEVb}C?IK%Mw%LX>XZHoNt+s;kV*_pZx%=t$LFGsnxIX?d%W$}8Ie5&6y5I3>GL z!wBm*7y?|Vk`kDSALv%U5nb~@65t_J=!?u4l3)lBRCzC>O-r?6D|?KH_n57QMtBQ* z;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L1A<#iK@Bols|um<8|3CL2xlEu+0bq) z#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#lPQrH?JlvvYea)N#43<&v8v_z7LCH{n rWKc^`duL+SlR36@gb+dqAw=^5ZVs13Ub>3!00000NkvXXu0mjfS!R?B literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00012.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..eeec6324a1f33b9b155d3e979728a086251adb10 GIT binary patch literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBK?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00001.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..c978af0baf12daf4747b904387f03ec16315336b GIT binary patch literal 380 zcmV-?0fYXDP)A?o1(9QaD50hV0000?&F2u(JOS>)wsm9y-rfVa z!skfau0E!-66Dpa#1Vj-Tcng}Ebqpu)M@C07Slkw*;uQH?&t>y9?#gOrL_cd#yO3Pwgx}%-; zw>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE$za67WO)7|KVzNRA5z3jdyO~NB^7P| zRx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw<_EZ2vs=insa=EO(EcW1FfP*)lDibP zyIOeAjv2HAw3AJnl`++hU}s&0AHsEy;_m4{bc3_A#x1Yqc)vne7qkii4`E;In*;y= agyIWiG1|MBe_I9s0000ZyZE5m%{7svIb8lbY#2H~>OdR=9o(D@eRB z&a@@AvWOud9pnGD=9t#ny=XsTBzC3UiqC3r6AL;d9(XozFWhug&n5*Z+4eW?`wG#c1nV%)07t z)`i+5HF#Cn-cgIG906DWpJ24FYQH!r)f#+24F|!L2ymozz=IP+qbiXw@{5(LEkF{7 ziADItJbcWsN41sJOH;cn_KDuMv*;djhhjzL zhO?jME&$TH=j|*)Xf@Npe?f>w*14eL+Yj>9%ZE6@6z;fWISxl)Y#pGGB z)~KDf-t+WiOYkl+9;!w+y6>tW2!bF8g4^%~Jr#&C0X|@d00000NkvXXu0mjf{gm*e literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00004.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..53e7aa041e7dc3e9453476b700c868cce35e5416 GIT binary patch literal 497 zcmVgw{{Ii|qAqrhIbg5g(6!>ZN=5JsbVQUSNs=V}yq=ritjGk^UQM+_DTda; zOS@$j>g>J(HV0NI#ne_HJQVLZ!36!>kE>|&deZXPc*FAe{4T{JEV~!6x^*pQ5&3;7l?Koym5Q7p0j!t=O)}7aQ$A^0172|KV31 zlTqJ=%p9muZK+RBqkcR#RlkX5_5=70b}37)1_-;FEMrr%&Bn}V#{h^Z{zJ@?ZZrnE z$(hSKWjoRC;SIn^U=r)7es%)279VPUuc|eymvOo6$HEd+2YNukJ26lrk(DW_@@*6K+tZ(XZNmzKc< zwfGOfQA4Y;zp`ur`vl8v746!KUDOe(hh(%iF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZ zm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&UrW?S65vFYo8Ui;l}^tK&E^OPGD3n~}% zzKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwnj)ts`EeQhpElb~sdp$$e=-@EA;PGdQ zz3p^DyDGy&n>?kIJ*6TBEXF)9>x0<=fCNVR*w7DjV%w_KJ&oA`$f3stP4Z~Tstlc0 zY}4(*)Bxxusr|U;YuaSnlI`8#<1+NL11P;#C_I^bcwgKF0M4i g5(GgI1VL~G-U}%#VS}wMHUIzs07*qoM6N<$f<$)Cr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..827de905d9c320a7426bc6a64da96948880e1ecd GIT binary patch literal 349 zcmV-j0iyniP)e2@4OhMANgYis7ZIHZA%u`s*`g;PA|mJUZEx?mc`S<- zz#Hj*b|_$0fDU}KAW~Pii(UP!=^C@*d)MVWtfzFh7~^TMXnCs<$}4&TBJvxp^^k0O z4a2SdUG&x z9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^91y0p6x1M+wXzTz4JQL?;1#JlxtkHM z;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35KaS{Q?cF0TUes$K1?Z%6HF*CtV6eAM v$dgcjU?5XaeyLeZ_w(+|gb+dqA=C2#1oN!@#*^C^00000NkvXXu0mjf1xT3z literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d556916108fab7602b510c4ceb72780470fd7e GIT binary patch literal 396 zcmV;70dxL|P)Iy8 zr2wrOf7?p|GXu)N7ZZYu<+WNY+lrzvQ~RBl_bNSA7S$N%O4V}LMJUhc0T9t|wAvxr z^%{m-{a^^NA(j-wjM|Q__4DW&2a*6MAzaTgV@QG_fU(NAB3iW+JGQXL@OY1_t)UjJ zjXm%gtF9mN?`wp~WwG|TJHss_%q#Cgo1 z+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M_MYAcQn|MhAPOTttCM5rp~aBiPXhlF9@so?J=>BbNs=T{u2q zfHvY^n+lj6zyn`wh}PxpVVAEJT`_I=+;us2=_%eF#&{bX&itwo$}`#kBDzMa9g??R z!*Ht~3;|9=N-?I9?&w}WkFIeb3GgR`>zm9Nl3)m6WO*&3hcm^AE#_l*{Elon)IvMh z1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=UZQ**SBzRHJffPVPBv9v8(7rTa@VK7> zf++ROLLLE5rqcj21v!hFlOD@OQ4~c{6f5usKe?e^Qb@cb00000NkvXXu0mjf(BPQ< literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00009.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9f05a0a8b72e6003ed4c63b990c15e5cc59db4 GIT binary patch literal 341 zcmV-b0jmCqP)MAqyx$ANsI#PMp%<(j6TK?1s n3J}b&C1~DlnGiw9KbEBy zz#AEVb}C?IK%Mw%LX>XZHoNt+s;kV*_pZx%=t$LFGsnxIX?d%W$}8Ie5&6y5I3>GL z!wBm*7y?|Vk`kDSALv%U5nb~@65t_J=!?u4l3)lBRCzC>O-r?6D|?KH_n57QMtBQ* z;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L1A<#iK@Bols|um<8|3CL2xlEu+0bq) z#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#lPQrH?JlvvYea)N#43<&v8v_z7LCH{n rWKc^`duL+SlR36@gb+dqAw=^5ZVs13Ub>3!00000NkvXXu0mjfS!R?B literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d556916108fab7602b510c4ceb72780470fd7e GIT binary patch literal 396 zcmV;70dxL|P)Iy8 zr2wrOf7?p|GXu)N7ZZYu<+WNY+lrzvQ~RBl_bNSA7S$N%O4V}LMJUhc0T9t|wAvxr z^%{m-{a^^NA(j-wjM|Q__4DW&2a*6MAzaTgV@QG_fU(NAB3iW+JGQXL@OY1_t)UjJ zjXm%gtF9mN?`wp~WwG|TJHss_%q#Cgo1 z+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M_MYAcQn|MhAPOTttCM5rp~aBiPXhlF9@so?J=>BbNs=Tpy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBvpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*S8t?o9QcTs66hz+;uTfWUk?)RtS zU5v&_?$vMdUf1qoWZq;VKG8%W$Mk1$I=A``&I1=zl$GL+wa;d7xj+Bn;yWw{yxsbX zgc}mXoX$VcWH@;^3217AWLcoaMxUHFuToS`n^#WT@_$L~+1zs9|FySG&zF6l_BLa$ z_%eC@zf-Qx7volcH{-6-++}A2YgcLCPJ7K9ZJB-Vr|l%Sd1AubVsD)LcrJT0_wCQK z`!19OFaP=5SnGaS|3x#stqE!Y0FS(tu3p779qfu8x}rkQ7# zzxD}_Gfny=Xkadpoxkl?u&G?>3gtJd-&EJU-;w3K+k&?&?#8Z^*G*?`KH9bD`B%Fy zy!n3*{uI4xA0YS0e93cTH;0HX*?)X^1VVSulDPB0SzWk!?Ta{2pdo>T+3~AXY>ubM RNT+~AJzf1=);T3K0RWFpxJv*4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00002.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbdac7f8d35233cafad2947c0c7f25a72f3885c GIT binary patch literal 507 zcmV134`Wt?v;g`r9#?=l4`S&8nb-~+ z=_+Hh*-+5h`kLrXDVtcL2ybiS%p2GG>_3oR$}tqrL1m-)X}U)==V_bPnZ&hojnGLqm=8nYQWZr3f({i??Q>N8>8%-Z^;% zD3S7h^}Ag0zr)UEqx5Blo{UVHg_;M_C}jU2w$IwnRZZP!PN~6dh18KvW7J@$X|oV+ xXe5~$EJb<&000000000000000004kxegO1`#_>5zw}=1$002ovPDHLkV1l>O>a_p> literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..343850a22a7448ea232679f2296b3c327c526eae GIT binary patch literal 811 zcmV+`1JwM9P)LFNuq+hPRQ`of(U zA%qY@$bL*}sO$7}ODMyNbusxhReMc!>)E>~wIgXt?U-7z*EhAFvSTqP46iUE%c~XT z@mQ4yKzZCHP{!E9atlAW#Xew0iYOT&ligBxqQz6xf@rx?K8GZDj25IuLTb6LfB_-e z`{b62YIEQiAC*Zn0WhlM>OcX-ZnKS0qh?$$kUif?Q__7#{cbp&dUe28$k9)-$-8DI zTNXFVk})&v_6uQaz!L(;b$FKoZK|{Zkd0X;oMxr!Rg}f#TybAf8}+X9^~{#wTH^ZY zaboqVZ=ohWYm4%sbe&A^Z$oi4y}ud8;3S-dPBL&ZW3UwI-mx00s(lHbMAW)?Pi8z? zs~rGc0#}S0t=&HE+dOjTjtdxX)px_y&AGlc!lzfG^>*MUSc-7TUe8ShB8AUA?LG}a zGmQY*%cWqerqp7ob6OtGRC8j3JuQq!>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jC zj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1?`e~&eN{KLi<}??Fz(D@;q|%dlwe9M-`W*^-(NvZstWN;SI?sCC}rW|5pW4N1JevQ3mhL zNW;48c*ev(D{JOl`ROx1XWIOjX|pyRbaXvg$z~&Ur>f`-f3&}NF^lmQ z{r^H=`kxuTRXe}^-x7}Qf@^-QRX=mL%fG#3`{q&Kj@F%iYvbK^wA8K^Dp7jwSJCge z+uG-0iCUYu28wO_YOoP58S tE3?mA;WSUL$%ik`wE`3}NTA{NAEx__FJ$jH{cZ#ad%F6$taD0e0syuQxSs$3 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..cf33e8caa9aaeec7e19d3259490e0d8cfd1fd124 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`Jjba4!+nDh3Aci&+J0oTAw zujX#}uex!%+yaG=DTcC%a%Jx%T|V-^(PC~B0O@}kck5NK*VFo*zzX&I8cRde58VCi zsQ7(R4x?qk)1&5vJ%-Dse9FJMrhnITmi3{ssV72oGn?#RuQu^2IraIt#N9PVwqIyj zbGLp<&$kr@zZ6^IJ=aE7uKYavo~7=8%ePslIL%*8IimYu|G~A=?)z`-+BrkW=W5h1 zy^KY5K6jsF{+_?#u)>_Jz6<5*Zh!9AE9{otBQV|I{>rb<_~viuf7SHP!$vr6v2pBz z&x{|=<{7hnNk9Ggv`bo+nmqFqZ^7c30lNh6Pq1VBJN^3H-Lo#6@fXgwV|3@9pPIh> za>n$kLy>k*jP;%8H+<~i(VO*cr={?%BsH6T$96iOcy>#P@$tOr%(EFzKK6|i@y-v< zd#R+pef!V5_J4`&UoJVJ2MCS)k2qS~(KbcpEFl;HAEw&yc?CI*~ Jvd$@?2>=1^x?=zU literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..b2401b220a6db139961dbcfed78507c4de86032a GIT binary patch literal 415 zcmV;Q0bu@#P)Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00000.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*S8t?o9QcTs66hz+;uTfWUk?)RtS zU5v&_?$vMdUf1qoWZq;VKG8%W$Mk1$I=A``&I1=zl$GL+wa;d7xj+Bn;yWw{yxsbX zgc}mXoX$VcWH@;^3217AWLcoaMxUHFuToS`n^#WT@_$L~+1zs9|FySG&zF6l_BLa$ z_%eC@zf-Qx7volcH{-6-++}A2YgcLCPJ7K9ZJB-Vr|l%Sd1AubVsD)LcrJT0_wCQK z`!19OFaP=5SnGaS|3x#stqE!Y0FS(tu3p779qfu8x}rkQ7# zzxD}_Gfny=Xkadpoxkl?u&G?>3gtJd-&EJU-;w3K+k&?&?#8Z^*G*?`KH9bD`B%Fy zy!n3*{uI4xA0YS0e93cTH;0HX*?)X^1VVSulDPB0SzWk!?Ta{2pdo>T+3~AXY>ubM RNT+~AJzf1=);T3K0RWFpxJv*4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00002.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbdac7f8d35233cafad2947c0c7f25a72f3885c GIT binary patch literal 507 zcmV134`Wt?v;g`r9#?=l4`S&8nb-~+ z=_+Hh*-+5h`kLrXDVtcL2ybiS%p2GG>_3oR$}tqrL1m-)X}U)==V_bPnZ&hojnGLqm=8nYQWZr3f({i??Q>N8>8%-Z^;% zD3S7h^}Ag0zr)UEqx5Blo{UVHg_;M_C}jU2w$IwnRZZP!PN~6dh18KvW7J@$X|oV+ xXe5~$EJb<&000000000000000004kxegO1`#_>5zw}=1$002ovPDHLkV1l>O>a_p> literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..343850a22a7448ea232679f2296b3c327c526eae GIT binary patch literal 811 zcmV+`1JwM9P)LFNuq+hPRQ`of(U zA%qY@$bL*}sO$7}ODMyNbusxhReMc!>)E>~wIgXt?U-7z*EhAFvSTqP46iUE%c~XT z@mQ4yKzZCHP{!E9atlAW#Xew0iYOT&ligBxqQz6xf@rx?K8GZDj25IuLTb6LfB_-e z`{b62YIEQiAC*Zn0WhlM>OcX-ZnKS0qh?$$kUif?Q__7#{cbp&dUe28$k9)-$-8DI zTNXFVk})&v_6uQaz!L(;b$FKoZK|{Zkd0X;oMxr!Rg}f#TybAf8}+X9^~{#wTH^ZY zaboqVZ=ohWYm4%sbe&A^Z$oi4y}ud8;3S-dPBL&ZW3UwI-mx00s(lHbMAW)?Pi8z? zs~rGc0#}S0t=&HE+dOjTjtdxX)px_y&AGlc!lzfG^>*MUSc-7TUe8ShB8AUA?LG}a zGmQY*%cWqerqp7ob6OtGRC8j3JuQq!>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jC zj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1?`e~&eN{KLi<}??Fz(D@;q|%dlwe9M-`W*^-(NvZstWN;SI?sCC}rW|5pW4N1JevQ3mhL zNW;48c*ev(D{JOl`ROx1XWIOjX|pyRbaXvg$z~&Ur>f`-f3&}NF^lmQ z{r^H=`kxuTRXe}^-x7}Qf@^-QRX=mL%fG#3`{q&Kj@F%iYvbK^wA8K^Dp7jwSJCge z+uG-0iCUYu28wO_YOoP58S tE3?mA;WSUL$%ik`wE`3}NTA{NAEx__FJ$jH{cZ#ad%F6$taD0e0syuQxSs$3 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..cf33e8caa9aaeec7e19d3259490e0d8cfd1fd124 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`Jjba4!+nDh3Aci&+J0oTAw zujX#}uex!%+yaG=DTcC%a%Jx%T|V-^(PC~B0O@}kck5NK*VFo*zzX&I8cRde58VCi zsQ7(R4x?qk)1&5vJ%-Dse9FJMrhnITmi3{ssV72oGn?#RuQu^2IraIt#N9PVwqIyj zbGLp<&$kr@zZ6^IJ=aE7uKYavo~7=8%ePslIL%*8IimYu|G~A=?)z`-+BrkW=W5h1 zy^KY5K6jsF{+_?#u)>_Jz6<5*Zh!9AE9{otBQV|I{>rb<_~viuf7SHP!$vr6v2pBz z&x{|=<{7hnNk9Ggv`bo+nmqFqZ^7c30lNh6Pq1VBJN^3H-Lo#6@fXgwV|3@9pPIh> za>n$kLy>k*jP;%8H+<~i(VO*cr={?%BsH6T$96iOcy>#P@$tOr%(EFzKK6|i@y-v< zd#R+pef!V5_J4`&UoJVJ2MCS)k2qS~(KbcpEFl;HAEw&yc?CI*~ Jvd$@?2>=1^x?=zU literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00006.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..b704065d711a0e90112ae1d81dd2be4e523494b3 GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>x2ba4!+nDh2VbkSi29*4kN zFa5UsSKTts1JK?taA!`=4$&z8@tbd>t`KaqVpr<7^e z{67!X(m%>Dsupa0JlmqnF!< zsbaRhyz1h=*9?DYF4dnN)_rTGxBvV(VSIYtzP1k+EP7(YR3{x{Yw>LR)x$^c95i`* zdOyqF3pUH{KKXfVzDS~w-mQfTmf!#O=c4M}+j?;w(KDWh{53nI{ARJ&h0ZzQhpK(1 zaf`?^ynl1WGNCs9#G0cTzt$U8)#Pjs4_{aGWT&{vMZJmhc4c(UV2IWDvXS#|k{8pr zD%~U|Hy_q`8Lqc=F&f9$w44r$I>7PovLUC&yy?u*O-eQ^UTXNOJrrL4wEKhIn&P7- zJVqDqFB8sMv|rNlgNx{=62X+B0_{WGz#u{fcb-XK*ZRt{xUFCfNZ8ZW&t;ucLK6Tx C-m|&@ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00007.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..b54209a0d779c558149a7fc1f1ac84c2a64ce46f GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t3ba4!+nDh2V_NGG$JZ*_3 z=lnMPS54Lbmyj}Hc7@wdhx^alA1~E4Rm{xf0O~qWB>wipyLtC!&-~z1H*xoK&WyUx z{mpY+BN+_~G9QT-ni!Y&uYZ~RFS~g9g;lHK+PW61s#e6>rzpCr|E)L9PCNR}Np#b% z-*HB-;#)8BEB^6x>%Fw3&$xC&WXn#3; z__8Oa3I7%bY!q1hc)$DmdmHPvS#6#^?Nj6h2gBq0D~@i-WIFV?YU?}W$(lEduRZ_f zd*DWj<`w?OWrw{YdRRK9a^BeNmtD8qZsK(t%ZHEuo$uV`sP^l$iIeXaab*ev(D{JOl`ROx1XWIOjX|pyRbaXvg$z~&Ur>f`-f3&}NF^lmQ z{r^H=`kxuTRXe}^-x7}Qf@^-QRX=mL%fG#3`{q&Kj@F%iYvbK^wA8K^Dp7jwSJCge z+uG-0iCUYu28wO_YOoP58S tE3?mA;WSUL$%ik`wE`3}NTA{NAEx__FJ$jH{cZ#ad%F6$taD0e0syuQxSs$3 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00009.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..857b4307fc540feea5dfd719ceeccd7c6fef03a0 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|bPE<>I z`!CSwmcQ&`eI@?sahr<*pKI3^MbvH9F@4&=Evoul@Izj~>w|{*+vN0?v0mP)|6k~f z>*pC|lb=V|s~qyR$ZmJ4{hiw{Klf7Zw+EdTtuvQjn=QC(gMDbzx)YVEdyc2JZ+jkc@j_@?(u-eO<eZRgiFc0ktxGr@_jRkc+Jgks z{P{;%T{w%}nC9FR5=q&W_OD@zqiyGh(EFP>@^3i(^lo!h`*pj-$@h!7GW)z0PV>YZ j)!3IS?E!`fGB}VqFJ;4%v?{Kp)gWO{S3j3^P6Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00000.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*S8t?o9QcTs66hz+;uTfWUk?)RtS zU5v&_?$vMdUf1qoWZq;VKG8%W$Mk1$I=A``&I1=zl$GL+wa;d7xj+Bn;yWw{yxsbX zgc}mXoX$VcWH@;^3217AWLcoaMxUHFuToS`n^#WT@_$L~+1zs9|FySG&zF6l_BLa$ z_%eC@zf-Qx7volcH{-6-++}A2YgcLCPJ7K9ZJB-Vr|l%Sd1AubVsD)LcrJT0_wCQK z`!19OFaP=5SnGaS|3x#stqE!Y0FS(tu3p779qfu8x}rkQ7# zzxD}_Gfny=Xkadpoxkl?u&G?>3gtJd-&EJU-;w3K+k&?&?#8Z^*G*?`KH9bD`B%Fy zy!n3*{uI4xA0YS0e93cTH;0HX*?)X^1VVSulDPB0SzWk!?Ta{2pdo>T+3~AXY>ubM RNT+~AJzf1=);T3K0RWFpxJv*4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00002.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbdac7f8d35233cafad2947c0c7f25a72f3885c GIT binary patch literal 507 zcmV134`Wt?v;g`r9#?=l4`S&8nb-~+ z=_+Hh*-+5h`kLrXDVtcL2ybiS%p2GG>_3oR$}tqrL1m-)X}U)==V_bPnZ&hojnGLqm=8nYQWZr3f({i??Q>N8>8%-Z^;% zD3S7h^}Ag0zr)UEqx5Blo{UVHg_;M_C}jU2w$IwnRZZP!PN~6dh18KvW7J@$X|oV+ xXe5~$EJb<&000000000000000004kxegO1`#_>5zw}=1$002ovPDHLkV1l>O>a_p> literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..343850a22a7448ea232679f2296b3c327c526eae GIT binary patch literal 811 zcmV+`1JwM9P)LFNuq+hPRQ`of(U zA%qY@$bL*}sO$7}ODMyNbusxhReMc!>)E>~wIgXt?U-7z*EhAFvSTqP46iUE%c~XT z@mQ4yKzZCHP{!E9atlAW#Xew0iYOT&ligBxqQz6xf@rx?K8GZDj25IuLTb6LfB_-e z`{b62YIEQiAC*Zn0WhlM>OcX-ZnKS0qh?$$kUif?Q__7#{cbp&dUe28$k9)-$-8DI zTNXFVk})&v_6uQaz!L(;b$FKoZK|{Zkd0X;oMxr!Rg}f#TybAf8}+X9^~{#wTH^ZY zaboqVZ=ohWYm4%sbe&A^Z$oi4y}ud8;3S-dPBL&ZW3UwI-mx00s(lHbMAW)?Pi8z? zs~rGc0#}S0t=&HE+dOjTjtdxX)px_y&AGlc!lzfG^>*MUSc-7TUe8ShB8AUA?LG}a zGmQY*%cWqerqp7ob6OtGRC8j3JuQq!>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jC zj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1?`e~&eN{KLi<}??Fz(D@;q|%dlwe9M-`W*^-(NvZstWN;SI?sCC}rW|5pW4N1JevQ3mhL zNW;48c*ev(D{JOl`ROx1XWIOjX|pyRbaXvg$z~&Ur>f`-f3&}NF^lmQ z{r^H=`kxuTRXe}^-x7}Qf@^-QRX=mL%fG#3`{q&Kj@F%iYvbK^wA8K^Dp7jwSJCge z+uG-0iCUYu28wO_YOoP58S tE3?mA;WSUL$%ik`wE`3}NTA{NAEx__FJ$jH{cZ#ad%F6$taD0e0syuQxSs$3 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..94771e7febd5e3c47d0ad945f1685bcf46e696d6 GIT binary patch literal 445 zcmV;u0Yd(XP)Q31IlGw|9pdw@pNh82cde6tGNqJ1{Kqv_T0002k?q%D3N~wH~F&h3S zzbK_tCqO-Op^yI(2 zS&1K^30Zr-myGsX!{~<)-X^_f<)+Se`k+|;a5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZG zw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NJ>KrwxqKzytNZ=k_3%Q26Ui4c z6X)EP`dV>ZMw}l!joXSBE@X8M4#NB3k?uz~$V7h|CDcTJGjd>wS;*2skjcSPgckq+ n00000000000000009fW9=_5(OU%?(o00000NkvXXu0mjfk`Kst literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..b704065d711a0e90112ae1d81dd2be4e523494b3 GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>x2ba4!+nDh2VbkSi29*4kN zFa5UsSKTts1JK?taA!`=4$&z8@tbd>t`KaqVpr<7^e z{67!X(m%>Dsupa0JlmqnF!< zsbaRhyz1h=*9?DYF4dnN)_rTGxBvV(VSIYtzP1k+EP7(YR3{x{Yw>LR)x$^c95i`* zdOyqF3pUH{KKXfVzDS~w-mQfTmf!#O=c4M}+j?;w(KDWh{53nI{ARJ&h0ZzQhpK(1 zaf`?^ynl1WGNCs9#G0cTzt$U8)#Pjs4_{aGWT&{vMZJmhc4c(UV2IWDvXS#|k{8pr zD%~U|Hy_q`8Lqc=F&f9$w44r$I>7PovLUC&yy?u*O-eQ^UTXNOJrrL4wEKhIn&P7- zJVqDqFB8sMv|rNlgNx{=62X+B0_{WGz#u{fcb-XK*ZRt{xUFCfNZ8ZW&t;ucLK6Tx C-m|&@ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..b54209a0d779c558149a7fc1f1ac84c2a64ce46f GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{t3ba4!+nDh2V_NGG$JZ*_3 z=lnMPS54Lbmyj}Hc7@wdhx^alA1~E4Rm{xf0O~qWB>wipyLtC!&-~z1H*xoK&WyUx z{mpY+BN+_~G9QT-ni!Y&uYZ~RFS~g9g;lHK+PW61s#e6>rzpCr|E)L9PCNR}Np#b% z-*HB-;#)8BEB^6x>%Fw3&$xC&WXn#3; z__8Oa3I7%bY!q1hc)$DmdmHPvS#6#^?Nj6h2gBq0D~@i-WIFV?YU?}W$(lEduRZ_f zd*DWj<`w?OWrw{YdRRK9a^BeNmtD8qZsK(t%ZHEuo$uV`sP^l$iIeXaabbPE<>I z`!CSwmcQ&`eI@?sahr<*pKI3^MbvH9F@4&=Evoul@Izj~>w|{*+vN0?v0mP)|6k~f z>*pC|lb=V|s~qyR$ZmJ4{hiw{Klf7Zw+EdTtuvQjn=QC(gMDbzx)YVEdyc2JZ+jkc@j_@?(u-eO<eZRgiFc0ktxGr@_jRkc+Jgks z{P{;%T{w%}nC9FR5=q&W_OD@zqiyGh(EFP>@^3i(^lo!h`*pj-$@h!7GW)z0PV>YZ j)!3IS?E!`fGB}VqFJ;4%v?{Kp)gWO{S3j3^P6Q31IlGw|9pdw@pNh82cde6tGNqJ1{Kqv_T0002k?q%D3N~wH~F&h3S zzbK_tCqO-Op^yI(2 zS&1K^30Zr-myGsX!{~<)-X^_f<)+Se`k+|;a5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZG zw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NJ>KrwxqKzytNZ=k_3%Q26Ui4c z6X)EP`dV>ZMw}l!joXSBE@X8M4#NB3k?uz~$V7h|CDcTJGjd>wS;*2skjcSPgckq+ n00000000000000009fW9=_5(OU%?(o00000NkvXXu0mjfk`Kst literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00010.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..b2401b220a6db139961dbcfed78507c4de86032a GIT binary patch literal 415 zcmV;Q0bu@#P)Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/src/lrQueueWithdrawals.test.js b/tests/src/lrQueueWithdrawals.test.js index 3b1706d..eab45de 100644 --- a/tests/src/lrQueueWithdrawals.test.js +++ b/tests/src/lrQueueWithdrawals.test.js @@ -44,7 +44,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 7 : 5; + const right_clicks = model.letter === 'S' ? 8 : 6; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -74,9 +74,9 @@ nano_models.forEach(function (model) { }, { strategies: [ - '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa', // mETH + '0x298aFB19A105D59E74658C4C334Ff360BadE6dd2', // mETH '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH - '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH + '0xa4C637e0F704745D182e4D38cAb7E7485321d059', // OETH ], shares: [parseEther('0.5'), parseEther('0.1'), parseEther('0.2')], withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', @@ -100,7 +100,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 7 : 5; + const right_clicks = model.letter === 'S' ? 12 : 10; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -129,8 +129,8 @@ nano_models.forEach(function (model) { }, { strategies: [ - '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa', // mETH - '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH + '0x298aFB19A105D59E74658C4C334Ff360BadE6dd2', // mETH + '0xa4C637e0F704745D182e4D38cAb7E7485321d059', // OETH '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // unkwown strategy ], shares: [parseEther('0.5'), parseEther('0.1'), parseEther('0.2')], @@ -155,7 +155,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 9 : 7; + const right_clicks = model.letter === 'S' ? 12 : 10; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( From 4c36e96dba4611bb77dc55c6a894a857cfa75c45 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Wed, 24 Apr 2024 11:20:17 +0200 Subject: [PATCH 10/46] feat(lr): add completeQueuedWithdrawals support --- src/contract.c | 6 +- src/handle_finalize.c | 15 +- src/handle_init_contract.c | 4 +- src/handle_provide_parameter.c | 443 ++++++++++++++---- src/handle_query_contract_id.c | 4 +- src/handle_query_contract_ui.c | 41 +- src/kiln_plugin.h | 85 +++- ...646372cc42e1a627fce94aa7a7033e7cf075a.json | 69 ++- tests/cal/b2c.json | 4 +- .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 415 bytes .../00002.png | Bin 0 -> 388 bytes .../00003.png | Bin 0 -> 426 bytes .../00004.png | Bin 0 -> 509 bytes .../00005.png | Bin 0 -> 497 bytes .../00006.png | Bin 0 -> 438 bytes .../00007.png | Bin 0 -> 319 bytes .../00008.png | Bin 0 -> 333 bytes .../00009.png | Bin 0 -> 319 bytes .../00010.png | Bin 0 -> 333 bytes .../00011.png | Bin 0 -> 358 bytes .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 415 bytes .../00002.png | Bin 0 -> 388 bytes .../00003.png | Bin 0 -> 426 bytes .../00004.png | Bin 0 -> 509 bytes .../00005.png | Bin 0 -> 497 bytes .../00006.png | Bin 0 -> 438 bytes .../00007.png | Bin 0 -> 319 bytes .../00008.png | Bin 0 -> 358 bytes .../00009.png | Bin 0 -> 414 bytes .../00010.png | Bin 0 -> 340 bytes .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 415 bytes .../00002.png | Bin 0 -> 388 bytes .../00003.png | Bin 0 -> 426 bytes .../00004.png | Bin 0 -> 509 bytes .../00005.png | Bin 0 -> 497 bytes .../00006.png | Bin 0 -> 438 bytes .../00007.png | Bin 0 -> 319 bytes .../00008.png | Bin 0 -> 333 bytes .../00009.png | Bin 0 -> 334 bytes .../00010.png | Bin 0 -> 329 bytes .../00011.png | Bin 0 -> 319 bytes .../00012.png | Bin 0 -> 333 bytes .../00013.png | Bin 0 -> 367 bytes .../00014.png | Bin 0 -> 317 bytes .../00015.png | Bin 0 -> 358 bytes .../00016.png | Bin 0 -> 414 bytes .../00017.png | Bin 0 -> 340 bytes .../00018.png | Bin 0 -> 349 bytes .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 415 bytes .../00002.png | Bin 0 -> 388 bytes .../00003.png | Bin 0 -> 426 bytes .../00004.png | Bin 0 -> 509 bytes .../00005.png | Bin 0 -> 497 bytes .../00006.png | Bin 0 -> 438 bytes .../00007.png | Bin 0 -> 319 bytes .../00008.png | Bin 0 -> 358 bytes .../00009.png | Bin 0 -> 414 bytes .../00010.png | Bin 0 -> 340 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 539 bytes .../00002.png | Bin 0 -> 503 bytes .../00003.png | Bin 0 -> 811 bytes .../00004.png | Bin 0 -> 387 bytes .../00005.png | Bin 0 -> 386 bytes .../00006.png | Bin 0 -> 387 bytes .../00007.png | Bin 0 -> 386 bytes .../00008.png | Bin 0 -> 415 bytes .../00009.png | Bin 0 -> 472 bytes .../00010.png | Bin 0 -> 381 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 539 bytes .../00002.png | Bin 0 -> 503 bytes .../00003.png | Bin 0 -> 811 bytes .../00004.png | Bin 0 -> 387 bytes .../00005.png | Bin 0 -> 415 bytes .../00006.png | Bin 0 -> 472 bytes .../00007.png | Bin 0 -> 366 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 539 bytes .../00002.png | Bin 0 -> 503 bytes .../00003.png | Bin 0 -> 811 bytes .../00004.png | Bin 0 -> 387 bytes .../00005.png | Bin 0 -> 386 bytes .../00006.png | Bin 0 -> 393 bytes .../00007.png | Bin 0 -> 394 bytes .../00008.png | Bin 0 -> 387 bytes .../00009.png | Bin 0 -> 386 bytes .../00010.png | Bin 0 -> 419 bytes .../00011.png | Bin 0 -> 371 bytes .../00012.png | Bin 0 -> 415 bytes .../00013.png | Bin 0 -> 472 bytes .../00014.png | Bin 0 -> 366 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 539 bytes .../00002.png | Bin 0 -> 503 bytes .../00003.png | Bin 0 -> 811 bytes .../00004.png | Bin 0 -> 387 bytes .../00005.png | Bin 0 -> 415 bytes .../00006.png | Bin 0 -> 472 bytes .../00007.png | Bin 0 -> 366 bytes tests/src/lrCompleteQueuedWithdrawals.test.js | 374 +++++++++++++++ 105 files changed, 886 insertions(+), 159 deletions(-) create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00010.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00011.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00000.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00001.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00002.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00003.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00004.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00005.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00006.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00007.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00008.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00009.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00000.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00001.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00002.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00003.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00004.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00005.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00006.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00007.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00008.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00009.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00010.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00011.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00012.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00013.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00014.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00015.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00016.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00017.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00018.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00000.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00001.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00002.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00003.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00004.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00005.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00006.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00007.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00009.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00000.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00001.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00002.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00005.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00007.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00010.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00000.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00001.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00002.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00003.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00004.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00005.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00006.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00000.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00001.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00002.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00003.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00004.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00005.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00006.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00007.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00008.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00009.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00010.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00011.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00012.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00013.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00014.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00000.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00001.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00002.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00003.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00004.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00005.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00006.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00007.png create mode 100644 tests/src/lrCompleteQueuedWithdrawals.test.js diff --git a/src/contract.c b/src/contract.c index 87e7b77..40e1ab4 100644 --- a/src/contract.c +++ b/src/contract.c @@ -34,8 +34,8 @@ static const uint32_t KILN_LR_DEPOSIT_INTO_STRATEGY_SELECTOR = 0xe7a050aa; // --- cast sig "queueWithdrawals((address[],uint256[],address)[])" static const uint32_t KILN_LR_QUEUE_WITHDRAWALS_SELECTOR = 0x0dd8dd02; // --- cast sig -// "completeQueuedWithdrawal((address[],uint256[],address,(address,uint96),uint32,address),address[],uint256,bool)" -static const uint32_t KILN_LR_COMPLETE_QUEUED_WITHDRAWAL_SELECTOR = 0xf3be65d3; +// "completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],uint256[],bool[])" +static const uint32_t KILN_LR_COMPLETE_QUEUED_WITHDRAWALS_SELECTOR = 0x33404396; // --- cast sig "delegateTo(address,(bytes,uint256),bytes32)" static const uint32_t KILN_LR_DELEGATE_TO_SELECTOR = 0xeea9064b; // -- cast sig "undelegate(address)" @@ -59,7 +59,7 @@ const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { // LR KILN_LR_DEPOSIT_INTO_STRATEGY_SELECTOR, KILN_LR_QUEUE_WITHDRAWALS_SELECTOR, - KILN_LR_COMPLETE_QUEUED_WITHDRAWAL_SELECTOR, + KILN_LR_COMPLETE_QUEUED_WITHDRAWALS_SELECTOR, KILN_LR_DELEGATE_TO_SELECTOR, KILN_LR_UNDELEGATE_SELECTOR, }; diff --git a/src/handle_finalize.c b/src/handle_finalize.c index bdcdd89..a474477 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -32,15 +32,24 @@ void handle_finalize(ethPluginFinalize_t *msg) { msg->numScreens = 2; // one screen per withdrawal msg->numScreens += params->strategies_count; - PRINTF("--- Queue Withdrawals: %d\n", params->strategies_count); + PRINTF("NUMBER OF STRATEGIES TO DISPLAY: %d\n", params->strategies_count); } msg->result = ETH_PLUGIN_RESULT_OK; break; } - case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: - msg->numScreens = 1; + case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: { + { + lr_complete_queued_withdrawals_t *params = + &context->param_data.lr_complete_queued_withdrawals; + // function + withdrawer screens + msg->numScreens = 2; + // one screen per strategy + msg->numScreens += params->strategies_count; + PRINTF("NUMBER OF STRATEGIES TO DISPLAY: %d\n", params->strategies_count); + } msg->result = ETH_PLUGIN_RESULT_OK; break; + } case KILN_LR_DELEGATE_TO: msg->numScreens = 2; msg->result = ETH_PLUGIN_RESULT_OK; diff --git a/src/handle_init_contract.c b/src/handle_init_contract.c index ea54b41..b258502 100644 --- a/src/handle_init_contract.c +++ b/src/handle_init_contract.c @@ -62,8 +62,8 @@ void handle_init_contract(ethPluginInitContract_t *msg) { case KILN_LR_QUEUE_WITHDRAWALS: context->next_param = LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET; break; - case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: - context->next_param = LR_COMPLETE_QUEUED_WITHDRAWAL_QUEUEDWITHDRAWAL_OFFSET; + case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: + context->next_param = LRCQW_WITHDRAWALS_OFFSET; break; case KILN_LR_DELEGATE_TO: context->next_param = LR_DELEGATE_TO_OPERATOR; diff --git a/src/handle_provide_parameter.c b/src/handle_provide_parameter.c index 92a410e..2129910 100644 --- a/src/handle_provide_parameter.c +++ b/src/handle_provide_parameter.c @@ -126,7 +126,6 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co // [612] shares_0 // [644] shares_1 - uint8_t buffer[ADDRESS_LENGTH]; lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; switch (context->next_param) { @@ -164,6 +163,7 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co // b1a4687a010eac8ef2/src/contracts/core/DelegationManager.sol#L275 // so we can only copy it once if (params->withdrawer[0] == '\0') { + uint8_t buffer[ADDRESS_LENGTH]; copy_address(buffer, msg->parameter, sizeof(buffer)); getEthDisplayableAddress(buffer, params->withdrawer, sizeof(params->withdrawer), 0); } @@ -182,17 +182,22 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM; } break; - case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM: + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM: { // get strategy we need to display - copy_address(buffer, msg->parameter, sizeof(buffer)); - char address_buffer[ADDRESS_STR_LEN]; - getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); + { + uint8_t buffer[ADDRESS_LENGTH]; + copy_address(buffer, msg->parameter, sizeof(buffer)); + char address_buffer[ADDRESS_STR_LEN]; + getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); - int strategy_index = find_lr_known_strategy(address_buffer); - params->strategies[params->strategies_count] = - (strategy_index != UNKNOW_LR_STRATEGY) ? strategy_index + 1 : UNKNOW_LR_STRATEGY; + int strategy_index = find_lr_known_strategy(address_buffer); + params->strategies[params->strategies_count] = + (strategy_index != UNKNOW_LR_STRATEGY) ? strategy_index + 1 + : UNKNOW_LR_STRATEGY; + + PRINTF("STRATEGY #: %d STRATEGY: %d\n", params->strategies_count, strategy_index); + } - PRINTF("STRATEGY #: %d STRATEGY: %d\n", params->strategies_count, strategy_index); // we just processed one strategy item params->strategies_count += 1; params->current_item_count -= 1; @@ -201,6 +206,7 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH; } break; + } case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH: // get number of items to parse U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); @@ -237,77 +243,341 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co msg->result = ETH_PLUGIN_RESULT_OK; } -void handle_lr_complete_queued_withdrawal(ethPluginProvideParameter_t *msg, context_t *context) { - // completeQueuedWithdrawal((address[],uint256[],address,(address,uint96),uint32,address),address[],uint256,bool) - // example for complete queued withdrawal with 2 tokens - // [0] selector - // [4] queuedWithdrawal_offset -- starting here - // [36] withdrawal_struct_offset - // [68] token_list_offset - // [100] middleware_time_index - // [132] receive_as_tokens - // [164] withdrawal_struct_offset_length - // [...] withdrawal_struct elements - // [...] withdrawal_struct elements - // [164 + nb_struct_elem * 32] token_list_length - // [...] token_list elements - // [...] token_list elements - - lr_complete_queued_withdrawal_t *params = &context->param_data.lr_complete_queued_withdrawal; - - if (params->skip_offset != 0 && params->go_to_offset == false && - msg->parameterOffset == params->skip_offset + SELECTOR_LENGTH) { - // if we reach offset, we get the size of the array and skip parsing it - // in the condition of the default switch case - - // with the example above: - // before: - // [164 + nb_struct_elem * 32] token_list_length -- skip_offset - // [...] token_list elements - // [...] token_list elements - params->skip_offset += - U2BE(msg->parameter, PARAMETER_LENGTH - sizeof(params->skip_offset)) * PARAMETER_LENGTH; - // after: - // [164 + nb_struct_elem * 32] token_list_length - // [...] token_list elements - // [...] token_list elements -- skip_offset - - params->go_to_offset = true; - } +void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, context_t *context) { + // ************************************************************************** + // FUNCTION TO PARSE + // ************************************************************************** + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + // ************************************************************************** + // example for 2 complete queued withdrawals with 2 tokens each + // [ 0] selector + // [ 4] withdrawals_offset + // [ 36] tokens_offset + // [ 68] middlewareTimesIndexes_offset + // [100] receiveAsTokens_offset + // [132] withdrawals_length + // [164] withdrawals_0_offset + // [196] withdrawals_1_offset + // [228] withdrawals_0 + // [228] staker + // [260] delegatedTo + // [292] withdrawer + // [324] nonce + // [356] startBlock + // [388] strategies_offset + // [420] shares_offset + // [452] strategies_length + // [484] strategies_0 + // [516] strategies_1 + // [548] shares_length + // [580] shares_0 + // [612] shares_1 + // [644] withdrawals_1 + // [644] staker + // [676] delegatedTo + // [708] withdrawer + // [740] nonce + // [772] startBlock + // [804] strategies_offset + // [836] shares_offset + // [868] strategies_length + // [900] strategies_0 + // [932] strategies_1 + // [964] shares_length + // [996] shares_0 + // [1028] shares_1 + // [1060] tokens_length + // [1092] tokens_0_offset + // [1124] tokens_1_offset + // [1156] tokens_0 + // [1156] tokens_0_length + // [1188] tokens_0_0 + // [1220] tokens_0_1 + // [1252] tokens_1 + // [1252] tokens_1_length + // [1284] tokens_1_0 + // [1316] tokens_1_1 + // [1348] middlewareTimesIndexes_length + // [1380] middlewareTimesIndexes_0 + // [1412] middlewareTimesIndexes_1 + // [1444] receiveAsTokens_length + // [1476] receiveAsTokens_0 + // [1508] receiveAsTokens_1 + lr_complete_queued_withdrawals_t *params = &context->param_data.lr_complete_queued_withdrawals; switch (context->next_param) { - case LR_COMPLETE_QUEUED_WITHDRAWAL_QUEUEDWITHDRAWAL_OFFSET: - context->next_param = LR_COMPLETE_QUEUED_WITHDRAWAL_TOKENS_OFFSET; - break; - case LR_COMPLETE_QUEUED_WITHDRAWAL_TOKENS_OFFSET: - // before: - // skip_offset = 0 - params->skip_offset = - U2BE(msg->parameter, PARAMETER_LENGTH - sizeof(params->skip_offset)); - // after: - // [164 + nb_struct_elem * 32] token_list_length -- skip_offset - // [...] token_list elements - // [...] token_list elements - context->next_param = LR_COMPLETE_QUEUED_WITHDRAWAL_MIDDLEWARETIMEINDEX; - break; - case LR_COMPLETE_QUEUED_WITHDRAWAL_MIDDLEWARETIMEINDEX: - context->next_param = LR_COMPLETE_QUEUED_WITHDRAWAL_RECEIVEASTOKENS; - break; - case LR_COMPLETE_QUEUED_WITHDRAWAL_RECEIVEASTOKENS: - context->next_param = LR_COMPLETE_QUEUED_WITHDRAWAL_UNEXPECTED_PARAMETER; + // ******************************************************************** + // FUNCTION PARAMETERS PARSING + // ******************************************************************** + case LRCQW_WITHDRAWALS_OFFSET: + context->next_param = LRCQW_TOKENS_OFFSET; break; - default: - if (msg->parameterOffset <= params->skip_offset + SELECTOR_LENGTH) { - // as we don't want to display withdrawals structures - // we skip parsing them until skip_offset is reached - msg->result = ETH_PLUGIN_RESULT_OK; - return; + case LRCQW_TOKENS_OFFSET: + context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_OFFSET; + break; + case LRCQW_MIDDLEWARE_TIMES_INDEXES_OFFSET: + context->next_param = LRCQW_RECEIVE_AS_TOKENS_OFFSET; + break; + case LRCQW_RECEIVE_AS_TOKENS_OFFSET: + context->next_param = LRCQW_WITHDRAWALS_LENGTH; + break; + + // ******************************************************************** + // WITHDRAWAL[] PARSING + // ******************************************************************** + case LRCQW_WITHDRAWALS_LENGTH: + + U2BE_from_parameter(msg->parameter, ¶ms->parent_item_count); + params->current_item_count = params->parent_item_count; + PRINTF("LRCQW_WITHDRAWALS_LENGTH: %d\n", params->parent_item_count); + + if (params->parent_item_count == 0) { + context->next_param = LRCQW_TOKENS_LENGTH; + } else { + context->next_param = LRCQW_WITHDRAWALS__OFFSET_ITEMS; + } + break; + case LRCQW_WITHDRAWALS__OFFSET_ITEMS: + + params->current_item_count -= 1; + if (params->current_item_count == 0) { + context->next_param = LRCQW_WITHDRAWALS__ITEM__STAKER; + } + break; + + // ******************************************************************** + // WITHDRAWAL STRUCT PARSING + // ******************************************************************** + case LRCQW_WITHDRAWALS__ITEM__STAKER: + context->next_param = LRCQW_WITHDRAWALS__ITEM__DELEGATED_TO; + break; + case LRCQW_WITHDRAWALS__ITEM__DELEGATED_TO: + context->next_param = LRCQW_WITHDRAWALS__ITEM__WITHDRAWER; + break; + case LRCQW_WITHDRAWALS__ITEM__WITHDRAWER: + // withdrawer is the same for all queuedWithdrawals + // so we only copy it once + if (params->withdrawer[0] == '\0') { + uint8_t buffer[ADDRESS_LENGTH]; + copy_address(buffer, msg->parameter, sizeof(buffer)); + getEthDisplayableAddress(buffer, params->withdrawer, sizeof(params->withdrawer), 0); + } + PRINTF("WITHDRAWER: %s\n", params->withdrawer); + + context->next_param = LRCQW_WITHDRAWALS__ITEM__NONCE; + break; + case LRCQW_WITHDRAWALS__ITEM__NONCE: + context->next_param = LRCQW_WITHDRAWALS__ITEM__START_BLOCK; + break; + case LRCQW_WITHDRAWALS__ITEM__START_BLOCK: + context->next_param = LRCQW_WITHDRAWALS__ITEM__STRATEGIES_OFFSET; + break; + case LRCQW_WITHDRAWALS__ITEM__STRATEGIES_OFFSET: + context->next_param = LRCQW_WITHDRAWALS__ITEM__SHARES_OFFSET; + break; + case LRCQW_WITHDRAWALS__ITEM__SHARES_OFFSET: + context->next_param = LRCQW_WITHDRAWALS__ITEM__STRATEGIES_LENGTH; + break; + case LRCQW_WITHDRAWALS__ITEM__STRATEGIES_LENGTH: + + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + PRINTF("LRCQW_WITHDRAWALS__ITEM__STRATEGIES_LENGTH: %d\n", params->current_item_count); + + if (params->current_item_count == 0) { + context->next_param = LRCQW_WITHDRAWALS__ITEM__SHARES_LENGTH; + } else { + context->next_param = LRCQW_WITHDRAWALS__ITEM__STRATEGIES__ITEMS; + } + break; + case LRCQW_WITHDRAWALS__ITEM__STRATEGIES__ITEMS: { + // get strategy we need to display + { + uint8_t buffer[ADDRESS_LENGTH]; + copy_address(buffer, msg->parameter, sizeof(buffer)); + char address_buffer[ADDRESS_STR_LEN]; + getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); + + int strategy_index = find_lr_known_strategy(address_buffer); + if (params->strategies_count < MAX_DISPLAYABLE_LR_STRATEGIES_COUNT) { + params->strategies[params->strategies_count] = + (strategy_index != UNKNOW_LR_STRATEGY) ? strategy_index + 1 + : UNKNOW_LR_STRATEGY; + + PRINTF("STRATEGY #: %d STRATEGY: %d\n", + params->strategies_count, + strategy_index); + } + } + + // we just processed one strategy item + params->strategies_count += 1; + params->current_item_count -= 1; + if (params->current_item_count == 0) { + // when we arrive at the end of the strategies array we go to the shares array + context->next_param = LRCQW_WITHDRAWALS__ITEM__SHARES_LENGTH; + } + break; + } + case LRCQW_WITHDRAWALS__ITEM__SHARES_LENGTH: + + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + PRINTF("LRCQW_WITHDRAWALS__ITEM__SHARES_LENGTH: %d\n", params->current_item_count); + + if (params->current_item_count == 0 && params->parent_item_count > 0) { + // shares array is empty AND we have other queuedWithdrawals to parse + context->next_param = LRCQW_WITHDRAWALS__ITEM__STAKER; + } else { + context->next_param = LRCQW_WITHDRAWALS__ITEM__SHARES__ITEMS; + } + break; + case LRCQW_WITHDRAWALS__ITEM__SHARES__ITEMS: + + // we don't need to parse shares items as they are not needed for clearsigning + // as not having ETH / ERC20 amount to display would confuse users + params->current_item_count -= 1; + if (params->current_item_count == 0) { + // we arrive at the end of the Withdrawal struct + params->parent_item_count -= 1; + if (params->parent_item_count == 0) { + // we arrive at the end of the Withdrawals array + context->next_param = LRCQW_TOKENS_LENGTH; + } else { + // we have other Withdrawals to parse + context->next_param = LRCQW_WITHDRAWALS__ITEM__STAKER; + } + } + break; + + // ******************************************************************** + // TOKENS[][] PARSING + // ^ + // ******************************************************************** + case LRCQW_TOKENS_LENGTH: + + U2BE_from_parameter(msg->parameter, ¶ms->parent_item_count); + params->current_item_count = params->parent_item_count; + PRINTF("LRCQW_TOKENS_LENGTH: %d\n", params->parent_item_count); + + if (params->parent_item_count == 0) { + context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH; + } else { + context->next_param = LRCQW_TOKENS__OFFSET_ITEMS; + } + break; + case LRCQW_TOKENS__OFFSET_ITEMS: + + params->current_item_count -= 1; + if (params->current_item_count == 0) { + context->next_param = LRCQW_TOKENS__ITEM__LENGTH; + } + break; + + // ******************************************************************** + // TOKENS[][] PARSING + // ^ + // ******************************************************************** + case LRCQW_TOKENS__ITEM__LENGTH: + + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + PRINTF("LRCQW_TOKENS__ITEM__LENGTH: %d\n", params->current_item_count); + + if (params->current_item_count == 0) { + context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH; + } else { + context->next_param = LRCQW_TOKENS__ITEM__ITEMS; + } + + break; + case LRCQW_TOKENS__ITEM__ITEMS: + params->current_item_count -= 1; + if (params->current_item_count == 0) { + // we arrive at the end of the tokens array + if (params->parent_item_count == 0) { + // if we don't have other Withdrawals to parse + context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH; + } else { + // if we have other Withdrawals to parse + context->next_param = LRCQW_TOKENS__ITEM__LENGTH; + } + } + break; + + // ******************************************************************** + // MIDDLEWARETIMESINDEXES[] PARSING + // ******************************************************************** + case LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH: + + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + PRINTF("LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH: %d\n", params->current_item_count); + + if (params->current_item_count == 0) { + context->next_param = LRCQW_RECEIVE_AS_TOKENS_LENGTH; + } else { + context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES__ITEMS; + } + break; + case LRCQW_MIDDLEWARE_TIMES_INDEXES__ITEMS: + + params->current_item_count -= 1; + if (params->current_item_count == 0) { + context->next_param = LRCQW_RECEIVE_AS_TOKENS_LENGTH; + } + break; + + // ******************************************************************** + // RECEIVEASTOKENS[] PARSING + // ******************************************************************** + case LRCQW_RECEIVE_AS_TOKENS_LENGTH: + + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + // we save the number of redelegations to parse + params->relegations_count = params->current_item_count; + PRINTF("LRCQW_RECEIVE_AS_TOKENS_LENGTH: %d\n", params->current_item_count); + + if (params->current_item_count == 0) { + // reached the end + context->next_param = LRCQW_UNEXPECTED_PARAMETER; + } else { + context->next_param = LRCQW_RECEIVE_AS_TOKENS__ITEMS; } + break; + case LRCQW_RECEIVE_AS_TOKENS__ITEMS: { + { + uint16_t index = params->relegations_count - params->current_item_count; + + // if false, token is redelegated + params->is_redelegated[index] = msg->parameter[0] == 0; + } + params->current_item_count -= 1; + if (params->current_item_count == 0) { + // reached the end + context->next_param = LRCQW_UNEXPECTED_PARAMETER; + } + break; + } + + default: PRINTF("Param not supported: %d\n", context->next_param); msg->result = ETH_PLUGIN_RESULT_ERROR; return; } - msg->result = ETH_PLUGIN_RESULT_OK; } void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) { @@ -318,23 +588,26 @@ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) // [36] signature_offset // [68] approver_salt - uint8_t buffer[ADDRESS_LENGTH]; lr_delegate_to_t *params = &context->param_data.lr_delegate_to; switch (context->next_param) { - case LR_DELEGATE_TO_OPERATOR: - copy_address(buffer, msg->parameter, sizeof(buffer)); - getEthDisplayableAddress(buffer, - params->operator_address, - sizeof(params->operator_address), - 0); - - params->is_kiln = false; - if (compare_addresses((const char *) buffer, lr_kiln_operator_address)) { - params->is_kiln = true; + case LR_DELEGATE_TO_OPERATOR: { + { + uint8_t buffer[ADDRESS_LENGTH]; + copy_address(buffer, msg->parameter, sizeof(buffer)); + getEthDisplayableAddress(buffer, + params->operator_address, + sizeof(params->operator_address), + 0); + + params->is_kiln = false; + if (compare_addresses((const char *) buffer, lr_kiln_operator_address)) { + params->is_kiln = true; + } } context->next_param = LR_DELEGATE_TO_SIGNATURE_OFFSET; break; + } case LR_DELEGATE_TO_SIGNATURE_OFFSET: context->next_param = LR_DELEGATE_TO_APPROVER_SALT; break; @@ -392,8 +665,8 @@ void handle_provide_parameter(ethPluginProvideParameter_t *msg) { case KILN_LR_QUEUE_WITHDRAWALS: handle_lr_queue_withdrawals(msg, context); break; - case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: - handle_lr_complete_queued_withdrawal(msg, context); + case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: + handle_lr_complete_queued_withdrawals(msg, context); break; case KILN_LR_DELEGATE_TO: handle_lr_delegate_to(msg, context); diff --git a/src/handle_query_contract_id.c b/src/handle_query_contract_id.c index aca6df5..517fc00 100644 --- a/src/handle_query_contract_id.c +++ b/src/handle_query_contract_id.c @@ -52,8 +52,8 @@ void handle_query_contract_id(ethQueryContractID_t *msg) { strlcpy(msg->version, "Liquid Restaking", msg->versionLength); break; - case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: - strlcpy(msg->version, "Liquid Restaking", msg->versionLength); + case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: + strlcpy(msg->version, "EigenLayer Claim Withdrawals", msg->versionLength); break; case KILN_LR_DELEGATE_TO: diff --git a/src/handle_query_contract_ui.c b/src/handle_query_contract_ui.c index 38207ec..7ce2843 100644 --- a/src/handle_query_contract_ui.c +++ b/src/handle_query_contract_ui.c @@ -257,19 +257,50 @@ static bool queue_withdrawals_ui_lr(ethQueryContractUI_t *msg, context_t *contex return ret; } -static bool complete_queued_withdrawal_ui_lr(ethQueryContractUI_t *msg) { +static bool complete_queued_withdrawals_ui_lr(ethQueryContractUI_t *msg, context_t *context) { bool ret = false; + lr_complete_queued_withdrawals_t *params = &context->param_data.lr_complete_queued_withdrawals; switch (msg->screenIndex) { case 0: strlcpy(msg->title, "EigenLayer", msg->titleLength); - strlcpy(msg->msg, "Complete Withdrawal", msg->msgLength); + strlcpy(msg->msg, "Claim Withdrawals", msg->msgLength); ret = true; break; - default: + case 1: + strlcpy(msg->title, "Withdrawer", msg->titleLength); + strlcpy(msg->msg, params->withdrawer, msg->msgLength); + ret = true; + break; + + default: { + { + // removing the first screen to current screen index + // to get the index of the withdrawal + uint8_t withdrawal_index = msg->screenIndex - 2; + + if (withdrawal_index < params->strategies_count) { + if (params->is_redelegated[withdrawal_index]) { + strlcpy(msg->title, "Redelegate", msg->titleLength); + } else { + strlcpy(msg->title, "Withdraw", msg->titleLength); + } + uint8_t strategy = params->strategies[withdrawal_index]; + + if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { + strlcpy(msg->msg, "UNKNOWN", msg->msgLength); + } else { + strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); + } + } + + ret = true; + break; + } PRINTF("Received an invalid screenIndex\n"); break; + } } return ret; } @@ -370,8 +401,8 @@ void handle_query_contract_ui(ethQueryContractUI_t *msg) { ret = queue_withdrawals_ui_lr(msg, context); break; - case KILN_LR_COMPLETE_QUEUED_WITHDRAWAL: - ret = complete_queued_withdrawal_ui_lr(msg); + case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: + ret = complete_queued_withdrawals_ui_lr(msg, context); break; case KILN_LR_DELEGATE_TO: diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 4478d85..45ea75a 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -51,7 +51,7 @@ typedef enum { KILN_V2_CLAIM, KILN_LR_DEPOSIT_INTO_STRATEGY, KILN_LR_QUEUE_WITHDRAWALS, - KILN_LR_COMPLETE_QUEUED_WITHDRAWAL, + KILN_LR_COMPLETE_QUEUED_WITHDRAWALS, KILN_LR_DELEGATE_TO, KILN_LR_UNDELEGATE, } selector_t; @@ -92,14 +92,43 @@ typedef enum { LR_QUEUE_WITHDRAWALS_UNEXPECTED_PARAMETER } lr_queue_withdrawals_parameters; -// Parameters for LR complete queued withdrawal selector. +// Parameters for LR complete queued withdrawals selector. typedef enum { - LR_COMPLETE_QUEUED_WITHDRAWAL_QUEUEDWITHDRAWAL_OFFSET = 0, - LR_COMPLETE_QUEUED_WITHDRAWAL_TOKENS_OFFSET, - LR_COMPLETE_QUEUED_WITHDRAWAL_MIDDLEWARETIMEINDEX, - LR_COMPLETE_QUEUED_WITHDRAWAL_RECEIVEASTOKENS, - LR_COMPLETE_QUEUED_WITHDRAWAL_UNEXPECTED_PARAMETER -} lr_complete_queued_withdrawal_parameters; + LRCQW_WITHDRAWALS_OFFSET = 0, + LRCQW_TOKENS_OFFSET, + LRCQW_MIDDLEWARE_TIMES_INDEXES_OFFSET, + LRCQW_RECEIVE_AS_TOKENS_OFFSET, + + LRCQW_WITHDRAWALS_LENGTH, + LRCQW_WITHDRAWALS__OFFSET_ITEMS, + + LRCQW_WITHDRAWALS__ITEM__STAKER, + LRCQW_WITHDRAWALS__ITEM__DELEGATED_TO, + LRCQW_WITHDRAWALS__ITEM__WITHDRAWER, + LRCQW_WITHDRAWALS__ITEM__NONCE, + LRCQW_WITHDRAWALS__ITEM__START_BLOCK, + LRCQW_WITHDRAWALS__ITEM__STRATEGIES_OFFSET, + LRCQW_WITHDRAWALS__ITEM__SHARES_OFFSET, + LRCQW_WITHDRAWALS__ITEM__STRATEGIES_LENGTH, + LRCQW_WITHDRAWALS__ITEM__STRATEGIES__ITEMS, + LRCQW_WITHDRAWALS__ITEM__SHARES_LENGTH, + LRCQW_WITHDRAWALS__ITEM__SHARES__ITEMS, + + LRCQW_TOKENS_LENGTH, + LRCQW_TOKENS__OFFSET_ITEMS, + + LRCQW_TOKENS__ITEM__LENGTH, + LRCQW_TOKENS__ITEM__ITEMS, + + LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH, + LRCQW_MIDDLEWARE_TIMES_INDEXES__ITEMS, + + LRCQW_RECEIVE_AS_TOKENS_LENGTH, + LRCQW_RECEIVE_AS_TOKENS__ITEMS, + + LRCQW_UNEXPECTED_PARAMETER + +} lr_complete_queued_withdrawals_parameters; // Parameters for LR delegate to selector. typedef enum { @@ -126,12 +155,19 @@ typedef struct { uint8_t erc20_amount_to_display[INT256_LENGTH]; } lr_deposit_t; -#define UNKNOW_LR_STRATEGY 255 +typedef struct { + char operator_address[ADDRESS_STR_LEN]; + bool is_kiln; +} lr_delegate_to_t; + +#define UNKNOW_LR_STRATEGY 255 +#define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) typedef struct { // -- utils uint16_t queued_withdrawals_count; uint16_t current_item_count; + // -- display uint8_t strategies_count; char withdrawer[ADDRESS_STR_LEN]; @@ -142,27 +178,38 @@ typedef struct { // LR_STRATEGIES_COUNT +~ a few potential unsupported // strategies in the plugin. So * 3 should be a good enough buffer. // (ii) in practice there should not be more than (2 ** 8) - 2 known strategies - uint8_t strategies[LR_STRATEGIES_COUNT * 3]; + uint8_t strategies[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; } lr_queue_withdrawals_t; typedef struct { - uint16_t skip_offset; - bool go_to_offset; -} lr_complete_queued_withdrawal_t; + // -- utils + uint16_t parent_item_count; + uint16_t current_item_count; + uint16_t relegations_count; -typedef struct { - char operator_address[ADDRESS_STR_LEN]; - bool is_kiln; -} lr_delegate_to_t; + // -- display + uint16_t strategies_count; + char withdrawer[ADDRESS_STR_LEN]; + // list of strategies indexes **INCREMENTED BY 1** to display in the UI + // 0 is reserved for end of array + // UNKNOW_LR_STRATEGY is used to display the "unknown" strategy + // (i) in practice, we should not encounter more than + // LR_STRATEGIES_COUNT +~ a few potential unsupported + // strategies in the plugin. So * 3 should be a good enough buffer. + // (ii) in practice there should not be more than (2 ** 8) - 2 known strategies + uint8_t strategies[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; + // follows the indexes of the strategies array in this structure + bool is_redelegated[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; +} lr_complete_queued_withdrawals_t; typedef struct context_t { uint8_t next_param; union { - lr_complete_queued_withdrawal_t lr_complete_queued_withdrawal; lr_deposit_t lr_deposit; - lr_queue_withdrawals_t lr_queue_withdrawals; lr_delegate_to_t lr_delegate_to; + lr_queue_withdrawals_t lr_queue_withdrawals; + lr_complete_queued_withdrawals_t lr_complete_queued_withdrawals; } param_data; selector_t selectorIndex; diff --git a/tests/cal/abis/0x858646372cc42e1a627fce94aa7a7033e7cf075a.json b/tests/cal/abis/0x858646372cc42e1a627fce94aa7a7033e7cf075a.json index 61309d3..89e1e41 100644 --- a/tests/cal/abis/0x858646372cc42e1a627fce94aa7a7033e7cf075a.json +++ b/tests/cal/abis/0x858646372cc42e1a627fce94aa7a7033e7cf075a.json @@ -80,71 +80,64 @@ { "inputs": [ { - "internalType": "struct QueuedWithdrawal", - "name": "queuedWithdrawal", - "type": "tuple", "components": [ { - "internalType": "address[]", - "name": "strategies", - "type": "address[]" + "internalType": "address", + "name": "staker", + "type": "address" }, { - "internalType": "uint256[]", - "name": "shares", - "type": "uint256[]" + "internalType": "address", + "name": "delegatedTo", + "type": "address" }, { "internalType": "address", - "name": "depositor", + "name": "withdrawer", "type": "address" }, { - "internalType": "struct WithdrawerAndNonce", - "name": "withdrawerAndNonce", - "type": "tuple", - "components": [ - { - "internalType": "address", - "name": "withdrawer", - "type": "address" - }, - { - "internalType": "uint96", - "name": "nonce", - "type": "uint96" - } - ] + "internalType": "uint256", + "name": "nonce", + "type": "uint256" }, { "internalType": "uint32", - "name": "withdrawalStartBlock", + "name": "startBlock", "type": "uint32" }, { - "internalType": "address", - "name": "delegatedAddress", - "type": "address" + "internalType": "contract IStrategy[]", + "name": "strategies", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "shares", + "type": "uint256[]" } - ] + ], + "internalType": "struct IDelegationManager.Withdrawal[]", + "name": "withdrawals", + "type": "tuple[]" }, { - "internalType": "address[]", + "internalType": "contract IERC20[][]", "name": "tokens", - "type": "address[]" + "type": "address[][]" }, { - "internalType": "uint256", - "name": "middlewareTimesIndex", - "type": "uint256" + "internalType": "uint256[]", + "name": "middlewareTimesIndexes", + "type": "uint256[]" }, { - "internalType": "bool", + "internalType": "bool[]", "name": "receiveAsTokens", - "type": "bool" + "type": "bool[]" } ], - "name": "completeQueuedWithdrawal", + "name": "completeQueuedWithdrawals", "outputs": [], "stateMutability": "nonpayable", "type": "function" diff --git a/tests/cal/b2c.json b/tests/cal/b2c.json index 0c14430..3e8fe7a 100644 --- a/tests/cal/b2c.json +++ b/tests/cal/b2c.json @@ -83,8 +83,8 @@ "method": "queueWithdrawals", "plugin": "Kiln" }, - "0xf3be65d3": { - "method": "completeQueuedWithdrawal", + "0x33404396": { + "method": "completeQueuedWithdrawals", "plugin": "Kiln" } } diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..8d84cc70fea8013b7e8b25c0982ce142fa103d5c GIT binary patch literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..64a8e99e50a97a4347a46c5c9de8eb0460c63b8d GIT binary patch literal 415 zcmV;Q0bu@#P)RDF)ZK91U(_}vdO%kb z;FXwhFUDi|SfqR*6Y7&Hbm!n6t^y=78nif)LsTIT;3NbfrlTyYeeOah zLz+h8;kA}Bug&GPxVVcoF?JvDJT^t!jca_iWi#Wr<2cTud;l)f5=n`4Ny7jD002ov JPDHLkV1jeLw(0-? literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..74a599281e0397c9d99a473d98061b3846d31e22 GIT binary patch literal 388 zcmV-~0ek+5P)GWLr4)L3C_OppaRD3N~Dnp0001RV_k&(e5djv>#}cRhrG4& z`cFpJ`m6!s8Ku?RfVXe>FY7|nTs)*-rC8I*yu5FKh$Oj1rg`7kV_P}AbWPVu5W@g- z6;eyY$rNS|#V~+OJ<#=yq&@{QfQ&pCN_~oD0JVC+Mx|>_G5@41(QuY{FUuNfzU|Jx z_fNP%)u(X`&?1hj{%{CVL;cRc15c2JJn?xC=gUOa)K-bR<8E(#3OyfjRxxHL^KN3R z(%Fi>8U?F{rn6!De{{&fYNh$`qZ_N6mg+)j#5_bP^uVxGBOX$D2Iw9143@?!WxVEZ zLDvW~0}MGOoZk8VLPfAzkQLi!gNvQTZx7aVG=QaJcGxZS*|;}*5Hba&FX5aTMNG2L i(_X>=00000f%pKdL;PKvo!JM2ZthnZAIhw+T1YUf3!U0*NDG_RgP2~441(TiJ_ki>>Dy4yG7D)VJ3=Cw z=GO%wcJzTxSp>{lCMh-SSIL^eo#acZcui&04pPL0R&w*=#NIVc|Mk3!fn~eQiMnd2 zQs>xint9d)be-m;9Or*&jd5M;*OUWO35uRHqGoT(3bQ66O{$PbRTTgL006)>ADxRf U4vi$0k^lez07*qoM6N<$g6Mg_jQ{`u literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..06c3c59a9000082a980407c1e47a01c43dbfef53 GIT binary patch literal 509 zcmVy=XsTBzC3UiqC3r6AL;d9(XozFWhug&n5*Z+4eW?`wG#c1nV%)07t z)`i+5HF#Cn-cgIG906DWpJ24FYQH!r)f#+24F|!L2ymozz=IP+qbiXw@{5(LEkF{7 ziADItJbcWsN41sJOH;cn_KDuMv*;djhhjzL zhO?jME&$TH=j|*)Xf@Npe?f>w*14eL+Yj>9%ZE6@6z;fWISxl)Y#pGGB z)~KDf-t+WiOYkl+9;!w+y6>tW2!bF8g4^%~Jr#&C0X|@d00000NkvXXu0mjf{gm*e literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..53e7aa041e7dc3e9453476b700c868cce35e5416 GIT binary patch literal 497 zcmVgw{{Ii|qAqrhIbg5g(6!>ZN=5JsbVQUSNs=V}yq=ritjGk^UQM+_DTda; zOS@$j>g>J(HV0NI#ne_HJQVLZ!36!>kE>|&deZXPc*FAe{4T{JEV~!6x^*pQ5&3;7l?Koym5Q7p0j!t=O)}7aQ$A^0172|KV31 zlTqJ=%p9muZK+RBqkcR#RlkX5_5=70b}37)1_-;FEMrr%&Bn}V#{h^Z{zJ@?ZZrnE z$(hSKWjoRC;SIn^U=r)7es%)279VPUuc|eymvOo6$HEd+2YNukJ26lrk(DW_@@*6K+tZ(XZNmzKc< zwfGOfQA4Y;zp`ur`vl8v746!KUDOe(hh(%iF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZ zm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&UrW?S65vFYo8Ui;l}^tK&E^OPGD3n~}% zzKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwnj)ts`EeQhpElb~sdp$$e=-@EA;PGdQ zz3p^DyDGy&n>?kIJ*6TBEXF)9>x0<=fCNVR*w7DjV%w_KJ&oA`$f3stP4Z~Tstlc0 zY}4(*)Bxxusr|U;YuaSnlI`8#<1+NL11P;#C_I^bcwgKF0M4i g5(GgI1VL~G-U}%#VS}wMHUIzs07*qoM6N<$f<$)Cr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10a09010526e7de70eab95e0b3a8b29ae7d6d7 GIT binary patch literal 319 zcmV-F0l@x=P)MU4&cA zutzmbeAIV?Ua~d!=m{7!CFp8sl5{<~LPZmaHlwvIOVw4=mw>q%HCu$UlIdZgRV(ii zWL*J&B)1a_+5?<9YFhUaCjfKDEbBJ3=eQaxxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f z?}lP(Sl=0F5DC0cBguh+*1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{ z8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rFT@Vd$&YVPUw=)9(0001N&kM**sQZn6 R=$-%o002ovPDHLkV1jp6eW?Hd literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe8a80119d949f651fb52a2d7a2705d68969fc5 GIT binary patch literal 333 zcmV-T0kZyyP)L;_i4Z~v*~#8nv2)S;_LU(dw0- z9-!`k3&A!qr)R)sa)GrMKLG|i9;(}>-Z`&E1PkgP!V>EbmApa>BCRzbi|{h~8!&^+ z=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI(t#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^i zejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;82B_K4n!iMi+J&GBP`QBys1_t$e)(dO f5JCtcgv8+k?(3gWw=t`Z00000NkvXXu0mjf5lfJ8 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10a09010526e7de70eab95e0b3a8b29ae7d6d7 GIT binary patch literal 319 zcmV-F0l@x=P)MU4&cA zutzmbeAIV?Ua~d!=m{7!CFp8sl5{<~LPZmaHlwvIOVw4=mw>q%HCu$UlIdZgRV(ii zWL*J&B)1a_+5?<9YFhUaCjfKDEbBJ3=eQaxxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f z?}lP(Sl=0F5DC0cBguh+*1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{ z8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rFT@Vd$&YVPUw=)9(0001N&kM**sQZn6 R=$-%o002ovPDHLkV1jp6eW?Hd literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe8a80119d949f651fb52a2d7a2705d68969fc5 GIT binary patch literal 333 zcmV-T0kZyyP)L;_i4Z~v*~#8nv2)S;_LU(dw0- z9-!`k3&A!qr)R)sa)GrMKLG|i9;(}>-Z`&E1PkgP!V>EbmApa>BCRzbi|{h~8!&^+ z=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI(t#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^i zejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;82B_K4n!iMi+J&GBP`QBys1_t$e)(dO f5JCtcgv8+k?(3gWw=t`Z00000NkvXXu0mjf5lfJ8 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00011.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..eeec6324a1f33b9b155d3e979728a086251adb10 GIT binary patch literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBK?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..64a8e99e50a97a4347a46c5c9de8eb0460c63b8d GIT binary patch literal 415 zcmV;Q0bu@#P)RDF)ZK91U(_}vdO%kb z;FXwhFUDi|SfqR*6Y7&Hbm!n6t^y=78nif)LsTIT;3NbfrlTyYeeOah zLz+h8;kA}Bug&GPxVVcoF?JvDJT^t!jca_iWi#Wr<2cTud;l)f5=n`4Ny7jD002ov JPDHLkV1jeLw(0-? literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00002.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..74a599281e0397c9d99a473d98061b3846d31e22 GIT binary patch literal 388 zcmV-~0ek+5P)GWLr4)L3C_OppaRD3N~Dnp0001RV_k&(e5djv>#}cRhrG4& z`cFpJ`m6!s8Ku?RfVXe>FY7|nTs)*-rC8I*yu5FKh$Oj1rg`7kV_P}AbWPVu5W@g- z6;eyY$rNS|#V~+OJ<#=yq&@{QfQ&pCN_~oD0JVC+Mx|>_G5@41(QuY{FUuNfzU|Jx z_fNP%)u(X`&?1hj{%{CVL;cRc15c2JJn?xC=gUOa)K-bR<8E(#3OyfjRxxHL^KN3R z(%Fi>8U?F{rn6!De{{&fYNh$`qZ_N6mg+)j#5_bP^uVxGBOX$D2Iw9143@?!WxVEZ zLDvW~0}MGOoZk8VLPfAzkQLi!gNvQTZx7aVG=QaJcGxZS*|;}*5Hba&FX5aTMNG2L i(_X>=00000f%pKdL;PKvo!JM2ZthnZAIhw+T1YUf3!U0*NDG_RgP2~441(TiJ_ki>>Dy4yG7D)VJ3=Cw z=GO%wcJzTxSp>{lCMh-SSIL^eo#acZcui&04pPL0R&w*=#NIVc|Mk3!fn~eQiMnd2 zQs>xint9d)be-m;9Or*&jd5M;*OUWO35uRHqGoT(3bQ66O{$PbRTTgL006)>ADxRf U4vi$0k^lez07*qoM6N<$g6Mg_jQ{`u literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..06c3c59a9000082a980407c1e47a01c43dbfef53 GIT binary patch literal 509 zcmVy=XsTBzC3UiqC3r6AL;d9(XozFWhug&n5*Z+4eW?`wG#c1nV%)07t z)`i+5HF#Cn-cgIG906DWpJ24FYQH!r)f#+24F|!L2ymozz=IP+qbiXw@{5(LEkF{7 ziADItJbcWsN41sJOH;cn_KDuMv*;djhhjzL zhO?jME&$TH=j|*)Xf@Npe?f>w*14eL+Yj>9%ZE6@6z;fWISxl)Y#pGGB z)~KDf-t+WiOYkl+9;!w+y6>tW2!bF8g4^%~Jr#&C0X|@d00000NkvXXu0mjf{gm*e literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00005.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..53e7aa041e7dc3e9453476b700c868cce35e5416 GIT binary patch literal 497 zcmVgw{{Ii|qAqrhIbg5g(6!>ZN=5JsbVQUSNs=V}yq=ritjGk^UQM+_DTda; zOS@$j>g>J(HV0NI#ne_HJQVLZ!36!>kE>|&deZXPc*FAe{4T{JEV~!6x^*pQ5&3;7l?Koym5Q7p0j!t=O)}7aQ$A^0172|KV31 zlTqJ=%p9muZK+RBqkcR#RlkX5_5=70b}37)1_-;FEMrr%&Bn}V#{h^Z{zJ@?ZZrnE z$(hSKWjoRC;SIn^U=r)7es%)279VPUuc|eymvOo6$HEd+2YNukJ26lrk(DW_@@*6K+tZ(XZNmzKc< zwfGOfQA4Y;zp`ur`vl8v746!KUDOe(hh(%iF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZ zm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&UrW?S65vFYo8Ui;l}^tK&E^OPGD3n~}% zzKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwnj)ts`EeQhpElb~sdp$$e=-@EA;PGdQ zz3p^DyDGy&n>?kIJ*6TBEXF)9>x0<=fCNVR*w7DjV%w_KJ&oA`$f3stP4Z~Tstlc0 zY}4(*)Bxxusr|U;YuaSnlI`8#<1+NL11P;#C_I^bcwgKF0M4i g5(GgI1VL~G-U}%#VS}wMHUIzs07*qoM6N<$f<$)Cr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00007.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10a09010526e7de70eab95e0b3a8b29ae7d6d7 GIT binary patch literal 319 zcmV-F0l@x=P)MU4&cA zutzmbeAIV?Ua~d!=m{7!CFp8sl5{<~LPZmaHlwvIOVw4=mw>q%HCu$UlIdZgRV(ii zWL*J&B)1a_+5?<9YFhUaCjfKDEbBJ3=eQaxxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f z?}lP(Sl=0F5DC0cBguh+*1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{ z8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rFT@Vd$&YVPUw=)9(0001N&kM**sQZn6 R=$-%o002ovPDHLkV1jp6eW?Hd literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00008.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..eeec6324a1f33b9b155d3e979728a086251adb10 GIT binary patch literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7e7049cb3e9bcfb1601ec510ee465d38229d4d GIT binary patch literal 340 zcmV-a0jvIrP)b=%MgRq*37h4eRxPbkJCLY|1VIo49_}P}TKpH4$L<8?X{t;p zy+UQc_4@p%0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&GII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=m zSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*Uj-J(h>P7(Y#?ZWvi?6}@n{fGLp>YTp myqR(V_$?>^<%seR_VWh!K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..64a8e99e50a97a4347a46c5c9de8eb0460c63b8d GIT binary patch literal 415 zcmV;Q0bu@#P)RDF)ZK91U(_}vdO%kb z;FXwhFUDi|SfqR*6Y7&Hbm!n6t^y=78nif)LsTIT;3NbfrlTyYeeOah zLz+h8;kA}Bug&GPxVVcoF?JvDJT^t!jca_iWi#Wr<2cTud;l)f5=n`4Ny7jD002ov JPDHLkV1jeLw(0-? literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00002.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..74a599281e0397c9d99a473d98061b3846d31e22 GIT binary patch literal 388 zcmV-~0ek+5P)GWLr4)L3C_OppaRD3N~Dnp0001RV_k&(e5djv>#}cRhrG4& z`cFpJ`m6!s8Ku?RfVXe>FY7|nTs)*-rC8I*yu5FKh$Oj1rg`7kV_P}AbWPVu5W@g- z6;eyY$rNS|#V~+OJ<#=yq&@{QfQ&pCN_~oD0JVC+Mx|>_G5@41(QuY{FUuNfzU|Jx z_fNP%)u(X`&?1hj{%{CVL;cRc15c2JJn?xC=gUOa)K-bR<8E(#3OyfjRxxHL^KN3R z(%Fi>8U?F{rn6!De{{&fYNh$`qZ_N6mg+)j#5_bP^uVxGBOX$D2Iw9143@?!WxVEZ zLDvW~0}MGOoZk8VLPfAzkQLi!gNvQTZx7aVG=QaJcGxZS*|;}*5Hba&FX5aTMNG2L i(_X>=00000f%pKdL;PKvo!JM2ZthnZAIhw+T1YUf3!U0*NDG_RgP2~441(TiJ_ki>>Dy4yG7D)VJ3=Cw z=GO%wcJzTxSp>{lCMh-SSIL^eo#acZcui&04pPL0R&w*=#NIVc|Mk3!fn~eQiMnd2 zQs>xint9d)be-m;9Or*&jd5M;*OUWO35uRHqGoT(3bQ66O{$PbRTTgL006)>ADxRf U4vi$0k^lez07*qoM6N<$g6Mg_jQ{`u literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..06c3c59a9000082a980407c1e47a01c43dbfef53 GIT binary patch literal 509 zcmVy=XsTBzC3UiqC3r6AL;d9(XozFWhug&n5*Z+4eW?`wG#c1nV%)07t z)`i+5HF#Cn-cgIG906DWpJ24FYQH!r)f#+24F|!L2ymozz=IP+qbiXw@{5(LEkF{7 ziADItJbcWsN41sJOH;cn_KDuMv*;djhhjzL zhO?jME&$TH=j|*)Xf@Npe?f>w*14eL+Yj>9%ZE6@6z;fWISxl)Y#pGGB z)~KDf-t+WiOYkl+9;!w+y6>tW2!bF8g4^%~Jr#&C0X|@d00000NkvXXu0mjf{gm*e literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00005.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..53e7aa041e7dc3e9453476b700c868cce35e5416 GIT binary patch literal 497 zcmVgw{{Ii|qAqrhIbg5g(6!>ZN=5JsbVQUSNs=V}yq=ritjGk^UQM+_DTda; zOS@$j>g>J(HV0NI#ne_HJQVLZ!36!>kE>|&deZXPc*FAe{4T{JEV~!6x^*pQ5&3;7l?Koym5Q7p0j!t=O)}7aQ$A^0172|KV31 zlTqJ=%p9muZK+RBqkcR#RlkX5_5=70b}37)1_-;FEMrr%&Bn}V#{h^Z{zJ@?ZZrnE z$(hSKWjoRC;SIn^U=r)7es%)279VPUuc|eymvOo6$HEd+2YNukJ26lrk(DW_@@*6K+tZ(XZNmzKc< zwfGOfQA4Y;zp`ur`vl8v746!KUDOe(hh(%iF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZ zm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&UrW?S65vFYo8Ui;l}^tK&E^OPGD3n~}% zzKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwnj)ts`EeQhpElb~sdp$$e=-@EA;PGdQ zz3p^DyDGy&n>?kIJ*6TBEXF)9>x0<=fCNVR*w7DjV%w_KJ&oA`$f3stP4Z~Tstlc0 zY}4(*)Bxxusr|U;YuaSnlI`8#<1+NL11P;#C_I^bcwgKF0M4i g5(GgI1VL~G-U}%#VS}wMHUIzs07*qoM6N<$f<$)Cr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00007.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10a09010526e7de70eab95e0b3a8b29ae7d6d7 GIT binary patch literal 319 zcmV-F0l@x=P)MU4&cA zutzmbeAIV?Ua~d!=m{7!CFp8sl5{<~LPZmaHlwvIOVw4=mw>q%HCu$UlIdZgRV(ii zWL*J&B)1a_+5?<9YFhUaCjfKDEbBJ3=eQaxxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f z?}lP(Sl=0F5DC0cBguh+*1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{ z8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rFT@Vd$&YVPUw=)9(0001N&kM**sQZn6 R=$-%o002ovPDHLkV1jp6eW?Hd literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00008.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe8a80119d949f651fb52a2d7a2705d68969fc5 GIT binary patch literal 333 zcmV-T0kZyyP)L;_i4Z~v*~#8nv2)S;_LU(dw0- z9-!`k3&A!qr)R)sa)GrMKLG|i9;(}>-Z`&E1PkgP!V>EbmApa>BCRzbi|{h~8!&^+ z=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI(t#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^i zejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;82B_K4n!iMi+J&GBP`QBys1_t$e)(dO f5JCtcgv8+k?(3gWw=t`Z00000NkvXXu0mjf5lfJ8 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00009.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..4b233bc4ea59997e2b76d999ce5937bed333a71a GIT binary patch literal 334 zcmV-U0kQsxP)Q#rgEy62i z+P;_)_vJTWw%nR`^a2cq6LdEWOQs*wp{AKchtb|qrS7WbN5DdjT5Td&$?{>N)hjJL@~k2A1Jz;^~= gu?zqJ008g=Rs$iOT)&xM)c^nh07*qoM6N<$f;Vl6p#T5? literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6aeb06d8fbe06680ec17d2093a7983479f02ba GIT binary patch literal 329 zcmV-P0k-~$P)8h{Qn2{&>ZYI1WCP~+$D^xU*=rlUoLaMIXegw>F)UXJ%l5MkdG%Ak~ zWZeOOB)5qL-2N}=Qug(3MkL;g^p=2sWn02=u z$@C=Ls{-=anAf7`TRW?YnFKIVYxg%Tb^iV!j!YKxNRkPVsZQy`QWi9S&$YW$00000 b06TF4pi`+lSB~T#00000NkvXXu0mjfN#=^q literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00011.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10a09010526e7de70eab95e0b3a8b29ae7d6d7 GIT binary patch literal 319 zcmV-F0l@x=P)MU4&cA zutzmbeAIV?Ua~d!=m{7!CFp8sl5{<~LPZmaHlwvIOVw4=mw>q%HCu$UlIdZgRV(ii zWL*J&B)1a_+5?<9YFhUaCjfKDEbBJ3=eQaxxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f z?}lP(Sl=0F5DC0cBguh+*1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{ z8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rFT@Vd$&YVPUw=)9(0001N&kM**sQZn6 R=$-%o002ovPDHLkV1jp6eW?Hd literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00012.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe8a80119d949f651fb52a2d7a2705d68969fc5 GIT binary patch literal 333 zcmV-T0kZyyP)L;_i4Z~v*~#8nv2)S;_LU(dw0- z9-!`k3&A!qr)R)sa)GrMKLG|i9;(}>-Z`&E1PkgP!V>EbmApa>BCRzbi|{h~8!&^+ z=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI(t#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^i zejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;82B_K4n!iMi+J&GBP`QBys1_t$e)(dO f5JCtcgv8+k?(3gWw=t`Z00000NkvXXu0mjf5lfJ8 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00013.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9f816d2af790fe1ac4d2841a0fd023ca9877aa GIT binary patch literal 367 zcmV-#0g(QQP)Nva-Ip(Kgac5CmJYOAhT{tJk!5vz$gD_$NpYIpgk z2T^yxL}EKJr!&BqBZqY_egY78OsZx}Tdpgyf(vR7VUG5LiqEhHD?RIi49pAb8=x8) z);B{iHLPz8H1Gso$P>?Vm`tu^4lbn`cw)6)S_d+=GvRdDL3Q783o5V_;Olo`8 z0HU9H9j-nRX5KKVh)z7kBh@p(*R0ilOc(()Cgut17KwD!MG`>5VdLB9rzzcljR7%q$H88Io}7d$HzZElCBrt+u&BadwxlEo8GH;YQfd5Ge!0DrMJfYd+m5dwm^BK z@0pj92|l@rZ;$#jBpqLpWw!O{9wAAcj5?0uE#g{rZ89lQ*-mB;UBB=KH21uit=J-U z(VR`Hf=T?-6R9U!CG0=b6w8}u%v0u6y5#Z6RdAj538Qa1pR#Y6slI)kB{6Se7l%)q zeq!H@DRDg9K7NdKTP}XBXESVIwPa?T)0yRHb6oS6XJ5D#&`%5u4wejtWs{wpy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00017.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7e7049cb3e9bcfb1601ec510ee465d38229d4d GIT binary patch literal 340 zcmV-a0jvIrP)b=%MgRq*37h4eRxPbkJCLY|1VIo49_}P}TKpH4$L<8?X{t;p zy+UQc_4@p%0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&GII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=m zSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*Uj-J(h>P7(Y#?ZWvi?6}@n{fGLp>YTp myqR(V_$?>^<%seR_VWh!O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00000.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..8d84cc70fea8013b7e8b25c0982ce142fa103d5c GIT binary patch literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..64a8e99e50a97a4347a46c5c9de8eb0460c63b8d GIT binary patch literal 415 zcmV;Q0bu@#P)RDF)ZK91U(_}vdO%kb z;FXwhFUDi|SfqR*6Y7&Hbm!n6t^y=78nif)LsTIT;3NbfrlTyYeeOah zLz+h8;kA}Bug&GPxVVcoF?JvDJT^t!jca_iWi#Wr<2cTud;l)f5=n`4Ny7jD002ov JPDHLkV1jeLw(0-? literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00002.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..74a599281e0397c9d99a473d98061b3846d31e22 GIT binary patch literal 388 zcmV-~0ek+5P)GWLr4)L3C_OppaRD3N~Dnp0001RV_k&(e5djv>#}cRhrG4& z`cFpJ`m6!s8Ku?RfVXe>FY7|nTs)*-rC8I*yu5FKh$Oj1rg`7kV_P}AbWPVu5W@g- z6;eyY$rNS|#V~+OJ<#=yq&@{QfQ&pCN_~oD0JVC+Mx|>_G5@41(QuY{FUuNfzU|Jx z_fNP%)u(X`&?1hj{%{CVL;cRc15c2JJn?xC=gUOa)K-bR<8E(#3OyfjRxxHL^KN3R z(%Fi>8U?F{rn6!De{{&fYNh$`qZ_N6mg+)j#5_bP^uVxGBOX$D2Iw9143@?!WxVEZ zLDvW~0}MGOoZk8VLPfAzkQLi!gNvQTZx7aVG=QaJcGxZS*|;}*5Hba&FX5aTMNG2L i(_X>=00000f%pKdL;PKvo!JM2ZthnZAIhw+T1YUf3!U0*NDG_RgP2~441(TiJ_ki>>Dy4yG7D)VJ3=Cw z=GO%wcJzTxSp>{lCMh-SSIL^eo#acZcui&04pPL0R&w*=#NIVc|Mk3!fn~eQiMnd2 zQs>xint9d)be-m;9Or*&jd5M;*OUWO35uRHqGoT(3bQ66O{$PbRTTgL006)>ADxRf U4vi$0k^lez07*qoM6N<$g6Mg_jQ{`u literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..06c3c59a9000082a980407c1e47a01c43dbfef53 GIT binary patch literal 509 zcmVy=XsTBzC3UiqC3r6AL;d9(XozFWhug&n5*Z+4eW?`wG#c1nV%)07t z)`i+5HF#Cn-cgIG906DWpJ24FYQH!r)f#+24F|!L2ymozz=IP+qbiXw@{5(LEkF{7 ziADItJbcWsN41sJOH;cn_KDuMv*;djhhjzL zhO?jME&$TH=j|*)Xf@Npe?f>w*14eL+Yj>9%ZE6@6z;fWISxl)Y#pGGB z)~KDf-t+WiOYkl+9;!w+y6>tW2!bF8g4^%~Jr#&C0X|@d00000NkvXXu0mjf{gm*e literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00005.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..53e7aa041e7dc3e9453476b700c868cce35e5416 GIT binary patch literal 497 zcmVgw{{Ii|qAqrhIbg5g(6!>ZN=5JsbVQUSNs=V}yq=ritjGk^UQM+_DTda; zOS@$j>g>J(HV0NI#ne_HJQVLZ!36!>kE>|&deZXPc*FAe{4T{JEV~!6x^*pQ5&3;7l?Koym5Q7p0j!t=O)}7aQ$A^0172|KV31 zlTqJ=%p9muZK+RBqkcR#RlkX5_5=70b}37)1_-;FEMrr%&Bn}V#{h^Z{zJ@?ZZrnE z$(hSKWjoRC;SIn^U=r)7es%)279VPUuc|eymvOo6$HEd+2YNukJ26lrk(DW_@@*6K+tZ(XZNmzKc< zwfGOfQA4Y;zp`ur`vl8v746!KUDOe(hh(%iF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZ zm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&UrW?S65vFYo8Ui;l}^tK&E^OPGD3n~}% zzKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwnj)ts`EeQhpElb~sdp$$e=-@EA;PGdQ zz3p^DyDGy&n>?kIJ*6TBEXF)9>x0<=fCNVR*w7DjV%w_KJ&oA`$f3stP4Z~Tstlc0 zY}4(*)Bxxusr|U;YuaSnlI`8#<1+NL11P;#C_I^bcwgKF0M4i g5(GgI1VL~G-U}%#VS}wMHUIzs07*qoM6N<$f<$)Cr~m)} literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00007.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10a09010526e7de70eab95e0b3a8b29ae7d6d7 GIT binary patch literal 319 zcmV-F0l@x=P)MU4&cA zutzmbeAIV?Ua~d!=m{7!CFp8sl5{<~LPZmaHlwvIOVw4=mw>q%HCu$UlIdZgRV(ii zWL*J&B)1a_+5?<9YFhUaCjfKDEbBJ3=eQaxxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f z?}lP(Sl=0F5DC0cBguh+*1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{ z8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rFT@Vd$&YVPUw=)9(0001N&kM**sQZn6 R=$-%o002ovPDHLkV1jp6eW?Hd literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..eeec6324a1f33b9b155d3e979728a086251adb10 GIT binary patch literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7e7049cb3e9bcfb1601ec510ee465d38229d4d GIT binary patch literal 340 zcmV-a0jvIrP)b=%MgRq*37h4eRxPbkJCLY|1VIo49_}P}TKpH4$L<8?X{t;p zy+UQc_4@p%0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&GII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=m zSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*Uj-J(h>P7(Y#?ZWvi?6}@n{fGLp>YTp myqR(V_$?>^<%seR_VWh!vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*onn-AH4gdfE0AM;_PYZBO2*Ek$y-(%% zsOw{SFTS4^poOUD9o4P*JS{*4Vw#5#l0)cb;g^{bHn5EWs)9@iVHf|{#sHD^XLK#w z7+{wfUCTBGaB3s;4t6p?;$=1f0001hYQlk3bHC5qa$WRaF7xVJ-VyQ*edlb3?m;d0 zPe-Rjn0PCl&=+ltWP@lXa&3CV>|?_~XRnh^BkbO0V7PNt;jB^**Vei2!LGb7Y9Spw zplS-VNnH4^^_L&b*b_0G#BX-kl1yBeXfQeDH`V~-;-fedu41X<8fkzA;f&=-{8YYn zWfwzRjKa=ivl5v{aG~CgV~eh~+pUg6i2XVKu#RKCn4_ouF=&Pkx|*=XbqAYCHh?Ur zs>TKrxKJ`S7|LVn72omtv%WlSP}QJ;$vT>JDm@=6F5hw(0@A>kfk7&TCTo(WU0O0P!CrpenZ-)?aOWI!2 z`I4^ueR&3xIeKZnmUA5dNlsgNem6V}*3_dlP1xJ#ZT0W=!$um7@&~D8_2=&Qv7X>TCFp;0`VzLO zS-GhWy!wL~03IX?xy3kmsAm;L?W*>68)C=H&#@P(>dV~1vyp>p3~)I%J$){;q|eC@ zG2>mLwYXUBn*02bOO@4C2ico3Y-(j9{glh4YP-CyYM=cVGOx1;l#{nQXIp<%2Xyu} z5v~=hRq^aI8MS^X;%T3nhUte>b?@Bt-|{6am(?C_=u}$=r}nv-H#q=Xr@1P}>gQH6 z)@a%IU0002ovPDHLkV1j@Y>3IME literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..343850a22a7448ea232679f2296b3c327c526eae GIT binary patch literal 811 zcmV+`1JwM9P)LFNuq+hPRQ`of(U zA%qY@$bL*}sO$7}ODMyNbusxhReMc!>)E>~wIgXt?U-7z*EhAFvSTqP46iUE%c~XT z@mQ4yKzZCHP{!E9atlAW#Xew0iYOT&ligBxqQz6xf@rx?K8GZDj25IuLTb6LfB_-e z`{b62YIEQiAC*Zn0WhlM>OcX-ZnKS0qh?$$kUif?Q__7#{cbp&dUe28$k9)-$-8DI zTNXFVk})&v_6uQaz!L(;b$FKoZK|{Zkd0X;oMxr!Rg}f#TybAf8}+X9^~{#wTH^ZY zaboqVZ=ohWYm4%sbe&A^Z$oi4y}ud8;3S-dPBL&ZW3UwI-mx00s(lHbMAW)?Pi8z? zs~rGc0#}S0t=&HE+dOjTjtdxX)px_y&AGlc!lzfG^>*MUSc-7TUe8ShB8AUA?LG}a zGmQY*%cWqerqp7ob6OtGRC8j3JuQq!>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jC zj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1?`e~&eN{KLi<}??Fz(D@;q|%dlwe9M-`W*^-(NvZstWN;SI?sCC}rW|5pW4N1JevQ3mhL zNW;48cvxp~!c|v~`MH>MY`s?ZxVzG2enYC)!jkRVH0K(f%!u}R%eL%+*lD{M?E?|<%j<4m zbJ>4gCq?ar)rk$f>)LN=#j?t5$_wZgdgz-&@PtKmTmGiS_Th=`;AE z=hRPP61ouou~TmJe&LWXrLht3S8e=pB=X zgTd`4qdl%$>Xr254yD%^?dQxtBvxsASwXngyg5L)HvNf$P^`wK*$R`J*K+6sZAS(h Z&IeOmXuOjcLY?bsS-{o}YzSUrR9R3}64=&61)Q?}?Yt837*cy8gA!K(4EbX)rG zSsT{RYV~2=>uZ$L{4Zp>S2$z)58hLng4Tyu#fir*q_$vBp6HFbMaOuS#(v$qhqGYUx7nozXClo!%^z>$-Lxg}_ktyy zH~u*Dm2i6%?Kb;;zwk%zopr05}4wVgLXD literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..af34fd01d1aab1c8d18e2d19a328e40975639de8 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh2#E?<)YPs78^ zJ)ZCDm)t!nuXgrQt;VZcPWPUREAeDx9*hJT^WfdH$_-K3nyxM-H)}*Dmd!r;&V9e{ z>vxp~!c|v~`MH>MY`s?ZxVzG2enYC)!jkRVH0K(f%!u}R%eL%+*lD{M?E?|<%j<4m zbJ>4gCq?ar)rk$f>)LN=#j?t5$_wZgdgz-&@PtKmTmGiS_Th=`;AE z=hRPP61ouou~TmJe&LWXrLht3S8e=pB=X zgTd`4qdl%$>Xr254yD%^?dQxtBvxsASwXngyg5L)HvNf$P^`wK*$R`J*K+6sZAS(h Z&IeOmXuOjcLY?bsS-{o}YzSUrR9R3}64=&61)Q?}?Yt837*cy8gA!K(4EbX)rG zSsT{RYV~2=>uZ$L{4Zp>S2$z)58hLng4Tyu#fir*q_$vBp6HFbMaOuS#(v$qhqGYUx7nozXClo!%^z>$-Lxg}_ktyy zH~u*Dm2i6%?Kb;;zwk%zopr05}4wVgLXD literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..b2401b220a6db139961dbcfed78507c4de86032a GIT binary patch literal 415 zcmV;Q0bu@#P)Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00000.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*onn-AH4gdfE0AM;_PYZBO2*Ek$y-(%% zsOw{SFTS4^poOUD9o4P*JS{*4Vw#5#l0)cb;g^{bHn5EWs)9@iVHf|{#sHD^XLK#w z7+{wfUCTBGaB3s;4t6p?;$=1f0001hYQlk3bHC5qa$WRaF7xVJ-VyQ*edlb3?m;d0 zPe-Rjn0PCl&=+ltWP@lXa&3CV>|?_~XRnh^BkbO0V7PNt;jB^**Vei2!LGb7Y9Spw zplS-VNnH4^^_L&b*b_0G#BX-kl1yBeXfQeDH`V~-;-fedu41X<8fkzA;f&=-{8YYn zWfwzRjKa=ivl5v{aG~CgV~eh~+pUg6i2XVKu#RKCn4_ouF=&Pkx|*=XbqAYCHh?Ur zs>TKrxKJ`S7|LVn72omtv%WlSP}QJ;$vT>JDm@=6F5hw(0@A>kfk7&TCTo(WU0O0P!CrpenZ-)?aOWI!2 z`I4^ueR&3xIeKZnmUA5dNlsgNem6V}*3_dlP1xJ#ZT0W=!$um7@&~D8_2=&Qv7X>TCFp;0`VzLO zS-GhWy!wL~03IX?xy3kmsAm;L?W*>68)C=H&#@P(>dV~1vyp>p3~)I%J$){;q|eC@ zG2>mLwYXUBn*02bOO@4C2ico3Y-(j9{glh4YP-CyYM=cVGOx1;l#{nQXIp<%2Xyu} z5v~=hRq^aI8MS^X;%T3nhUte>b?@Bt-|{6am(?C_=u}$=r}nv-H#q=Xr@1P}>gQH6 z)@a%IU0002ovPDHLkV1j@Y>3IME literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..343850a22a7448ea232679f2296b3c327c526eae GIT binary patch literal 811 zcmV+`1JwM9P)LFNuq+hPRQ`of(U zA%qY@$bL*}sO$7}ODMyNbusxhReMc!>)E>~wIgXt?U-7z*EhAFvSTqP46iUE%c~XT z@mQ4yKzZCHP{!E9atlAW#Xew0iYOT&ligBxqQz6xf@rx?K8GZDj25IuLTb6LfB_-e z`{b62YIEQiAC*Zn0WhlM>OcX-ZnKS0qh?$$kUif?Q__7#{cbp&dUe28$k9)-$-8DI zTNXFVk})&v_6uQaz!L(;b$FKoZK|{Zkd0X;oMxr!Rg}f#TybAf8}+X9^~{#wTH^ZY zaboqVZ=ohWYm4%sbe&A^Z$oi4y}ud8;3S-dPBL&ZW3UwI-mx00s(lHbMAW)?Pi8z? zs~rGc0#}S0t=&HE+dOjTjtdxX)px_y&AGlc!lzfG^>*MUSc-7TUe8ShB8AUA?LG}a zGmQY*%cWqerqp7ob6OtGRC8j3JuQq!>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jC zj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1?`e~&eN{KLi<}??Fz(D@;q|%dlwe9M-`W*^-(NvZstWN;SI?sCC}rW|5pW4N1JevQ3mhL zNW;48cvxp~!c|v~`MH>MY`s?ZxVzG2enYC)!jkRVH0K(f%!u}R%eL%+*lD{M?E?|<%j<4m zbJ>4gCq?ar)rk$f>)LN=#j?t5$_wZgdgz-&@PtKmTmGiS_Th=`;AE z=hRPP61ouou~TmJe&LWXrLht3S8e=pB=X zgTd`4qdl%$>Xr254yD%^?dQxtBvxsASwXngyg5L)HvNf$P^`wK*$R`J*K+6sZAS(h Z&IQ31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000j&LwL#RobX?V zbQiII^4uMl|Z~1l7yy12MZ$b&j z?TtJM^{@JVDT&uHZn5nzWh-TPv_J7m;jgq0f(|YbTZHdAM)myZxO-=(=&Jp4l55=A zUQcBF*M05wg}=Y7bG1(&{&siyl(&8#-KTdql}}rLm3hWhy}m5glJN5fpDsOd=_5x% z{HDvZre)46&g0e%{pDoXaPf-VTe-XJSGLU(Jj!tDNp8H)+;exzHoZ2kko_Ba_xXNR zr;WUGZIbufwyah@qN*6%Wc!qrE&9UV%v{IGH{4)eXE1ondwSC@^_ATTjUX{kS3j3^ HP6vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*onn-AH4gdfE0AM;_PYZBO2*Ek$y-(%% zsOw{SFTS4^poOUD9o4P*JS{*4Vw#5#l0)cb;g^{bHn5EWs)9@iVHf|{#sHD^XLK#w z7+{wfUCTBGaB3s;4t6p?;$=1f0001hYQlk3bHC5qa$WRaF7xVJ-VyQ*edlb3?m;d0 zPe-Rjn0PCl&=+ltWP@lXa&3CV>|?_~XRnh^BkbO0V7PNt;jB^**Vei2!LGb7Y9Spw zplS-VNnH4^^_L&b*b_0G#BX-kl1yBeXfQeDH`V~-;-fedu41X<8fkzA;f&=-{8YYn zWfwzRjKa=ivl5v{aG~CgV~eh~+pUg6i2XVKu#RKCn4_ouF=&Pkx|*=XbqAYCHh?Ur zs>TKrxKJ`S7|LVn72omtv%WlSP}QJ;$vT>JDm@=6F5hw(0@A>kfk7&TCTo(WU0O0P!CrpenZ-)?aOWI!2 z`I4^ueR&3xIeKZnmUA5dNlsgNem6V}*3_dlP1xJ#ZT0W=!$um7@&~D8_2=&Qv7X>TCFp;0`VzLO zS-GhWy!wL~03IX?xy3kmsAm;L?W*>68)C=H&#@P(>dV~1vyp>p3~)I%J$){;q|eC@ zG2>mLwYXUBn*02bOO@4C2ico3Y-(j9{glh4YP-CyYM=cVGOx1;l#{nQXIp<%2Xyu} z5v~=hRq^aI8MS^X;%T3nhUte>b?@Bt-|{6am(?C_=u}$=r}nv-H#q=Xr@1P}>gQH6 z)@a%IU0002ovPDHLkV1j@Y>3IME literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..343850a22a7448ea232679f2296b3c327c526eae GIT binary patch literal 811 zcmV+`1JwM9P)LFNuq+hPRQ`of(U zA%qY@$bL*}sO$7}ODMyNbusxhReMc!>)E>~wIgXt?U-7z*EhAFvSTqP46iUE%c~XT z@mQ4yKzZCHP{!E9atlAW#Xew0iYOT&ligBxqQz6xf@rx?K8GZDj25IuLTb6LfB_-e z`{b62YIEQiAC*Zn0WhlM>OcX-ZnKS0qh?$$kUif?Q__7#{cbp&dUe28$k9)-$-8DI zTNXFVk})&v_6uQaz!L(;b$FKoZK|{Zkd0X;oMxr!Rg}f#TybAf8}+X9^~{#wTH^ZY zaboqVZ=ohWYm4%sbe&A^Z$oi4y}ud8;3S-dPBL&ZW3UwI-mx00s(lHbMAW)?Pi8z? zs~rGc0#}S0t=&HE+dOjTjtdxX)px_y&AGlc!lzfG^>*MUSc-7TUe8ShB8AUA?LG}a zGmQY*%cWqerqp7ob6OtGRC8j3JuQq!>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jC zj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1?`e~&eN{KLi<}??Fz(D@;q|%dlwe9M-`W*^-(NvZstWN;SI?sCC}rW|5pW4N1JevQ3mhL zNW;48cvxp~!c|v~`MH>MY`s?ZxVzG2enYC)!jkRVH0K(f%!u}R%eL%+*lD{M?E?|<%j<4m zbJ>4gCq?ar)rk$f>)LN=#j?t5$_wZgdgz-&@PtKmTmGiS_Th=`;AE z=hRPP61ouou~TmJe&LWXrLht3S8e=pB=X zgTd`4qdl%$>Xr254yD%^?dQxtBvxsASwXngyg5L)HvNf$P^`wK*$R`J*K+6sZAS(h Z&IeOmXuOjcLY?bsS-{o}YzSUrR9R3}64=&61)Q?}?Yt837*cy8gA!K(4EbX)rG zSsT{RYV~2=>uZ$L{4Zp>S2$z)58hLng4Tyu#fir*q_$vBp6HFbMaOuS#(v$qhqGYUx7nozXClo!%^z>$-Lxg}_ktyy zH~u*Dm2i6%?Kb;;zwk%zopr05}4wVgLXD literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0ed7d61504543993a76bb82da0ff9edbf58df4 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|^{vV=(`!`GS=}9%)&tFL}=GIh8a?eMOUW&hLV?45@$S zd|k1IvpQ5iMe9ZBgfwXxe$&t$To$Q!7O<%%xkp@my+`|i-`<;_*Y(MN{$82Nz3ZKq z&urau_MY5A3G$o1-`E<%_IKg;w9+gApnEKeV|n)m=2sqnH|70~SITwQt5@dhy?+z8 zHQ>V51qUZRKfJ8q2+IjK#qG0SFDTnDn|sLio>~%9RS3I%1lKF`2mfyGdX_Ktc$@0x z2Ejcq@`W~3#_^SKcYRo-wz%fW{1Z>jYwq|}$eZm$kzSlvsYQkZMOLP zW_jx0l(;i3`=pbXud?k}Yg+%|@Sk`8n5Jp67WQw`l%1JUqO4nJ&L>rd!CrwLU&`-OVHJf99vp z^#6a@b>7WqajpM2+ZCrJef(A4D)#u^>thdJ|7O@PV0-)J)U!zoS!AS)3(LN$orz>^ zjk-|2YHGvA=QI9&4%x;Uy6^dh(wZOA0Y@AwyiJcUpT#!w#d1z3-!GFVHqU+GWG%}w jQ|3vxp~!c|v~`MH>MY`s?ZxVzG2enYC)!jkRVH0K(f%!u}R%eL%+*lD{M?E?|<%j<4m zbJ>4gCq?ar)rk$f>)LN=#j?t5$_wZgdgz-&@PtKmTmGiS_Th=`;AE z=hRPP61ouou~TmJe&LWXrLht3S8e=pB=X zgTd`4qdl%$>Xr254yD%^?dQxtBvxsASwXngyg5L)HvNf$P^`wK*$R`J*K+6sZAS(h Z&IeOmXuOjcLY?bsS-{o}YzSUrR9R3}64=&61)Q?}?Yt837*cy8gA!K(4EbX)rG zSsT{RYV~2=>uZ$L{4Zp>S2$z)58hLng4Tyu#fir*q_$vBp6HFbMaOuS#(v$qhqGYUx7nozXClo!%^z>$-Lxg}_ktyy zH~u*Dm2i6%?Kb;;zwk%zopr05}4wVgLXD literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00010.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..460a5e92b658d2e27542e4522f0b7b83ed120c20 GIT binary patch literal 419 zcmV;U0bKrxP)w#o=l{^8*^7{?MZB{>EM_7+5G_|(F#Q^ZP7YqQqi%Q#sJZ9&f^%N z9U%Dg?C*{}p^uuSOeDPzVs3-}P)nujfJ^)h%4rcj!mhn8x&!pmTfOf3_&L9ycWy!V z-N~uB#l;tCLjm+8XVdQO;_MHzUsjg}0RRBNo0*sXAHIGXT>gG*cC!F+tTSMMEEi(_ zw2zx>e((`9GH=G2V{W`e$Wnk=nu^N4AN=^)SIbg>8J+!`Lv75pDNzB;)XehrnkGn8 zfSGJ-_F1_KaB01NUYH|tyya=`Y+EWV|B!ib&(+L-2mKiFy7O(U5B$eOR@dMpy)W+c zJf=w|`(cb!ll@@SU?+B=olcTW4VEIk0000000000000000002MGQR{ zPTutVzF*~=QGSca3TK|Bv;J3qGFx#pEX4(+yP$rey7tnJj#bxEH?Lat*6`f<@bAmM zcG}G3ti5{7FEm@gTl4Qh{m=Ekm~*l!eE!x$i7k0K?%UHu#nX(J9gaQx z_FtCV`F}!njqZNOz8YWpmpIdQ6LZ~~XU}9eye-OG$Rg{;E|caRFzMl}pYnlfUsVn- z)!WIDf6M8o+GPddzXr_#!haLK9P|uXI9adBM?S~3f)QvR5@^WXSAX#Y@4+f_O^~Rk LtDnm{r-UW|5$2&s literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00012.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..b2401b220a6db139961dbcfed78507c4de86032a GIT binary patch literal 415 zcmV;Q0bu@#P)Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00013.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000j&LwL#RobX?V zbQiII^4uMl|Z~1l7yy12MZ$b&j z?TtJM^{@JVDT&uHZn5nzWh-TPv_J7m;jgq0f(|YbTZHdAM)myZxO-=(=&Jp4l55=A zUQcBF*M05wg}=Y7bG1(&{&siyl(&8#-KTdql}}rLm3hWhy}m5glJN5fpDsOd=_5x% z{HDvZre)46&g0e%{pDoXaPf-VTe-XJSGLU(Jj!tDNp8H)+;exzHoZ2kko_Ba_xXNR zr;WUGZIbufwyah@qN*6%Wc!qrE&9UV%v{IGH{4)eXE1ondwSC@^_ATTjUX{kS3j3^ HP6vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*onn-AH4gdfE0AM;_PYZBO2*Ek$y-(%% zsOw{SFTS4^poOUD9o4P*JS{*4Vw#5#l0)cb;g^{bHn5EWs)9@iVHf|{#sHD^XLK#w z7+{wfUCTBGaB3s;4t6p?;$=1f0001hYQlk3bHC5qa$WRaF7xVJ-VyQ*edlb3?m;d0 zPe-Rjn0PCl&=+ltWP@lXa&3CV>|?_~XRnh^BkbO0V7PNt;jB^**Vei2!LGb7Y9Spw zplS-VNnH4^^_L&b*b_0G#BX-kl1yBeXfQeDH`V~-;-fedu41X<8fkzA;f&=-{8YYn zWfwzRjKa=ivl5v{aG~CgV~eh~+pUg6i2XVKu#RKCn4_ouF=&Pkx|*=XbqAYCHh?Ur zs>TKrxKJ`S7|LVn72omtv%WlSP}QJ;$vT>JDm@=6F5hw(0@A>kfk7&TCTo(WU0O0P!CrpenZ-)?aOWI!2 z`I4^ueR&3xIeKZnmUA5dNlsgNem6V}*3_dlP1xJ#ZT0W=!$um7@&~D8_2=&Qv7X>TCFp;0`VzLO zS-GhWy!wL~03IX?xy3kmsAm;L?W*>68)C=H&#@P(>dV~1vyp>p3~)I%J$){;q|eC@ zG2>mLwYXUBn*02bOO@4C2ico3Y-(j9{glh4YP-CyYM=cVGOx1;l#{nQXIp<%2Xyu} z5v~=hRq^aI8MS^X;%T3nhUte>b?@Bt-|{6am(?C_=u}$=r}nv-H#q=Xr@1P}>gQH6 z)@a%IU0002ovPDHLkV1j@Y>3IME literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..343850a22a7448ea232679f2296b3c327c526eae GIT binary patch literal 811 zcmV+`1JwM9P)LFNuq+hPRQ`of(U zA%qY@$bL*}sO$7}ODMyNbusxhReMc!>)E>~wIgXt?U-7z*EhAFvSTqP46iUE%c~XT z@mQ4yKzZCHP{!E9atlAW#Xew0iYOT&ligBxqQz6xf@rx?K8GZDj25IuLTb6LfB_-e z`{b62YIEQiAC*Zn0WhlM>OcX-ZnKS0qh?$$kUif?Q__7#{cbp&dUe28$k9)-$-8DI zTNXFVk})&v_6uQaz!L(;b$FKoZK|{Zkd0X;oMxr!Rg}f#TybAf8}+X9^~{#wTH^ZY zaboqVZ=ohWYm4%sbe&A^Z$oi4y}ud8;3S-dPBL&ZW3UwI-mx00s(lHbMAW)?Pi8z? zs~rGc0#}S0t=&HE+dOjTjtdxX)px_y&AGlc!lzfG^>*MUSc-7TUe8ShB8AUA?LG}a zGmQY*%cWqerqp7ob6OtGRC8j3JuQq!>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jC zj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1?`e~&eN{KLi<}??Fz(D@;q|%dlwe9M-`W*^-(NvZstWN;SI?sCC}rW|5pW4N1JevQ3mhL zNW;48cvxp~!c|v~`MH>MY`s?ZxVzG2enYC)!jkRVH0K(f%!u}R%eL%+*lD{M?E?|<%j<4m zbJ>4gCq?ar)rk$f>)LN=#j?t5$_wZgdgz-&@PtKmTmGiS_Th=`;AE z=hRPP61ouou~TmJe&LWXrLht3S8e=pB=X zgTd`4qdl%$>Xr254yD%^?dQxtBvxsASwXngyg5L)HvNf$P^`wK*$R`J*K+6sZAS(h Z&IQ31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000j&LwL#RobX?V zbQiII^4uMl|Z~1l7yy12MZ$b&j z?TtJM^{@JVDT&uHZn5nzWh-TPv_J7m;jgq0f(|YbTZHdAM)myZxO-=(=&Jp4l55=A zUQcBF*M05wg}=Y7bG1(&{&siyl(&8#-KTdql}}rLm3hWhy}m5glJN5fpDsOd=_5x% z{HDvZre)46&g0e%{pDoXaPf-VTe-XJSGLU(Jj!tDNp8H)+;exzHoZ2kko_Ba_xXNR zr;WUGZIbufwyah@qN*6%Wc!qrE&9UV%v{IGH{4)eXE1ondwSC@^_ATTjUX{kS3j3^ HP6 { + const contract = new ethers.Contract(contractAddr, abi); + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + const { data } = + await contract.populateTransaction.completeQueuedWithdrawals( + [ + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 0, + startBlock: 0, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x93c4b944D05dfe6df7645A86cd2206016c51564D', // stETH + ], + shares: [parseEther('0.1'), parseEther('0.2')], + }, + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 1, + startBlock: 1, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x93c4b944D05dfe6df7645A86cd2206016c51564D', // stETH + ], + shares: [parseEther('2'), parseEther('3')], + }, + ], + [ + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH + ], + ], + [0, 0], + [false, false] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 11 : 9; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrCompleteQueuedWithdrawals', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] LR Complete Queued Withdrawals Redelegate 1', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + const { data } = + await contract.populateTransaction.completeQueuedWithdrawals( + [ + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 0, + startBlock: 0, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + ], + shares: [parseEther('0.1')], + }, + ], + [ + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + ], + ], + [0], + [true] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 11 : 9; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrCompleteQueuedWithdrawals_redelegate_1', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] LR Complete Queued Withdrawals 1', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + const { data } = + await contract.populateTransaction.completeQueuedWithdrawals( + [ + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 0, + startBlock: 0, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + ], + shares: [parseEther('0.1')], + }, + ], + [ + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + ], + ], + [0], + [false] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 11 : 9; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrCompleteQueuedWithdrawals_1', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); + + test( + '[Nano ' + model.letter + '] LR Complete Queued Withdrawals 8', + zemu(model, async (sim, eth) => { + const contract = new ethers.Contract(contractAddr, abi); + // + // struct Withdrawal { + // address staker; + // address delegatedTo; + // address withdrawer; + // uint256 nonce; + // uint32 startBlock; + // address[] strategies; + // uint256[] shares; + // } + // + // function completeQueuedWithdrawals( + // Withdrawal[] calldata withdrawals, + // address[][] calldata tokens, + // uint256[] calldata middlewareTimesIndexes, + // bool[] calldata receiveAsTokens + // ) external + // + const { data } = + await contract.populateTransaction.completeQueuedWithdrawals( + [ + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 0, + startBlock: 0, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x93c4b944D05dfe6df7645A86cd2206016c51564D', // stETH + '0x57ba429517c3473B6d34CA9aCd56c0e735b94c02', // osETH + '0x7CA911E83dabf90C90dD3De5411a10F1A6112184', // wBETH + ], + shares: [ + parseEther('0.1'), + parseEther('0.2'), + parseEther('0.3'), + parseEther('0.4'), + ], + }, + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 1, + startBlock: 1, + strategies: [ + '0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc', // cbETH + '0x93c4b944D05dfe6df7645A86cd2206016c51564D', // stETH + '0xae78736Cd615f374D3085123A210448E74Fc6393', // UNKNOWN + ], + shares: [parseEther('2'), parseEther('3'), parseEther('4')], + }, + { + staker: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + delegatedTo: '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', + withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', + nonce: 2, + startBlock: 1, + strategies: [ + '0xa4C637e0F704745D182e4D38cAb7E7485321d059', // OETH + ], + shares: [parseEther('17')], + }, + ], + [ + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH + '0xf1C9acDc66974dFB6dEcB12aA385b9cD01190E38', // osETH + '0xa2E3356610840701BDf5611a53974510Ae27E2e1', // wBETH + ], + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH + '0xae78736Cd615f374D3085123A210448E74Fc6393', // rETH + ], + [ + '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH + ], + ], + [0, 0, 1], + [false, true, false] + ); + + let unsignedTx = genericTx; + + unsignedTx.to = contractAddr; + unsignedTx.data = data; + unsignedTx.value = parseEther('0'); + + const serializedTx = ethers.utils + .serializeTransaction(unsignedTx) + .slice(2); + const resolution = await ledgerService.resolveTransaction( + serializedTx, + eth.loadConfig, + { + externalPlugins: true, + } + ); + const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); + const right_clicks = model.letter === 'S' ? 17 : 15; + + await waitForAppScreen(sim); + await sim.navigateAndCompareSnapshots( + '.', + model.name + '_lrCompleteQueuedWithdrawals_4', + [right_clicks, 0] + ); + await tx; + }), + 30000 + ); +}); From 7d3b45aeb6852654f6d4d5745ae3e7a75c79bfc6 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 25 Apr 2024 17:55:08 +0200 Subject: [PATCH 11/46] chore: file split + headers --- src/{contract.c => contracts.c} | 64 ++- src/handle_finalize.c | 15 + src/handle_init_contract.c | 15 + src/handle_provide_token.c | 15 + src/handle_query_contract_id.c | 15 + src/handle_query_contract_ui.c | 421 ------------------ src/kiln_plugin.h | 74 +-- .../eigenlayer.c} | 117 ++--- .../handle_provide_parameter.c | 76 ++++ src/provide_parameter/provide_parameter.h | 26 ++ src/query_contract_ui/eigenlayer.c | 225 ++++++++++ .../handle_query_contract_ui.c | 87 ++++ src/query_contract_ui/onchainv1.c | 133 ++++++ src/query_contract_ui/onchainv2.c | 91 ++++ src/query_contract_ui/query_contract_ui.h | 42 ++ 15 files changed, 873 insertions(+), 543 deletions(-) rename src/{contract.c => contracts.c} (86%) delete mode 100644 src/handle_query_contract_ui.c rename src/{handle_provide_parameter.c => provide_parameter/eigenlayer.c} (92%) create mode 100644 src/provide_parameter/handle_provide_parameter.c create mode 100644 src/provide_parameter/provide_parameter.h create mode 100644 src/query_contract_ui/eigenlayer.c create mode 100644 src/query_contract_ui/handle_query_contract_ui.c create mode 100644 src/query_contract_ui/onchainv1.c create mode 100644 src/query_contract_ui/onchainv2.c create mode 100644 src/query_contract_ui/query_contract_ui.h diff --git a/src/contract.c b/src/contracts.c similarity index 86% rename from src/contract.c rename to src/contracts.c index 40e1ab4..10963f0 100644 --- a/src/contract.c +++ b/src/contracts.c @@ -1,3 +1,18 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + #include "kiln_plugin.h" // ONCHAIN V1 - Solo Staking @@ -41,29 +56,6 @@ static const uint32_t KILN_LR_DELEGATE_TO_SELECTOR = 0xeea9064b; // -- cast sig "undelegate(address)" static const uint32_t KILN_LR_UNDELEGATE_SELECTOR = 0xda8be864; -const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { - // V1 - KILN_V1_DEPOSIT_SELECTOR, - KILN_V1_WITHDRAW_SELECTOR, - KILN_V1_WITHDRAW_EL_SELECTOR, - KILN_V1_WITHDRAW_CL_SELECTOR, - KILN_V1_BATCH_WITHDRAW_SELECTOR, - KILN_V1_BATCH_WITHDRAW_EL_SELECTOR, - KILN_V1_BATCH_WITHDRAW_CL_SELECTOR, - KILN_V1_REQUEST_EXIT_SELECTOR, - // V2 - KILN_V2_STAKE_SELECTOR, - KILN_V2_REQUEST_EXIT_SELECTOR, - KILN_V2_MULTICLAIM_SELECTOR, - KILN_V2_CLAIM_SELECTOR, - // LR - KILN_LR_DEPOSIT_INTO_STRATEGY_SELECTOR, - KILN_LR_QUEUE_WITHDRAWALS_SELECTOR, - KILN_LR_COMPLETE_QUEUED_WITHDRAWALS_SELECTOR, - KILN_LR_DELEGATE_TO_SELECTOR, - KILN_LR_UNDELEGATE_SELECTOR, -}; - const char lr_strategy_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN] = { "0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc", // cbETH "0x93c4b944D05dfe6df7645A86cd2206016c51564D", // stETH @@ -104,4 +96,28 @@ const char lr_tickers[LR_STRATEGIES_COUNT][MAX_TICKER_LEN] = {"cbETH", "sfrxETH", "mETH"}; -const char lr_kiln_operator_address[ADDRESS_STR_LEN] = "0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662"; \ No newline at end of file +const char lr_kiln_operator_address[ADDRESS_STR_LEN] = "0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662"; + +// Array of all supported selectors. +const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { + // V1 + KILN_V1_DEPOSIT_SELECTOR, + KILN_V1_WITHDRAW_SELECTOR, + KILN_V1_WITHDRAW_EL_SELECTOR, + KILN_V1_WITHDRAW_CL_SELECTOR, + KILN_V1_BATCH_WITHDRAW_SELECTOR, + KILN_V1_BATCH_WITHDRAW_EL_SELECTOR, + KILN_V1_BATCH_WITHDRAW_CL_SELECTOR, + KILN_V1_REQUEST_EXIT_SELECTOR, + // V2 + KILN_V2_STAKE_SELECTOR, + KILN_V2_REQUEST_EXIT_SELECTOR, + KILN_V2_MULTICLAIM_SELECTOR, + KILN_V2_CLAIM_SELECTOR, + // EigenLayer + KILN_LR_DEPOSIT_INTO_STRATEGY_SELECTOR, + KILN_LR_QUEUE_WITHDRAWALS_SELECTOR, + KILN_LR_COMPLETE_QUEUED_WITHDRAWALS_SELECTOR, + KILN_LR_DELEGATE_TO_SELECTOR, + KILN_LR_UNDELEGATE_SELECTOR, +}; \ No newline at end of file diff --git a/src/handle_finalize.c b/src/handle_finalize.c index a474477..29c397c 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -1,3 +1,18 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + #include "kiln_plugin.h" void handle_finalize(ethPluginFinalize_t *msg) { diff --git a/src/handle_init_contract.c b/src/handle_init_contract.c index b258502..7a69a9d 100644 --- a/src/handle_init_contract.c +++ b/src/handle_init_contract.c @@ -1,3 +1,18 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + #include "kiln_plugin.h" #include "plugin_utils.h" diff --git a/src/handle_provide_token.c b/src/handle_provide_token.c index 8f94498..bace802 100644 --- a/src/handle_provide_token.c +++ b/src/handle_provide_token.c @@ -1,3 +1,18 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + #include "kiln_plugin.h" void handle_provide_token(ethPluginProvideInfo_t *msg) { diff --git a/src/handle_query_contract_id.c b/src/handle_query_contract_id.c index 517fc00..c8fc990 100644 --- a/src/handle_query_contract_id.c +++ b/src/handle_query_contract_id.c @@ -1,3 +1,18 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + #include "kiln_plugin.h" void handle_query_contract_id(ethQueryContractID_t *msg) { diff --git a/src/handle_query_contract_ui.c b/src/handle_query_contract_ui.c deleted file mode 100644 index 7ce2843..0000000 --- a/src/handle_query_contract_ui.c +++ /dev/null @@ -1,421 +0,0 @@ -#include -#include "kiln_plugin.h" - -static bool withdraw_rewards_ui(ethQueryContractUI_t *msg, context_t *context) { - strlcpy(msg->title, "Rewards", msg->titleLength); - - switch (context->selectorIndex) { - case KILN_V1_WITHDRAW: - strlcpy(msg->msg, "Consensus & Exec", msg->msgLength); - break; - - case KILN_V1_WITHDRAW_EL: - strlcpy(msg->msg, "Execution Layer", msg->msgLength); - break; - - case KILN_V1_WITHDRAW_CL: - strlcpy(msg->msg, "Consensus Layer", msg->msgLength); - break; - - default: - strlcpy(msg->msg, "?", msg->msgLength); - break; - } - return true; -} - -static bool withdraw_ui(ethQueryContractUI_t *msg, context_t *context) { - bool ret = false; - - switch (msg->screenIndex) { - case 0: - ret = withdraw_rewards_ui(msg, context); - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool batch_withdraw_rewards_ui(ethQueryContractUI_t *msg, context_t *context) { - strlcpy(msg->title, "Rewards", msg->titleLength); - - switch (context->selectorIndex) { - case KILN_V1_BATCH_WITHDRAW: - strlcpy(msg->msg, "Consensus & Exec", msg->msgLength); - break; - - case KILN_V1_BATCH_WITHDRAW_EL: - strlcpy(msg->msg, "Execution Layer", msg->msgLength); - break; - - case KILN_V1_BATCH_WITHDRAW_CL: - strlcpy(msg->msg, "Consensus Layer", msg->msgLength); - break; - - default: - strlcpy(msg->msg, "?", msg->msgLength); - break; - } - return true; -} - -static bool batch_withdraw_ui(ethQueryContractUI_t *msg, context_t *context) { - bool ret = false; - - switch (msg->screenIndex) { - case 0: - ret = batch_withdraw_rewards_ui(msg, context); - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool request_exits_ui(ethQueryContractUI_t *msg) { - strlcpy(msg->title, "Request", msg->titleLength); - strlcpy(msg->msg, "Validators Exit", msg->msgLength); - return true; -} - -static bool request_exit_ui(ethQueryContractUI_t *msg) { - bool ret = false; - - switch (msg->screenIndex) { - case 0: - ret = request_exits_ui(msg); - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool stake_ui(ethQueryContractUI_t *msg) { - bool ret = false; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "Stake", msg->titleLength); - const uint8_t *eth_amount = msg->pluginSharedRO->txContent->value.value; - uint8_t eth_amount_size = msg->pluginSharedRO->txContent->value.length; - - ret = amountToString(eth_amount, - eth_amount_size, - WEI_TO_ETHER, - "ETH", - msg->msg, - msg->msgLength); - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool request_exit_ui_v2(ethQueryContractUI_t *msg) { - bool ret = false; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "Request", msg->titleLength); - strlcpy(msg->msg, "Position Exit", msg->msgLength); - ret = true; - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool multiclaim_ui_v2(ethQueryContractUI_t *msg) { - bool ret = false; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "Withdraw", msg->titleLength); - strlcpy(msg->msg, "Exited Positions", msg->msgLength); - ret = true; - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool claim_ui_v2(ethQueryContractUI_t *msg) { - bool ret = false; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "Withdraw", msg->titleLength); - strlcpy(msg->msg, "Exited Position", msg->msgLength); - ret = true; - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool deposit_into_stragey_ui_lr(ethQueryContractUI_t *msg, context_t *context) { - bool ret = false; - lr_deposit_t *params = &context->param_data.lr_deposit; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "EigenLayer", msg->titleLength); - strlcpy(msg->msg, "Deposit In Strategy", msg->msgLength); - ret = true; - break; - case 1: - strlcpy(msg->title, "Strategy", msg->titleLength); - if (params->strategy_to_display == UNKNOW_LR_STRATEGY || - params->strategy_to_display >= LR_STRATEGIES_COUNT) { - strlcpy(msg->msg, "UNKNOWN", msg->msgLength); - } else { - strlcpy(msg->msg, lr_tickers[params->strategy_to_display], MAX_TICKER_LEN); - } - ret = true; - break; - case 2: - strlcpy(msg->title, "Amount", msg->titleLength); - amountToString(params->erc20_amount_to_display, - sizeof(params->erc20_amount_to_display), - ERC20_DECIMALS, - params->erc20_to_display == UNKNOW_LR_STRATEGY || - params->erc20_to_display >= LR_STRATEGIES_COUNT - ? "UNKNOWN" - : lr_tickers[params->erc20_to_display], - msg->msg, - msg->msgLength); - ret = true; - break; - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool queue_withdrawals_ui_lr(ethQueryContractUI_t *msg, context_t *context) { - bool ret = false; - lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "EigenLayer", msg->titleLength); - strlcpy(msg->msg, "Queue Withdrawals", msg->msgLength); - ret = true; - break; - - case 1: - strlcpy(msg->title, "Withdrawer", msg->titleLength); - strlcpy(msg->msg, params->withdrawer, msg->msgLength); - ret = true; - break; - - default: { - { - // removing the first screen to current screen index - // to get the index of the withdrawal - uint8_t withdrawal_index = msg->screenIndex - 2; - - if (withdrawal_index < params->strategies_count) { - strlcpy(msg->title, "Strategy", msg->titleLength); - uint8_t strategy = params->strategies[withdrawal_index]; - - if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { - strlcpy(msg->msg, "UNKNOWN", msg->msgLength); - } else { - strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); - } - } - - ret = true; - break; - } - PRINTF("Received an invalid screenIndex\n"); - break; - } - } - return ret; -} - -static bool complete_queued_withdrawals_ui_lr(ethQueryContractUI_t *msg, context_t *context) { - bool ret = false; - lr_complete_queued_withdrawals_t *params = &context->param_data.lr_complete_queued_withdrawals; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "EigenLayer", msg->titleLength); - strlcpy(msg->msg, "Claim Withdrawals", msg->msgLength); - ret = true; - break; - - case 1: - strlcpy(msg->title, "Withdrawer", msg->titleLength); - strlcpy(msg->msg, params->withdrawer, msg->msgLength); - ret = true; - break; - - default: { - { - // removing the first screen to current screen index - // to get the index of the withdrawal - uint8_t withdrawal_index = msg->screenIndex - 2; - - if (withdrawal_index < params->strategies_count) { - if (params->is_redelegated[withdrawal_index]) { - strlcpy(msg->title, "Redelegate", msg->titleLength); - } else { - strlcpy(msg->title, "Withdraw", msg->titleLength); - } - uint8_t strategy = params->strategies[withdrawal_index]; - - if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { - strlcpy(msg->msg, "UNKNOWN", msg->msgLength); - } else { - strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); - } - } - - ret = true; - break; - } - PRINTF("Received an invalid screenIndex\n"); - break; - } - } - return ret; -} - -static bool delegate_to_ui_lr(ethQueryContractUI_t *msg, context_t *context) { - bool ret = false; - lr_delegate_to_t *params = &context->param_data.lr_delegate_to; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "EigenLayer", msg->titleLength); - strlcpy(msg->msg, "Delegate To", msg->msgLength); - ret = true; - break; - case 1: - strlcpy(msg->title, "Operator", msg->titleLength); - if (params->is_kiln) { - strlcpy(msg->msg, "Kiln", msg->msgLength); - } else { - strlcpy(msg->msg, params->operator_address, msg->msgLength); - } - ret = true; - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -static bool undelegate_ui_lr(ethQueryContractUI_t *msg) { - bool ret = false; - - switch (msg->screenIndex) { - case 0: - strlcpy(msg->title, "EigenLayer", msg->titleLength); - strlcpy(msg->msg, "Undelegate all", msg->msgLength); - ret = true; - break; - - default: - PRINTF("Received an invalid screenIndex\n"); - break; - } - return ret; -} - -void handle_query_contract_ui(ethQueryContractUI_t *msg) { - context_t *context = (context_t *) msg->pluginContext; - bool ret = false; - - memset(msg->title, 0, msg->titleLength); - memset(msg->msg, 0, msg->msgLength); - - switch (context->selectorIndex) { - case KILN_V1_DEPOSIT: - ret = stake_ui(msg); - break; - - case KILN_V1_WITHDRAW: - case KILN_V1_WITHDRAW_EL: - case KILN_V1_WITHDRAW_CL: - ret = withdraw_ui(msg, context); - break; - - case KILN_V1_BATCH_WITHDRAW: - case KILN_V1_BATCH_WITHDRAW_EL: - case KILN_V1_BATCH_WITHDRAW_CL: - ret = batch_withdraw_ui(msg, context); - break; - - case KILN_V1_REQUEST_EXIT: - ret = request_exit_ui(msg); - break; - - case KILN_V2_STAKE: - ret = stake_ui(msg); - break; - - case KILN_V2_REQUEST_EXIT: - ret = request_exit_ui_v2(msg); - break; - - case KILN_V2_MULTICLAIM: - ret = multiclaim_ui_v2(msg); - break; - - case KILN_V2_CLAIM: - ret = claim_ui_v2(msg); - break; - - case KILN_LR_DEPOSIT_INTO_STRATEGY: - ret = deposit_into_stragey_ui_lr(msg, context); - break; - - case KILN_LR_QUEUE_WITHDRAWALS: - ret = queue_withdrawals_ui_lr(msg, context); - break; - - case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: - ret = complete_queued_withdrawals_ui_lr(msg, context); - break; - - case KILN_LR_DELEGATE_TO: - ret = delegate_to_ui_lr(msg, context); - break; - - case KILN_LR_UNDELEGATE: - ret = undelegate_ui_lr(msg); - break; - - default: - PRINTF("Selector Index not supported: %d\n", context->selectorIndex); - break; - } - msg->result = ret ? ETH_PLUGIN_RESULT_OK : ETH_PLUGIN_RESULT_ERROR; -} diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 45ea75a..a8a053a 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -1,11 +1,33 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + #pragma once #include #include "eth_plugin_interface.h" +#include + +#define PLUGIN_NAME "Kiln" -#define PLUGIN_NAME "Kiln" -#define VALIDATOR_KEY_SIZE 48 +// ADDRESS_STR_LEN is 0x + addr + \0 +#define ADDRESS_STR_LEN 43 + +// **************************************************************************** +// * SUPPORTED SELECTORS +// **************************************************************************** // Available selectors: // @@ -34,6 +56,7 @@ // --- 16. undelegate(address) // #define NUM_SELECTORS 17 +extern const uint32_t KILN_SELECTORS[NUM_SELECTORS]; // Selectors available (see mapping above). typedef enum { @@ -56,20 +79,26 @@ typedef enum { KILN_LR_UNDELEGATE, } selector_t; -extern const uint32_t KILN_SELECTORS[NUM_SELECTORS]; +// **************************************************************************** +// * EIGENLAYER +// **************************************************************************** -// ADDRESS_STR_LEN is 0x + addr + \0 -#define ADDRESS_STR_LEN 43 +// globals -// All supported ERC20 tokens have 18 decimals on mainnet. -#define ERC20_DECIMALS 18 +#define LR_STRATEGIES_COUNT 11 +#define UNKNOW_LR_STRATEGY 255 +#define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) +#define ERC20_DECIMALS 18 -// Parameters for deposit selector. -typedef enum { - DEPOSIT_UNEXPECTED_PARAMETER, -} deposit_parameters; +extern const char lr_strategy_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN]; +extern const char lr_erc20_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN]; +extern const char lr_tickers[LR_STRATEGIES_COUNT][MAX_TICKER_LEN]; +extern const char lr_kiln_operator_address[ADDRESS_STR_LEN]; + +// **************************************************************************** + +// Parameters and state machines for EigenLayer parsing -// Parameters for LR deposit into strategy selector. typedef enum { LR_DEPOSIT_INTO_STRATEGY_STRATEGY = 0, LR_DEPOSIT_INTO_STRATEGY_TOKEN, @@ -77,7 +106,6 @@ typedef enum { LR_DEPOSIT_INTO_STRATEGY_UNEXPECTED_PARAMETER, } lr_deposit_into_strategy_parameters; -// Parameters for LR queue withdrawals selector. typedef enum { LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET = 0, LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH, @@ -92,7 +120,6 @@ typedef enum { LR_QUEUE_WITHDRAWALS_UNEXPECTED_PARAMETER } lr_queue_withdrawals_parameters; -// Parameters for LR complete queued withdrawals selector. typedef enum { LRCQW_WITHDRAWALS_OFFSET = 0, LRCQW_TOKENS_OFFSET, @@ -130,7 +157,6 @@ typedef enum { } lr_complete_queued_withdrawals_parameters; -// Parameters for LR delegate to selector. typedef enum { LR_DELEGATE_TO_OPERATOR = 0, LR_DELEGATE_TO_SIGNATURE_OFFSET, @@ -138,16 +164,9 @@ typedef enum { LR_DELEGATE_TO_UNEXPECTED_PARAMETER } lr_delegate_to_parameters; -#define LR_STRATEGIES_COUNT 11 +// **************************************************************************** -extern const char lr_strategy_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN]; -extern const char lr_erc20_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN]; -extern const char lr_tickers[LR_STRATEGIES_COUNT][MAX_TICKER_LEN]; -extern const char lr_kiln_operator_address[ADDRESS_STR_LEN]; - -// max number of strategies / erc20 to display -#define MAX_DISPLAY_COUNT 3 -#define SELECTOR_LENGTH 4 +// Parsing structures typedef struct { int strategy_to_display; @@ -160,9 +179,6 @@ typedef struct { bool is_kiln; } lr_delegate_to_t; -#define UNKNOW_LR_STRATEGY 255 -#define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) - typedef struct { // -- utils uint16_t queued_withdrawals_count; @@ -202,6 +218,10 @@ typedef struct { bool is_redelegated[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; } lr_complete_queued_withdrawals_t; +// **************************************************************************** +// * SHARED PLUGIN CONTEXT MEMORY +// **************************************************************************** + typedef struct context_t { uint8_t next_param; diff --git a/src/handle_provide_parameter.c b/src/provide_parameter/eigenlayer.c similarity index 92% rename from src/handle_provide_parameter.c rename to src/provide_parameter/eigenlayer.c index 2129910..1e0a7a6 100644 --- a/src/handle_provide_parameter.c +++ b/src/provide_parameter/eigenlayer.c @@ -1,8 +1,22 @@ -#include "kiln_plugin.h" -#include +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ -/* - * Compare two addresses +#include "provide_parameter.h" + +/** + * @brief Compare two addresses * * @param a: first address * @param b: second address @@ -18,8 +32,8 @@ bool compare_addresses(const char a[ADDRESS_STR_LEN], const char b[ADDRESS_STR_L return true; } -/* - * If address is a known erc20, update lr display context with its name +/** + * @brief If address is a known erc20, update lr display context with its name * otherwise set it to unkwown (UNKNOW_LR_STRATEGY) * * @param address: address to compare @@ -36,8 +50,8 @@ int find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { return UNKNOW_LR_STRATEGY; } -/* - * If address is a known strategy, update lr display context with its name +/** + * @brief If address is a known strategy, update lr display context with its name * otherwise set it to unkwown (UNKNOW_LR_STRATEGY) * * @param address: address to compare @@ -54,8 +68,8 @@ int find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { return UNKNOW_LR_STRATEGY; } -/* - * Handle the parameters for the depositIntoStrategy(strategy,erc20,amount) +/** + * @brief Handle the parameters for the depositIntoStrategy(strategy,erc20,amount) * selector * * @param msg: message containing the parameter @@ -96,6 +110,13 @@ void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t msg->result = ETH_PLUGIN_RESULT_OK; } +/** + * @brief Handle the parameters for the queueWithdrawals(queuedWithdrawals[]) selector + * + * @param msg: message containing the parameter + * @param context: context to update + * + */ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *context) { // queuedWithdrawals = (address strategies[],uint256 shares[],address withdrawer) // queueWithdrawals(queuedWithdrawals[]) @@ -243,6 +264,13 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co msg->result = ETH_PLUGIN_RESULT_OK; } +/** + * @brief Handle the parameters for the completeQueuedWithdrawals(Withdrawal[] withdrawals, + * address[][] tokens, uint256[] middlewareTimesIndexes, bool[] receiveAsTokens) selector + * @param msg: message containing the parameter + * @param context: context to update + * + */ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, context_t *context) { // ************************************************************************** // FUNCTION TO PARSE @@ -580,6 +608,13 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con } } +/** + * @brief Handle the parameters for the delegateTo(address,(bytes,uint256),bytes32) selector + * + * @param msg: message containing the parameter + * @param context: context to update + * + */ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) { // delegateTo(address,(bytes,uint256),bytes32) // example @@ -620,64 +655,4 @@ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) return; } msg->result = ETH_PLUGIN_RESULT_OK; -} - -void handle_provide_parameter(ethPluginProvideParameter_t *msg) { - context_t *context = (context_t *) msg->pluginContext; - - PRINTF("plugin provide parameter: offset %d\nBytes: %.*H\n", - msg->parameterOffset, - PARAMETER_LENGTH, - msg->parameter); - - switch (context->selectorIndex) { - case KILN_V1_DEPOSIT: - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - - case KILN_V1_WITHDRAW: - case KILN_V1_WITHDRAW_EL: - case KILN_V1_WITHDRAW_CL: - msg->result = ETH_PLUGIN_RESULT_OK; - break; - case KILN_V1_BATCH_WITHDRAW: - case KILN_V1_BATCH_WITHDRAW_EL: - case KILN_V1_BATCH_WITHDRAW_CL: - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - case KILN_V1_REQUEST_EXIT: - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - case KILN_V2_STAKE: - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - case KILN_V2_REQUEST_EXIT: - case KILN_V2_MULTICLAIM: - case KILN_V2_CLAIM: - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - case KILN_LR_DEPOSIT_INTO_STRATEGY: - handle_lr_deposit_into_strategy(msg, context); - break; - case KILN_LR_QUEUE_WITHDRAWALS: - handle_lr_queue_withdrawals(msg, context); - break; - case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: - handle_lr_complete_queued_withdrawals(msg, context); - break; - case KILN_LR_DELEGATE_TO: - handle_lr_delegate_to(msg, context); - break; - case KILN_LR_UNDELEGATE: - msg->result = ETH_PLUGIN_RESULT_OK; - break; - - default: - PRINTF("Selector Index not supported: %d\n", context->selectorIndex); - msg->result = ETH_PLUGIN_RESULT_ERROR; - break; - } -} +} \ No newline at end of file diff --git a/src/provide_parameter/handle_provide_parameter.c b/src/provide_parameter/handle_provide_parameter.c new file mode 100644 index 0000000..f514469 --- /dev/null +++ b/src/provide_parameter/handle_provide_parameter.c @@ -0,0 +1,76 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + +#include "provide_parameter.h" + +void handle_provide_parameter(ethPluginProvideParameter_t *msg) { + context_t *context = (context_t *) msg->pluginContext; + + PRINTF("plugin provide parameter: offset %d\nBytes: %.*H\n", + msg->parameterOffset, + PARAMETER_LENGTH, + msg->parameter); + + switch (context->selectorIndex) { + case KILN_V1_DEPOSIT: + msg->result = ETH_PLUGIN_RESULT_ERROR; + break; + + case KILN_V1_WITHDRAW: + case KILN_V1_WITHDRAW_EL: + case KILN_V1_WITHDRAW_CL: + msg->result = ETH_PLUGIN_RESULT_OK; + break; + case KILN_V1_BATCH_WITHDRAW: + case KILN_V1_BATCH_WITHDRAW_EL: + case KILN_V1_BATCH_WITHDRAW_CL: + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + case KILN_V1_REQUEST_EXIT: + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + case KILN_V2_STAKE: + msg->result = ETH_PLUGIN_RESULT_ERROR; + break; + case KILN_V2_REQUEST_EXIT: + case KILN_V2_MULTICLAIM: + case KILN_V2_CLAIM: + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + case KILN_LR_DEPOSIT_INTO_STRATEGY: + handle_lr_deposit_into_strategy(msg, context); + break; + case KILN_LR_QUEUE_WITHDRAWALS: + handle_lr_queue_withdrawals(msg, context); + break; + case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: + handle_lr_complete_queued_withdrawals(msg, context); + break; + case KILN_LR_DELEGATE_TO: + handle_lr_delegate_to(msg, context); + break; + case KILN_LR_UNDELEGATE: + msg->result = ETH_PLUGIN_RESULT_OK; + break; + + default: + PRINTF("Selector Index not supported: %d\n", context->selectorIndex); + msg->result = ETH_PLUGIN_RESULT_ERROR; + break; + } +} diff --git a/src/provide_parameter/provide_parameter.h b/src/provide_parameter/provide_parameter.h new file mode 100644 index 0000000..63c41d6 --- /dev/null +++ b/src/provide_parameter/provide_parameter.h @@ -0,0 +1,26 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + +#pragma once + +#include +#include + +#include "kiln_plugin.h" + +void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t *context); +void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *context); +void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, context_t *context); +void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context); \ No newline at end of file diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c new file mode 100644 index 0000000..9ded161 --- /dev/null +++ b/src/query_contract_ui/eigenlayer.c @@ -0,0 +1,225 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + +#include "query_contract_ui.h" + +/** + * @brief UI for depositing into an EigenLayer strategy + * + * @param msg: message containing the parameter + * @param context: context with provide_parameter data + * + */ +bool deposit_into_stragey_ui(ethQueryContractUI_t *msg, context_t *context) { + bool ret = false; + lr_deposit_t *params = &context->param_data.lr_deposit; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "EigenLayer", msg->titleLength); + strlcpy(msg->msg, "Deposit In Strategy", msg->msgLength); + ret = true; + break; + case 1: + strlcpy(msg->title, "Strategy", msg->titleLength); + if (params->strategy_to_display == UNKNOW_LR_STRATEGY || + params->strategy_to_display >= LR_STRATEGIES_COUNT) { + strlcpy(msg->msg, "UNKNOWN", msg->msgLength); + } else { + strlcpy(msg->msg, lr_tickers[params->strategy_to_display], MAX_TICKER_LEN); + } + ret = true; + break; + case 2: + strlcpy(msg->title, "Amount", msg->titleLength); + amountToString(params->erc20_amount_to_display, + sizeof(params->erc20_amount_to_display), + ERC20_DECIMALS, + params->erc20_to_display == UNKNOW_LR_STRATEGY || + params->erc20_to_display >= LR_STRATEGIES_COUNT + ? "UNKNOWN" + : lr_tickers[params->erc20_to_display], + msg->msg, + msg->msgLength); + ret = true; + break; + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + +/** + * @brief UI for queueing withdrawals + * + * @param msg: message containing the parameter + * @param context: context with provide_parameter data + * + */ +bool queue_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context) { + bool ret = false; + lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "EigenLayer", msg->titleLength); + strlcpy(msg->msg, "Queue Withdrawals", msg->msgLength); + ret = true; + break; + + case 1: + strlcpy(msg->title, "Withdrawer", msg->titleLength); + strlcpy(msg->msg, params->withdrawer, msg->msgLength); + ret = true; + break; + + default: { + { + // removing the first screen to current screen index + // to get the index of the withdrawal + uint8_t withdrawal_index = msg->screenIndex - 2; + + if (withdrawal_index < params->strategies_count) { + strlcpy(msg->title, "Strategy", msg->titleLength); + uint8_t strategy = params->strategies[withdrawal_index]; + + if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { + strlcpy(msg->msg, "UNKNOWN", msg->msgLength); + } else { + strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); + } + } + + ret = true; + break; + } + PRINTF("Received an invalid screenIndex\n"); + break; + } + } + return ret; +} + +/** + * @brief UI for completing queued withdrawals + * + * @param msg: message containing the parameter + * @param context: context with provide_parameter data + * + */ +bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context) { + bool ret = false; + lr_complete_queued_withdrawals_t *params = &context->param_data.lr_complete_queued_withdrawals; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "EigenLayer", msg->titleLength); + strlcpy(msg->msg, "Claim Withdrawals", msg->msgLength); + ret = true; + break; + + case 1: + strlcpy(msg->title, "Withdrawer", msg->titleLength); + strlcpy(msg->msg, params->withdrawer, msg->msgLength); + ret = true; + break; + + default: { + { + // removing the first screen to current screen index + // to get the index of the withdrawal + uint8_t withdrawal_index = msg->screenIndex - 2; + + if (withdrawal_index < params->strategies_count) { + if (params->is_redelegated[withdrawal_index]) { + strlcpy(msg->title, "Redelegate", msg->titleLength); + } else { + strlcpy(msg->title, "Withdraw", msg->titleLength); + } + uint8_t strategy = params->strategies[withdrawal_index]; + + if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { + strlcpy(msg->msg, "UNKNOWN", msg->msgLength); + } else { + strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); + } + } + + ret = true; + break; + } + PRINTF("Received an invalid screenIndex\n"); + break; + } + } + return ret; +} + +/** + * @brief UI for delegating to an operator + * + * @param msg: message containing the parameter + * @param context: context with provide_parameter data + * + */ +bool delegate_to_ui(ethQueryContractUI_t *msg, context_t *context) { + bool ret = false; + lr_delegate_to_t *params = &context->param_data.lr_delegate_to; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "EigenLayer", msg->titleLength); + strlcpy(msg->msg, "Delegate To", msg->msgLength); + ret = true; + break; + case 1: + strlcpy(msg->title, "Operator", msg->titleLength); + if (params->is_kiln) { + strlcpy(msg->msg, "Kiln", msg->msgLength); + } else { + strlcpy(msg->msg, params->operator_address, msg->msgLength); + } + ret = true; + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} +/** + * @brief UI for undelegating + * + * @param msg: message containing the parameter + * + */ +bool undelegate_ui(ethQueryContractUI_t *msg) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "EigenLayer", msg->titleLength); + strlcpy(msg->msg, "Undelegate all", msg->msgLength); + ret = true; + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} \ No newline at end of file diff --git a/src/query_contract_ui/handle_query_contract_ui.c b/src/query_contract_ui/handle_query_contract_ui.c new file mode 100644 index 0000000..d4eab9a --- /dev/null +++ b/src/query_contract_ui/handle_query_contract_ui.c @@ -0,0 +1,87 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + +#include "query_contract_ui.h" + +void handle_query_contract_ui(ethQueryContractUI_t *msg) { + context_t *context = (context_t *) msg->pluginContext; + bool ret = false; + + memset(msg->title, 0, msg->titleLength); + memset(msg->msg, 0, msg->msgLength); + + switch (context->selectorIndex) { + case KILN_V1_DEPOSIT: + ret = stake_ui(msg); + break; + + case KILN_V1_WITHDRAW: + case KILN_V1_WITHDRAW_EL: + case KILN_V1_WITHDRAW_CL: + ret = withdraw_ui(msg, context); + break; + + case KILN_V1_BATCH_WITHDRAW: + case KILN_V1_BATCH_WITHDRAW_EL: + case KILN_V1_BATCH_WITHDRAW_CL: + ret = batch_withdraw_ui(msg, context); + break; + + case KILN_V1_REQUEST_EXIT: + ret = request_exit_ui(msg); + break; + + case KILN_V2_STAKE: + ret = stake_in_pool_ui(msg); + break; + + case KILN_V2_REQUEST_EXIT: + ret = request_pooling_exit_ui(msg); + break; + + case KILN_V2_MULTICLAIM: + ret = multiclaim_ui(msg); + break; + + case KILN_V2_CLAIM: + ret = claim_ui(msg); + break; + + case KILN_LR_DEPOSIT_INTO_STRATEGY: + ret = deposit_into_stragey_ui(msg, context); + break; + + case KILN_LR_QUEUE_WITHDRAWALS: + ret = queue_withdrawals_ui(msg, context); + break; + + case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: + ret = complete_queued_withdrawals_ui(msg, context); + break; + + case KILN_LR_DELEGATE_TO: + ret = delegate_to_ui(msg, context); + break; + + case KILN_LR_UNDELEGATE: + ret = undelegate_ui(msg); + break; + + default: + PRINTF("Selector Index not supported: %d\n", context->selectorIndex); + break; + } + msg->result = ret ? ETH_PLUGIN_RESULT_OK : ETH_PLUGIN_RESULT_ERROR; +} diff --git a/src/query_contract_ui/onchainv1.c b/src/query_contract_ui/onchainv1.c new file mode 100644 index 0000000..392e0e3 --- /dev/null +++ b/src/query_contract_ui/onchainv1.c @@ -0,0 +1,133 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + +#include "query_contract_ui.h" + +bool stake_ui(ethQueryContractUI_t *msg) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "Stake", msg->titleLength); + const uint8_t *eth_amount = msg->pluginSharedRO->txContent->value.value; + uint8_t eth_amount_size = msg->pluginSharedRO->txContent->value.length; + + ret = amountToString(eth_amount, + eth_amount_size, + WEI_TO_ETHER, + "ETH", + msg->msg, + msg->msgLength); + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + +bool request_exit_ui(ethQueryContractUI_t *msg) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "Request", msg->titleLength); + strlcpy(msg->msg, "Validators Exit", msg->msgLength); + ret = true; + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + +bool withdraw_rewards_ui(ethQueryContractUI_t *msg, context_t *context) { + strlcpy(msg->title, "Rewards", msg->titleLength); + + switch (context->selectorIndex) { + case KILN_V1_WITHDRAW: + strlcpy(msg->msg, "Consensus & Exec", msg->msgLength); + break; + + case KILN_V1_WITHDRAW_EL: + strlcpy(msg->msg, "Execution Layer", msg->msgLength); + break; + + case KILN_V1_WITHDRAW_CL: + strlcpy(msg->msg, "Consensus Layer", msg->msgLength); + break; + + default: + strlcpy(msg->msg, "?", msg->msgLength); + break; + } + return true; +} + +bool withdraw_ui(ethQueryContractUI_t *msg, context_t *context) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + ret = withdraw_rewards_ui(msg, context); + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + +bool batch_withdraw_rewards_ui(ethQueryContractUI_t *msg, context_t *context) { + strlcpy(msg->title, "Rewards", msg->titleLength); + + switch (context->selectorIndex) { + case KILN_V1_BATCH_WITHDRAW: + strlcpy(msg->msg, "Consensus & Exec", msg->msgLength); + break; + + case KILN_V1_BATCH_WITHDRAW_EL: + strlcpy(msg->msg, "Execution Layer", msg->msgLength); + break; + + case KILN_V1_BATCH_WITHDRAW_CL: + strlcpy(msg->msg, "Consensus Layer", msg->msgLength); + break; + + default: + strlcpy(msg->msg, "?", msg->msgLength); + break; + } + return true; +} + +bool batch_withdraw_ui(ethQueryContractUI_t *msg, context_t *context) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + ret = batch_withdraw_rewards_ui(msg, context); + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} diff --git a/src/query_contract_ui/onchainv2.c b/src/query_contract_ui/onchainv2.c new file mode 100644 index 0000000..31f4e77 --- /dev/null +++ b/src/query_contract_ui/onchainv2.c @@ -0,0 +1,91 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + +#include "query_contract_ui.h" + +bool stake_in_pool_ui(ethQueryContractUI_t *msg) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "Stake", msg->titleLength); + const uint8_t *eth_amount = msg->pluginSharedRO->txContent->value.value; + uint8_t eth_amount_size = msg->pluginSharedRO->txContent->value.length; + + ret = amountToString(eth_amount, + eth_amount_size, + WEI_TO_ETHER, + "ETH", + msg->msg, + msg->msgLength); + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + +bool request_pooling_exit_ui(ethQueryContractUI_t *msg) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "Request", msg->titleLength); + strlcpy(msg->msg, "Position Exit", msg->msgLength); + ret = true; + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + +bool multiclaim_ui(ethQueryContractUI_t *msg) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "Withdraw", msg->titleLength); + strlcpy(msg->msg, "Exited Positions", msg->msgLength); + ret = true; + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} + +bool claim_ui(ethQueryContractUI_t *msg) { + bool ret = false; + + switch (msg->screenIndex) { + case 0: + strlcpy(msg->title, "Withdraw", msg->titleLength); + strlcpy(msg->msg, "Exited Position", msg->msgLength); + ret = true; + break; + + default: + PRINTF("Received an invalid screenIndex\n"); + break; + } + return ret; +} \ No newline at end of file diff --git a/src/query_contract_ui/query_contract_ui.h b/src/query_contract_ui/query_contract_ui.h new file mode 100644 index 0000000..b4f65d7 --- /dev/null +++ b/src/query_contract_ui/query_contract_ui.h @@ -0,0 +1,42 @@ +/******************************************************************************* + * + * ██╗ ██╗██╗██╗ ███╗ ██╗ + * ██║ ██╔╝██║██║ ████╗ ██║ + * █████╔╝ ██║██║ ██╔██╗ ██║ + * ██╔═██╗ ██║██║ ██║╚██╗██║ + * ██║ ██╗██║███████╗██║ ╚████║ + * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ + * + * Kiln Ethereum Ledger App + * (c) 2022-2024 Kiln + * + * contact@kiln.fi + ********************************************************************************/ + +#pragma once + +#include +#include + +#include "kiln_plugin.h" + +// On-Chain v1 UI +bool stake_ui(ethQueryContractUI_t *msg); +bool withdraw_rewards_ui(ethQueryContractUI_t *msg, context_t *context); +bool withdraw_ui(ethQueryContractUI_t *msg, context_t *context); +bool batch_withdraw_rewards_ui(ethQueryContractUI_t *msg, context_t *context); +bool batch_withdraw_ui(ethQueryContractUI_t *msg, context_t *context); + +// On-Chain v2 UI +bool stake_in_pool_ui(ethQueryContractUI_t *msg); +bool request_pooling_exit_ui(ethQueryContractUI_t *msg); +bool request_exit_ui(ethQueryContractUI_t *msg); +bool multiclaim_ui(ethQueryContractUI_t *msg); +bool claim_ui(ethQueryContractUI_t *msg); + +// EigenLayer UI +bool deposit_into_stragey_ui(ethQueryContractUI_t *msg, context_t *context); +bool queue_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context); +bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context); +bool delegate_to_ui(ethQueryContractUI_t *msg, context_t *context); +bool undelegate_ui(ethQueryContractUI_t *msg); \ No newline at end of file From 64807475488a6fd76ea3738bfb69bf6917305941 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 29 Apr 2024 00:44:22 +0200 Subject: [PATCH 12/46] fix(lr): invalid state transitions + tests --- src/kiln_plugin.h | 12 ++- src/provide_parameter/eigenlayer.c | 22 +++-- src/query_contract_ui/eigenlayer.c | 8 +- .../00001.png | Bin 380 -> 0 bytes .../00002.png | Bin 445 -> 0 bytes .../00003.png | Bin 358 -> 0 bytes .../00007.png | Bin 319 -> 349 bytes .../00008.png | Bin 333 -> 357 bytes .../00009.png | Bin 319 -> 349 bytes .../00010.png | Bin 333 -> 357 bytes .../00012.png} | Bin .../00013.png} | Bin .../00010.png | Bin 340 -> 349 bytes .../00000.png | Bin 374 -> 0 bytes .../00007.png | Bin 319 -> 0 bytes .../00008.png | Bin 333 -> 0 bytes .../00009.png | Bin 334 -> 0 bytes .../00010.png | Bin 329 -> 0 bytes .../00017.png | Bin 340 -> 0 bytes .../00000.png | Bin .../00001.png | Bin .../00002.png | Bin .../00003.png | Bin .../00004.png | Bin .../00005.png | Bin .../00006.png | Bin .../00007.png | Bin 0 -> 349 bytes .../00008.png | Bin 0 -> 357 bytes .../00009.png | Bin 0 -> 356 bytes .../00010.png | Bin 0 -> 360 bytes .../00011.png | Bin .../00012.png | Bin .../00013.png | Bin .../00014.png | Bin .../00015.png | Bin .../00016.png | Bin .../00017.png} | Bin .../00007.png | Bin 319 -> 349 bytes .../00010.png | Bin 340 -> 349 bytes .../nanos_lrQueueWithdrawal/00000.png | Bin 374 -> 0 bytes .../nanos_lrQueueWithdrawal/00001.png | Bin 380 -> 0 bytes .../nanos_lrQueueWithdrawal/00002.png | Bin 422 -> 0 bytes .../nanos_lrQueueWithdrawal/00003.png | Bin 509 -> 0 bytes .../nanos_lrQueueWithdrawal/00004.png | Bin 497 -> 0 bytes .../nanos_lrQueueWithdrawal/00005.png | Bin 438 -> 0 bytes .../nanos_lrQueueWithdrawal/00006.png | Bin 358 -> 0 bytes .../00009.png} | Bin .../00010.png} | Bin .../00013.png | Bin 0 -> 414 bytes .../00014.png | Bin 0 -> 349 bytes .../00013.png | Bin 0 -> 414 bytes .../00014.png | Bin 0 -> 349 bytes .../00001.png | Bin 426 -> 0 bytes .../00002.png | Bin 522 -> 0 bytes .../00003.png | Bin 415 -> 0 bytes .../00004.png | Bin 387 -> 417 bytes .../00005.png | Bin 386 -> 425 bytes .../00006.png | Bin 387 -> 417 bytes .../00007.png | Bin 386 -> 425 bytes .../00007.png | Bin 366 -> 381 bytes .../00000.png | Bin 414 -> 0 bytes .../00004.png | Bin 387 -> 0 bytes .../00005.png | Bin 386 -> 0 bytes .../00006.png | Bin 393 -> 0 bytes .../00007.png | Bin 394 -> 0 bytes .../00014.png | Bin 366 -> 0 bytes .../00000.png | Bin .../00001.png | Bin .../00002.png | Bin .../00003.png | Bin .../00004.png | Bin 0 -> 417 bytes .../00005.png | Bin 0 -> 425 bytes .../00006.png | Bin 0 -> 424 bytes .../00007.png | Bin 0 -> 429 bytes .../00008.png | Bin .../00009.png | Bin .../00010.png | Bin .../00011.png | Bin .../00012.png | Bin .../00013.png | Bin .../00014.png} | Bin .../00004.png | Bin 387 -> 417 bytes .../00007.png | Bin 366 -> 381 bytes .../nanox_lrQueueWithdrawal/00000.png | Bin 414 -> 0 bytes .../nanox_lrQueueWithdrawal/00001.png | Bin 426 -> 0 bytes .../nanox_lrQueueWithdrawal/00002.png | Bin 496 -> 0 bytes .../nanox_lrQueueWithdrawal/00003.png | Bin 811 -> 0 bytes .../nanox_lrQueueWithdrawal/00004.png | Bin 415 -> 0 bytes .../00007.png} | Bin .../00008.png} | Bin .../00011.png} | Bin .../00012.png | Bin 0 -> 381 bytes .../00011.png | Bin 0 -> 472 bytes .../00012.png | Bin 0 -> 381 bytes tests/src/lrCompleteQueuedWithdrawal.test.js | 88 ------------------ tests/src/lrCompleteQueuedWithdrawals.test.js | 16 ++-- tests/src/lrQueueWithdrawals.test.js | 14 +-- 97 files changed, 48 insertions(+), 112 deletions(-) delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00001.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00002.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00003.png rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawal/00004.png => nanos_lrCompleteQueuedWithdrawals/00012.png} (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawal/00005.png => nanos_lrCompleteQueuedWithdrawals/00013.png} (100%) delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00000.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00007.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00008.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00009.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00010.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00017.png rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawal => nanos_lrCompleteQueuedWithdrawals_8}/00000.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00001.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00002.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00003.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00004.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00005.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00006.png (100%) create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00007.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00008.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00009.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00010.png rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00011.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00012.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00013.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00014.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00015.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4 => nanos_lrCompleteQueuedWithdrawals_8}/00016.png (100%) rename tests/snapshots/{nanos_lrCompleteQueuedWithdrawals_4/00018.png => nanos_lrCompleteQueuedWithdrawals_8/00017.png} (100%) delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawal/00000.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawal/00001.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawal/00002.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawal/00003.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawal/00004.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawal/00005.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawal/00006.png rename tests/snapshots/{nanos_lrQueueWithdrawal/00007.png => nanos_lrQueueWithdrawals_1_2_dimension/00009.png} (100%) rename tests/snapshots/{nanos_lrQueueWithdrawal/00008.png => nanos_lrQueueWithdrawals_1_2_dimension/00010.png} (100%) create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00013.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00013.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00001.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00002.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00003.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00000.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00004.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00005.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00006.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00007.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00014.png rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawal => nanox_lrCompleteQueuedWithdrawals_8}/00000.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00001.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00002.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00003.png (100%) create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00004.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00005.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00006.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00007.png rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00008.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00009.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00010.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00011.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00012.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawals_4 => nanox_lrCompleteQueuedWithdrawals_8}/00013.png (100%) rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawal/00005.png => nanox_lrCompleteQueuedWithdrawals_8/00014.png} (100%) delete mode 100644 tests/snapshots/nanox_lrQueueWithdrawal/00000.png delete mode 100644 tests/snapshots/nanox_lrQueueWithdrawal/00001.png delete mode 100644 tests/snapshots/nanox_lrQueueWithdrawal/00002.png delete mode 100644 tests/snapshots/nanox_lrQueueWithdrawal/00003.png delete mode 100644 tests/snapshots/nanox_lrQueueWithdrawal/00004.png rename tests/snapshots/{nanox_lrCompleteQueuedWithdrawal/00004.png => nanox_lrQueueWithdrawals_1_2_dimension/00007.png} (100%) rename tests/snapshots/{nanox_lrQueueWithdrawal/00006.png => nanox_lrQueueWithdrawals_1_2_dimension/00008.png} (100%) rename tests/snapshots/{nanox_lrQueueWithdrawal/00005.png => nanox_lrQueueWithdrawals_2_3_dimension/00011.png} (100%) create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png delete mode 100644 tests/src/lrCompleteQueuedWithdrawal.test.js diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index a8a053a..b85a99a 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -190,6 +190,7 @@ typedef struct { // list of strategies indexes **INCREMENTED BY 1** to display in the UI // 0 is reserved for end of array // UNKNOW_LR_STRATEGY is used to display the "unknown" strategy + // assumptions: // (i) in practice, we should not encounter more than // LR_STRATEGIES_COUNT +~ a few potential unsupported // strategies in the plugin. So * 3 should be a good enough buffer. @@ -201,19 +202,28 @@ typedef struct { // -- utils uint16_t parent_item_count; uint16_t current_item_count; + // -- total values uint16_t relegations_count; + uint8_t withdrawals_count; + uint16_t strategies_count; // -- display - uint16_t strategies_count; char withdrawer[ADDRESS_STR_LEN]; // list of strategies indexes **INCREMENTED BY 1** to display in the UI // 0 is reserved for end of array // UNKNOW_LR_STRATEGY is used to display the "unknown" strategy + // assumptions: // (i) in practice, we should not encounter more than // LR_STRATEGIES_COUNT +~ a few potential unsupported // strategies in the plugin. So * 3 should be a good enough buffer. // (ii) in practice there should not be more than (2 ** 8) - 2 known strategies uint8_t strategies[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; + // follows the indexes of the strategies array in this structure. + // value is the withdrawal number + // assumptions: + // (i) in practice, we should not encounter more than + // 255 strategies in queued withdrawal calls + uint8_t withdrawals[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; // follows the indexes of the strategies array in this structure bool is_redelegated[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; } lr_complete_queued_withdrawals_t; diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 1e0a7a6..448925f 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -40,7 +40,7 @@ bool compare_addresses(const char a[ADDRESS_STR_LEN], const char b[ADDRESS_STR_L * * @returns index of the erc20 in the context or UNKNOW_LR_STRATEGY if not found */ -int find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { +uint8_t find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { for (size_t i = 0; i < LR_STRATEGIES_COUNT; i++) { if (compare_addresses(address, lr_erc20_addresses[i])) { return i; @@ -58,7 +58,7 @@ int find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { * * @returns index of the strategy in the context or UNKNOW_LR_STRATEGY if not found */ -int find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { +uint8_t find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { for (size_t i = 0; i < LR_STRATEGIES_COUNT; i++) { if (compare_addresses(address, lr_strategy_addresses[i])) { return i; @@ -211,7 +211,7 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co char address_buffer[ADDRESS_STR_LEN]; getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); - int strategy_index = find_lr_known_strategy(address_buffer); + uint8_t strategy_index = find_lr_known_strategy(address_buffer); params->strategies[params->strategies_count] = (strategy_index != UNKNOW_LR_STRATEGY) ? strategy_index + 1 : UNKNOW_LR_STRATEGY; @@ -442,13 +442,16 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con char address_buffer[ADDRESS_STR_LEN]; getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); - int strategy_index = find_lr_known_strategy(address_buffer); + uint8_t strategy_index = find_lr_known_strategy(address_buffer); if (params->strategies_count < MAX_DISPLAYABLE_LR_STRATEGIES_COUNT) { + params->withdrawals[params->strategies_count] = params->withdrawals_count; + params->strategies[params->strategies_count] = (strategy_index != UNKNOW_LR_STRATEGY) ? strategy_index + 1 : UNKNOW_LR_STRATEGY; - PRINTF("STRATEGY #: %d STRATEGY: %d\n", + PRINTF("WITHDRAWAL #: %d STRATEGY #: %d STRATEGY: %d\n", + params->parent_item_count, params->strategies_count, strategy_index); } @@ -470,6 +473,8 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con if (params->current_item_count == 0 && params->parent_item_count > 0) { // shares array is empty AND we have other queuedWithdrawals to parse + params->parent_item_count -= 1; + params->withdrawals_count += 1; context->next_param = LRCQW_WITHDRAWALS__ITEM__STAKER; } else { context->next_param = LRCQW_WITHDRAWALS__ITEM__SHARES__ITEMS; @@ -483,6 +488,7 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con if (params->current_item_count == 0) { // we arrive at the end of the Withdrawal struct params->parent_item_count -= 1; + params->withdrawals_count += 1; if (params->parent_item_count == 0) { // we arrive at the end of the Withdrawals array context->next_param = LRCQW_TOKENS_LENGTH; @@ -537,6 +543,7 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con params->current_item_count -= 1; if (params->current_item_count == 0) { // we arrive at the end of the tokens array + params->parent_item_count -= 1; if (params->parent_item_count == 0) { // if we don't have other Withdrawals to parse context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH; @@ -590,8 +597,11 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con { uint16_t index = params->relegations_count - params->current_item_count; + uint16_t value; + U2BE_from_parameter(msg->parameter, &value); // if false, token is redelegated - params->is_redelegated[index] = msg->parameter[0] == 0; + params->is_redelegated[index] = value == 0; + PRINTF("RECEIVE AS TOKENS #%d: %d\n", index, value); } params->current_item_count -= 1; if (params->current_item_count == 0) { diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c index 9ded161..3aab58e 100644 --- a/src/query_contract_ui/eigenlayer.c +++ b/src/query_contract_ui/eigenlayer.c @@ -141,16 +141,18 @@ bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *contex { // removing the first screen to current screen index // to get the index of the withdrawal - uint8_t withdrawal_index = msg->screenIndex - 2; + uint8_t strategy_index = msg->screenIndex - 2; + uint8_t withdrawal_index = params->withdrawals[strategy_index]; + PRINTF("strat: %d || withdrawal_index: %d\n", strategy_index, withdrawal_index); - if (withdrawal_index < params->strategies_count) { + if (strategy_index < params->strategies_count) { if (params->is_redelegated[withdrawal_index]) { strlcpy(msg->title, "Redelegate", msg->titleLength); } else { strlcpy(msg->title, "Withdraw", msg->titleLength); } - uint8_t strategy = params->strategies[withdrawal_index]; + uint8_t strategy = params->strategies[strategy_index]; if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { strlcpy(msg->msg, "UNKNOWN", msg->msgLength); } else { diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00001.png deleted file mode 100644 index c978af0baf12daf4747b904387f03ec16315336b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcmV-?0fYXDP)A?o1(9QaD50hV0000?&F2u(JOS>)wsm9y-rfVa z!skfau0E!-66Dpa#1Vj-Tcng}Ebqpu)M@C07Slkw*;uQH?&t>y9?#gOrL_cd#yO3Pwgx}%-; zw>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE$za67WO)7|KVzNRA5z3jdyO~NB^7P| zRx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw<_EZ2vs=insa=EO(EcW1FfP*)lDibP zyIOeAjv2HAw3AJnl`++hU}s&0AHsEy;_m4{bc3_A#x1Yqc)vne7qkii4`E;In*;y= agyIWiG1|MBe_I9s0000xHgBXOd|&GS4p`H5{2&%dGsa z(%I3MP5#uoOOwD+N|2M=ruSbS{`Nk^*r=3#ztHR>?9feN!v1jo?nzSCkXk8CST+V0~}6HrADXDA`U5LV!JZ61=dloQcXe&$<(NnIeq n85D?~3rZ%F3y>s9a$Wub=qXRwE})=500000NkvXXu0mjf=z7S; diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00003.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00003.png deleted file mode 100644 index eeec6324a1f33b9b155d3e979728a086251adb10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uB3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH1)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000uFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f`x{aQUCw| delta 306 zcmV-20nPs90?h)DB!3i1L_t(|ob8#-4#FT1gu%%BKd=Wq&=AV*f+h_+Yv(%{{w%mt zrm{_m5JCvq%KLRH57l9S`mN<KUVuSWqTdZwlBP#fC}|?~ z!}{J@?bTJww_vauwVH%k$?~$%>Xn}!pzeSR!8S3cXTWB1fq%6ZKLG|i9;(}>-Z`&E z1PkgP!V>EbmApa>BCRzbi|{h~8!&^+=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI( zt#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^iejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;8 z2B_K4n!iMi+AD>i3Q)O$2B;P!U4Hpuk`O`&A%w)?1McgeP`5FwjsO4v07*qoM6N<$ Eg53>{jQ{`u diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png index 5d10a09010526e7de70eab95e0b3a8b29ae7d6d7..82030b711fe69207d044d44c0ff7bbee83f4da1c 100644 GIT binary patch delta 322 zcmV-I0loge0^I_TB!47HL_t(|ob8$062c%1M5$x{|AYHbAF7C4Vt|&cxMv(k375c@ zAkjHO2q9z;`}Th6n>3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH1)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000uFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f`x{aQUCw| delta 306 zcmV-20nPs90?h)DB!3i1L_t(|ob8#-4#FT1gu%%BKd=Wq&=AV*f+h_+Yv(%{{w%mt zrm{_m5JCvq%KLRH57l9S`mN<KUVuSWqTdZwlBP#fC}|?~ z!}{J@?bTJww_vauwVH%k$?~$%>Xn}!pzeSR!8S3cXTWB1fq%6ZKLG|i9;(}>-Z`&E z1PkgP!V>EbmApa>BCRzbi|{h~8!&^+=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI( zt#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^iejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;8 z2B_K4n!iMi+AD>i3Q)O$2B;P!U4Hpuk`O`&A%w)?1McgeP`5FwjsO4v07*qoM6N<$ Eg53>{jQ{`u diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00012.png similarity index 100% rename from tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00004.png rename to tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00012.png diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00005.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00013.png similarity index 100% rename from tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00005.png rename to tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00013.png diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png index 9c7e7049cb3e9bcfb1601ec510ee465d38229d4d..ce795f34e8569e986af689fded3b59c9a8af2961 100644 GIT binary patch delta 322 zcmV-I0logz0^I_TB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&i0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&G zII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=mSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*U zj-J(h>P7(Y#xl^nkBhIt`kQe1WT9~g7`&Ns0r)K_0Og4C5BBp0_v3}4{b+)F00000 LNkvXXu0mjfZW)%( diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00000.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00000.png deleted file mode 100644 index 8d84cc70fea8013b7e8b25c0982ce142fa103d5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00007.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00007.png deleted file mode 100644 index 5d10a09010526e7de70eab95e0b3a8b29ae7d6d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmV-F0l@x=P)MU4&cA zutzmbeAIV?Ua~d!=m{7!CFp8sl5{<~LPZmaHlwvIOVw4=mw>q%HCu$UlIdZgRV(ii zWL*J&B)1a_+5?<9YFhUaCjfKDEbBJ3=eQaxxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f z?}lP(Sl=0F5DC0cBguh+*1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{ z8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rFT@Vd$&YVPUw=)9(0001N&kM**sQZn6 R=$-%o002ovPDHLkV1jp6eW?Hd diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00008.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00008.png deleted file mode 100644 index 4fe8a80119d949f651fb52a2d7a2705d68969fc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 zcmV-T0kZyyP)L;_i4Z~v*~#8nv2)S;_LU(dw0- z9-!`k3&A!qr)R)sa)GrMKLG|i9;(}>-Z`&E1PkgP!V>EbmApa>BCRzbi|{h~8!&^+ z=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI(t#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^i zejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;82B_K4n!iMi+J&GBP`QBys1_t$e)(dO f5JCtcgv8+k?(3gWw=t`Z00000NkvXXu0mjf5lfJ8 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00009.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00009.png deleted file mode 100644 index 4b233bc4ea59997e2b76d999ce5937bed333a71a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmV-U0kQsxP)Q#rgEy62i z+P;_)_vJTWw%nR`^a2cq6LdEWOQs*wp{AKchtb|qrS7WbN5DdjT5Td&$?{>N)hjJL@~k2A1Jz;^~= gu?zqJ008g=Rs$iOT)&xM)c^nh07*qoM6N<$f;Vl6p#T5? diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00010.png deleted file mode 100644 index 9a6aeb06d8fbe06680ec17d2093a7983479f02ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-~$P)8h{Qn2{&>ZYI1WCP~+$D^xU*=rlUoLaMIXegw>F)UXJ%l5MkdG%Ak~ zWZeOOB)5qL-2N}=Qug(3MkL;g^p=2sWn02=u z$@C=Ls{-=anAf7`TRW?YnFKIVYxg%Tb^iV!j!YKxNRkPVsZQy`QWi9S&$YW$00000 b06TF4pi`+lSB~T#00000NkvXXu0mjfN#=^q diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00017.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_4/00017.png deleted file mode 100644 index 9c7e7049cb3e9bcfb1601ec510ee465d38229d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvIrP)b=%MgRq*37h4eRxPbkJCLY|1VIo49_}P}TKpH4$L<8?X{t;p zy+UQc_4@p%0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&GII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=m zSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*Uj-J(h>P7(Y#?ZWvi?6}@n{fGLp>YTp myqR(V_$?>^<%seR_VWh!y@Tw;Khthi?!M+uj}mLSnNLI@#b5c~Fi>6ktsQvb*J4@Y61iH*6g6Mgj}rg&c#oQ-ozFvd2M8aO)s$UTjWPs_9guy{285&j z3Kw7@Kq*A%+bT_AcoBxK_2E=*57@@e)qOh%Qs*$*b8#o)`PNN{r5{ z0>Fy(l2M`%CR-;@N-_A}S)_DA z;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh>BTxkhiLavuYUa+?1NEs-0T#drmj^O; zsA9BB#@UGEOuwKC5E(!N)DTokWDfM-At8hiLP*anZw$o(|1uge00000NkvXXu0mjf D<;RyD literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00009.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f84470ac161bd75bb2966852d72414df5870f1 GIT binary patch literal 356 zcmV-q0h|7bP)_tq-P?c)+)Yk(5vB0zR8#Ov0%c(Pc$>@@jgKWny2VM0t5v z09IxPAVz^Rs2`T#7`hW!0fJ%-l$HD0u;uPX!6ZN{$A%hsa+NHE$=b>JMMNicnbUpO z2>_tqv$X+VqA$itKC!E96^Z8Kw0IJ~hO20@?z|t=6=2*rt2w*M8l?&?R)G3Ls}PQk zSGa%{0&Il{e_Ll!8eWW{b8R@4NBto`h@gDY5b)6)<0YJm5nQIqv#w?rd0y;sl^C5@ z1z=}(0%8_8liINa$Iyeo3NRSPKv{X5f|R=&ib;T0_6;>?$z7rlCQB!eN-^f%Sxwx; z@s3eVWZkXi2lXveTru3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH1)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&i0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&G zII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=mSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*U zj-J(h>P7(Y#xl^nkBhIt`kQe1WT9~g7`&Ns0r)K_0Og4C5BBp0_v3}4{b+)F00000 LNkvXXu0mjfZW)%( diff --git a/tests/snapshots/nanos_lrQueueWithdrawal/00000.png b/tests/snapshots/nanos_lrQueueWithdrawal/00000.png deleted file mode 100644 index 8d84cc70fea8013b7e8b25c0982ce142fa103d5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY diff --git a/tests/snapshots/nanos_lrQueueWithdrawal/00001.png b/tests/snapshots/nanos_lrQueueWithdrawal/00001.png deleted file mode 100644 index c978af0baf12daf4747b904387f03ec16315336b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcmV-?0fYXDP)A?o1(9QaD50hV0000?&F2u(JOS>)wsm9y-rfVa z!skfau0E!-66Dpa#1Vj-Tcng}Ebqpu)M@C07Slkw*;uQH?&t>y9?#gOrL_cd#yO3Pwgx}%-; zw>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE$za67WO)7|KVzNRA5z3jdyO~NB^7P| zRx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw<_EZ2vs=insa=EO(EcW1FfP*)lDibP zyIOeAjv2HAw3AJnl`++hU}s&0AHsEy;_m4{bc3_A#x1Yqc)vne7qkii4`E;In*;y= agyIWiG1|MBe_I9s00006AU%cghc?Dy$(FuMvW9EUre&OuTnl0tF#F0UiGw! ze0ajgj^@G@DVH6@e1hN;YG2KMAe?dK-yMh;SmHMe-GQA!mfs=ArEJC}U@o^w2X?(O zIcW7UinUCO0bj=^D@D6HJEGUw`yy5zWI;Q#-I63?Dx>9UV5*x;*uWVPlu>b8Seoq* z^BeeTrB)2c00E&|xm|1#*s5i`1NGEdrHHeXCshvg@OD-Jge%m;JzQ8yY7nM)?u&Q; zq+|Ri*BsLW>^7|cT+rZmIkN636w|`joVilWzXp{#OYA)eA_hSa1VPZi2W!te?0^*{ QrT_o{07*qoM6N<$g80L)?*IS* diff --git a/tests/snapshots/nanos_lrQueueWithdrawal/00003.png b/tests/snapshots/nanos_lrQueueWithdrawal/00003.png deleted file mode 100644 index 06c3c59a9000082a980407c1e47a01c43dbfef53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmVy=XsTBzC3UiqC3r6AL;d9(XozFWhug&n5*Z+4eW?`wG#c1nV%)07t z)`i+5HF#Cn-cgIG906DWpJ24FYQH!r)f#+24F|!L2ymozz=IP+qbiXw@{5(LEkF{7 ziADItJbcWsN41sJOH;cn_KDuMv*;djhhjzL zhO?jME&$TH=j|*)Xf@Npe?f>w*14eL+Yj>9%ZE6@6z;fWISxl)Y#pGGB z)~KDf-t+WiOYkl+9;!w+y6>tW2!bF8g4^%~Jr#&C0X|@d00000NkvXXu0mjf{gm*e diff --git a/tests/snapshots/nanos_lrQueueWithdrawal/00004.png b/tests/snapshots/nanos_lrQueueWithdrawal/00004.png deleted file mode 100644 index 53e7aa041e7dc3e9453476b700c868cce35e5416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmVgw{{Ii|qAqrhIbg5g(6!>ZN=5JsbVQUSNs=V}yq=ritjGk^UQM+_DTda; zOS@$j>g>J(HV0NI#ne_HJQVLZ!36!>kE>|&deZXPc*FAe{4T{JEV~!6x^*pQ5&3;7l?Koym5Q7p0j!t=O)}7aQ$A^0172|KV31 zlTqJ=%p9muZK+RBqkcR#RlkX5_5=70b}37)1_-;FEMrr%&Bn}V#{h^Z{zJ@?ZZrnE z$(hSKWjoRC;SIn^U=r)7es%)279VPUuc|eymvOo6$HEd+2YNukJ26lrk(DW_@@*6K+tZ(XZNmzKc< zwfGOfQA4Y;zp`ur`vl8v746!KUDOe(hh(%iF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZ zm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&UrW?S65vFYo8Ui;l}^tK&E^OPGD3n~}% zzKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwnj)ts`EeQhpElb~sdp$$e=-@EA;PGdQ zz3p^DyDGy&n>?kIJ*6TBEXF)9>x0<=fCNVR*w7DjV%w_KJ&oA`$f3stP4Z~Tstlc0 zY}4(*)Bxxusr|U;YuaSnlI`8#<1+NL11P;#C_I^bcwgKF0M4i g5(GgI1VL~G-U}%#VS}wMHUIzs07*qoM6N<$f<$)Cr~m)} diff --git a/tests/snapshots/nanos_lrQueueWithdrawal/00006.png b/tests/snapshots/nanos_lrQueueWithdrawal/00006.png deleted file mode 100644 index eeec6324a1f33b9b155d3e979728a086251adb10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00013.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9156c31edf73cb072eaebf2db3fbe1ba5c612b GIT binary patch literal 414 zcmV;P0b%}$P)j~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00001.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00001.png deleted file mode 100644 index f86d7e2bc7c744a8c5f9c8c987b0fefa39364db1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=ltba4!+nDh3gW8Yx~9*4lF zv%W?Dm4E7Oc4*e&5fNyy`g~t&;S$9g0$$EQO$>S8t?o9QcTs66hz+;uTfWUk?)RtS zU5v&_?$vMdUf1qoWZq;VKG8%W$Mk1$I=A``&I1=zl$GL+wa;d7xj+Bn;yWw{yxsbX zgc}mXoX$VcWH@;^3217AWLcoaMxUHFuToS`n^#WT@_$L~+1zs9|FySG&zF6l_BLa$ z_%eC@zf-Qx7volcH{-6-++}A2YgcLCPJ7K9ZJB-Vr|l%Sd1AubVsD)LcrJT0_wCQK z`!19OFaP=5SnGaS|3x#stqE!Y0FS(tu3p779qfu8x}rkQ7# zzxD}_Gfny=Xkadpoxkl?u&G?>3gtJd-&EJU-;w3K+k&?&?#8Z^*G*?`KH9bD`B%Fy zy!n3*{uI4xA0YS0e93cTH;0HX*?)X^1VVSulDPB0SzWk!?Ta{2pdo>T+3~AXY>ubM RNT+~AJzf1=);T3K0RWFpxJv*4 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00002.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00002.png deleted file mode 100644 index e6fdcb1d964f122ee239fccf6ef30ed9a96fc9a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcmV+l0`>igP)c#GWv!d5gX5T2^Q(ISZ&ULPf za;Yk1Dotm0{6OjDXyv-z(v0%iSN#wI@Bn#HEwp5B#-ECW) zg;+E1^|HlU@mu9ar$MV;W*uvh70qsIbtl!QB)`fFSD(8VdqH;;H;Y;I#=*UVzgN4| z4+dL%Bb*h>n(+qfiCYxo{8L;$hg>>=t7p4K2lzvEhozJC$I<;CcS;e>i`j@8$& z&^P1i5l~-Jvq&kojBpNVHYi`f?w2b4B82llfokDWIBS=86_f7worh68GaFNjz>`}3 zP>qC4%@G|?i|zwR3uYk{og~u-Q;}W(000000000000000003Z`U*UPi()205V*mgE M07*qoM6N<$f+0QeS^xk5 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00003.png deleted file mode 100644 index b2401b220a6db139961dbcfed78507c4de86032a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu@#P)Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png index af34fd01d1aab1c8d18e2d19a328e40975639de8..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 390 zcmV;10eSv|1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!drQXZa#WAE}&fA;0d`$*C4G%N-c)qV+a`&jb+SyCB8n13S-Fq&s#FLSE zFp`Ubf#JcsXO$bGvNc^@N^aJOOe~vy^qu>D-`DRd4TP(%9`kcC>DYR$?s0de%lw8^ zuZ1Psw`tBbI++pe^OkMd1F_R~G1>V%>-*?kz@I}w5pTs0|A^ypmO@4UF7MxS*-6XeSDrp>9vFM`owbbCwa(>AJ{s+U=k+t0+Ww18>4;yoJJrXbUVQuI ztnSK}H#4Nqeatsfd*Cb|me^d$mSa6ve{QwWJ0=eYgWF9;dtA5FE9uD{O0O~6&zXNn ztkU+ff^e;QbAWJd`V$4ASdB}w6(%>Y<F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1gY@ze)fA delta 359 zcmV-t0hs=&1A+sPB!5XsL_t(|obB0B4#FS|fMGP=r1w7(cky8f!4^7~xl;B2o;F2v zEv*wv0RR91!rda@tkzme5s`MRPDP|20>7%Er_*NJNU;uR(}9Z zl|nH~Ta`|kWVA1)et;@C=Qu`a1t|V?wrBgAu&0Q0<+Wa}cpI5e^^UlO{*y7@ov>*ZYB4?M~%EjpqvpcIplK=n!AXw;b z=ts;pcI<=w-K{#sG4_|UKW6tdkEDA+{g&r;{H5FdyOJiLylxfPexk+n9VFsZl z`oYM-N_3%>c7jX}E=70&000000000000000004l?JOL3a+Tp@X(2W29002ovPDHLk FV1k0Hr`!Ml diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png index af34fd01d1aab1c8d18e2d19a328e40975639de8..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 390 zcmV;10eSv|1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!drQXZa#WAE}&fA;0d`$*C4G%N-c)qV+a`&jb+SyCB8n13S-Fq&s#FLSE zFp`Ubf#JcsXO$bGvNc^@N^aJOOe~vy^qu>D-`DRd4TP(%9`kcC>DYR$?s0de%lw8^ zuZ1Psw`tBbI++pe^OkMd1F_R~G1>V%>-*?kz@I}w5pTs0|A^ypmO@4UF7MxS*-6XeSDrp>9vFM`owbbCwa(>AJ{s+U=k+t0+Ww18>4;yoJJrXbUVQuI ztnSK}H#4Nqeatsfd*Cb|me^d$mSa6ve{QwWJ0=eYgWF9;dtA5FE9uD{O0O~6&zXNn ztkU+ff^e;QbAWJd`V$4ASdB}w6(%>Y<F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1gY@ze)fA delta 359 zcmV-t0hs=&1A+sPB!5XsL_t(|obB0B4#FS|fMGP=r1w7(cky8f!4^7~xl;B2o;F2v zEv*wv0RR91!rda@tkzme5s`MRPDP|20>7%Er_*NJNU;uR(}9Z zl|nH~Ta`|kWVA1)et;@C=Qu`a1t|V?wrBgAu&0Q0<+Wa}cpI5e^^UlO{*y7@ov>*ZYB4?M~%EjpqvpcIplK=n!AXw;b z=ts;pcI<=w-K{#sG4_|UKW6tdkEDA+{g&r;{H5FdyOJiLylxfPexk+n9VFsZl z`oYM-N_3%>c7jX}E=70&000000000000000004l?JOL3a+Tp@X(2W29002ovPDHLk FV1k0Hr`!Ml diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png index e90cd9db37ed7e4c669da0b1abe6e4a823770f3c..657887225857cf48be8a8daed2cb3e89d4b29ece 100644 GIT binary patch delta 354 zcmaFI^p|OZO1+Dxi(^Q|oVPcl`3@-vI0Po$;rtyhRQ<8JMIk?%eObZz=}8L@T*!1t zWzj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCw2HK`l` delta 339 zcmey%^p0tQO1-J4i(^Q|oVPclR~<4CX?>`1PUW-wrFq@_jX}kk$&Q=C{_bC{yxi%I z_H^ILLJV*qDJUp-{om@BJF6JNOIGKE|2m}8FsJzEVy*Ar3abyaMl!6N-kAS2*sK34 z^NtmF3uIQ$mkDi&x~{%H3tZ zvTc^&QHE1ba^rn`=AOG#w&}HTh3wzZyU+KlI&I{gYm>a+wq>>Q5mm+5Cfld1Y|$6? jX68ChzTpPvpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*vxp~!c|v~`MH>MY`s?ZxVzG2enYC)!jkRVH0K(f%!u}R%eL%+*lD{M?E?|<%j<4m zbJ>4gCq?ar)rk$f>)LN=#j?t5$_wZgdgz-&@PtKmTmGiS_Th=`;AE z=hRPP61ouou~TmJe&LWXrLht3S8e=pB=X zgTd`4qdl%$>Xr254yD%^?dQxtBvxsASwXngyg5L)HvNf$P^`wK*$R`J*K+6sZAS(h Z&IeOmXuOjcLY?bsS-{o}YzSUrR9R3}64=&61)Q?}?Yt837*cy8gA!K(4EbX)rG zSsT{RYV~2=>uZ$L{4Zp>S2$z)58hLng4Tyu#fir*q_$vBp6HFbMaOuS#(v$qhqGYUx7nozXClo!%^z>$-Lxg}_ktyy zH~u*Dm2i6%?Kb;;zwk%zopr05}4wVgLXD diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00006.png deleted file mode 100644 index ab0ed7d61504543993a76bb82da0ff9edbf58df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|^{vV=(`!`GS=}9%)&tFL}=GIh8a?eMOUW&hLV?45@$S zd|k1IvpQ5iMe9ZBgfwXxe$&t$To$Q!7O<%%xkp@my+`|i-`<;_*Y(MN{$82Nz3ZKq z&urau_MY5A3G$o1-`E<%_IKg;w9+gApnEKeV|n)m=2sqnH|70~SITwQt5@dhy?+z8 zHQ>V51qUZRKfJ8q2+IjK#qG0SFDTnDn|sLio>~%9RS3I%1lKF`2mfyGdX_Ktc$@0x z2Ejcq@`W~3#_^SKcYRo-wz%fW{1Z>jYwq|}$eZm$kzSlvsYQkZMOLP zW_jx0l(;i3`=pbXud?k}Yg+%|@Sk`8n5Jp67WQw`l%1JUqO4nJ&L>rd!CrwLU&`-OVHJf99vp z^#6a@b>7WqajpM2+ZCrJef(A4D)#u^>thdJ|7O@PV0-)J)U!zoS!AS)3(LN$orz>^ zjk-|2YHGvA=QI9&4%x;Uy6^dh(wZOA0Y@AwyiJcUpT#!w#d1z3-!GFVHqU+GWG%}w jQ|3j&LwL#RobX?V zbQiII^4uMl|Z~1l7yy12MZ$b&j z?TtJM^{@JVDT&uHZn5nzWh-TPv_J7m;jgq0f(|YbTZHdAM)myZxO-=(=&Jp4l55=A zUQcBF*M05wg}=Y7bG1(&{&siyl(&8#-KTdql}}rLm3hWhy}m5glJN5fpDsOd=_5x% z{HDvZre)46&g0e%{pDoXaPf-VTe-XJSGLU(Jj!tDNp8H)+;exzHoZ2kko_Ba_xXNR zr;WUGZIbufwyah@qN*6%Wc!qrE&9UV%v{IGH{4)eXE1ondwSC@^_ATTjUX{kS3j3^ HP6b30Fxen#$Z+;y9w^y%5m+iQT_$vb`=3}3iOljFr=22^wWuI)q!g~`hx?48+Wbzhv*P6LeYJ8|dQ3*n?YHU=?_XJ~ zQ!75pXnUwY*JITar&rx#U|1!6hVk*Yw^iwPZ@&Gy$d_%N{^NZncSG2HHtJ-suPJl; z?)9#(LsnsrQP%%0H?f8PAI}_C3^zap2o4$Z!b;q~*_CqQ)$7e=* z<{uFHSv}2D?RT2mO10m|UNHNIDEfO%dfB|#LmwDY$e`eiaC{DnT5s-KZIH01tDnm{ Hr-UW|p&GO8 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00005.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..c63a3b840a14de66db65b55d3950c561e819ba67 GIT binary patch literal 425 zcmV;a0apHrP)aNnf^KFZgjUl^=CFq zfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@=&o;)7?PO4mf`A zQ_6bM#SDcV^{u!apj7S2c`(1zw^7h9;j)PqHfwJbv;&I&&!!3f-B$ItNgH)4!XY|2NRH2=WB+~~=kzN1*0000000000000000AQIPb>Q31IlGsZ>P!Tdz2~FKAWsrZa2R@B0001hyRY3B$T`>Jl+r`r zQsT{kPx0+@nUbk?FyhELAH1=jQy0D_lVg|*a~kyl{drPKN?1Fko}0DLahd_W+Tpg( z!@@F*TnwnEDhKILf33dVXVyB+0MT3V-1WzO<17(oz%bYha4Skq15l=a&RIO&?MJ=O zW+_lgQ~$`D`E`4}pD97Z?yWbj2h>XP%8hO1vtlCrLh-w6ax)_sT~Qi&%FNKE7)KJDnb8KtO00ij;KF(B}-7`KI{Ln z347ZuBfX)D<6TXYO!nOjQcd=qF$O15g-$Y(%ouD%dI10c000000000000000fNg#O XN@F1go7$9>00000NkvXXu0mjfQ&PW3 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00008.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00008.png similarity index 100% rename from tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00008.png rename to tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00008.png diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00009.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00009.png similarity index 100% rename from tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00009.png rename to tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00009.png diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00010.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00010.png similarity index 100% rename from tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00010.png rename to tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00010.png diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00011.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00011.png similarity index 100% rename from tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00011.png rename to tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00011.png diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00012.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00012.png similarity index 100% rename from tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00012.png rename to tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00012.png diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00013.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00013.png similarity index 100% rename from tests/snapshots/nanox_lrCompleteQueuedWithdrawals_4/00013.png rename to tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00013.png diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00005.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00014.png similarity index 100% rename from tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00005.png rename to tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00014.png diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00004.png index af34fd01d1aab1c8d18e2d19a328e40975639de8..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 390 zcmV;10eSv|1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!drQXZa#WAE}&fA;0d`$*C4G%N-c)qV+a`&jb+SyCB8n13S-Fq&s#FLSE zFp`Ubf#JcsXO$bGvNc^@N^aJOOe~vy^qu>D-`DRd4TP(%9`kcC>DYR$?s0de%lw8^ zuZ1Psw`tBbI++pe^OkMd1F_R~G1>V%>-*?kz@I}w5pTs0|A^ypmO@4UF7MxS*-6XeSDrp>9vFM`owbbCwa(>AJ{s+U=k+t0+Ww18>4;yoJJrXbUVQuI ztnSK}H#4Nqeatsfd*Cb|me^d$mSa6ve{QwWJ0=eYgWF9;dtA5FE9uD{O0O~6&zXNn ztkU+ff^e;QbAWJd`V$4ASdB}w6(%>Y<zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCw2HK`l` delta 339 zcmey%^p0tQO1-J4i(^Q|oVPclR~<4CX?>`1PUW-wrFq@_jX}kk$&Q=C{_bC{yxi%I z_H^ILLJV*qDJUp-{om@BJF6JNOIGKE|2m}8FsJzEVy*Ar3abyaMl!6N-kAS2*sK34 z^NtmF3uIQ$mkDi&x~{%H3tZ zvTc^&QHE1ba^rn`=AOG#w&}HTh3wzZyU+KlI&I{gYm>a+wq>>Q5mm+5Cfld1Y|$6? jX68ChzTpPvpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*S8t?o9QcTs66hz+;uTfWUk?)RtS zU5v&_?$vMdUf1qoWZq;VKG8%W$Mk1$I=A``&I1=zl$GL+wa;d7xj+Bn;yWw{yxsbX zgc}mXoX$VcWH@;^3217AWLcoaMxUHFuToS`n^#WT@_$L~+1zs9|FySG&zF6l_BLa$ z_%eC@zf-Qx7volcH{-6-++}A2YgcLCPJ7K9ZJB-Vr|l%Sd1AubVsD)LcrJT0_wCQK z`!19OFaP=5SnGaS|3x#stqE!Y0FS(tu3p779qfu8x}rkQ7# zzxD}_Gfny=Xkadpoxkl?u&G?>3gtJd-&EJU-;w3K+k&?&?#8Z^*G*?`KH9bD`B%Fy zy!n3*{uI4xA0YS0e93cTH;0HX*?)X^1VVSulDPB0SzWk!?Ta{2pdo>T+3~AXY>ubM RNT+~AJzf1=);T3K0RWFpxJv*4 diff --git a/tests/snapshots/nanox_lrQueueWithdrawal/00002.png b/tests/snapshots/nanox_lrQueueWithdrawal/00002.png deleted file mode 100644 index 853699333c5a0dae345c0c4b086505eae20f4229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 496 zcmV5u|661nhafBr#N@gF0001UA2wmU_wm>{7te&_ zDV0yD%HEe{urx<6&DV6M9gs?I+jM*c`T2OpITz2@da*g+YSHs3t8bLgrL_y*`#jfC zyi}1gk*1IxJ&^lxm2#b*DMq<{nM1ZsLAr;D==_!*#b%P+HU;I1L;gk1Q$T!yYRj&9aVrQ{Y z`hJ7*mw>2YDBMta?b2=xrR}r!>r^v#JC*dos6xg_qA~hlr}?uG`ZbbFA1pLFNuq+hPRQ`of(U zA%qY@$bL*}sO$7}ODMyNbusxhReMc!>)E>~wIgXt?U-7z*EhAFvSTqP46iUE%c~XT z@mQ4yKzZCHP{!E9atlAW#Xew0iYOT&ligBxqQz6xf@rx?K8GZDj25IuLTb6LfB_-e z`{b62YIEQiAC*Zn0WhlM>OcX-ZnKS0qh?$$kUif?Q__7#{cbp&dUe28$k9)-$-8DI zTNXFVk})&v_6uQaz!L(;b$FKoZK|{Zkd0X;oMxr!Rg}f#TybAf8}+X9^~{#wTH^ZY zaboqVZ=ohWYm4%sbe&A^Z$oi4y}ud8;3S-dPBL&ZW3UwI-mx00s(lHbMAW)?Pi8z? zs~rGc0#}S0t=&HE+dOjTjtdxX)px_y&AGlc!lzfG^>*MUSc-7TUe8ShB8AUA?LG}a zGmQY*%cWqerqp7ob6OtGRC8j3JuQq!>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jC zj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1?`e~&eN{KLi<}??Fz(D@;q|%dlwe9M-`W*^-(NvZstWN;SI?sCC}rW|5pW4N1JevQ3mhL zNW;48cQ31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00004.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00007.png similarity index 100% rename from tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00004.png rename to tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00007.png diff --git a/tests/snapshots/nanox_lrQueueWithdrawal/00006.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png similarity index 100% rename from tests/snapshots/nanox_lrQueueWithdrawal/00006.png rename to tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png diff --git a/tests/snapshots/nanox_lrQueueWithdrawal/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00011.png similarity index 100% rename from tests/snapshots/nanox_lrQueueWithdrawal/00005.png rename to tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00011.png diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..657887225857cf48be8a8daed2cb3e89d4b29ece GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/src/lrCompleteQueuedWithdrawal.test.js b/tests/src/lrCompleteQueuedWithdrawal.test.js deleted file mode 100644 index ec43e7f..0000000 --- a/tests/src/lrCompleteQueuedWithdrawal.test.js +++ /dev/null @@ -1,88 +0,0 @@ -import 'core-js/stable'; -import 'regenerator-runtime/runtime'; -import { - waitForAppScreen, - kilnJSON, - zemu, - genericTx, - nano_models, - SPECULOS_ADDRESS, - txFromEtherscan, -} from './test.fixture'; -import { ethers } from 'ethers'; -import { parseEther, parseUnits } from 'ethers/lib/utils'; -import { ledgerService } from '@ledgerhq/hw-app-eth'; - -const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager - -const pluginName = 'Kiln'; -const abi_path = `../cal/abis/${contractAddr}.json`; -const abi = require(abi_path); - -nano_models.forEach(function (model) { - test( - '[Nano ' + model.letter + '] LR Complete Queued Withdrawal', - zemu(model, async (sim, eth) => { - const contract = new ethers.Contract(contractAddr, abi); - - const queuedWithdrawal = { - strategies: [ - '0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff', // ankrETH strat - '0xa4C637e0F704745D182e4D38cAb7E7485321d059', // OETH strat - ], - shares: [1000, 2000], - depositor: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', - withdrawerAndNonce: { - withdrawer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', - nonce: 1, - }, - withdrawalStartBlock: 12345678, - delegatedAddress: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // Placeholder delegated address - }; - const tokens = [ - '0xE95A203B1a91a908F9B9CE46459d101078c2c3cb', // ankrETH erc20 - '0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3', // OETH erc20 - ]; // Placeholder token addresses - const middlewareTimesIndex = 0; // Placeholder middleware times index - const receiveAsTokens = true; // Placeholder boolean - - // Generate the transaction data 0xf044c946 - const { data } = - await contract.populateTransaction.completeQueuedWithdrawal( - queuedWithdrawal, - tokens, - middlewareTimesIndex, - receiveAsTokens - ); - - let unsignedTx = genericTx; - console.log(unsignedTx); - - unsignedTx.to = contractAddr; - unsignedTx.data = data; - unsignedTx.value = parseEther('0'); - - const serializedTx = ethers.utils - .serializeTransaction(unsignedTx) - .slice(2); - const resolution = await ledgerService.resolveTransaction( - serializedTx, - eth.loadConfig, - { - externalPlugins: true, - } - ); - const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = 4; - - await waitForAppScreen(sim); - await sim.navigateAndCompareSnapshots( - '.', - model.name + '_lrCompleteQueuedWithdrawal', - [right_clicks, 0] - ); - await tx; - }), - 30000 - ); -}); diff --git a/tests/src/lrCompleteQueuedWithdrawals.test.js b/tests/src/lrCompleteQueuedWithdrawals.test.js index 05853c8..c0adb91 100644 --- a/tests/src/lrCompleteQueuedWithdrawals.test.js +++ b/tests/src/lrCompleteQueuedWithdrawals.test.js @@ -88,7 +88,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 11 : 9; + const right_clicks = model.letter === 'S' ? 12 : 9; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -144,7 +144,7 @@ nano_models.forEach(function (model) { ], ], [0], - [true] + [false] ); let unsignedTx = genericTx; @@ -164,7 +164,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 11 : 9; + const right_clicks = model.letter === 'S' ? 9 : 6; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -220,7 +220,7 @@ nano_models.forEach(function (model) { ], ], [0], - [false] + [true] ); let unsignedTx = genericTx; @@ -240,7 +240,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 11 : 9; + const right_clicks = model.letter === 'S' ? 9 : 6; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -339,7 +339,7 @@ nano_models.forEach(function (model) { ], ], [0, 0, 1], - [false, true, false] + [false, true, true, false, true, true, true, true] ); let unsignedTx = genericTx; @@ -359,12 +359,12 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 17 : 15; + const right_clicks = model.letter === 'S' ? 16 : 13; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( '.', - model.name + '_lrCompleteQueuedWithdrawals_4', + model.name + '_lrCompleteQueuedWithdrawals_8', [right_clicks, 0] ); await tx; diff --git a/tests/src/lrQueueWithdrawals.test.js b/tests/src/lrQueueWithdrawals.test.js index eab45de..5391986 100644 --- a/tests/src/lrQueueWithdrawals.test.js +++ b/tests/src/lrQueueWithdrawals.test.js @@ -44,7 +44,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 8 : 6; + const right_clicks = model.letter === 'S' ? 9 : 7; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -54,7 +54,7 @@ nano_models.forEach(function (model) { ); await tx; }), - 30000 + 10000 ); test( @@ -100,7 +100,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 12 : 10; + const right_clicks = model.letter === 'S' ? 13 : 11; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -109,7 +109,8 @@ nano_models.forEach(function (model) { [right_clicks, 0] ); await tx; - }) + }), + 10000 ); test( @@ -155,7 +156,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 12 : 10; + const right_clicks = model.letter === 'S' ? 13 : 11; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -164,6 +165,7 @@ nano_models.forEach(function (model) { [right_clicks, 0] ); await tx; - }) + }), + 10000 ); }); From ca5885beba42e46cb6b06a23866457824e42eb7a Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 29 Apr 2024 10:34:33 +0200 Subject: [PATCH 13/46] fix(lr): deposit parsing --- src/kiln_plugin.h | 7 ++++ src/provide_parameter/eigenlayer.c | 35 ++++++++++++++++-- .../nanos_delegate_to_is_kiln/00000.png | Bin 0 -> 374 bytes .../nanos_delegate_to_is_kiln/00001.png | Bin 0 -> 398 bytes .../nanos_delegate_to_is_kiln/00002.png | Bin 0 -> 397 bytes .../nanos_delegate_to_is_kiln/00003.png | Bin 0 -> 308 bytes .../nanos_delegate_to_is_kiln/00004.png | Bin 0 -> 358 bytes .../nanos_delegate_to_is_kiln/00005.png | Bin 0 -> 414 bytes .../nanos_delegate_to_is_kiln/00006.png | Bin 0 -> 349 bytes .../nanos_delegate_to_is_not_kiln/00000.png | Bin 0 -> 374 bytes .../nanos_delegate_to_is_not_kiln/00001.png | Bin 0 -> 398 bytes .../nanos_delegate_to_is_not_kiln/00002.png | Bin 0 -> 397 bytes .../nanos_delegate_to_is_not_kiln/00003.png | Bin 0 -> 496 bytes .../nanos_delegate_to_is_not_kiln/00004.png | Bin 0 -> 485 bytes .../nanos_delegate_to_is_not_kiln/00005.png | Bin 0 -> 401 bytes .../nanos_delegate_to_is_not_kiln/00006.png | Bin 0 -> 358 bytes .../nanos_delegate_to_is_not_kiln/00007.png | Bin 0 -> 414 bytes .../nanos_delegate_to_is_not_kiln/00008.png | Bin 0 -> 349 bytes .../nanox_delegate_to_is_kiln/00000.png | Bin 0 -> 414 bytes .../nanox_delegate_to_is_kiln/00001.png | Bin 0 -> 458 bytes .../nanox_delegate_to_is_kiln/00002.png | Bin 0 -> 467 bytes .../nanox_delegate_to_is_kiln/00003.png | Bin 0 -> 355 bytes .../nanox_delegate_to_is_kiln/00004.png | Bin 0 -> 415 bytes .../nanox_delegate_to_is_kiln/00005.png | Bin 0 -> 472 bytes .../nanox_delegate_to_is_kiln/00006.png | Bin 0 -> 381 bytes .../nanox_delegate_to_is_not_kiln/00000.png | Bin 0 -> 414 bytes .../nanox_delegate_to_is_not_kiln/00001.png | Bin 0 -> 458 bytes .../nanox_delegate_to_is_not_kiln/00002.png | Bin 0 -> 467 bytes .../nanox_delegate_to_is_not_kiln/00003.png | Bin 0 -> 776 bytes .../nanox_delegate_to_is_not_kiln/00004.png | Bin 0 -> 415 bytes .../nanox_delegate_to_is_not_kiln/00005.png | Bin 0 -> 472 bytes .../nanox_delegate_to_is_not_kiln/00006.png | Bin 0 -> 381 bytes tests/src/lrDelegateTo.test.js | 18 ++++----- 33 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 tests/snapshots/nanos_delegate_to_is_kiln/00000.png create mode 100644 tests/snapshots/nanos_delegate_to_is_kiln/00001.png create mode 100644 tests/snapshots/nanos_delegate_to_is_kiln/00002.png create mode 100644 tests/snapshots/nanos_delegate_to_is_kiln/00003.png create mode 100644 tests/snapshots/nanos_delegate_to_is_kiln/00004.png create mode 100644 tests/snapshots/nanos_delegate_to_is_kiln/00005.png create mode 100644 tests/snapshots/nanos_delegate_to_is_kiln/00006.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00000.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00001.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00002.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00003.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00004.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00005.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00006.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00007.png create mode 100644 tests/snapshots/nanos_delegate_to_is_not_kiln/00008.png create mode 100644 tests/snapshots/nanox_delegate_to_is_kiln/00000.png create mode 100644 tests/snapshots/nanox_delegate_to_is_kiln/00001.png create mode 100644 tests/snapshots/nanox_delegate_to_is_kiln/00002.png create mode 100644 tests/snapshots/nanox_delegate_to_is_kiln/00003.png create mode 100644 tests/snapshots/nanox_delegate_to_is_kiln/00004.png create mode 100644 tests/snapshots/nanox_delegate_to_is_kiln/00005.png create mode 100644 tests/snapshots/nanox_delegate_to_is_kiln/00006.png create mode 100644 tests/snapshots/nanox_delegate_to_is_not_kiln/00000.png create mode 100644 tests/snapshots/nanox_delegate_to_is_not_kiln/00001.png create mode 100644 tests/snapshots/nanox_delegate_to_is_not_kiln/00002.png create mode 100644 tests/snapshots/nanox_delegate_to_is_not_kiln/00003.png create mode 100644 tests/snapshots/nanox_delegate_to_is_not_kiln/00004.png create mode 100644 tests/snapshots/nanox_delegate_to_is_not_kiln/00005.png create mode 100644 tests/snapshots/nanox_delegate_to_is_not_kiln/00006.png diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index b85a99a..88178b8 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -161,6 +161,10 @@ typedef enum { LR_DELEGATE_TO_OPERATOR = 0, LR_DELEGATE_TO_SIGNATURE_OFFSET, LR_DELEGATE_TO_APPROVER_SALT, + LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET, + LR_DELEGATE_TO_SIGNATURE_EXPIRY, + LR_DELEGATE_TO_SIGNATURE_SIG_LENGTH, + LR_DELEGATE_TO_SIGNATURE_SIG_ITEMS, LR_DELEGATE_TO_UNEXPECTED_PARAMETER } lr_delegate_to_parameters; @@ -175,6 +179,9 @@ typedef struct { } lr_deposit_t; typedef struct { + // -- utils + uint16_t current_item_count; + // -- display char operator_address[ADDRESS_STR_LEN]; bool is_kiln; } lr_delegate_to_t; diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 448925f..ec2565d 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -632,6 +632,11 @@ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) // [4] operator // [36] signature_offset // [68] approver_salt + // [100] signature + // [100] signature.signature.offset + // [132] signature.expiry + // [164] signature.signature.length + // [192] signature.signature.items lr_delegate_to_t *params = &context->param_data.lr_delegate_to; @@ -645,8 +650,8 @@ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) sizeof(params->operator_address), 0); - params->is_kiln = false; - if (compare_addresses((const char *) buffer, lr_kiln_operator_address)) { + if (compare_addresses((const char *) params->operator_address, + lr_kiln_operator_address)) { params->is_kiln = true; } } @@ -657,7 +662,31 @@ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) context->next_param = LR_DELEGATE_TO_APPROVER_SALT; break; case LR_DELEGATE_TO_APPROVER_SALT: - context->next_param = LR_DELEGATE_TO_UNEXPECTED_PARAMETER; + context->next_param = LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET; + break; + case LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET: + context->next_param = LR_DELEGATE_TO_SIGNATURE_EXPIRY; + break; + case LR_DELEGATE_TO_SIGNATURE_EXPIRY: + context->next_param = LR_DELEGATE_TO_SIGNATURE_SIG_LENGTH; + break; + case LR_DELEGATE_TO_SIGNATURE_SIG_LENGTH: + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + PRINTF("LR_DELEGATE_TO_SIGNATURE_SIG_LENGTH: %d\n", params->current_item_count); + + if (params->current_item_count == 0) { + context->next_param = LR_DELEGATE_TO_UNEXPECTED_PARAMETER; + } else { + context->next_param = LR_DELEGATE_TO_SIGNATURE_SIG_ITEMS; + } + break; + case LR_DELEGATE_TO_SIGNATURE_SIG_ITEMS: + // we skip parsing signature items as they are not needed for clearsigning + + params->current_item_count -= 1; + if (params->current_item_count == 0) { + context->next_param = LR_DELEGATE_TO_UNEXPECTED_PARAMETER; + } break; default: PRINTF("Param not supported: %d\n", context->next_param); diff --git a/tests/snapshots/nanos_delegate_to_is_kiln/00000.png b/tests/snapshots/nanos_delegate_to_is_kiln/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..8d84cc70fea8013b7e8b25c0982ce142fa103d5c GIT binary patch literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_delegate_to_is_kiln/00001.png b/tests/snapshots/nanos_delegate_to_is_kiln/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..795d58e37cfe0dd9091df3f113320d597214678c GIT binary patch literal 398 zcmV;90df9`P)!nTHK`8=d#jZ|iDDUF$mMHMBD?ALozNkOWIQX^H@HuxwkB0#mi+KeK63m|s^ zq@a}DBB_U(vjLmdSQ%5m9MI1q`%chRMH3bdsO)uFSF{={%)S_8YhN|^P^{8oruVL= zRWgS;?*>{6cO(tF9PQ3Z^PahA2ja5JJeV1ZxLGuJbVrhmjw9qOxDK z%-tW1x3vRx(%hwGaoeLY9jYa97{B@C;%?i~sDSiWZY)k4+@!nwj{sLdjYi6>v-txK z1!$iY>ZpO|W$nQ3SXY3$Ii-2us`rU8d&1y6j~Bb_wdbNTLK?Pu09y-{5Zt=A@&v5sh?@;JymO<0^>)3Jl#do zKC=f6{PcqIro|HY5kS_|z?A^9pa$LqkOeg$gb+dq*^m#7?t?&h-nLc%0000py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_delegate_to_is_kiln/00006.png b/tests/snapshots/nanos_delegate_to_is_kiln/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_delegate_to_is_not_kiln/00000.png b/tests/snapshots/nanos_delegate_to_is_not_kiln/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..8d84cc70fea8013b7e8b25c0982ce142fa103d5c GIT binary patch literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_delegate_to_is_not_kiln/00001.png b/tests/snapshots/nanos_delegate_to_is_not_kiln/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..795d58e37cfe0dd9091df3f113320d597214678c GIT binary patch literal 398 zcmV;90df9`P)!nTHK`8=d#jZ|iDDUF$mMHMBD?ALozNkOWIQX^H@HuxwkB0#mi+KeK63m|s^ zq@a}DBB_U(vjLmdSQ%5m9MI1q`%chRMH3bdsO)uFSF{={%)S_8YhN|^P^{8oruVL= zRWgS;?*>{6cO(tF9Pa#d~vwO`M@smDNDB(LY& zjnzHn)!Je6Tz38j{~J)V@3zG1H;r09C=uXutn-4uLAnU}FmhR`btk{7A#(a`XID+} zW6QY%ay8jTyy&n99$sxxI@S1yU`7O#08cn91ME!5u-F1?aIAdO3&4-6Qq5Vo&vxMI z42uA@b1rbdRsG#iC}r^5qdr!eD2ZeDjyr}PlWk|wZ92+lqjT3kpZ|O|6`L5|9JVk| zw~;pE%s@`c!Q?xb$^0yIW%iS7s-fdDoW zYB=UFwLtt+sbbS%v8q-o-L#gQm_BYXl@}K@-h_E|=2fqAYRg_7YTJzbS{9AC3G??x z)zgh}H*Zwc>@C-oVw|@YnQJyL-ZLK5X~`mUNmfO`hibT;uT*2}AQNH_JqFZ*RDQ(S zqgvx^QVW4ho_zxijW1xc0gN%(gC|xk3Y$E8eSau-v5Dju`bpz1NqWiZk2!bG3m5XESV}I}J?%0=+V}GWR zawA!t2K;Vv{29pTi!E*A*LmeF;BMRGGj2|C5&6U9(~8Wy{F1nwm*;P3MwjOJDi~)I zZ^V-h2f^+*ApcM7eHOup6;J{^p;HCOD?6$3X<<1ppqX9(epFIwzGseo^*TC%LCi7w zo8t-~JLd-XTVgK`O{u0|?z(T@g}6(T_c8Jq>UQ4h+C}rOTjk8+TD6j#eFzeUBpYgb&H2QAlev(9TKP1wdz&Mhd0*6 zAvPZ$b3{o5i-^RY8>_O6+G5cuL8_KG7UPn;xt3@jVqAB`UrAVAFS$2?_tNc1%}2?M z_5%1=13_!6{?|)zyc0q^6{6q&xDtU`eC455?B&HMuK@iN!(y{M-I}WvW9IKLj`%a_G z4b3W7pwiOtZ$R2-OWO8-uN5p&q-`e;cz5bo11<)d6|y_{h??Zb{3}_sWaG0?X-%|H zH#)r&y*Vn`H>RXg+71g3kWg0GWAVjx&>vRX4Nn`OFBOHFr|`0#!0dGM0CaLD^}I#( zSyzx^`m&z4g+s81HVQSCub~5c+%SyX9=g?>Nk1eDzppto_o7HIB`u`vkPmnFbQ6|L z!>`pez*8=WMbbWd^<^)#zBkYP2CztBovr5EfjosEO8M{tzrZM!9V=SGlLt@@D&gfR vxY>Z5B&qz4SW`_pB;bfa5ClOG1c4DB)|%T39ewk|00000NkvXXu0mjf;zX>T literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_delegate_to_is_not_kiln/00006.png b/tests/snapshots/nanos_delegate_to_is_not_kiln/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..eeec6324a1f33b9b155d3e979728a086251adb10 GIT binary patch literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_delegate_to_is_not_kiln/00008.png b/tests/snapshots/nanos_delegate_to_is_not_kiln/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_kiln/00000.png b/tests/snapshots/nanox_delegate_to_is_kiln/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*2D2`8gfHh^wJ3Hh1cII)Dypn2Si55b0_1XJ>>1%ydB4LqjMA)fPbiUH8jrrLOwqEaD@A)E@F4hlEz?K!a$=O}F zJoivaZ!H&LZ*1@BfOT1f`u4lu>Uwnt6mqim|E~DYs(b^t*=;%EnZnDL-~LoMqAK#< zS7WQByaUhH_H1w1sm13-x2DQ@#y=Q%AF)s6vadJcnbvR2@rO%3I4qXlnl6yfOxt9e znm*W|(#Z6|QZz3B000000000000000006MeFJX^XPM%9h&;S4c07*qoM6N<$g1@)c A`2YX_ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_kiln/00002.png b/tests/snapshots/nanox_delegate_to_is_kiln/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..5492520723880b9e01d05f7080412eaa37df976e GIT binary patch literal 467 zcmV;^0WAKBP)-P8*3`OVhvA6C5I?a^Ah{kd9v>~Oi#<5EU9l<%Q;4;W+OSUc`j zgOCMbveA(X(jO`n>v&JHl-I9WWmyW6H3p*aD!G(7Npe{ViY2@Jizo=`C08*E2c)Sf zNapf@8W|D4dUluyOzi>kuoeuhw!uD*x5>-p!Nylx%7ubpmB+5VtQ~BWg8rvTU&6AW zRSwDnM}IH_zz7RgLzS3_OI8|YKF=kB7Z&D%jnl-c%XgTPu3w4}K7xWnakEXXG$fZI z3fuU#Uu3x+(6}MoP(ELND&dmuHtGRYhkBi`-1-U-I(sfD#edc|T;?paz5=T3AJAH1 z1&o^o#()0Q-+?s#6A&K~_5=ml#qFv=wf6iM9>TkG#w?%6ZZ7-eo4?XE6`+z2f5iJ3 z&+2Dsb!r{l;nXa2hle0j2SX8F0000000000000000001Bm|rfPR|hOxer*5%002ov JPDHLkV1gVK&u;(# literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_kiln/00003.png b/tests/snapshots/nanox_delegate_to_is_kiln/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..0e736ef5b4ebcff982ca8f620db4c4ad524b378c GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`hpba4!+nDh2VAYZcrPebCi zH)?nOd+a?e=i?D9_)P7>uK(4udX=^?Pn`nN{Zejqo{rKlgXeozssHzIDPcVGaEG+z zm#DjpuQSqK{16kFIOnsNzWo`_Us1wWbYGXb@vM4i`Lj;ms8i$S%Cv1UNq!o=A&=9z z_+)%0@0Ls`xg0WA>FzQw7x9iS#?qGY+^U38DcAMI+Sz{-SJkfhDZY&1 zcS-n6-)9Hs?sAy%o?-Ljdg(;233*Y?9;_baYZ`SM{y%J8=eYcNA-mX##7QUrnM@6t s{P*OFgI;T#v_Hzkb$$T_5i&Tuhq1xuwEv>B)B8Zep00i_>zopr0MTuj_y7O^ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_kiln/00004.png b/tests/snapshots/nanox_delegate_to_is_kiln/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..b2401b220a6db139961dbcfed78507c4de86032a GIT binary patch literal 415 zcmV;Q0bu@#P)Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_kiln/00005.png b/tests/snapshots/nanox_delegate_to_is_kiln/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_not_kiln/00000.png b/tests/snapshots/nanox_delegate_to_is_not_kiln/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*2D2`8gfHh^wJ3Hh1cII)Dypn2Si55b0_1XJ>>1%ydB4LqjMA)fPbiUH8jrrLOwqEaD@A)E@F4hlEz?K!a$=O}F zJoivaZ!H&LZ*1@BfOT1f`u4lu>Uwnt6mqim|E~DYs(b^t*=;%EnZnDL-~LoMqAK#< zS7WQByaUhH_H1w1sm13-x2DQ@#y=Q%AF)s6vadJcnbvR2@rO%3I4qXlnl6yfOxt9e znm*W|(#Z6|QZz3B000000000000000006MeFJX^XPM%9h&;S4c07*qoM6N<$g1@)c A`2YX_ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_not_kiln/00002.png b/tests/snapshots/nanox_delegate_to_is_not_kiln/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..5492520723880b9e01d05f7080412eaa37df976e GIT binary patch literal 467 zcmV;^0WAKBP)-P8*3`OVhvA6C5I?a^Ah{kd9v>~Oi#<5EU9l<%Q;4;W+OSUc`j zgOCMbveA(X(jO`n>v&JHl-I9WWmyW6H3p*aD!G(7Npe{ViY2@Jizo=`C08*E2c)Sf zNapf@8W|D4dUluyOzi>kuoeuhw!uD*x5>-p!Nylx%7ubpmB+5VtQ~BWg8rvTU&6AW zRSwDnM}IH_zz7RgLzS3_OI8|YKF=kB7Z&D%jnl-c%XgTPu3w4}K7xWnakEXXG$fZI z3fuU#Uu3x+(6}MoP(ELND&dmuHtGRYhkBi`-1-U-I(sfD#edc|T;?paz5=T3AJAH1 z1&o^o#()0Q-+?s#6A&K~_5=ml#qFv=wf6iM9>TkG#w?%6ZZ7-eo4?XE6`+z2f5iJ3 z&+2Dsb!r{l;nXa2hle0j2SX8F0000000000000000001Bm|rfPR|hOxer*5%002ov JPDHLkV1gVK&u;(# literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_not_kiln/00003.png b/tests/snapshots/nanox_delegate_to_is_not_kiln/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..5484aa06bc49351de18c43dc29be484c7f695151 GIT binary patch literal 776 zcmV+j1NZ!iP)@OyikmX{-rQag5{Mcd zF|xG^DNvn=b}|JQ-i%4Q89;EuBu)|6RkgH(G~UYxWFLSQBSzX!J3mQNP^D&%DXv`0 ze$p*NyB@+_6^)1RE5~4@ApgQ~F4JbO`Nun<((1B1n<{Elw7nj;-y}_#c0v>Ml9Tw@u90H)o5I@owxL@g5uuE4@4_d zdFZW1=NwUkr{X}{mv9vLY3#*a)8bsV}8{2VSofi&n*$s=WPqoh=L}z$6qPDq_;L#z+2h2ZRSym;|u^-8MR`yEAiB15Sj8uAL0#Zd+#nq zK#Wo_1!Z|Pk#F%|EDF3B@$jTw+p}ASLyeik4x)aw&=aA>&FhZ%Gz0PD6{nc0|*AVso7A10WJqo(Ck%{Ul03oFkIz zW)jT+9>JV1hR!9+0NnCnP*sf-GtTiNO#lD@0002+&in#0-DK$Au)#3^0000Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_delegate_to_is_not_kiln/00005.png b/tests/snapshots/nanox_delegate_to_is_not_kiln/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/src/lrDelegateTo.test.js b/tests/src/lrDelegateTo.test.js index 51ab428..4fb91bc 100644 --- a/tests/src/lrDelegateTo.test.js +++ b/tests/src/lrDelegateTo.test.js @@ -26,12 +26,12 @@ nano_models.forEach(function (model) { const contract = new ethers.Contract(contractAddr, abi); const { data } = await contract.populateTransaction.delegateTo( - '0x1f8c8b1d78d01bcc42ebdd34fae60181bd697662', // kiln operator + '0x1f8C8b1d78d01bCc42ebdd34Fae60181bD697662', // kiln operator { - signature: '0x', - expiry: 0, + signature: '0x1111111111111111', + expiry: 42424242, }, - 0 + ethers.utils.formatBytes32String('salt') ); let unsignedTx = genericTx; @@ -51,14 +51,14 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 7 : 5; + const right_clicks = model.letter === 'S' ? 5 : 5; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( '.', model.name + '_delegate_to_is_kiln', [right_clicks, 0] - ); + ); await tx; }), 30000 @@ -72,10 +72,10 @@ nano_models.forEach(function (model) { const { data } = await contract.populateTransaction.delegateTo( '0x645a845f80576a25f1b412330a108780f6c4573d', // not kiln operator { - signature: '0x', - expiry: 0, + signature: '0x1111111111111111', + expiry: 42424242424242, }, - 0 + ethers.utils.formatBytes32String('salt') ); let unsignedTx = genericTx; From 68785590eca7dc2b3ca98e5427fd4922bbefed1f Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 29 Apr 2024 10:54:29 +0200 Subject: [PATCH 14/46] fix(lr): undelegate test --- src/handle_query_contract_id.c | 24 +++++++++--------- tests/snapshots/nanos_lr_undelegate/00000.png | Bin 0 -> 374 bytes tests/snapshots/nanos_lr_undelegate/00001.png | Bin 0 -> 334 bytes tests/snapshots/nanos_lr_undelegate/00002.png | Bin 0 -> 401 bytes tests/snapshots/nanos_lr_undelegate/00003.png | Bin 0 -> 358 bytes tests/snapshots/nanos_lr_undelegate/00004.png | Bin 0 -> 414 bytes tests/snapshots/nanos_lr_undelegate/00005.png | Bin 0 -> 349 bytes tests/snapshots/nanox_lr_undelegate/00000.png | Bin 0 -> 414 bytes tests/snapshots/nanox_lr_undelegate/00001.png | Bin 0 -> 372 bytes tests/snapshots/nanox_lr_undelegate/00002.png | Bin 0 -> 476 bytes tests/snapshots/nanox_lr_undelegate/00003.png | Bin 0 -> 415 bytes tests/snapshots/nanox_lr_undelegate/00004.png | Bin 0 -> 472 bytes tests/snapshots/nanox_lr_undelegate/00005.png | Bin 0 -> 381 bytes tests/src/lrUndelegate.test.js | 2 +- 14 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 tests/snapshots/nanos_lr_undelegate/00000.png create mode 100644 tests/snapshots/nanos_lr_undelegate/00001.png create mode 100644 tests/snapshots/nanos_lr_undelegate/00002.png create mode 100644 tests/snapshots/nanos_lr_undelegate/00003.png create mode 100644 tests/snapshots/nanos_lr_undelegate/00004.png create mode 100644 tests/snapshots/nanos_lr_undelegate/00005.png create mode 100644 tests/snapshots/nanox_lr_undelegate/00000.png create mode 100644 tests/snapshots/nanox_lr_undelegate/00001.png create mode 100644 tests/snapshots/nanox_lr_undelegate/00002.png create mode 100644 tests/snapshots/nanox_lr_undelegate/00003.png create mode 100644 tests/snapshots/nanox_lr_undelegate/00004.png create mode 100644 tests/snapshots/nanox_lr_undelegate/00005.png diff --git a/src/handle_query_contract_id.c b/src/handle_query_contract_id.c index c8fc990..c9c43f2 100644 --- a/src/handle_query_contract_id.c +++ b/src/handle_query_contract_id.c @@ -24,23 +24,23 @@ void handle_query_contract_id(ethQueryContractID_t *msg) { switch (context->selectorIndex) { case KILN_V1_DEPOSIT: - strlcpy(msg->version, "Solo Staking", msg->versionLength); + strlcpy(msg->version, "Native Staking", msg->versionLength); break; case KILN_V1_WITHDRAW: case KILN_V1_WITHDRAW_EL: case KILN_V1_WITHDRAW_CL: - strlcpy(msg->version, "Withdraw", msg->versionLength); + strlcpy(msg->version, "Native Staking", msg->versionLength); break; case KILN_V1_BATCH_WITHDRAW: case KILN_V1_BATCH_WITHDRAW_EL: case KILN_V1_BATCH_WITHDRAW_CL: - strlcpy(msg->version, "Batch Withdraw", msg->versionLength); + strlcpy(msg->version, "Native Stakingn", msg->versionLength); break; case KILN_V1_REQUEST_EXIT: - strlcpy(msg->version, "Request Exit", msg->versionLength); + strlcpy(msg->version, "Native Stakingn", msg->versionLength); break; case KILN_V2_STAKE: @@ -48,35 +48,35 @@ void handle_query_contract_id(ethQueryContractID_t *msg) { break; case KILN_V2_REQUEST_EXIT: - strlcpy(msg->version, "Request Exit", msg->versionLength); + strlcpy(msg->version, "Pooled Staking", msg->versionLength); break; case KILN_V2_MULTICLAIM: - strlcpy(msg->version, "Multiclaim", msg->versionLength); + strlcpy(msg->version, "Pooled Staking", msg->versionLength); break; case KILN_V2_CLAIM: - strlcpy(msg->version, "Claim", msg->versionLength); + strlcpy(msg->version, "Pooled Staking", msg->versionLength); break; case KILN_LR_DEPOSIT_INTO_STRATEGY: - strlcpy(msg->version, "Liquid Restaking", msg->versionLength); + strlcpy(msg->version, "EigenLayer", msg->versionLength); break; case KILN_LR_QUEUE_WITHDRAWALS: - strlcpy(msg->version, "Liquid Restaking", msg->versionLength); + strlcpy(msg->version, "EigenLayer", msg->versionLength); break; case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: - strlcpy(msg->version, "EigenLayer Claim Withdrawals", msg->versionLength); + strlcpy(msg->version, "EigenLayer", msg->versionLength); break; case KILN_LR_DELEGATE_TO: - strlcpy(msg->version, "EigenLayer Delegate", msg->versionLength); + strlcpy(msg->version, "EigenLayer", msg->versionLength); break; case KILN_LR_UNDELEGATE: - strlcpy(msg->version, "EigenLayer Undelegate", msg->versionLength); + strlcpy(msg->version, "EigenLayer", msg->versionLength); break; default: diff --git a/tests/snapshots/nanos_lr_undelegate/00000.png b/tests/snapshots/nanos_lr_undelegate/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..8d84cc70fea8013b7e8b25c0982ce142fa103d5c GIT binary patch literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lr_undelegate/00001.png b/tests/snapshots/nanos_lr_undelegate/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..326ea1dfd542fd2a490dc7418fe1e8df5245237e GIT binary patch literal 334 zcmV-U0kQsxP)*2 z#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R;t6QFzxqU}{FZ{+rJw})d=>E>>aGUK zvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe&bQ^Ie)2~U==GRis|Mc(ti^^-z+>Eh g8dO$)LI{EL0h9ov6thu;vBUQHJ;Wr9*ye2E#*EFv6x@vD-!;jkpr!||5l`1QxD*;EplN^gIi<3ff!t*v z1;v~mi6hjV4al@c+NfeI0P{R@-UL&p=t3g^nY%7|6}(0olO3UM?>7xDidI@o=3TW~ zMQeDauMO>m6^V~siuwk@73$cL?LaKX)cT%)$3PRiS?CEAoIE53-6c(ps36Q(p`uU) zfvJjkC`Jx9a(5YJSG1CYr8TvEa^D(BGR;8Kw=9DpWno3G~t0AGXk#<(%*PQJ>t1i~rF>!3#J vrQ0ANqs|0<2RO29+6x%LBE`GoIF2-5X9N6zc!7Z~00000NkvXXu0mjfyfv}@ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lr_undelegate/00003.png b/tests/snapshots/nanos_lr_undelegate/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..eeec6324a1f33b9b155d3e979728a086251adb10 GIT binary patch literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lr_undelegate/00005.png b/tests/snapshots/nanos_lr_undelegate/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lr_undelegate/00000.png b/tests/snapshots/nanox_lr_undelegate/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*%aHdtUInDsB@h&BfhV%)mYU1H>1PWo0@(r(pH(J z&)@N@*vC3L;L^csp1*hOIk!4<1Jk5u;c)?e_pTnkceRc?YLn~#H+LWSJYCnmcG-HC zDcv2v+V1erZQ!~;sqEkDD@!G|UOl$jyzO%6>(6uVzfjo2``zX1i^lt5R}Jo+=H9D& zUQsvvUOfNi!}}KAyZw1@ZQPYiKDi|0D^C_QH7iVRUc{jf@;?#?I3pfp`tBij(ZqU? NsHdx+%Q~loCIIUFqrCtC literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lr_undelegate/00002.png b/tests/snapshots/nanox_lr_undelegate/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..c6bdfc1c7d6d3f0a0ab42d2816e1f3d8cde74a5a GIT binary patch literal 476 zcmV<20VDp2P)&bd&Y>&4;=m#baZ()&UA?Rs~?d#__1 zgug06Cc<<^$F9hI9I06Al4LE-fAf-QDadv+5S3TiwTwxU(^8O@eB~RWV5FB^$4nfM zhNd7}$OA{uh{WBq!bD)`8(VrV@d*y4DbyxbmaVpnTxV-1``%yr+7A!jE=E55SbwrE)L#hnPew@)fBdQ$;d>~AciFj`p?S?QOSXmUH$7>) z4mgsH+@jq%J~F#4wcgeTdwE+H+DjqG^g&mI7XSbN000000000000000=;j~IHfvV{ SoPYoT0000Q31IlGw|9L_yRTLLS&ux#tU!)?{o#0wDkZ008EG?1xM#ZH*XXtLJje zn{n*@df&j4{!!jD&jO^BVvJ()hQHH!%W3(Dj6W`QoPO|;n2-Ayk2fOj!k(QvFKVVz zN;#YPAImsuXF2GEUvpr^C8&NT!any~^~irCB9x)jPI1+~25toqi%C6mLnBjXN6GEh z+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c|@F<8lTYl9}-0rEScN?C9`;0f0RR9100000000000001hX}(@gLwlUg|EK@}002ov JPDHLkV1g7!yiouE literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lr_undelegate/00004.png b/tests/snapshots/nanox_lr_undelegate/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/src/lrUndelegate.test.js b/tests/src/lrUndelegate.test.js index 81bed55..18bdda8 100644 --- a/tests/src/lrUndelegate.test.js +++ b/tests/src/lrUndelegate.test.js @@ -46,7 +46,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 7 : 5; + const right_clicks = model.letter === 'S' ? 4 : 4; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( From b66a7ce751920219ca3237c3df3150a0d490ab9f Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 29 Apr 2024 11:03:25 +0200 Subject: [PATCH 15/46] fix: better contract ids --- src/handle_query_contract_id.c | 4 ++-- src/query_contract_ui/eigenlayer.c | 6 +++--- .../handle_query_contract_ui.c | 2 +- src/query_contract_ui/query_contract_ui.h | 2 +- .../nanos_delegate_to_is_kiln/00001.png | Bin 398 -> 334 bytes .../nanos_delegate_to_is_not_kiln/00001.png | Bin 398 -> 334 bytes .../nanox_delegate_to_is_kiln/00001.png | Bin 458 -> 372 bytes .../nanox_delegate_to_is_not_kiln/00001.png | Bin 458 -> 372 bytes 8 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/handle_query_contract_id.c b/src/handle_query_contract_id.c index c9c43f2..0bf1e16 100644 --- a/src/handle_query_contract_id.c +++ b/src/handle_query_contract_id.c @@ -36,11 +36,11 @@ void handle_query_contract_id(ethQueryContractID_t *msg) { case KILN_V1_BATCH_WITHDRAW: case KILN_V1_BATCH_WITHDRAW_EL: case KILN_V1_BATCH_WITHDRAW_CL: - strlcpy(msg->version, "Native Stakingn", msg->versionLength); + strlcpy(msg->version, "Native Staking", msg->versionLength); break; case KILN_V1_REQUEST_EXIT: - strlcpy(msg->version, "Native Stakingn", msg->versionLength); + strlcpy(msg->version, "Native Staking", msg->versionLength); break; case KILN_V2_STAKE: diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c index 3aab58e..ac65260 100644 --- a/src/query_contract_ui/eigenlayer.c +++ b/src/query_contract_ui/eigenlayer.c @@ -22,13 +22,13 @@ * @param context: context with provide_parameter data * */ -bool deposit_into_stragey_ui(ethQueryContractUI_t *msg, context_t *context) { +bool deposit_into_strategy_ui(ethQueryContractUI_t *msg, context_t *context) { bool ret = false; lr_deposit_t *params = &context->param_data.lr_deposit; switch (msg->screenIndex) { case 0: - strlcpy(msg->title, "EigenLayer", msg->titleLength); + strlcpy(msg->title, "Liquid Restaking", msg->titleLength); strlcpy(msg->msg, "Deposit In Strategy", msg->msgLength); ret = true; break; @@ -127,7 +127,7 @@ bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *contex switch (msg->screenIndex) { case 0: strlcpy(msg->title, "EigenLayer", msg->titleLength); - strlcpy(msg->msg, "Claim Withdrawals", msg->msgLength); + strlcpy(msg->msg, "Complete Withdrawals", msg->msgLength); ret = true; break; diff --git a/src/query_contract_ui/handle_query_contract_ui.c b/src/query_contract_ui/handle_query_contract_ui.c index d4eab9a..b7b00a1 100644 --- a/src/query_contract_ui/handle_query_contract_ui.c +++ b/src/query_contract_ui/handle_query_contract_ui.c @@ -60,7 +60,7 @@ void handle_query_contract_ui(ethQueryContractUI_t *msg) { break; case KILN_LR_DEPOSIT_INTO_STRATEGY: - ret = deposit_into_stragey_ui(msg, context); + ret = deposit_into_strategy_ui(msg, context); break; case KILN_LR_QUEUE_WITHDRAWALS: diff --git a/src/query_contract_ui/query_contract_ui.h b/src/query_contract_ui/query_contract_ui.h index b4f65d7..66ecff7 100644 --- a/src/query_contract_ui/query_contract_ui.h +++ b/src/query_contract_ui/query_contract_ui.h @@ -35,7 +35,7 @@ bool multiclaim_ui(ethQueryContractUI_t *msg); bool claim_ui(ethQueryContractUI_t *msg); // EigenLayer UI -bool deposit_into_stragey_ui(ethQueryContractUI_t *msg, context_t *context); +bool deposit_into_strategy_ui(ethQueryContractUI_t *msg, context_t *context); bool queue_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context); bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context); bool delegate_to_ui(ethQueryContractUI_t *msg, context_t *context); diff --git a/tests/snapshots/nanos_delegate_to_is_kiln/00001.png b/tests/snapshots/nanos_delegate_to_is_kiln/00001.png index 795d58e37cfe0dd9091df3f113320d597214678c..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGl61I_}FB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1hnAlZXHS delta 371 zcmV-(0gV360*(WaB!5*&L_t(|ob8(14#OY_hH+Wn|ABkaT{Ll3gray3UzVlq6p%mS zrUNhx!!V4gxz5BjzA#$B=XzxUzM})k;X1(`sJmi^9{1|zX5G?Kz~ z_&WbDks*C3YU4QO{$W(})gsE)0tkI6!_akCY{vQBt|)@&A#TI$kwwj@?N7?MaQBUA z&x8%=H=w`0-^+rL!jzz_3+f?uS7sbr&=_P~6b~&VX9i?RS~f9-z1kIxSIhbaA(hSp zo^$Y~cmgKper&Q$F-&)=DB+<|5oX3#Nq}}oAHL3xI$de(H%9>Z+Vxzl_yOR>`E?3w zjPu=-A2ClNNAAdots3%gd$nA2qr=daJP+6lSHVWR|00a7{?Kx0hG7^J@B`qp{)9Hd Rvts}N002ovPDHLkV1l4gu_*um diff --git a/tests/snapshots/nanos_delegate_to_is_not_kiln/00001.png b/tests/snapshots/nanos_delegate_to_is_not_kiln/00001.png index 795d58e37cfe0dd9091df3f113320d597214678c..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGl61I_}FB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1hnAlZXHS delta 371 zcmV-(0gV360*(WaB!5*&L_t(|ob8(14#OY_hH+Wn|ABkaT{Ll3gray3UzVlq6p%mS zrUNhx!!V4gxz5BjzA#$B=XzxUzM})k;X1(`sJmi^9{1|zX5G?Kz~ z_&WbDks*C3YU4QO{$W(})gsE)0tkI6!_akCY{vQBt|)@&A#TI$kwwj@?N7?MaQBUA z&x8%=H=w`0-^+rL!jzz_3+f?uS7sbr&=_P~6b~&VX9i?RS~f9-z1kIxSIhbaA(hSp zo^$Y~cmgKper&Q$F-&)=DB+<|5oX3#Nq}}oAHL3xI$de(H%9>Z+Vxzl_yOR>`E?3w zjPu=-A2ClNNAAdots3%gd$nA2qr=daJP+6lSHVWR|00a7{?Kx0hG7^J@B`qp{)9Hd Rvts}N002ovPDHLkV1l4gu_*um diff --git a/tests/snapshots/nanox_delegate_to_is_kiln/00001.png b/tests/snapshots/nanox_delegate_to_is_kiln/00001.png index 7075588f449113a0235cca6b502f5d9ac712fab9..e2039b1539745292d15d4ad9319b6b43599e56a1 100644 GIT binary patch delta 345 zcmV-f0jB=S1M~urB!4?eL_t(|obB0L5`!QNKvCN1PTc>JvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf8K|MV delta 432 zcmV;h0Z;z)0?GrBB!7`fL_t(|obB0Ll7k=+Kv9yKov{BU^{_O+WHzqW1pIUT@=tD!A6cj|dMfDUSyi%6Id>1pz3 zXM_XHbU@cbMntU44>KKb`TP;x%S;DY8PUDWbbw0|q3>X+1Al@q>jMA)fPbiUH8jrr zLOwqEaD?|=CsmM+#0Pr#NHx5?RExIFhzN^dO}VQ*~j>40@vg!=Zo-|BjG2NZI$ z_W!Q<&#HU_x7lqu;+ewBm*4(WIHD@@-dAI*q`U*q*7j^~*r~k@pwh_n!6{NSF8}}l000000000000000 au*@%Ek5*2eOGwZF0000JvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf8K|MV delta 432 zcmV;h0Z;z)0?GrBB!7`fL_t(|obB0Ll7k=+Kv9yKov{BU^{_O+WHzqW1pIUT@=tD!A6cj|dMfDUSyi%6Id>1pz3 zXM_XHbU@cbMntU44>KKb`TP;x%S;DY8PUDWbbw0|q3>X+1Al@q>jMA)fPbiUH8jrr zLOwqEaD?|=CsmM+#0Pr#NHx5?RExIFhzN^dO}VQ*~j>40@vg!=Zo-|BjG2NZI$ z_W!Q<&#HU_x7lqu;+ewBm*4(WIHD@@-dAI*q`U*q*7j^~*r~k@pwh_n!6{NSF8}}l000000000000000 au*@%Ek5*2eOGwZF0000 Date: Mon, 29 Apr 2024 11:20:11 +0200 Subject: [PATCH 16/46] fix(lr): test for complete queued withdrawal --- README.md | 30 ++++++++++++------ .../00001.png | Bin 415 -> 334 bytes .../00002.png | Bin 388 -> 413 bytes .../00003.png | Bin 426 -> 440 bytes .../00001.png | Bin 415 -> 334 bytes .../00002.png | Bin 388 -> 413 bytes .../00003.png | Bin 426 -> 440 bytes .../00001.png | Bin 415 -> 334 bytes .../00002.png | Bin 388 -> 413 bytes .../00003.png | Bin 426 -> 440 bytes .../00001.png | Bin 415 -> 334 bytes .../00002.png | Bin 388 -> 413 bytes .../00003.png | Bin 426 -> 440 bytes .../00001.png | Bin 539 -> 372 bytes .../00002.png | Bin 503 -> 563 bytes .../00001.png | Bin 539 -> 372 bytes .../00002.png | Bin 503 -> 563 bytes .../00001.png | Bin 539 -> 372 bytes .../00002.png | Bin 503 -> 563 bytes .../00001.png | Bin 539 -> 372 bytes .../00002.png | Bin 503 -> 563 bytes 21 files changed, 20 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 76268c5..86d08da 100644 --- a/README.md +++ b/README.md @@ -126,15 +126,19 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ### LR Deposit Into Strategy -![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00000.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00001.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00002.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00003.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00004.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00005.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00006.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00007.png) +### Delegate To -### LR Queue Withdrawal +![](/tests/snapshots/nanos_delegate_to_is_kiln/00000.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00001.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00002.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00003.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00004.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00005.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00006.png) -![](/tests/snapshots/nanos_lrQueueWithdrawal/00000.png) ![](/tests/snapshots/nanos_lrQueueWithdrawal/00001.png) ![](/tests/snapshots/nanos_lrQueueWithdrawal/00002.png) ![](/tests/snapshots/nanos_lrQueueWithdrawal/00003.png) ![](/tests/snapshots/nanos_lrQueueWithdrawal/00004.png) ![](/tests/snapshots/nanos_lrQueueWithdrawal/00005.png) ![](/tests/snapshots/nanos_lrQueueWithdrawal/00006.png) ![](/tests/snapshots/nanos_lrQueueWithdrawal/00007.png) +### Undelegate -### LR Complete Queued Withdrawal +![](/tests/snapshots/nanos_lr_undelegate/00000.png) ![](/tests/snapshots/nanos_lr_undelegate/00001.png) ![](/tests/snapshots/nanos_lr_undelegate/00002.png) ![](/tests/snapshots/nanos_lr_undelegate/00003.png) ![](/tests/snapshots/nanos_lr_undelegate/00004.png) ![](/tests/snapshots/nanos_lr_undelegate/00005.png) -![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawal/00005.png) +### Queue Withdrawals + +### LR Complete Queued Withdrawals + +![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000010.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000011.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000012.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000013.png) ## NANO X @@ -186,14 +190,20 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ![](/tests/snapshots/nanox_claimv2/00000.png) ![](/tests/snapshots/nanox_claimv2/00001.png) ![](/tests/snapshots/nanox_claimv2/00002.png) ![](/tests/snapshots/nanox_claimv2/00003.png) ![](/tests/snapshots/nanox_claimv2/00004.png) ![](/tests/snapshots/nanox_claimv2/00005.png) +# EigenLayer + ### LR Deposit Into Strategy -![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00000.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00001.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00002.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00003.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00004.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00005.png) +### Delegate To + +![](/tests/snapshots/nanox_delegate_to_is_kiln/00000.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00001.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00002.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00003.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00004.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00005.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00006.png) + +### Undelegate -### LR Queue Withdrawal +![](/tests/snapshots/nanox_lr_undelegate/00000.png) ![](/tests/snapshots/nanox_lr_undelegate/00001.png) ![](/tests/snapshots/nanox_lr_undelegate/00002.png) ![](/tests/snapshots/nanox_lr_undelegate/00003.png) ![](/tests/snapshots/nanox_lr_undelegate/00004.png) ![](/tests/snapshots/nanox_lr_undelegate/00005.png) -![](/tests/snapshots/nanox_lrQueueWithdrawal/00000.png) ![](/tests/snapshots/nanox_lrQueueWithdrawal/00001.png) ![](/tests/snapshots/nanox_lrQueueWithdrawal/00002.png) ![](/tests/snapshots/nanox_lrQueueWithdrawal/00003.png) ![](/tests/snapshots/nanox_lrQueueWithdrawal/00004.png) ![](/tests/snapshots/nanox_lrQueueWithdrawal/00005.png) ![](/tests/snapshots/nanox_lrQueueWithdrawal/00006.png) +### Queue Withdrawals -### LR Complete Queued Withdrawal +### LR Complete Queued Withdrawals -![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00000.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00001.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00002.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00003.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00004.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawal/00005.png) +![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/000010.png) diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png index 64a8e99e50a97a4347a46c5c9de8eb0460c63b8d..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGlN1I_}FB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1iPilbHYj delta 388 zcmV-~0ek+=0-pnrB!6Z}L_t(|ob8#*62l+}MM{a~&}F3jDx`!g)Z=rZW8Eu23^Z+|S70^XbKUDF)Z zK91`@(-KLEbVk>$u?87x^F?6}UAq+E(w^`b~_**iOnTa2-AgBm=57KbIu==ZzIzb gQIa@c;k- delta 361 zcmV-v0ha!q1B3&RB!5duL_t(|ob8#x5`!QNL}RD^{|9@p2OUd8ND(6m&c5-W0>%^!003}fU4;F7r}84}vTtICytVTBPe#}JtO4Q~rPbSjw{Q3_>q669JfvTxSkuV7 zyl;SrB)LVVdEeM$TRFURP1i{f!vJ#?QcJ|i6lM;^Fn~-w(0}!fq&@{QfQ&pCN_~oD z0JVC+Mx|>_G5@41(QuY{FUuNfzU|Jx_fNP%)u(X`&?1hj{%{CVL;cRc15c2JJn?xC z=gUOa)K-bR<8E(#3OyfjRxxHL^KN3R(%Fi>8U?F{rn6!De{{&fYNh$`qZ_N6mg+)j z#5_bP^uVxGBVry>c?Rem^bD59DrLOpZ$Z}xGXo4cC7j;*{z65tT96gnXM>BK#cvPR zbTojaV|Lgr^x3#Kdk``Or7z)}8bwU9(9>SR000000D<@btV8@=o8!N=UGf z5`yD6j^hY$o&VoG@?57L&`xMJ5=duNt?Ea^ESmt3Bh0LvRUauuG}jrn<97i;gQ-j$ z$?1e*_Y%1k$=fwyN>I~9ZZKW0PdTHxG6Q(ST9D3wrvF#pJAYI@)u9|F6G|*{L;~d! z1c@Gj@6i1|WLYC+>f!yXh2TOS#ogn8l)7-j?0#bm;U_Ic@P z3tclU*wq@SsML_RA)f&qO;d8MT*a$tpeis-1_;vRI9^!)WV)9{W@I}W9G4T0OIqiMNDXd z0d7M800006@!o%*qvd~_KueEcT{!`-*#ijSy@zG{UZjx5yiaVAY^L1~7m`Qz>pdxy zpsEY0F?VM(K8hJ{K-K)R1x5LkgWBbw1f|4?q!}_-1GcQOeSfCnECKx@5?6w*E=o!JM2ZthnZAIhw+T1YUf3!U0*NDG_R zgP2~441(TiK7R*AYw6oi&@u~YBRfJOn&#I9A$IhEPFV!ZS|%wq>{rQ}!JXtws(4Lh z)DBX_g;sL&;>6xHP5<@0i-Bdk%!#^cs8Z+HZkl=41azI|q#WmeX^nAR>(`V6QwfTm uG@@p2$_le4B2B80M^zO70002MH6NXeHV%y>m68Ae00{s|MNUMnLSTY$@V&VJ diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00001.png index 64a8e99e50a97a4347a46c5c9de8eb0460c63b8d..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGlN1I_}FB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1iPilbHYj delta 388 zcmV-~0ek+=0-pnrB!6Z}L_t(|ob8#*62l+}MM{a~&}F3jDx`!g)Z=rZW8Eu23^Z+|S70^XbKUDF)Z zK91`@(-KLEbVk>$u?87x^F?6}UAq+E(w^`b~_**iOnTa2-AgBm=57KbIu==ZzIzb gQIa@c;k- delta 361 zcmV-v0ha!q1B3&RB!5duL_t(|ob8#x5`!QNL}RD^{|9@p2OUd8ND(6m&c5-W0>%^!003}fU4;F7r}84}vTtICytVTBPe#}JtO4Q~rPbSjw{Q3_>q669JfvTxSkuV7 zyl;SrB)LVVdEeM$TRFURP1i{f!vJ#?QcJ|i6lM;^Fn~-w(0}!fq&@{QfQ&pCN_~oD z0JVC+Mx|>_G5@41(QuY{FUuNfzU|Jx_fNP%)u(X`&?1hj{%{CVL;cRc15c2JJn?xC z=gUOa)K-bR<8E(#3OyfjRxxHL^KN3R(%Fi>8U?F{rn6!De{{&fYNh$`qZ_N6mg+)j z#5_bP^uVxGBVry>c?Rem^bD59DrLOpZ$Z}xGXo4cC7j;*{z65tT96gnXM>BK#cvPR zbTojaV|Lgr^x3#Kdk``Or7z)}8bwU9(9>SR000000D<@btV8@=o8!N=UGf z5`yD6j^hY$o&VoG@?57L&`xMJ5=duNt?Ea^ESmt3Bh0LvRUauuG}jrn<97i;gQ-j$ z$?1e*_Y%1k$=fwyN>I~9ZZKW0PdTHxG6Q(ST9D3wrvF#pJAYI@)u9|F6G|*{L;~d! z1c@Gj@6i1|WLYC+>f!yXh2TOS#ogn8l)7-j?0#bm;U_Ic@P z3tclU*wq@SsML_RA)f&qO;d8MT*a$tpeis-1_;vRI9^!)WV)9{W@I}W9G4T0OIqiMNDXd z0d7M800006@!o%*qvd~_KueEcT{!`-*#ijSy@zG{UZjx5yiaVAY^L1~7m`Qz>pdxy zpsEY0F?VM(K8hJ{K-K)R1x5LkgWBbw1f|4?q!}_-1GcQOeSfCnECKx@5?6w*E=o!JM2ZthnZAIhw+T1YUf3!U0*NDG_R zgP2~441(TiK7R*AYw6oi&@u~YBRfJOn&#I9A$IhEPFV!ZS|%wq>{rQ}!JXtws(4Lh z)DBX_g;sL&;>6xHP5<@0i-Bdk%!#^cs8Z+HZkl=41azI|q#WmeX^nAR>(`V6QwfTm uG@@p2$_le4B2B80M^zO70002MH6NXeHV%y>m68Ae00{s|MNUMnLSTY$@V&VJ diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00001.png index 64a8e99e50a97a4347a46c5c9de8eb0460c63b8d..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGlN1I_}FB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1iPilbHYj delta 388 zcmV-~0ek+=0-pnrB!6Z}L_t(|ob8#*62l+}MM{a~&}F3jDx`!g)Z=rZW8Eu23^Z+|S70^XbKUDF)Z zK91`@(-KLEbVk>$u?87x^F?6}UAq+E(w^`b~_**iOnTa2-AgBm=57KbIu==ZzIzb gQIa@c;k- delta 361 zcmV-v0ha!q1B3&RB!5duL_t(|ob8#x5`!QNL}RD^{|9@p2OUd8ND(6m&c5-W0>%^!003}fU4;F7r}84}vTtICytVTBPe#}JtO4Q~rPbSjw{Q3_>q669JfvTxSkuV7 zyl;SrB)LVVdEeM$TRFURP1i{f!vJ#?QcJ|i6lM;^Fn~-w(0}!fq&@{QfQ&pCN_~oD z0JVC+Mx|>_G5@41(QuY{FUuNfzU|Jx_fNP%)u(X`&?1hj{%{CVL;cRc15c2JJn?xC z=gUOa)K-bR<8E(#3OyfjRxxHL^KN3R(%Fi>8U?F{rn6!De{{&fYNh$`qZ_N6mg+)j z#5_bP^uVxGBVry>c?Rem^bD59DrLOpZ$Z}xGXo4cC7j;*{z65tT96gnXM>BK#cvPR zbTojaV|Lgr^x3#Kdk``Or7z)}8bwU9(9>SR000000D<@btV8@=o8!N=UGf z5`yD6j^hY$o&VoG@?57L&`xMJ5=duNt?Ea^ESmt3Bh0LvRUauuG}jrn<97i;gQ-j$ z$?1e*_Y%1k$=fwyN>I~9ZZKW0PdTHxG6Q(ST9D3wrvF#pJAYI@)u9|F6G|*{L;~d! z1c@Gj@6i1|WLYC+>f!yXh2TOS#ogn8l)7-j?0#bm;U_Ic@P z3tclU*wq@SsML_RA)f&qO;d8MT*a$tpeis-1_;vRI9^!)WV)9{W@I}W9G4T0OIqiMNDXd z0d7M800006@!o%*qvd~_KueEcT{!`-*#ijSy@zG{UZjx5yiaVAY^L1~7m`Qz>pdxy zpsEY0F?VM(K8hJ{K-K)R1x5LkgWBbw1f|4?q!}_-1GcQOeSfCnECKx@5?6w*E=o!JM2ZthnZAIhw+T1YUf3!U0*NDG_R zgP2~441(TiK7R*AYw6oi&@u~YBRfJOn&#I9A$IhEPFV!ZS|%wq>{rQ}!JXtws(4Lh z)DBX_g;sL&;>6xHP5<@0i-Bdk%!#^cs8Z+HZkl=41azI|q#WmeX^nAR>(`V6QwfTm uG@@p2$_le4B2B80M^zO70002MH6NXeHV%y>m68Ae00{s|MNUMnLSTY$@V&VJ diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00001.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00001.png index 64a8e99e50a97a4347a46c5c9de8eb0460c63b8d..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGlN1I_}FB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1iPilbHYj delta 388 zcmV-~0ek+=0-pnrB!6Z}L_t(|ob8#*62l+}MM{a~&}F3jDx`!g)Z=rZW8Eu23^Z+|S70^XbKUDF)Z zK91`@(-KLEbVk>$u?87x^F?6}UAq+E(w^`b~_**iOnTa2-AgBm=57KbIu==ZzIzb gQIa@c;k- delta 361 zcmV-v0ha!q1B3&RB!5duL_t(|ob8#x5`!QNL}RD^{|9@p2OUd8ND(6m&c5-W0>%^!003}fU4;F7r}84}vTtICytVTBPe#}JtO4Q~rPbSjw{Q3_>q669JfvTxSkuV7 zyl;SrB)LVVdEeM$TRFURP1i{f!vJ#?QcJ|i6lM;^Fn~-w(0}!fq&@{QfQ&pCN_~oD z0JVC+Mx|>_G5@41(QuY{FUuNfzU|Jx_fNP%)u(X`&?1hj{%{CVL;cRc15c2JJn?xC z=gUOa)K-bR<8E(#3OyfjRxxHL^KN3R(%Fi>8U?F{rn6!De{{&fYNh$`qZ_N6mg+)j z#5_bP^uVxGBVry>c?Rem^bD59DrLOpZ$Z}xGXo4cC7j;*{z65tT96gnXM>BK#cvPR zbTojaV|Lgr^x3#Kdk``Or7z)}8bwU9(9>SR000000D<@btV8@=o8!N=UGf z5`yD6j^hY$o&VoG@?57L&`xMJ5=duNt?Ea^ESmt3Bh0LvRUauuG}jrn<97i;gQ-j$ z$?1e*_Y%1k$=fwyN>I~9ZZKW0PdTHxG6Q(ST9D3wrvF#pJAYI@)u9|F6G|*{L;~d! z1c@Gj@6i1|WLYC+>f!yXh2TOS#ogn8l)7-j?0#bm;U_Ic@P z3tclU*wq@SsML_RA)f&qO;d8MT*a$tpeis-1_;vRI9^!)WV)9{W@I}W9G4T0OIqiMNDXd z0d7M800006@!o%*qvd~_KueEcT{!`-*#ijSy@zG{UZjx5yiaVAY^L1~7m`Qz>pdxy zpsEY0F?VM(K8hJ{K-K)R1x5LkgWBbw1f|4?q!}_-1GcQOeSfCnECKx@5?6w*E=o!JM2ZthnZAIhw+T1YUf3!U0*NDG_R zgP2~441(TiK7R*AYw6oi&@u~YBRfJOn&#I9A$IhEPFV!ZS|%wq>{rQ}!JXtws(4Lh z)DBX_g;sL&;>6xHP5<@0i-Bdk%!#^cs8Z+HZkl=41azI|q#WmeX^nAR>(`V6QwfTm uG@@p2$_le4B2B80M^zO70002MH6NXeHV%y>m68Ae00{s|MNUMnLSTY$@V&VJ diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00001.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00001.png index ff64ab0f59b3821892d8ed08788bf3a583914a96..e2039b1539745292d15d4ad9319b6b43599e56a1 100644 GIT binary patch delta 345 zcmV-f0jB<&1oQ%sB!4?eL_t(|obB0L5`!QNKvCN1PTc>JvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf+nS+` delta 513 zcmV+c0{;E<0-FSoB!A*bL_t(|ob8%XmcD1z08L*rYF%9Md{r8rJhHc zNN8{l00000U^-t<3vf*c!8zx>Pv!Wi>tlH@zMmGLg{bHq)vftFEkFfgnuidQL+EDV zmzfeau#Ew#f=mcu7ysDC0Fm`)bS>K$V3!$P%QgmZY9sUxc7HNJ;$=1f0001hYQlk3 zbHC5qa$WRaF7xVJ-VyQ*edlb3?m;d0Pe-Rjn0PCl&=+ltWP@lXa&3CV>|?_~XRnh^ zBkbO0V7PNt;jB^**Vei2!LGb7Y9SpwplS-VNnH4^^_L&b*b_0G#BX-kl1yBeXfQeD zH`V~-;-fedu76^w;~Hsz2H}k5Nc>d3c4ZesTa3caW3v*OM{uFuj$@0iw%e_aLx}x3 z{;-Z?zL=w@{xN8V4!WAK#dQapNj88ir>e#V6Sz<^HWJ{Jd`m??~ZBW&qfyp|W zbSomi^dGif#|wvZL|TMZF6Tx|9KFHFXd1aQVQG;%)p}(k9lJ`tvlk-NWFMUhR=QlC zmCTNH7V!#`sohz{13FTrIJ@zLkJBx0#$DpQFIU`I<5)l159S#_gkycMHD~DBaYx%= z#SmoYnM*X%B?`T55e5JN000000000000000_-Fh83r*B9<B!BuzL_t(|ob8%hlEfegMKe>g6ZgL)_c9+=TNEIgwBjT8d?j`( z2J{+<*98Co0001hJ3l^VVvPAZgpfF0AK_&*8rJ>>DV%~zQX9&%?CeC zVP+~q9i(zkRDVh*lyaFygQa9#sqV?BBa!XMS_&I~ZT!DK3nk+QVLNxaBAp)qTU(|p z&&*WB^wGBhd7qiXEy4f*00000000000000000000 cz{~gt?h}jAhr||WZ2$lO07*qoM6N<$f>gfzYybcN delta 477 zcmV<30V4jh1os1wB!9k1L_t(|obA|Aa)lraKvCQ2PT2pF*h@c{GMNAoCMMOrm6V}*3_dlP1xJ#ZT0W= z!$um7@&~D8_2=&Qv7X>TCFp;0`VzLOS-GhWy!wL~03IX?xy3kmsAm;L?W*>68)C=H z&#@P(>dV~1vwx9;Y7B5WHa&eVw4~3;4>99iqP4hK?wb4jkxP};RR`IdF>GpOBK?%h zrE0spu46|z?sdNQ)43JopU zTF1Poe7{#S$zJvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf+nS+` delta 513 zcmV+c0{;E<0-FSoB!A*bL_t(|ob8%XmcD1z08L*rYF%9Md{r8rJhHc zNN8{l00000U^-t<3vf*c!8zx>Pv!Wi>tlH@zMmGLg{bHq)vftFEkFfgnuidQL+EDV zmzfeau#Ew#f=mcu7ysDC0Fm`)bS>K$V3!$P%QgmZY9sUxc7HNJ;$=1f0001hYQlk3 zbHC5qa$WRaF7xVJ-VyQ*edlb3?m;d0Pe-Rjn0PCl&=+ltWP@lXa&3CV>|?_~XRnh^ zBkbO0V7PNt;jB^**Vei2!LGb7Y9SpwplS-VNnH4^^_L&b*b_0G#BX-kl1yBeXfQeD zH`V~-;-fedu76^w;~Hsz2H}k5Nc>d3c4ZesTa3caW3v*OM{uFuj$@0iw%e_aLx}x3 z{;-Z?zL=w@{xN8V4!WAK#dQapNj88ir>e#V6Sz<^HWJ{Jd`m??~ZBW&qfyp|W zbSomi^dGif#|wvZL|TMZF6Tx|9KFHFXd1aQVQG;%)p}(k9lJ`tvlk-NWFMUhR=QlC zmCTNH7V!#`sohz{13FTrIJ@zLkJBx0#$DpQFIU`I<5)l159S#_gkycMHD~DBaYx%= z#SmoYnM*X%B?`T55e5JN000000000000000_-Fh83r*B9<B!BuzL_t(|ob8%hlEfegMKe>g6ZgL)_c9+=TNEIgwBjT8d?j`( z2J{+<*98Co0001hJ3l^VVvPAZgpfF0AK_&*8rJ>>DV%~zQX9&%?CeC zVP+~q9i(zkRDVh*lyaFygQa9#sqV?BBa!XMS_&I~ZT!DK3nk+QVLNxaBAp)qTU(|p z&&*WB^wGBhd7qiXEy4f*00000000000000000000 cz{~gt?h}jAhr||WZ2$lO07*qoM6N<$f>gfzYybcN delta 477 zcmV<30V4jh1os1wB!9k1L_t(|obA|Aa)lraKvCQ2PT2pF*h@c{GMNAoCMMOrm6V}*3_dlP1xJ#ZT0W= z!$um7@&~D8_2=&Qv7X>TCFp;0`VzLOS-GhWy!wL~03IX?xy3kmsAm;L?W*>68)C=H z&#@P(>dV~1vwx9;Y7B5WHa&eVw4~3;4>99iqP4hK?wb4jkxP};RR`IdF>GpOBK?%h zrE0spu46|z?sdNQ)43JopU zTF1Poe7{#S$zJvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf+nS+` delta 513 zcmV+c0{;E<0-FSoB!A*bL_t(|ob8%XmcD1z08L*rYF%9Md{r8rJhHc zNN8{l00000U^-t<3vf*c!8zx>Pv!Wi>tlH@zMmGLg{bHq)vftFEkFfgnuidQL+EDV zmzfeau#Ew#f=mcu7ysDC0Fm`)bS>K$V3!$P%QgmZY9sUxc7HNJ;$=1f0001hYQlk3 zbHC5qa$WRaF7xVJ-VyQ*edlb3?m;d0Pe-Rjn0PCl&=+ltWP@lXa&3CV>|?_~XRnh^ zBkbO0V7PNt;jB^**Vei2!LGb7Y9SpwplS-VNnH4^^_L&b*b_0G#BX-kl1yBeXfQeD zH`V~-;-fedu76^w;~Hsz2H}k5Nc>d3c4ZesTa3caW3v*OM{uFuj$@0iw%e_aLx}x3 z{;-Z?zL=w@{xN8V4!WAK#dQapNj88ir>e#V6Sz<^HWJ{Jd`m??~ZBW&qfyp|W zbSomi^dGif#|wvZL|TMZF6Tx|9KFHFXd1aQVQG;%)p}(k9lJ`tvlk-NWFMUhR=QlC zmCTNH7V!#`sohz{13FTrIJ@zLkJBx0#$DpQFIU`I<5)l159S#_gkycMHD~DBaYx%= z#SmoYnM*X%B?`T55e5JN000000000000000_-Fh83r*B9<B!BuzL_t(|ob8%hlEfegMKe>g6ZgL)_c9+=TNEIgwBjT8d?j`( z2J{+<*98Co0001hJ3l^VVvPAZgpfF0AK_&*8rJ>>DV%~zQX9&%?CeC zVP+~q9i(zkRDVh*lyaFygQa9#sqV?BBa!XMS_&I~ZT!DK3nk+QVLNxaBAp)qTU(|p z&&*WB^wGBhd7qiXEy4f*00000000000000000000 cz{~gt?h}jAhr||WZ2$lO07*qoM6N<$f>gfzYybcN delta 477 zcmV<30V4jh1os1wB!9k1L_t(|obA|Aa)lraKvCQ2PT2pF*h@c{GMNAoCMMOrm6V}*3_dlP1xJ#ZT0W= z!$um7@&~D8_2=&Qv7X>TCFp;0`VzLOS-GhWy!wL~03IX?xy3kmsAm;L?W*>68)C=H z&#@P(>dV~1vwx9;Y7B5WHa&eVw4~3;4>99iqP4hK?wb4jkxP};RR`IdF>GpOBK?%h zrE0spu46|z?sdNQ)43JopU zTF1Poe7{#S$zJvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf+nS+` delta 513 zcmV+c0{;E<0-FSoB!A*bL_t(|ob8%XmcD1z08L*rYF%9Md{r8rJhHc zNN8{l00000U^-t<3vf*c!8zx>Pv!Wi>tlH@zMmGLg{bHq)vftFEkFfgnuidQL+EDV zmzfeau#Ew#f=mcu7ysDC0Fm`)bS>K$V3!$P%QgmZY9sUxc7HNJ;$=1f0001hYQlk3 zbHC5qa$WRaF7xVJ-VyQ*edlb3?m;d0Pe-Rjn0PCl&=+ltWP@lXa&3CV>|?_~XRnh^ zBkbO0V7PNt;jB^**Vei2!LGb7Y9SpwplS-VNnH4^^_L&b*b_0G#BX-kl1yBeXfQeD zH`V~-;-fedu76^w;~Hsz2H}k5Nc>d3c4ZesTa3caW3v*OM{uFuj$@0iw%e_aLx}x3 z{;-Z?zL=w@{xN8V4!WAK#dQapNj88ir>e#V6Sz<^HWJ{Jd`m??~ZBW&qfyp|W zbSomi^dGif#|wvZL|TMZF6Tx|9KFHFXd1aQVQG;%)p}(k9lJ`tvlk-NWFMUhR=QlC zmCTNH7V!#`sohz{13FTrIJ@zLkJBx0#$DpQFIU`I<5)l159S#_gkycMHD~DBaYx%= z#SmoYnM*X%B?`T55e5JN000000000000000_-Fh83r*B9<B!BuzL_t(|ob8%hlEfegMKe>g6ZgL)_c9+=TNEIgwBjT8d?j`( z2J{+<*98Co0001hJ3l^VVvPAZgpfF0AK_&*8rJ>>DV%~zQX9&%?CeC zVP+~q9i(zkRDVh*lyaFygQa9#sqV?BBa!XMS_&I~ZT!DK3nk+QVLNxaBAp)qTU(|p z&&*WB^wGBhd7qiXEy4f*00000000000000000000 cz{~gt?h}jAhr||WZ2$lO07*qoM6N<$f>gfzYybcN delta 477 zcmV<30V4jh1os1wB!9k1L_t(|obA|Aa)lraKvCQ2PT2pF*h@c{GMNAoCMMOrm6V}*3_dlP1xJ#ZT0W= z!$um7@&~D8_2=&Qv7X>TCFp;0`VzLOS-GhWy!wL~03IX?xy3kmsAm;L?W*>68)C=H z&#@P(>dV~1vwx9;Y7B5WHa&eVw4~3;4>99iqP4hK?wb4jkxP};RR`IdF>GpOBK?%h zrE0spu46|z?sdNQ)43JopU zTF1Poe7{#S$z Date: Mon, 29 Apr 2024 11:24:55 +0200 Subject: [PATCH 17/46] fix(lr): depositIntoStrategy tests --- README.md | 4 ++++ .../nanos_lrDepositIntoStrategyNormal/00001.png | Bin 380 -> 334 bytes .../nanos_lrDepositIntoStrategyNormal/00002.png | Bin 445 -> 493 bytes .../00001.png | Bin 380 -> 334 bytes .../00002.png | Bin 445 -> 493 bytes .../00001.png | Bin 380 -> 334 bytes .../00002.png | Bin 445 -> 493 bytes .../nanox_lrDepositIntoStrategyNormal/00001.png | Bin 426 -> 372 bytes .../nanox_lrDepositIntoStrategyNormal/00002.png | Bin 533 -> 573 bytes .../00001.png | Bin 426 -> 372 bytes .../00002.png | Bin 533 -> 573 bytes .../00001.png | Bin 426 -> 372 bytes .../00002.png | Bin 533 -> 573 bytes 13 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 86d08da..cb41468 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,8 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ### LR Deposit Into Strategy +![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00000.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00001.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00002.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00003.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00004.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00005.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00006.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00007.png) + ### Delegate To ![](/tests/snapshots/nanos_delegate_to_is_kiln/00000.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00001.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00002.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00003.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00004.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00005.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00006.png) @@ -194,6 +196,8 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ### LR Deposit Into Strategy +![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00000.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00001.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00002.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00003.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00004.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00005.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00006.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00007.png) + ### Delegate To ![](/tests/snapshots/nanox_delegate_to_is_kiln/00000.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00001.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00002.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00003.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00004.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00005.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00006.png) diff --git a/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00001.png b/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00001.png index c978af0baf12daf4747b904387f03ec16315336b..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGmV0?q=EB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1mH*ll1@q delta 353 zcmV-n0iOQO0{jAyB!5FmL_t(|ob8$04uc>JhH;ti|G-{s7bFCG8Zxw${9l#@kz;=- zp{4`?002zQ=Md670q(-Kbz}kF-UGP8=SbVGKBlu0pu)M@C07Slkw*; zuQH?&t>y9?#gOrL_cd#yO3Pwgx}%-;w>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE z$za67WO)7|KVzNRA5z3jdyO~NB^7P|Rx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw z<_EZ2vs=insajow;?VvkU@$Jz5|X zKy-t%v&Jp2<#@kBSQoSk0S{qc?3)At0EFTTWHH*in15Ra00000NkvXXu0mjf)9<7) diff --git a/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00002.png b/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00002.png index 424ff7377ae4b6f3a209c0a5d1f0da46aad6c35b..bf86a81e5ea812e9bb4d5d5277dffe36debfa456 100644 GIT binary patch delta 467 zcmV;^0WAK#1MLHlB!9F?L_t(|ob8#*j>8}fMd@hz{~z2%XAy~7e$^Nghm4P^Dxn4w zz=qtmRun~16n@^X?&{V#eq{?C z9+8WFdt4vi{T3S2Zo>;|jJk&!NkCbr?1I$`^)+s+iz@2*4S&v%yQ^N-M8HzeVn>Cr zgk77`WF#%*4JUvmheq-MO>24!M{2UqK~HGY{LD9z1Ip%Z8@F*#!~{ivw6jT1r9A4; zK+r056NVny=yAZN!5GdwQ|^dmd$(7|DJX9*`Y&kly?TY-BLZ5)+c;D4Hlwo(H3ylb zWucwo+32}+3G2jfXW(R>mKIOa^A!)AO9d7KfMPs{|NQiSw2)CApz>Wff9 zKq{uB8DD|s67yEQ;15Sznqptb2P${=G1xu7*b+kNmVP;JP`0BqaZLcb`%y^}T8^3_UyfN( zvb^MlwH)p6g}CKw-Ozc#z_x$L+=VOc0b3xwH(WXw6-80-`~jjsXdPXqC;I>Z002ov JPDHLkV1lmh;hO*e delta 419 zcmV;U0bKs=1HA)~B!7fSL_t(|ob8$27Q!G1fL*8F|ABY0F4i#uBxL@ujqh|(PJxLc zQc6J(1VJ!}ZT)_7%W;{3mL8LJW(PcH8<5hrrsehd0zr+m&)!m!3A<$#C5`OQYa)c8 zsxPHRs?H{S6f<@})%vncigJ{L*ySJuLG~Ge9x_J*HmtFIrhnqh0sUrVKMA_3Ffqdc z!dZtN?xR z2Q%>-h3>%bBrnWkeZrUeByh3~%1l97H5yEVG-p7*C<`~28T6(Oj08-Tz5dXF zIb9R3uT^UtNq>VHY3UT{72b<|yS^K)v;z#4%TgIqE>Fs$V2iL>4U+rRQ~T@y+t{`X z2d>ttQ_axf08JfmymHxm^GY{Q&H&*lq+MOlQ#F+Sb>$Xh*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1mH*ll1@q delta 353 zcmV-n0iOQO0{jAyB!5FmL_t(|ob8$04uc>JhH;ti|G-{s7bFCG8Zxw${9l#@kz;=- zp{4`?002zQ=Md670q(-Kbz}kF-UGP8=SbVGKBlu0pu)M@C07Slkw*; zuQH?&t>y9?#gOrL_cd#yO3Pwgx}%-;w>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE z$za67WO)7|KVzNRA5z3jdyO~NB^7P|Rx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw z<_EZ2vs=insajow;?VvkU@$Jz5|X zKy-t%v&Jp2<#@kBSQoSk0S{qc?3)At0EFTTWHH*in15Ra00000NkvXXu0mjf)9<7) diff --git a/tests/snapshots/nanos_lrDepositIntoStrategyUnknownERC20/00002.png b/tests/snapshots/nanos_lrDepositIntoStrategyUnknownERC20/00002.png index 424ff7377ae4b6f3a209c0a5d1f0da46aad6c35b..bf86a81e5ea812e9bb4d5d5277dffe36debfa456 100644 GIT binary patch delta 467 zcmV;^0WAK#1MLHlB!9F?L_t(|ob8#*j>8}fMd@hz{~z2%XAy~7e$^Nghm4P^Dxn4w zz=qtmRun~16n@^X?&{V#eq{?C z9+8WFdt4vi{T3S2Zo>;|jJk&!NkCbr?1I$`^)+s+iz@2*4S&v%yQ^N-M8HzeVn>Cr zgk77`WF#%*4JUvmheq-MO>24!M{2UqK~HGY{LD9z1Ip%Z8@F*#!~{ivw6jT1r9A4; zK+r056NVny=yAZN!5GdwQ|^dmd$(7|DJX9*`Y&kly?TY-BLZ5)+c;D4Hlwo(H3ylb zWucwo+32}+3G2jfXW(R>mKIOa^A!)AO9d7KfMPs{|NQiSw2)CApz>Wff9 zKq{uB8DD|s67yEQ;15Sznqptb2P${=G1xu7*b+kNmVP;JP`0BqaZLcb`%y^}T8^3_UyfN( zvb^MlwH)p6g}CKw-Ozc#z_x$L+=VOc0b3xwH(WXw6-80-`~jjsXdPXqC;I>Z002ov JPDHLkV1lmh;hO*e delta 419 zcmV;U0bKs=1HA)~B!7fSL_t(|ob8$27Q!G1fL*8F|ABY0F4i#uBxL@ujqh|(PJxLc zQc6J(1VJ!}ZT)_7%W;{3mL8LJW(PcH8<5hrrsehd0zr+m&)!m!3A<$#C5`OQYa)c8 zsxPHRs?H{S6f<@})%vncigJ{L*ySJuLG~Ge9x_J*HmtFIrhnqh0sUrVKMA_3Ffqdc z!dZtN?xR z2Q%>-h3>%bBrnWkeZrUeByh3~%1l97H5yEVG-p7*C<`~28T6(Oj08-Tz5dXF zIb9R3uT^UtNq>VHY3UT{72b<|yS^K)v;z#4%TgIqE>Fs$V2iL>4U+rRQ~T@y+t{`X z2d>ttQ_axf08JfmymHxm^GY{Q&H&*lq+MOlQ#F+Sb>$Xh*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1mH*ll1@q delta 353 zcmV-n0iOQO0{jAyB!5FmL_t(|ob8$04uc>JhH;ti|G-{s7bFCG8Zxw${9l#@kz;=- zp{4`?002zQ=Md670q(-Kbz}kF-UGP8=SbVGKBlu0pu)M@C07Slkw*; zuQH?&t>y9?#gOrL_cd#yO3Pwgx}%-;w>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE z$za67WO)7|KVzNRA5z3jdyO~NB^7P|Rx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw z<_EZ2vs=insajow;?VvkU@$Jz5|X zKy-t%v&Jp2<#@kBSQoSk0S{qc?3)At0EFTTWHH*in15Ra00000NkvXXu0mjf)9<7) diff --git a/tests/snapshots/nanos_lrDepositIntoStrategyUnknownStrategy/00002.png b/tests/snapshots/nanos_lrDepositIntoStrategyUnknownStrategy/00002.png index 424ff7377ae4b6f3a209c0a5d1f0da46aad6c35b..bf86a81e5ea812e9bb4d5d5277dffe36debfa456 100644 GIT binary patch delta 467 zcmV;^0WAK#1MLHlB!9F?L_t(|ob8#*j>8}fMd@hz{~z2%XAy~7e$^Nghm4P^Dxn4w zz=qtmRun~16n@^X?&{V#eq{?C z9+8WFdt4vi{T3S2Zo>;|jJk&!NkCbr?1I$`^)+s+iz@2*4S&v%yQ^N-M8HzeVn>Cr zgk77`WF#%*4JUvmheq-MO>24!M{2UqK~HGY{LD9z1Ip%Z8@F*#!~{ivw6jT1r9A4; zK+r056NVny=yAZN!5GdwQ|^dmd$(7|DJX9*`Y&kly?TY-BLZ5)+c;D4Hlwo(H3ylb zWucwo+32}+3G2jfXW(R>mKIOa^A!)AO9d7KfMPs{|NQiSw2)CApz>Wff9 zKq{uB8DD|s67yEQ;15Sznqptb2P${=G1xu7*b+kNmVP;JP`0BqaZLcb`%y^}T8^3_UyfN( zvb^MlwH)p6g}CKw-Ozc#z_x$L+=VOc0b3xwH(WXw6-80-`~jjsXdPXqC;I>Z002ov JPDHLkV1lmh;hO*e delta 419 zcmV;U0bKs=1HA)~B!7fSL_t(|ob8$27Q!G1fL*8F|ABY0F4i#uBxL@ujqh|(PJxLc zQc6J(1VJ!}ZT)_7%W;{3mL8LJW(PcH8<5hrrsehd0zr+m&)!m!3A<$#C5`OQYa)c8 zsxPHRs?H{S6f<@})%vncigJ{L*ySJuLG~Ge9x_J*HmtFIrhnqh0sUrVKMA_3Ffqdc z!dZtN?xR z2Q%>-h3>%bBrnWkeZrUeByh3~%1l97H5yEVG-p7*C<`~28T6(Oj08-Tz5dXF zIb9R3uT^UtNq>VHY3UT{72b<|yS^K)v;z#4%TgIqE>Fs$V2iL>4U+rRQ~T@y+t{`X z2d>ttQ_axf08JfmymHxm^GY{Q&H&*lq+MOlQ#F+Sb>$XhJvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf?s=h` delta 400 zcmV;B0dM~F0;&U$B!6*9L_t(|obA~`j>8}fKv7!FO>+Mu`7X0SgDeab5QIAO-zuS` zA=nT~LjV8(0B-j>-GI+TB!qBXS2~WTwmcsD@^iWYGh#=3>~8CQx&Z^SG#8OHAZ#`H zb7u=DxCy|}BqJhT#)q2#MBks$qud0*OGb}!6M$eALeJnS0DsBDVgLXDfEjjCII&D@ z?CNAC%QtzJwEv`i&24v0|9#sv&vy5g?P$FhrXMf;l+~XW3n%WF-6EZ)%~5@-E8Ax4 z16w(3-uXR}MxGWEwq4lH@y=_r3)}OXj?i>dr}_IsCQJ6LP?r>Qvlfg~iR>=`#Vxt4 z`|PyV{)RX;^?%1;;Xj}*H{*ht&8O>3S6($@@)0mM7;A5~+EXw?VL;<}>e^*;0sZ~ejf71cjb9^yBo=QBn?SoCZBObifJyP6o>;6o=9 ugRSUZ0000000000000000001Bn_sFVJjY}l8)N_g00{s|MNUMnLSTa7Ft%R+ diff --git a/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00002.png b/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00002.png index 3a306b185323cb01e28f5f83cfbe9e6644bff724..899b5918e75cdd8ac389da0ea8dc6ba2b6e4c36c 100644 GIT binary patch delta 549 zcmV+=0^0qR1ib{1BYy$}NklJSB=0hdR9loE6q?wR)O)Lh zh@eP}Bqaa<004mP{5W)S&MBqiI24JmA6R_SUk8#ZX+rp9 zuMQ5tp51t=<(}VBjHg=eaQXv~-;ADig(F87M_x56x6%`ND|14AK`EXq{ws~A9e#oT z=u;@w0Da@V(|;cDNIWOuMK&BGzfSki0|0Or%zMCwx1L^ZTQ9~{U#kznR6L2bWwJOr z1H0{BL}V>UsT6k018r5OtvfE3bf#;(>P=egR!_V2-IWTcqgrlblmW_xNvOzIx{?wl zSsgu_F4nmu1AMx%3#a?bVPtyhTcBeVkpXbepnUTL`hSy}H_X%l<*6j_j2Zkt;1kZt zy2TeuS>6|n~ zXD@w}JxTJi6jURI{Dc*h^wM(7g&We=6r_{#fU~qn?w&gw1hz(izO5BoYh190`>ohr z-)wS5M|mNIvHERyeylriqZIT%*>n@uDOROX9(eSH834e7;XPnOzSfHkJ*9~BW^BAF z?-vd*J=KZIM}NxjDx>(C*fEt2l%q>azcRO^t+=)2dRhfL@w>#Y zvkkab1SpLmp(5{5l}nUhozOhg=*J`i=K8K(IQ{?K4ySFJkybij+JbrJSvVi3RzSrG zC{J@1-sx^sj*iB9#EGS@nNPc@#NAK)Q&>wnUrHOAk3PwI|8K46S`sVdLlZun zmDXi#vb$T|aS21`g&qx`{J|r_|LMrvlErF$WdykI0XH3U=l(Hl@&Sl6O^pvWaA0J7 jU<&31lMwJvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf?s=h` delta 400 zcmV;B0dM~F0;&U$B!6*9L_t(|obA~`j>8}fKv7!FO>+Mu`7X0SgDeab5QIAO-zuS` zA=nT~LjV8(0B-j>-GI+TB!qBXS2~WTwmcsD@^iWYGh#=3>~8CQx&Z^SG#8OHAZ#`H zb7u=DxCy|}BqJhT#)q2#MBks$qud0*OGb}!6M$eALeJnS0DsBDVgLXDfEjjCII&D@ z?CNAC%QtzJwEv`i&24v0|9#sv&vy5g?P$FhrXMf;l+~XW3n%WF-6EZ)%~5@-E8Ax4 z16w(3-uXR}MxGWEwq4lH@y=_r3)}OXj?i>dr}_IsCQJ6LP?r>Qvlfg~iR>=`#Vxt4 z`|PyV{)RX;^?%1;;Xj}*H{*ht&8O>3S6($@@)0mM7;A5~+EXw?VL;<}>e^*;0sZ~ejf71cjb9^yBo=QBn?SoCZBObifJyP6o>;6o=9 ugRSUZ0000000000000000001Bn_sFVJjY}l8)N_g00{s|MNUMnLSTa7Ft%R+ diff --git a/tests/snapshots/nanox_lrDepositIntoStrategyUnknownERC20/00002.png b/tests/snapshots/nanox_lrDepositIntoStrategyUnknownERC20/00002.png index 3a306b185323cb01e28f5f83cfbe9e6644bff724..899b5918e75cdd8ac389da0ea8dc6ba2b6e4c36c 100644 GIT binary patch delta 549 zcmV+=0^0qR1ib{1BYy$}NklJSB=0hdR9loE6q?wR)O)Lh zh@eP}Bqaa<004mP{5W)S&MBqiI24JmA6R_SUk8#ZX+rp9 zuMQ5tp51t=<(}VBjHg=eaQXv~-;ADig(F87M_x56x6%`ND|14AK`EXq{ws~A9e#oT z=u;@w0Da@V(|;cDNIWOuMK&BGzfSki0|0Or%zMCwx1L^ZTQ9~{U#kznR6L2bWwJOr z1H0{BL}V>UsT6k018r5OtvfE3bf#;(>P=egR!_V2-IWTcqgrlblmW_xNvOzIx{?wl zSsgu_F4nmu1AMx%3#a?bVPtyhTcBeVkpXbepnUTL`hSy}H_X%l<*6j_j2Zkt;1kZt zy2TeuS>6|n~ zXD@w}JxTJi6jURI{Dc*h^wM(7g&We=6r_{#fU~qn?w&gw1hz(izO5BoYh190`>ohr z-)wS5M|mNIvHERyeylriqZIT%*>n@uDOROX9(eSH834e7;XPnOzSfHkJ*9~BW^BAF z?-vd*J=KZIM}NxjDx>(C*fEt2l%q>azcRO^t+=)2dRhfL@w>#Y zvkkab1SpLmp(5{5l}nUhozOhg=*J`i=K8K(IQ{?K4ySFJkybij+JbrJSvVi3RzSrG zC{J@1-sx^sj*iB9#EGS@nNPc@#NAK)Q&>wnUrHOAk3PwI|8K46S`sVdLlZun zmDXi#vb$T|aS21`g&qx`{J|r_|LMrvlErF$WdykI0XH3U=l(Hl@&Sl6O^pvWaA0J7 jU<&31lMwJvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf?s=h` delta 400 zcmV;B0dM~F0;&U$B!6*9L_t(|obA~`j>8}fKv7!FO>+Mu`7X0SgDeab5QIAO-zuS` zA=nT~LjV8(0B-j>-GI+TB!qBXS2~WTwmcsD@^iWYGh#=3>~8CQx&Z^SG#8OHAZ#`H zb7u=DxCy|}BqJhT#)q2#MBks$qud0*OGb}!6M$eALeJnS0DsBDVgLXDfEjjCII&D@ z?CNAC%QtzJwEv`i&24v0|9#sv&vy5g?P$FhrXMf;l+~XW3n%WF-6EZ)%~5@-E8Ax4 z16w(3-uXR}MxGWEwq4lH@y=_r3)}OXj?i>dr}_IsCQJ6LP?r>Qvlfg~iR>=`#Vxt4 z`|PyV{)RX;^?%1;;Xj}*H{*ht&8O>3S6($@@)0mM7;A5~+EXw?VL;<}>e^*;0sZ~ejf71cjb9^yBo=QBn?SoCZBObifJyP6o>;6o=9 ugRSUZ0000000000000000001Bn_sFVJjY}l8)N_g00{s|MNUMnLSTa7Ft%R+ diff --git a/tests/snapshots/nanox_lrDepositIntoStrategyUnknownStrategy/00002.png b/tests/snapshots/nanox_lrDepositIntoStrategyUnknownStrategy/00002.png index 3a306b185323cb01e28f5f83cfbe9e6644bff724..899b5918e75cdd8ac389da0ea8dc6ba2b6e4c36c 100644 GIT binary patch delta 549 zcmV+=0^0qR1ib{1BYy$}NklJSB=0hdR9loE6q?wR)O)Lh zh@eP}Bqaa<004mP{5W)S&MBqiI24JmA6R_SUk8#ZX+rp9 zuMQ5tp51t=<(}VBjHg=eaQXv~-;ADig(F87M_x56x6%`ND|14AK`EXq{ws~A9e#oT z=u;@w0Da@V(|;cDNIWOuMK&BGzfSki0|0Or%zMCwx1L^ZTQ9~{U#kznR6L2bWwJOr z1H0{BL}V>UsT6k018r5OtvfE3bf#;(>P=egR!_V2-IWTcqgrlblmW_xNvOzIx{?wl zSsgu_F4nmu1AMx%3#a?bVPtyhTcBeVkpXbepnUTL`hSy}H_X%l<*6j_j2Zkt;1kZt zy2TeuS>6|n~ zXD@w}JxTJi6jURI{Dc*h^wM(7g&We=6r_{#fU~qn?w&gw1hz(izO5BoYh190`>ohr z-)wS5M|mNIvHERyeylriqZIT%*>n@uDOROX9(eSH834e7;XPnOzSfHkJ*9~BW^BAF z?-vd*J=KZIM}NxjDx>(C*fEt2l%q>azcRO^t+=)2dRhfL@w>#Y zvkkab1SpLmp(5{5l}nUhozOhg=*J`i=K8K(IQ{?K4ySFJkybij+JbrJSvVi3RzSrG zC{J@1-sx^sj*iB9#EGS@nNPc@#NAK)Q&>wnUrHOAk3PwI|8K46S`sVdLlZun zmDXi#vb$T|aS21`g&qx`{J|r_|LMrvlErF$WdykI0XH3U=l(Hl@&Sl6O^pvWaA0J7 jU<&31lMw Date: Mon, 29 Apr 2024 11:29:20 +0200 Subject: [PATCH 18/46] fix(lr): test for lrQueueWithdrawals --- README.md | 4 ++++ .../00001.png | Bin 380 -> 334 bytes .../00001.png | Bin 380 -> 334 bytes .../00001.png | Bin 380 -> 334 bytes .../00001.png | Bin 426 -> 372 bytes .../00001.png | Bin 426 -> 372 bytes .../00001.png | Bin 426 -> 372 bytes 7 files changed, 4 insertions(+) diff --git a/README.md b/README.md index cb41468..d65fdf0 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,8 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ### Queue Withdrawals +![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00008.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00009.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00010.png) + ### LR Complete Queued Withdrawals ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000010.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000011.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000012.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000013.png) @@ -208,6 +210,8 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ### Queue Withdrawals +![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00007.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png) + ### LR Complete Queued Withdrawals ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/000010.png) diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png index c978af0baf12daf4747b904387f03ec16315336b..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGmV0?q=EB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1mH*ll1@q delta 353 zcmV-n0iOQO0{jAyB!5FmL_t(|ob8$04uc>JhH;ti|G-{s7bFCG8Zxw${9l#@kz;=- zp{4`?002zQ=Md670q(-Kbz}kF-UGP8=SbVGKBlu0pu)M@C07Slkw*; zuQH?&t>y9?#gOrL_cd#yO3Pwgx}%-;w>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE z$za67WO)7|KVzNRA5z3jdyO~NB^7P|Rx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw z<_EZ2vs=insajow;?VvkU@$Jz5|X zKy-t%v&Jp2<#@kBSQoSk0S{qc?3)At0EFTTWHH*in15Ra00000NkvXXu0mjf)9<7) diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00001.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00001.png index c978af0baf12daf4747b904387f03ec16315336b..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGmV0?q=EB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1mH*ll1@q delta 353 zcmV-n0iOQO0{jAyB!5FmL_t(|ob8$04uc>JhH;ti|G-{s7bFCG8Zxw${9l#@kz;=- zp{4`?002zQ=Md670q(-Kbz}kF-UGP8=SbVGKBlu0pu)M@C07Slkw*; zuQH?&t>y9?#gOrL_cd#yO3Pwgx}%-;w>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE z$za67WO)7|KVzNRA5z3jdyO~NB^7P|Rx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw z<_EZ2vs=insajow;?VvkU@$Jz5|X zKy-t%v&Jp2<#@kBSQoSk0S{qc?3)At0EFTTWHH*in15Ra00000NkvXXu0mjf)9<7) diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00001.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00001.png index c978af0baf12daf4747b904387f03ec16315336b..326ea1dfd542fd2a490dc7418fe1e8df5245237e 100644 GIT binary patch delta 307 zcmV-30nGmV0?q=EB!3l2L_t(|ob8&;5`!QNgkz_^{{wrlht5#sPhbk0;C|BsYKn1J zLnl^*5JCu1&3Poo@qmn?thHqW-sl8cI1kzO?513u2o7n*jsdaUNnA{2Jen6efoith zbg9W<#{gN=15*abf*x2iKo<1i%F5TKfE#(K{sgijQ~hZqq<^ORlc5JlScQ;)*WvT{ zeg1VuL-!3n)e#xsuc{vf%{bRJ3v>*2#xaFnTM(9Oqvj^J(8cSeP=cBUxt;Op`X-+R z;t6QFzxqU}{FZ{+rJw})d=>E>>aGUKvX+d2qRfDCintb@0?~aC1{Bu1;E><=EDIMe z&bQ^Ie)2~U=q&Y^U#kY+2du@0PQYW_e;QO)e?ka>^8u6qqZG4IgyaAK002ovPDHLk FV1mH*ll1@q delta 353 zcmV-n0iOQO0{jAyB!5FmL_t(|ob8$04uc>JhH;ti|G-{s7bFCG8Zxw${9l#@kz;=- zp{4`?002zQ=Md670q(-Kbz}kF-UGP8=SbVGKBlu0pu)M@C07Slkw*; zuQH?&t>y9?#gOrL_cd#yO3Pwgx}%-;w>NW7Fs=@S@dzb(D`s}|NV+JGIi3H>C5{JE z$za67WO)7|KVzNRA5z3jdyO~NB^7P|Rx8v!)L!C*qYGrQlgv6tT$`F0P767p0Ngnw z<_EZ2vs=insajow;?VvkU@$Jz5|X zKy-t%v&Jp2<#@kBSQoSk0S{qc?3)At0EFTTWHH*in15Ra00000NkvXXu0mjf)9<7) diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00001.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00001.png index f86d7e2bc7c744a8c5f9c8c987b0fefa39364db1..e2039b1539745292d15d4ad9319b6b43599e56a1 100644 GIT binary patch delta 345 zcmV-f0jB<{1M~urB!4?eL_t(|obB0L5`!QNKvCN1PTc>JvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf?s=h` delta 400 zcmV;B0dM~F0;&U$B!6*9L_t(|obA~`j>8}fKv7!FO>+Mu`7X0SgDeab5QIAO-zuS` zA=nT~LjV8(0B-j>-GI+TB!qBXS2~WTwmcsD@^iWYGh#=3>~8CQx&Z^SG#8OHAZ#`H zb7u=DxCy|}BqJhT#)q2#MBks$qud0*OGb}!6M$eALeJnS0DsBDVgLXDfEjjCII&D@ z?CNAC%QtzJwEv`i&24v0|9#sv&vy5g?P$FhrXMf;l+~XW3n%WF-6EZ)%~5@-E8Ax4 z16w(3-uXR}MxGWEwq4lH@y=_r3)}OXj?i>dr}_IsCQJ6LP?r>Qvlfg~iR>=`#Vxt4 z`|PyV{)RX;^?%1;;Xj}*H{*ht&8O>3S6($@@)0mM7;A5~+EXw?VL;<}>e^*;0sZ~ejf71cjb9^yBo=QBn?SoCZBObifJyP6o>;6o=9 ugRSUZ0000000000000000001Bn_sFVJjY}l8)N_g00{s|MNUMnLSTa7Ft%R+ diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00001.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00001.png index f86d7e2bc7c744a8c5f9c8c987b0fefa39364db1..e2039b1539745292d15d4ad9319b6b43599e56a1 100644 GIT binary patch delta 345 zcmV-f0jB<{1M~urB!4?eL_t(|obB0L5`!QNKvCN1PTc>JvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf?s=h` delta 400 zcmV;B0dM~F0;&U$B!6*9L_t(|obA~`j>8}fKv7!FO>+Mu`7X0SgDeab5QIAO-zuS` zA=nT~LjV8(0B-j>-GI+TB!qBXS2~WTwmcsD@^iWYGh#=3>~8CQx&Z^SG#8OHAZ#`H zb7u=DxCy|}BqJhT#)q2#MBks$qud0*OGb}!6M$eALeJnS0DsBDVgLXDfEjjCII&D@ z?CNAC%QtzJwEv`i&24v0|9#sv&vy5g?P$FhrXMf;l+~XW3n%WF-6EZ)%~5@-E8Ax4 z16w(3-uXR}MxGWEwq4lH@y=_r3)}OXj?i>dr}_IsCQJ6LP?r>Qvlfg~iR>=`#Vxt4 z`|PyV{)RX;^?%1;;Xj}*H{*ht&8O>3S6($@@)0mM7;A5~+EXw?VL;<}>e^*;0sZ~ejf71cjb9^yBo=QBn?SoCZBObifJyP6o>;6o=9 ugRSUZ0000000000000000001Bn_sFVJjY}l8)N_g00{s|MNUMnLSTa7Ft%R+ diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00001.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00001.png index f86d7e2bc7c744a8c5f9c8c987b0fefa39364db1..e2039b1539745292d15d4ad9319b6b43599e56a1 100644 GIT binary patch delta 345 zcmV-f0jB<{1M~urB!4?eL_t(|obB0L5`!QNKvCN1PTc>JvX_21rB31tlt=KMFRO@5 z0@R5i00000)xBB|;FySn5TH`4fjO#=u&~-R@E@x%L~0N&mk>W-d_*1!@i;3+w;ABUesw09%3`pqQZ?@33v!Wv00000NkvXXu0mjf?s=h` delta 400 zcmV;B0dM~F0;&U$B!6*9L_t(|obA~`j>8}fKv7!FO>+Mu`7X0SgDeab5QIAO-zuS` zA=nT~LjV8(0B-j>-GI+TB!qBXS2~WTwmcsD@^iWYGh#=3>~8CQx&Z^SG#8OHAZ#`H zb7u=DxCy|}BqJhT#)q2#MBks$qud0*OGb}!6M$eALeJnS0DsBDVgLXDfEjjCII&D@ z?CNAC%QtzJwEv`i&24v0|9#sv&vy5g?P$FhrXMf;l+~XW3n%WF-6EZ)%~5@-E8Ax4 z16w(3-uXR}MxGWEwq4lH@y=_r3)}OXj?i>dr}_IsCQJ6LP?r>Qvlfg~iR>=`#Vxt4 z`|PyV{)RX;^?%1;;Xj}*H{*ht&8O>3S6($@@)0mM7;A5~+EXw?VL;<}>e^*;0sZ~ejf71cjb9^yBo=QBn?SoCZBObifJyP6o>;6o=9 ugRSUZ0000000000000000001Bn_sFVJjY}l8)N_g00{s|MNUMnLSTa7Ft%R+ From 596c71118f812c526ba2b3d90be7587fd953c230 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 29 Apr 2024 11:33:27 +0200 Subject: [PATCH 19/46] fix(v2): tests with new contract id --- tests/snapshots/nanos_claimv2/00001.png | Bin 276 -> 367 bytes tests/snapshots/nanos_multiClaimv2/00001.png | Bin 306 -> 367 bytes tests/snapshots/nanos_requestExitv2/00001.png | Bin 359 -> 367 bytes tests/snapshots/nanox_claimv2/00001.png | Bin 317 -> 402 bytes tests/snapshots/nanox_multiClaimv2/00001.png | Bin 344 -> 402 bytes tests/snapshots/nanox_requestExitv2/00001.png | Bin 403 -> 402 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/nanos_claimv2/00001.png b/tests/snapshots/nanos_claimv2/00001.png index 63403adf3150add319eff07b5dc122b8db9c5a49..c57eb58085b3955615381587da1dc17faf6ad759 100644 GIT binary patch delta 341 zcmV-b0jmC#0`CHlBYy!lNklahaCZEP7O>6Koe?UO#qrugF7>?Z2%tJ3-338buzr)jDLu$;r+%ygPtG?^`!27 zcw2v;yykgk+Hs>jG@$w@(Y$e9bCsFap~IZ@R>`0+a%fBYyzfNkl1~RmwB!C-+!r8s23`t-h zz6d0X5D^hU%c*nU-q5e;wYD6uALX3HWeAm>0NQeQl{q)(@AlZefZIYe zz157^2|#>iU@8D{n1Qtb#9;MzqNHFB%J7&F+3yU2cW3Cp89B;3KFvcpcZtN!Cp`i zBId3#1v>yQzqtZ<3woWO$`Sep@emOa5qWh0>vLsy`c;AA00000NkvXXu0mjf1>SV% diff --git a/tests/snapshots/nanos_multiClaimv2/00001.png b/tests/snapshots/nanos_multiClaimv2/00001.png index 116aee8964b94892f94ee9ada540d8944637a428..c57eb58085b3955615381587da1dc17faf6ad759 100644 GIT binary patch delta 341 zcmV-b0jmD80`CHlBYy!lNklahaCZEP7O>6Koe?UO#qrugF7>?Z2%tJ3-338buzr)jDLu$;r+%ygPtG?^`!27 zcw2v;yykgk+Hs>jG@$w@(Y$e9bCsFap~IZ@R>`-BYyz-Nkld(ebesC!u?5&m#??tQp8hPy^LMNsdBVrn?PW^S)tw%e zTE|hfDGPhM)sN4!1baK+hp0z<0eS|MjeqN|=K;qU4wG@QFd2d*pQQD^nY={}Kl=ax e00030%mJYtj}apf7!xo60000JhRZVF|AD>G3lpb6D@9Ia|CeQ9SWf++ z#yTPZ003ZUwlz`?3!oOVuPqDk?L7ev+e&U>f6`qE@6xE)5g>GTl+z~BzBixV6G+A_ zrb7*f9RX-g4NM6@6KY^h0Gd#PJ2S6s03O^6?>B&TGQ8i6h<~f${l-9po*)YKr0#uq zTYsOt=6Pn?aicvnp!z7$ym4N0m6_I|!<_Y2$+&aDUOF?Z6t1Rw?XWz)y$822fqK+j z3!$+$^tfq0`OQgsrTo@~3qjmWxPjhGtPmAWfV{6W`bpusdBbrzF$UPk6$B`?s*HYw zG*L9Xs5IczeNBhKWL!a1c|Et(I5ACb!q;`4Ylv0~O=M>Y5kK7fd6WvRKuyZ+J(vFu mK?C4=PrwKU|8D^R0FUg@@XWr%hP1H&0000Jh08ME|AD>G3m1a6AP#LQo-fPd51^cb zB@`k6005wCmRUIF2jD5nT6;F&YyAROSY`@S_LTNc9B%cB9|O4DBC$+md22q_FHlXG zT!)$*ehi>7J#b|J4d{V4186`G_Ke)O4mgn)>MM{H8S1McNPi9Wm4OGAAPQNs7dZ&G zZ(qT8lA@`3ji(bBHVG0jnXLB2{~oOs3``ed%l!NCD`NgxEXhyf|EY+%t%dp)nz74< z#*Z=We45L=RF{&dvMrUxFFlqo$ALl%ccW#1*z=b0#p~8cb|?_D8g?_2mH~XgQd_sV zl;ma)AVqf$cttvocD4P@Fw^Xw-5ij1dmFYnA^1gJmxnkpwp7jmg%;kzYnFr#_XEZP e1^@uSdszYAyR{Q%3b!sS%w0Qk_IKt|2`{_Yt`~H zl!HlcJwtBBd2mq@)~!5a#?&)l#>6bIGdJEXRDPldOS#E=ZDPADtq0*<=izKAXKwH2 z*4)~CFy939TOj(nFaP0p8$3~jIar16bP!~6Fcski0000000000000000001{`2$hF VC@y_Bf8YQB002ovPDHLkV1oIvsyP4v delta 290 zcmV+-0p0$R1HA%}B!2`+L_t(|obA~`Zi6ro1yHBzO?>|&&0V@cwNOZ%I8v~OzPBO- zMZM|YMV_DQrSQ%3b!sS%w0Qk_IKt|2`{_Yt`~H zl!HlcJwtBBd2mq@)~!5a#?&)l#>6bIGdJEXRDPldOS#E=ZDPADtq0*<=izKAXKwH2 z*4)~CFy939TOj(nFaP0p8$3~jIar16bP!~6Fcski0000000000000000001{`2$hF VC@y_Bf8YQB002ovPDHLkV1gk{s#E{~ delta 317 zcmbQle1mC%O1-?Ni(^Q|oVPb~`I;4Y8Xo3-RJ-@zWAEuY0Zv9yMd7GVcKbhME9Q%3b!sS%w0Qk_IKt|2`{_Yt`~H zl!HlcJwtBBd2mq@)~!5a#?&)l#>6bIGdJEXRDPldOS#E=ZDPADtq0*<=izKAXKwH2 z*4)~CFy939TOj(nFaP0p8$3~jIar16bP!~6Fcski0000000000000000001{`2$hF VC@y_Bf8YQB002ovPDHLkV1m7&st^DG delta 376 zcmV-;0f+vQ1Cs-gB!5~-L_t(|obB0B4uc>JfMK@mCf@%@y~`fRNMlh!5vcpWC$}kS zDWZcA0001h?p~t}ZeOZM{baP+>L9MI_x2_B8qF z8Q}?T3Q#r4h=`Z_!%YFA`A2juHwExAqHDP+Krk;t&)}&5$$!IY0002+hkC4r>bJ&$ z|EEgAaI}U|L1*6Q6@F)t?n(=H82LxcE?A0^zR|yKU8_Ip)zHHLvIpfYTsLe#Al>Xb zdA-zJb!||yO5Cf-&Lnz2XQ%z07Mkl+fNbVh#+SXeq{~((thUvL=v090I@*=AZC3`L zkI=5qfHdMJX>mUm?Cz-ct?z(tgGi^H_IL~5UhK7YipwTa_zch|x9yFC?wx0ucb-U^ z+e~e$oTmz=xlDGmB|KX^%{i#SgZY?+p6Z~Jsll!2UH||9000000000000000;5J_Z Wo&>=xg-T%n0000 Date: Mon, 29 Apr 2024 11:36:32 +0200 Subject: [PATCH 20/46] feat: bump plugin version --- Makefile | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 6cf50b8..40715a7 100644 --- a/Makefile +++ b/Makefile @@ -1,25 +1,23 @@ -# **************************************************************************** -# Ledger Ethereum Plugin Boilerplate -# (c) 2023 Ledger SAS. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# **************************************************************************** +# ******************************************************************************* +# * +# * ██╗ ██╗██╗██╗ ███╗ ██╗ +# * ██║ ██╔╝██║██║ ████╗ ██║ +# * █████╔╝ ██║██║ ██╔██╗ ██║ +# * ██╔═██╗ ██║██║ ██║╚██╗██║ +# * ██║ ██╗██║███████╗██║ ╚████║ +# * ╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═══╝ +# * +# * Kiln Ethereum Ledger App +# * (c) 2022-2024 Kiln +# * +# * contact@kiln.fi +# ******************************************************************************** APPNAME = "Kiln" # Application version -APPVERSION_M = 1 -APPVERSION_N = 4 +APPVERSION_M = 2 +APPVERSION_N = 0 APPVERSION_P = 0 include ethereum-plugin-sdk/standard_plugin.mk From 05701c16a1f502448c141dfa2773354e0ee403c9 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 29 Apr 2024 11:37:56 +0200 Subject: [PATCH 21/46] fix: v1 tests --- tests/snapshots/nanos_batchWithdraw/00001.png | Bin 349 -> 378 bytes tests/snapshots/nanos_batchWithdrawCL/00001.png | Bin 349 -> 378 bytes tests/snapshots/nanos_batchWithdrawEL/00001.png | Bin 349 -> 378 bytes tests/snapshots/nanos_deposit/00001.png | Bin 353 -> 378 bytes .../nanos_requestValidatorsExit/00001.png | Bin 359 -> 378 bytes tests/snapshots/nanos_withdraw/00001.png | Bin 308 -> 378 bytes tests/snapshots/nanos_withdrawEL/00001.png | Bin 308 -> 378 bytes tests/snapshots/nanox_batchWithdraw/00001.png | Bin 387 -> 425 bytes tests/snapshots/nanox_batchWithdrawCL/00001.png | Bin 387 -> 425 bytes tests/snapshots/nanox_batchWithdrawEL/00001.png | Bin 387 -> 425 bytes .../nanox_requestValidatorsExit/00001.png | Bin 403 -> 425 bytes tests/snapshots/nanox_withdraw/00001.png | Bin 351 -> 425 bytes tests/snapshots/nanox_withdrawEL/00001.png | Bin 351 -> 425 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/nanos_batchWithdraw/00001.png b/tests/snapshots/nanos_batchWithdraw/00001.png index d7d84b57bafdf8543983f5c6b7856a9230a1b82e..da040da358c6aace96623d528283d17eb910111d 100644 GIT binary patch delta 351 zcmV-l0igcf0{Q}wB!59kL_t(|ob8(34#FS|g*&6~|G>ML7fX;8S__V!;`w6CmO;yU z3b;-p0001BYK}c~oF0Hy=&|-Jz;pBfN;r1fUg9ZTm0*`<#g71KxU+;d#`dFmj2?iQ z?d5u@k?duY;FM23x`n0vA;vJz#W zxLqOu003ZW&O;dI1JDaS*O3eG9UVXo=Rwjrc(U?$n}9#*MfM#iCK=gxLw`s$vhNIPFcNg3k@UKU z&*SlWH-qI7oBtZW6Y2anT*nnf#keX0J-Ad5Rm4$a7)FQwbQa^7Jels+ODVe@M6+rk z%lvs%>=X7c?=nS!Z#uD0??2+6WuE%xWvxaul}U65OU(Iu3!0vQe0NN6#;fs-xxW^) z?UNl<1CBAr5j*2pJ7%Wa(yiBR+JcO~1@B8Tz402RGQEUzEMjWJ&Itej000n*AD(U2 Uk45?{j{pDw07*qoM6N<$g5bfFZ2$lO diff --git a/tests/snapshots/nanos_batchWithdrawCL/00001.png b/tests/snapshots/nanos_batchWithdrawCL/00001.png index d7d84b57bafdf8543983f5c6b7856a9230a1b82e..da040da358c6aace96623d528283d17eb910111d 100644 GIT binary patch delta 351 zcmV-l0igcf0{Q}wB!59kL_t(|ob8(34#FS|g*&6~|G>ML7fX;8S__V!;`w6CmO;yU z3b;-p0001BYK}c~oF0Hy=&|-Jz;pBfN;r1fUg9ZTm0*`<#g71KxU+;d#`dFmj2?iQ z?d5u@k?duY;FM23x`n0vA;vJz#W zxLqOu003ZW&O;dI1JDaS*O3eG9UVXo=Rwjrc(U?$n}9#*MfM#iCK=gxLw`s$vhNIPFcNg3k@UKU z&*SlWH-qI7oBtZW6Y2anT*nnf#keX0J-Ad5Rm4$a7)FQwbQa^7Jels+ODVe@M6+rk z%lvs%>=X7c?=nS!Z#uD0??2+6WuE%xWvxaul}U65OU(Iu3!0vQe0NN6#;fs-xxW^) z?UNl<1CBAr5j*2pJ7%Wa(yiBR+JcO~1@B8Tz402RGQEUzEMjWJ&Itej000n*AD(U2 Uk45?{j{pDw07*qoM6N<$g5bfFZ2$lO diff --git a/tests/snapshots/nanos_batchWithdrawEL/00001.png b/tests/snapshots/nanos_batchWithdrawEL/00001.png index d7d84b57bafdf8543983f5c6b7856a9230a1b82e..da040da358c6aace96623d528283d17eb910111d 100644 GIT binary patch delta 351 zcmV-l0igcf0{Q}wB!59kL_t(|ob8(34#FS|g*&6~|G>ML7fX;8S__V!;`w6CmO;yU z3b;-p0001BYK}c~oF0Hy=&|-Jz;pBfN;r1fUg9ZTm0*`<#g71KxU+;d#`dFmj2?iQ z?d5u@k?duY;FM23x`n0vA;vJz#W zxLqOu003ZW&O;dI1JDaS*O3eG9UVXo=Rwjrc(U?$n}9#*MfM#iCK=gxLw`s$vhNIPFcNg3k@UKU z&*SlWH-qI7oBtZW6Y2anT*nnf#keX0J-Ad5Rm4$a7)FQwbQa^7Jels+ODVe@M6+rk z%lvs%>=X7c?=nS!Z#uD0??2+6WuE%xWvxaul}U65OU(Iu3!0vQe0NN6#;fs-xxW^) z?UNl<1CBAr5j*2pJ7%Wa(yiBR+JcO~1@B8Tz402RGQEUzEMjWJ&Itej000n*AD(U2 Uk45?{j{pDw07*qoM6N<$g5bfFZ2$lO diff --git a/tests/snapshots/nanos_deposit/00001.png b/tests/snapshots/nanos_deposit/00001.png index f475f186309ae5b4efce2c4fc0216db14dbfb05a..da040da358c6aace96623d528283d17eb910111d 100644 GIT binary patch delta 351 zcmV-l0igcj0{Q}wB!59kL_t(|ob8(34#FS|g*&6~|G>ML7fX;8S__V!;`w6CmO;yU z3b;-p0001BYK}c~oF0Hy=&|-Jz;pBfN;r1fUg9ZTm0*`<#g71KxU+;d#`dFmj2?iQ z?d5u@k?JMawe(|AT$d2NS0hDk8R&-IHZugA}|M z%hrtu0002!nq^M3c>}zKthHwYzSax4!!lEtvM=fEMAX$QehlDpC)vjoj<@Dxy?|oE z47T)Xh09V89)PiaAxFd>wpV+p}qoHk)ggC34f`fzB2H@5@aDu49?+Y z{ym;gT^LOWYq-yBrmj}1a99&xjj$`m?YbmOW^ykdxjjeU(Ri(Nd*|5TgCoN{RP?Uk z>7x7xmgIgHqUFNMGhQy^HB|0^<92(#q2y>eGkV>~inXA&5(v@46!+dOA8j|8if0as zadq7CfLr()DnBWRU-?lEeyMV=kn#D^T1WXu0MM9{ML7fX;8S__V!;`w6CmO;yU z3b;-p0001BYK}c~oF0Hy=&|-Jz;pBfN;r1fUg9ZTm0*`<#g71KxU+;d#`dFmj2?iQ z?d5u@k? delta 332 zcmV-S0ki)40_OsdB!4bRL_t(|ob8$24uc>Jh08ME|AD>G3m1a6AP#LQo-fPd51^cb zB@`k6005wCmRUIF2jD5nT6;F&YyAROSY`@S_LTNc9B%cB9|O4DBC$+md22q_FHlXG zT!)$*ehi>7J#b|J4d{V4186`G_Ke)O4mgn)>MM{H8S1McNPi9Wm4OGAAPQNs7dZ&G zZ(qT8lA@`3ji(bBHVG0jnXLB2{~oOs3``ed%l!NCD`NgxEXhyf|EY+%t%dp)nz74< z#*Z=We45L=RF{&dvMrUxFFlqo$ALl%ccW#1*z=b0#p~8cb|?_D8g?_2mH~XgQd_sV zl;ma)AVqf$cttvocD4P@Fw^Xw-5ij1dmFYnA^1gJmxnkpwp7jmg%;kzYnFr#_XEZP e1^@uSdszYAyR{<$IfeFX2V>J0J!b(SPqoCe(<2XQ07IunLW& z$3D!A7;V*R}tL-G3ifJy^8*(`5Xj5{Bf^lIgKdVYuYQpq#))k|!t z&DbMr87wmwbS>(!`*J`W1yYmL_@+fSWm)l<1>LXF^&PYe_8+lfRQ&)Wz@{{EaN-?0000<$IfeFX2V>J0J!b(SPqoCe(<2XQ07IunLW& z$3D!A7;V*R}tL-G3ifJy^8*(`5Xj5{Bf^lIgKdVYuYQpq#))k|!t z&DbMr87wmwbS>(!`*J`W1yYmL_@+fSWm)l<1>LXF^&PYe_8+lfRQ&)Wz@{{EaN-?0000Q>RtAMEFncJFjT<&-;*;@ zkQNak1ONa4;BlYXH*ilxLI}rkq~rLr{68M=<#+ZC^oW7pG2Eq}**DNYb#oC(4@7yI z{Cn~aJ8YAHra?wTc6mOwNkFuIk8ZV10(R-qt+q)(C?-Phuzynml9%NG0001EsA*#5 ztg(A?*|h9ap7z2?tqOT^fTWHFzPMK z%xhFkl#&fTS5U2E@% zT_t0kj{NkFSbz6|njJDV+SoOo4vz-c{Z8Km7;&k&%CDa`<-qlE(Fqv-c&Z#+y$|X; z_|=QO9P36cUst~WD~qxUS#63oUEc>yQ<;NHe;JPioR>rNuSjNWu@!&82cytTH$f%` tt_Uvx000000000000000007|T4`$>w0$ka6761SM00>D%PDHLkV1lG2zV!eA delta 360 zcmZ3<+{`>drQXZa#WAE}&fA;0e9a0x4T;;{sNMVTvG;V{1i|ZFOpg!iz5kpnn69<0 zqpy_#2zAbw@;#@TPCd! z`LpFyu;_*l4V+c~_-@$w^=0mUw&h38;+0b`T0hxx>c-O-wN^nw#jk&Fi!5C<>BqM4 zto~IcIqz0i@2KT|{@MRlW_thOG(C5%KHk~fMRg9I^WUb6+rDS8wz}iXkytgqeLZWe zooHT0+WfmZ$5y_KFkPNFch~RAuOeT(zZ@z*_+`Q!`;S&}mwwi#?-bXPPHgG^QZ;AO z-IHoF-}o0#$l7EtX&TWPnX$B6CAfK^hd#*NNWkEXw1m5q#}3v236Q9#tDnm{r-UW| DT*0PD diff --git a/tests/snapshots/nanox_batchWithdrawCL/00001.png b/tests/snapshots/nanox_batchWithdrawCL/00001.png index 2b52f120ef1e2e7ce6270b84097af9763b766b76..abb89702db778f107780bef945ba3624aa7e7b95 100644 GIT binary patch delta 399 zcmV;A0dW3<1E~X$B!6&8L_t(|obB0Bj)Wi#fMI5{H}U>Q>RtAMEFncJFjT<&-;*;@ zkQNak1ONa4;BlYXH*ilxLI}rkq~rLr{68M=<#+ZC^oW7pG2Eq}**DNYb#oC(4@7yI z{Cn~aJ8YAHra?wTc6mOwNkFuIk8ZV10(R-qt+q)(C?-Phuzynml9%NG0001EsA*#5 ztg(A?*|h9ap7z2?tqOT^fTWHFzPMK z%xhFkl#&fTS5U2E@% zT_t0kj{NkFSbz6|njJDV+SoOo4vz-c{Z8Km7;&k&%CDa`<-qlE(Fqv-c&Z#+y$|X; z_|=QO9P36cUst~WD~qxUS#63oUEc>yQ<;NHe;JPioR>rNuSjNWu@!&82cytTH$f%` tt_Uvx000000000000000007|T4`$>w0$ka6761SM00>D%PDHLkV1lG2zV!eA delta 360 zcmZ3<+{`>drQXZa#WAE}&fA;0e9a0x4T;;{sNMVTvG;V{1i|ZFOpg!iz5kpnn69<0 zqpy_#2zAbw@;#@TPCd! z`LpFyu;_*l4V+c~_-@$w^=0mUw&h38;+0b`T0hxx>c-O-wN^nw#jk&Fi!5C<>BqM4 zto~IcIqz0i@2KT|{@MRlW_thOG(C5%KHk~fMRg9I^WUb6+rDS8wz}iXkytgqeLZWe zooHT0+WfmZ$5y_KFkPNFch~RAuOeT(zZ@z*_+`Q!`;S&}mwwi#?-bXPPHgG^QZ;AO z-IHoF-}o0#$l7EtX&TWPnX$B6CAfK^hd#*NNWkEXw1m5q#}3v236Q9#tDnm{r-UW| DT*0PD diff --git a/tests/snapshots/nanox_batchWithdrawEL/00001.png b/tests/snapshots/nanox_batchWithdrawEL/00001.png index 2b52f120ef1e2e7ce6270b84097af9763b766b76..abb89702db778f107780bef945ba3624aa7e7b95 100644 GIT binary patch delta 399 zcmV;A0dW3<1E~X$B!6&8L_t(|obB0Bj)Wi#fMI5{H}U>Q>RtAMEFncJFjT<&-;*;@ zkQNak1ONa4;BlYXH*ilxLI}rkq~rLr{68M=<#+ZC^oW7pG2Eq}**DNYb#oC(4@7yI z{Cn~aJ8YAHra?wTc6mOwNkFuIk8ZV10(R-qt+q)(C?-Phuzynml9%NG0001EsA*#5 ztg(A?*|h9ap7z2?tqOT^fTWHFzPMK z%xhFkl#&fTS5U2E@% zT_t0kj{NkFSbz6|njJDV+SoOo4vz-c{Z8Km7;&k&%CDa`<-qlE(Fqv-c&Z#+y$|X; z_|=QO9P36cUst~WD~qxUS#63oUEc>yQ<;NHe;JPioR>rNuSjNWu@!&82cytTH$f%` tt_Uvx000000000000000007|T4`$>w0$ka6761SM00>D%PDHLkV1lG2zV!eA delta 360 zcmZ3<+{`>drQXZa#WAE}&fA;0e9a0x4T;;{sNMVTvG;V{1i|ZFOpg!iz5kpnn69<0 zqpy_#2zAbw@;#@TPCd! z`LpFyu;_*l4V+c~_-@$w^=0mUw&h38;+0b`T0hxx>c-O-wN^nw#jk&Fi!5C<>BqM4 zto~IcIqz0i@2KT|{@MRlW_thOG(C5%KHk~fMRg9I^WUb6+rDS8wz}iXkytgqeLZWe zooHT0+WfmZ$5y_KFkPNFch~RAuOeT(zZ@z*_+`Q!`;S&}mwwi#?-bXPPHgG^QZ;AO z-IHoF-}o0#$l7EtX&TWPnX$B6CAfK^hd#*NNWkEXw1m5q#}3v236Q9#tDnm{r-UW| DT*0PD diff --git a/tests/snapshots/nanox_requestValidatorsExit/00001.png b/tests/snapshots/nanox_requestValidatorsExit/00001.png index beaec8624779d1c0df01f381f9b660793f08b1e6..abb89702db778f107780bef945ba3624aa7e7b95 100644 GIT binary patch delta 399 zcmV;A0dW441E~X$B!6&8L_t(|obB0Bj)Wi#fMI5{H}U>Q>RtAMEFncJFjT<&-;*;@ zkQNak1ONa4;BlYXH*ilxLI}rkq~rLr{68M=<#+ZC^oW7pG2Eq}**DNYb#oC(4@7yI z{Cn~aJ8YAHra?wTc6mOwNkFuIk8ZV10(R-qt+q)(C?-Phuzynml9%NG0001EsA*#5 ztg(A?*|h9ap7z2?tqOT^fTWHFzPMK z%xhFkl#&fTS5U2E@% zT_t0kj{NkFSbz6|njJDV+SoOo4vz-c{Z8Km7;&k&%CDa`<-qlE(Fqv-c&Z#+y$|X; z_|=QO9P36cUst~WD~qxUS#63oUEc>yQ<;NHe;JPioR>rNuSjNWu@!&82cytTH$f%` tt_Uvx000000000000000007|T4`$>w0$ka6761SM00>D%PDHLkV1m6BzXbpQ delta 376 zcmV-;0f+vn1Cs-gB!5~-L_t(|obB0B4uc>JfMK@mCf@%@y~`fRNMlh!5vcpWC$}kS zDWZcA0001h?p~t}ZeOZM{baP+>L9MI_x2_B8qF z8Q}?T3Q#r4h=`Z_!%YFA`A2juHwExAqHDP+Krk;t&)}&5$$!IY0002+hkC4r>bJ&$ z|EEgAaI}U|L1*6Q6@F)t?n(=H82LxcE?A0^zR|yKU8_Ip)zHHLvIpfYTsLe#Al>Xb zdA-zJb!||yO5Cf-&Lnz2XQ%z07Mkl+fNbVh#+SXeq{~((thUvL=v090I@*=AZC3`L zkI=5qfHdMJX>mUm?Cz-ct?z(tgGi^H_IL~5UhK7YipwTa_zch|x9yFC?wx0ucb-U^ z+e~e$oTmz=xlDGmB|KX^%{i#SgZY?+p6Z~Jsll!2UH||9000000000000000;5J_Z Wo&>=xg-T%n0000Q>RtAMEFncJFjT<&-;*;@ zkQNak1ONa4;BlYXH*ilxLI}rkq~rLr{68M=<#+ZC^oW7pG2Eq}**DNYb#oC(4@7yI z{Cn~aJ8YAHra?wTc6mOwNkFuIk8ZV10(R-qt+q)(C?-Phuzynml9%NG0001EsA*#5 ztg(A?*|h9ap7z2?tqOT^fTWHFzPMK z%xhFkl#&fTS5U2E@% zT_t0kj{NkFSbz6|njJDV+SoOo4vz-c{Z8Km7;&k&%CDa`<-qlE(Fqv-c&Z#+y$|X; z_|=QO9P36cUst~WD~qxUS#63oUEc>yQ<;NHe;JPioR>rNuSjNWu@!&82cytTH$f%` tt_Uvx000000000000000007|T4`$>w0$ka6761SM00>D%PDHLkV1hCVzfb@G delta 324 zcmV-K0lWUG1K$FWB!4DJL_t(|obB0d4#FS|fMGP=g!><!06w=FMj3Fyjk*EPGe<#mVp613rO(fPZuqX#N| zh8;}8yU##x>^(5ZMBmIH)I{GHIq*ak@-zuDIru5U3jhEB000000000000000{LCAo WTF#CP3}@f~0000iQ>RtAMEFncJFjT<&-;*;@ zkQNak1ONa4;BlYXH*ilxLI}rkq~rLr{68M=<#+ZC^oW7pG2Eq}**DNYb#oC(4@7yI z{Cn~aJ8YAHra?wTc6mOwNkFuIk8ZV10(R-qt+q)(C?-Phuzynml9%NG0001EsA*#5 ztg(A?*|h9ap7z2?tqOT^fTWHFzPMK z%xhFkl#&fTS5U2E@% zT_t0kj{NkFSbz6|njJDV+SoOo4vz-c{Z8Km7;&k&%CDa`<-qlE(Fqv-c&Z#+y$|X; z_|=QO9P36cUst~WD~qxUS#63oUEc>yQ<;NHe;JPioR>rNuSjNWu@!&82cytTH$f%` tt_Uvx000000000000000007|T4`$>w0$ka6761SM00>D%PDHLkV1hCVzfb@G delta 324 zcmV-K0lWUG1K$FWB!4DJL_t(|obB0d4#FS|fMGP=g!><!06w=FMj3Fyjk*EPGe<#mVp613rO(fPZuqX#N| zh8;}8yU##x>^(5ZMBmIH)I{GHIq*ak@-zuDIru5U3jhEB000000000000000{LCAo WTF#CP3}@f~0000i Date: Mon, 29 Apr 2024 11:51:05 +0200 Subject: [PATCH 22/46] fix: v1 tests --- tests/globalsetup.js | 12 +++++++----- tests/snapshots/nanos_withdrawCL/00001.png | Bin 308 -> 378 bytes tests/snapshots/nanox_deposit/00001.png | Bin 385 -> 425 bytes tests/snapshots/nanox_withdrawCL/00001.png | Bin 351 -> 425 bytes 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/globalsetup.js b/tests/globalsetup.js index e835233..c03ad0c 100644 --- a/tests/globalsetup.js +++ b/tests/globalsetup.js @@ -1,8 +1,8 @@ -import Zemu from "@zondax/zemu"; -import fsExtra from "fs-extra"; +import Zemu from '@zondax/zemu'; +import fsExtra from 'fs-extra'; const catchExit = async () => { - process.on("SIGINT", () => { + process.on('SIGINT', () => { Zemu.stopAllEmuContainers(function () { process.exit(); }); @@ -10,8 +10,10 @@ const catchExit = async () => { }; module.exports = async () => { + console.log('Waited 7 seconds before running tests\n'); + await new Promise((resolve) => setTimeout(resolve, 7000)); await catchExit(); await Zemu.checkAndPullImage(); await Zemu.stopAllEmuContainers(); - fsExtra.emptyDirSync("snapshots/tmp") -}; \ No newline at end of file + fsExtra.emptyDirSync('snapshots/tmp'); +}; diff --git a/tests/snapshots/nanos_withdrawCL/00001.png b/tests/snapshots/nanos_withdrawCL/00001.png index 54a9b5e79fe27669fd27bda33c8ede2664504b1f..da040da358c6aace96623d528283d17eb910111d 100644 GIT binary patch delta 352 zcmV-m0iXV~0{Q}wBYy!wNkl<$IfeFX2V>J0J!b(SPqoCe(<2XQ07IunLW& z$3D!A7;V*R}tL-G3ifJy^8*(`5Xj5{Bf^lIgKdVYuYQpq#))k|!t z&DbMr87wmwbS>(!`*J`W1yYmL_@+fSWm)l<1>LXF^&PYe_8+lfRQ&)Wz@{{EaN-?0000Q>RtAMEFncJFjT<&-;*;@ zkQNak1ONa4;BlYXH*ilxLI}rkq~rLr{68M=<#+ZC^oW7pG2Eq}**DNYb#oC(4@7yI z{Cn~aJ8YAHra?wTc6mOwNkFuIk8ZV10(R-qt+q)(C?-Phuzynml9%NG0001EsA*#5 ztg(A?*|h9ap7z2?tqOT^fTWHFzPMK z%xhFkl#&fTS5U2E@% zT_t0kj{NkFSbz6|njJDV+SoOo4vz-c{Z8Km7;&k&%CDa`<-qlE(Fqv-c&Z#+y$|X; z_|=QO9P36cUst~WD~qxUS#63oUEc>yQ<;NHe;JPioR>rNuSjNWu@!&82cytTH$f%` tt_Uvx000000000000000007|T4`$>w0$ka6761SM00>D%PDHLkV1l6szViS8 delta 358 zcmV-s0h#`(1AzmOB!5UrL_t(|obB034#OY}Kv7!tCfxr>zDpOV2;qbwVu;iKR|VeXAO8vJ-@V0Nj#Oi}QF+~BTRA$d?Dt;PJ!7dZ4R`k2SfNWBx^tGWCzL?+aglzEZQXDu z`@JyQ*|6mqtIL>Y#T_vAPpk51XUVwjMqXD78XJPbXx{tmYIZbLg_~?m&P*2LF6hdE zPT@TH5i}$7`d^8fhC@$RzIu4+@Q?d}3m&Bs-kZO%Ezt6KA3Md|$;?@hfa76_ek6&h zvow5#IXH!Ossx!FOhtGB000000000000000004k#z7%`~M%sq4L;wH)07*qoM6N<$ Eg4TMeA^-pY diff --git a/tests/snapshots/nanox_withdrawCL/00001.png b/tests/snapshots/nanox_withdrawCL/00001.png index a1fa923ec3554b5475315cd71978a9af0ebe0421..abb89702db778f107780bef945ba3624aa7e7b95 100644 GIT binary patch delta 399 zcmV;A0dW4`0;vO#B!6&8L_t(|obB0Bj)Wi#fMI5{H}U>Q>RtAMEFncJFjT<&-;*;@ zkQNak1ONa4;BlYXH*ilxLI}rkq~rLr{68M=<#+ZC^oW7pG2Eq}**DNYb#oC(4@7yI z{Cn~aJ8YAHra?wTc6mOwNkFuIk8ZV10(R-qt+q)(C?-Phuzynml9%NG0001EsA*#5 ztg(A?*|h9ap7z2?tqOT^fTWHFzPMK z%xhFkl#&fTS5U2E@% zT_t0kj{NkFSbz6|njJDV+SoOo4vz-c{Z8Km7;&k&%CDa`<-qlE(Fqv-c&Z#+y$|X; z_|=QO9P36cUst~WD~qxUS#63oUEc>yQ<;NHe;JPioR>rNuSjNWu@!&82cytTH$f%` tt_Uvx000000000000000007|T4`$>w0$ka6761SM00>D%PDHLkV1hCVzfb@G delta 324 zcmV-K0lWUG1K$FWB!4DJL_t(|obB0d4#FS|fMGP=g!><!06w=FMj3Fyjk*EPGe<#mVp613rO(fPZuqX#N| zh8;}8yU##x>^(5ZMBmIH)I{GHIq*ak@-zuDIru5U3jhEB000000000000000{LCAo WTF#CP3}@f~0000i Date: Mon, 29 Apr 2024 11:58:44 +0200 Subject: [PATCH 23/46] fix(lr): provide parameter missing comments --- src/provide_parameter/eigenlayer.c | 71 +++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 11 deletions(-) diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index ec2565d..171da3d 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -77,6 +77,23 @@ uint8_t find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { * */ void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t *context) { + // ************************************************************************** + // FUNCTION TO PARSE + // ************************************************************************** + // + // function depositIntoStrategy( + // address strategy, + // address erc20, + // uint256 amount + // ) external + // + // ************************************************************************** + // example + // [ 0] selector + // [ 4] strategy + // [ 36] erc20 + // [ 68] amount + uint8_t buffer[ADDRESS_LENGTH]; char address_buffer[ADDRESS_STR_LEN]; @@ -118,15 +135,28 @@ void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t * */ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *context) { - // queuedWithdrawals = (address strategies[],uint256 shares[],address withdrawer) - // queueWithdrawals(queuedWithdrawals[]) + // ************************************************************************** + // FUNCTION TO PARSE + // ************************************************************************** + // + // struct QueuedWithdrawalParams { + // address[] strategies; + // uint256[] shares; + // address withdrawer; + // } + // + // function queueWithdrawals( + // QueuedWithdrawalParams[] calldata queuedWithdrawalParams + // ) external + // + // ************************************************************************** // example for 2 queue withdrawals with 2 strategies each (2x2 dimension) // [ 0] selector - // [ 4] queuedWithdrawals_offset - // [ 36] queuedWithdrawals_length - // [ 68] queuedWithdrawals_0_offset - // [100] queuedWithdrawals_1_offset - // [132] queuedWithdrawals_0 + // [ 4] QueuedWithdrawalParams_offset + // [ 36] QueuedWithdrawalParams_length + // [ 68] QueuedWithdrawalParams_0_offset + // [100] QueuedWithdrawalParams_1_offset + // [132] QueuedWithdrawalParams_0 // [132] strategies_offset // [164] shares_offset // [196] withdrawer @@ -136,7 +166,7 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co // [324] shares_length // [356] shares_0 // [388] shares_1 - // [388] queuedWithdrawals_1 + // [388] QueuedWithdrawalParams_1 // [388] strategies_offset // [420] shares_offset // [452] withdrawer @@ -150,7 +180,9 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; switch (context->next_param) { - // 1. queuedWithdrawals array setup + // ******************************************************************** + // QUEUEWITHDRAWALPARAMS[] + // ******************************************************************** case LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET: context->next_param = LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH; break; @@ -160,7 +192,9 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET; break; - // 2. entering a queuedWithdrawal + // ******************************************************************** + // QUEUEWITHDRAWALPARAMS STRUCT + // ******************************************************************** case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET: // we skip all the queuewithdrawal structs offsets PRINTF("CURRENT ITEM COUNT: %d\n", params->current_item_count); @@ -626,7 +660,22 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con * */ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) { - // delegateTo(address,(bytes,uint256),bytes32) + // ************************************************************************** + // FUNCTION TO PARSE + // ************************************************************************** + // + // struct Signature { + // bytes signature; + // uint256 expiry; + // } + // + // function delegateTo( + // address operator, + // Signature signature, + // bytes32 approverSalt + // ) external + // + // ************************************************************************** // example // [0] selector // [4] operator From dd294507a046a9206d53963787f7bd05465169a3 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Mon, 29 Apr 2024 23:34:05 +0200 Subject: [PATCH 24/46] fix: review useless overflow check --- src/handle_init_contract.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/handle_init_contract.c b/src/handle_init_contract.c index 7a69a9d..30d1228 100644 --- a/src/handle_init_contract.c +++ b/src/handle_init_contract.c @@ -39,12 +39,6 @@ void handle_init_contract(ethPluginInitContract_t *msg) { return; } context->selectorIndex = index; - // check for overflow - if ((size_t) context->selectorIndex != index) { - PRINTF("Error: overflow detected on selector index!\n"); - msg->result = ETH_PLUGIN_RESULT_ERROR; - return; - } msg->result = ETH_PLUGIN_RESULT_OK; From 54cf56a7777196f46e36f3fd8b130a21b1da303a Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Tue, 30 Apr 2024 00:02:41 +0200 Subject: [PATCH 25/46] fix: nits --- src/contracts.c | 4 +- src/dbg/debug.h | 5 - src/dbg/printf.c | 567 ------------------ src/handle_finalize.c | 5 + src/handle_init_contract.c | 6 - src/handle_query_contract_id.c | 30 - src/kiln_plugin.h | 21 +- src/provide_parameter/eigenlayer.c | 6 +- src/provide_parameter/provide_parameter.h | 2 +- src/query_contract_ui/eigenlayer.c | 2 +- tests/src/lrCompleteQueuedWithdrawals.test.js | 6 +- tests/src/lrDepositIntoStrategy.test.js | 2 +- tests/src/withdraw.test.js | 1 - tests/src/withdrawCL.test.js | 23 +- tests/src/withdrawEL.test.js | 23 +- 15 files changed, 50 insertions(+), 653 deletions(-) delete mode 100644 src/dbg/debug.h delete mode 100644 src/dbg/printf.c diff --git a/src/contracts.c b/src/contracts.c index 10963f0..ae42509 100644 --- a/src/contracts.c +++ b/src/contracts.c @@ -53,7 +53,7 @@ static const uint32_t KILN_LR_QUEUE_WITHDRAWALS_SELECTOR = 0x0dd8dd02; static const uint32_t KILN_LR_COMPLETE_QUEUED_WITHDRAWALS_SELECTOR = 0x33404396; // --- cast sig "delegateTo(address,(bytes,uint256),bytes32)" static const uint32_t KILN_LR_DELEGATE_TO_SELECTOR = 0xeea9064b; -// -- cast sig "undelegate(address)" +// --- cast sig "undelegate(address)" static const uint32_t KILN_LR_UNDELEGATE_SELECTOR = 0xda8be864; const char lr_strategy_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN] = { @@ -120,4 +120,4 @@ const uint32_t KILN_SELECTORS[NUM_SELECTORS] = { KILN_LR_COMPLETE_QUEUED_WITHDRAWALS_SELECTOR, KILN_LR_DELEGATE_TO_SELECTOR, KILN_LR_UNDELEGATE_SELECTOR, -}; \ No newline at end of file +}; diff --git a/src/dbg/debug.h b/src/dbg/debug.h deleted file mode 100644 index 06f63df..0000000 --- a/src/dbg/debug.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include - -// Printf that uses speculos semi-hosting features. -void semihosted_printf(const char *format, ...); \ No newline at end of file diff --git a/src/dbg/printf.c b/src/dbg/printf.c deleted file mode 100644 index 7ef63c3..0000000 --- a/src/dbg/printf.c +++ /dev/null @@ -1,567 +0,0 @@ -#include "stdint.h" -#include -#include - -#if !defined(MIN) -#define MIN(x, y) ((x) < (y) ? (x) : (y)) -#endif // MIN - -// Prints the null terminated string pointed by `buf`. -static void debug_write(const char *buf) { - asm volatile( - "movs r0, #0x04\n" - "movs r1, %0\n" - "svc 0xab\n" ::"r"(buf) - : "r0", "r1"); -} - -// Prints a single character `c`. -static void printc(char c) { - char buf[2]; - - buf[0] = c; - buf[1] = 0; - debug_write(buf); -} - -// Prints `size` characters of `str. -static void prints(const char *str, uint16_t size) { - char buf[64]; - - while (size > 0) { - uint8_t written = MIN(sizeof(buf) - 1, size); - - memcpy(buf, str, written); - buf[written] = 0; - debug_write(buf); - - if (written >= size) { - size = 0; - } else { - size -= written; - str += written; - } - } -} - -static const char g_pcHex[] = { - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', -}; - -static const char g_pcHex_cap[] = { - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - 'A', - 'B', - 'C', - 'D', - 'E', - 'F', -}; - -void semihosted_printf(const char *format, ...) { - unsigned long ulIdx, ulValue, ulPos, ulCount, ulBase, ulNeg, ulStrlen, ulCap; - char *pcStr, pcBuf[16], cFill; - va_list vaArgP; - char cStrlenSet; - - // - // Check the arguments. - // - if (format == 0) { - return; - } - - // - // Start the varargs processing. - // - va_start(vaArgP, format); - - // - // Loop while there are more characters in the string. - // - while (*format) { - // - // Find the first non-% character, or the end of the string. - // - for (ulIdx = 0; (format[ulIdx] != '%') && (format[ulIdx] != '\0'); ulIdx++) { - } - - // - // Write this portion of the string. - // - prints(format, ulIdx); - - // - // Skip the portion of the string that was written. - // - format += ulIdx; - - // - // See if the next character is a %. - // - if (*format == '%') { - // - // Skip the %. - // - format++; - - // - // Set the digit count to zero, and the fill character to space - // (i.e. to the defaults). - // - ulCount = 0; - cFill = ' '; - ulStrlen = 0; - cStrlenSet = 0; - ulCap = 0; - ulBase = 10; - - // - // It may be necessary to get back here to process more characters. - // Goto's aren't pretty, but effective. I feel extremely dirty for - // using not one but two of the beasts. - // - again: - - // - // Determine how to handle the next character. - // - switch (*format++) { - // - // Handle the digit characters. - // - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': { - // - // If this is a zero, and it is the first digit, then the - // fill character is a zero instead of a space. - // - if ((format[-1] == '0') && (ulCount == 0)) { - cFill = '0'; - } - - // - // Update the digit count. - // - ulCount *= 10; - ulCount += format[-1] - '0'; - - // - // Get the next character. - // - goto again; - } - - // - // Handle the %c command. - // - case 'c': { - // - // Get the value from the varargs. - // - ulValue = va_arg(vaArgP, unsigned long); - - // - // Print out the character. - // - prints((char *) &ulValue, 1); - - // - // This command has been handled. - // - break; - } - - // - // Handle the %d command. - // - case 'd': { - // - // Get the value from the varargs. - // - ulValue = va_arg(vaArgP, unsigned long); - - // - // Reset the buffer position. - // - ulPos = 0; - - // - // If the value is negative, make it positive and indicate - // that a minus sign is needed. - // - if ((long) ulValue < 0) { - // - // Make the value positive. - // - ulValue = -(long) ulValue; - - // - // Indicate that the value is negative. - // - ulNeg = 1; - } else { - // - // Indicate that the value is positive so that a minus - // sign isn't inserted. - // - ulNeg = 0; - } - - // - // Set the base to 10. - // - ulBase = 10; - - // - // Convert the value to ASCII. - // - goto convert; - } - - // - // Handle ths %.*s command - // special %.*H or %.*h format to print a given length of hex digits (case: H UPPER, - // h lower) - // - case '.': { - // ensure next char is '*' and next one is 's' - if (format[0] == '*' && - (format[1] == 's' || format[1] == 'H' || format[1] == 'h')) { - // skip '*' char - format++; - - ulStrlen = va_arg(vaArgP, unsigned long); - cStrlenSet = 1; - - // interpret next char (H/h/s) - goto again; - } - - // does not support %.2x for example - goto error; - } - - case '*': { - if (*format == 's') { - ulStrlen = va_arg(vaArgP, unsigned long); - cStrlenSet = 2; - goto again; - } - - goto error; - } - - case '-': // -XXs - { - cStrlenSet = 0; - // read a number of space to post pad with ' ' the string to display - goto again; - } - - // - // Handle the %s command. - // %H and %h also - case 'H': - ulCap = 1; // uppercase base 16 - ulBase = 16; - goto case_s; - case 'h': - ulCap = 0; - ulBase = 16; // lowercase base 16 - goto case_s; - case 's': - case_s : { - // - // Get the string pointer from the varargs. - // - pcStr = va_arg(vaArgP, char *); - - // - // Determine the length of the string. (if not specified using .*) - // - switch (cStrlenSet) { - // compute length with strlen - case 0: - for (ulIdx = 0; pcStr[ulIdx] != '\0'; ulIdx++) { - } - break; - - // use given length - case 1: - ulIdx = ulStrlen; - break; - - // printout prepad - case 2: - // if string is empty, then, ' ' padding - if (pcStr[0] == '\0') { - // padd ulStrlen white space - do { - prints(" ", 1); - } while (ulStrlen-- > 0); - - goto s_pad; - } - goto error; // unsupported if replicating the same string multiple - // times - case 3: - // skip '-' still buggy ... - goto again; - } - - // - // Write the string. - // - switch (ulBase) { - default: - prints(pcStr, ulIdx); - break; - case 16: { - unsigned char nibble1, nibble2; - for (ulCount = 0; ulCount < ulIdx; ulCount++) { - nibble1 = (pcStr[ulCount] >> 4) & 0xF; - nibble2 = pcStr[ulCount] & 0xF; - switch (ulCap) { - case 0: - printc(g_pcHex[nibble1]); - printc(g_pcHex[nibble2]); - break; - case 1: - printc(g_pcHex_cap[nibble1]); - printc(g_pcHex_cap[nibble2]); - break; - } - } - break; - } - } - - s_pad: - // - // Write any required padding spaces - // - if (ulCount > ulIdx) { - ulCount -= ulIdx; - while (ulCount--) { - prints(" ", 1); - } - } - // - // This command has been handled. - // - break; - } - - // - // Handle the %u command. - // - case 'u': { - // - // Get the value from the varargs. - // - ulValue = va_arg(vaArgP, unsigned long); - - // - // Reset the buffer position. - // - ulPos = 0; - - // - // Set the base to 10. - // - ulBase = 10; - - // - // Indicate that the value is positive so that a minus sign - // isn't inserted. - // - ulNeg = 0; - - // - // Convert the value to ASCII. - // - goto convert; - } - - // - // Handle the %x and %X commands. Note that they are treated - // identically; i.e. %X will use lower case letters for a-f - // instead of the upper case letters is should use. We also - // alias %p to %x. - // - case 'X': - ulCap = 1; - __attribute__((fallthrough)); - case 'x': - case 'p': { - // - // Get the value from the varargs. - // - ulValue = va_arg(vaArgP, unsigned long); - - // - // Reset the buffer position. - // - ulPos = 0; - - // - // Set the base to 16. - // - ulBase = 16; - - // - // Indicate that the value is positive so that a minus sign - // isn't inserted. - // - ulNeg = 0; - - // - // Determine the number of digits in the string version of - // the value. - // - convert: - for (ulIdx = 1; - (((ulIdx * ulBase) <= ulValue) && (((ulIdx * ulBase) / ulBase) == ulIdx)); - ulIdx *= ulBase, ulCount--) { - } - - // - // If the value is negative, reduce the count of padding - // characters needed. - // - if (ulNeg) { - ulCount--; - } - - // - // If the value is negative and the value is padded with - // zeros, then place the minus sign before the padding. - // - if (ulNeg && (cFill == '0')) { - // - // Place the minus sign in the output buffer. - // - pcBuf[ulPos++] = '-'; - - // - // The minus sign has been placed, so turn off the - // negative flag. - // - ulNeg = 0; - } - - // - // Provide additional padding at the beginning of the - // string conversion if needed. - // - if ((ulCount > 1) && (ulCount < 16)) { - for (ulCount--; ulCount; ulCount--) { - pcBuf[ulPos++] = cFill; - } - } - - // - // If the value is negative, then place the minus sign - // before the number. - // - if (ulNeg) { - // - // Place the minus sign in the output buffer. - // - pcBuf[ulPos++] = '-'; - } - - // - // Convert the value into a string. - // - for (; ulIdx; ulIdx /= ulBase) { - if (!ulCap) { - pcBuf[ulPos++] = g_pcHex[(ulValue / ulIdx) % ulBase]; - } else { - pcBuf[ulPos++] = g_pcHex_cap[(ulValue / ulIdx) % ulBase]; - } - } - - // - // Write the string. - // - prints(pcBuf, ulPos); - - // - // This command has been handled. - // - break; - } - - // - // Handle the %% command. - // - case '%': { - // - // Simply write a single %. - // - prints(format - 1, 1); - - // - // This command has been handled. - // - break; - } - - error: - // - // Handle all other commands. - // - default: { - // - // Indicate an error. - // - prints("ERROR", 5); - - // - // This command has been handled. - // - break; - } - } - } - } - - // - // End the varargs processing. - // - va_end(vaArgP); -} \ No newline at end of file diff --git a/src/handle_finalize.c b/src/handle_finalize.c index 29c397c..841bcc4 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -29,6 +29,10 @@ void handle_finalize(ethPluginFinalize_t *msg) { case KILN_V1_BATCH_WITHDRAW_EL: case KILN_V1_BATCH_WITHDRAW_CL: case KILN_V1_REQUEST_EXIT: + msg->numScreens = 1; + msg->result = ETH_PLUGIN_RESULT_OK; + break; + case KILN_V2_STAKE: case KILN_V2_REQUEST_EXIT: case KILN_V2_MULTICLAIM: @@ -36,6 +40,7 @@ void handle_finalize(ethPluginFinalize_t *msg) { msg->numScreens = 1; msg->result = ETH_PLUGIN_RESULT_OK; break; + case KILN_LR_DEPOSIT_INTO_STRATEGY: msg->numScreens = 3; msg->result = ETH_PLUGIN_RESULT_OK; diff --git a/src/handle_init_contract.c b/src/handle_init_contract.c index 30d1228..e6d79b5 100644 --- a/src/handle_init_contract.c +++ b/src/handle_init_contract.c @@ -44,18 +44,12 @@ void handle_init_contract(ethPluginInitContract_t *msg) { switch (context->selectorIndex) { case KILN_V1_DEPOSIT: - break; - case KILN_V1_WITHDRAW: case KILN_V1_WITHDRAW_EL: case KILN_V1_WITHDRAW_CL: - break; - case KILN_V1_BATCH_WITHDRAW: case KILN_V1_BATCH_WITHDRAW_EL: case KILN_V1_BATCH_WITHDRAW_CL: - break; - case KILN_V1_REQUEST_EXIT: break; diff --git a/src/handle_query_contract_id.c b/src/handle_query_contract_id.c index 0bf1e16..b03e6ad 100644 --- a/src/handle_query_contract_id.c +++ b/src/handle_query_contract_id.c @@ -24,57 +24,27 @@ void handle_query_contract_id(ethQueryContractID_t *msg) { switch (context->selectorIndex) { case KILN_V1_DEPOSIT: - strlcpy(msg->version, "Native Staking", msg->versionLength); - break; - case KILN_V1_WITHDRAW: case KILN_V1_WITHDRAW_EL: case KILN_V1_WITHDRAW_CL: - strlcpy(msg->version, "Native Staking", msg->versionLength); - break; - case KILN_V1_BATCH_WITHDRAW: case KILN_V1_BATCH_WITHDRAW_EL: case KILN_V1_BATCH_WITHDRAW_CL: - strlcpy(msg->version, "Native Staking", msg->versionLength); - break; - case KILN_V1_REQUEST_EXIT: strlcpy(msg->version, "Native Staking", msg->versionLength); break; case KILN_V2_STAKE: - strlcpy(msg->version, "Pooled Staking", msg->versionLength); - break; - case KILN_V2_REQUEST_EXIT: - strlcpy(msg->version, "Pooled Staking", msg->versionLength); - break; - case KILN_V2_MULTICLAIM: - strlcpy(msg->version, "Pooled Staking", msg->versionLength); - break; - case KILN_V2_CLAIM: strlcpy(msg->version, "Pooled Staking", msg->versionLength); break; case KILN_LR_DEPOSIT_INTO_STRATEGY: - strlcpy(msg->version, "EigenLayer", msg->versionLength); - break; - case KILN_LR_QUEUE_WITHDRAWALS: - strlcpy(msg->version, "EigenLayer", msg->versionLength); - break; - case KILN_LR_COMPLETE_QUEUED_WITHDRAWALS: - strlcpy(msg->version, "EigenLayer", msg->versionLength); - break; - case KILN_LR_DELEGATE_TO: - strlcpy(msg->version, "EigenLayer", msg->versionLength); - break; - case KILN_LR_UNDELEGATE: strlcpy(msg->version, "EigenLayer", msg->versionLength); break; diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 88178b8..f102aa5 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -43,7 +43,7 @@ // // V2 selectors // --- 8. stake() -// --- 9. requestExit(shares_count) +// --- 9. requestExit(shares_amount) // --- 10. multiClaim(exit_queues, ticket_ids, cask_ids) // --- 11. claim(uint256[],uint32[],uint16) // @@ -86,6 +86,7 @@ typedef enum { // globals #define LR_STRATEGIES_COUNT 11 +#define UNKNOW_LR_ERC20 255 #define UNKNOW_LR_STRATEGY 255 #define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) #define ERC20_DECIMALS 18 @@ -100,14 +101,15 @@ extern const char lr_kiln_operator_address[ADDRESS_STR_LEN]; // Parameters and state machines for EigenLayer parsing typedef enum { - LR_DEPOSIT_INTO_STRATEGY_STRATEGY = 0, + LR_DEPOSIT_INTO_STRATEGY_UNEXPECTED_PARAMETER = 0, + LR_DEPOSIT_INTO_STRATEGY_STRATEGY, LR_DEPOSIT_INTO_STRATEGY_TOKEN, LR_DEPOSIT_INTO_STRATEGY_AMOUNT, - LR_DEPOSIT_INTO_STRATEGY_UNEXPECTED_PARAMETER, } lr_deposit_into_strategy_parameters; typedef enum { - LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET = 0, + LR_QUEUE_WITHDRAWALS_UNEXPECTED_PARAMETER = 0, + LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET, LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH, LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET, LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET, @@ -117,11 +119,11 @@ typedef enum { LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM, LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH, LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__SHARES_ITEM, - LR_QUEUE_WITHDRAWALS_UNEXPECTED_PARAMETER } lr_queue_withdrawals_parameters; typedef enum { - LRCQW_WITHDRAWALS_OFFSET = 0, + LRCQW_UNEXPECTED_PARAMETER = 0, + LRCQW_WITHDRAWALS_OFFSET, LRCQW_TOKENS_OFFSET, LRCQW_MIDDLEWARE_TIMES_INDEXES_OFFSET, LRCQW_RECEIVE_AS_TOKENS_OFFSET, @@ -152,20 +154,17 @@ typedef enum { LRCQW_RECEIVE_AS_TOKENS_LENGTH, LRCQW_RECEIVE_AS_TOKENS__ITEMS, - - LRCQW_UNEXPECTED_PARAMETER - } lr_complete_queued_withdrawals_parameters; typedef enum { - LR_DELEGATE_TO_OPERATOR = 0, + LR_DELEGATE_TO_UNEXPECTED_PARAMETER = 0, + LR_DELEGATE_TO_OPERATOR, LR_DELEGATE_TO_SIGNATURE_OFFSET, LR_DELEGATE_TO_APPROVER_SALT, LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET, LR_DELEGATE_TO_SIGNATURE_EXPIRY, LR_DELEGATE_TO_SIGNATURE_SIG_LENGTH, LR_DELEGATE_TO_SIGNATURE_SIG_ITEMS, - LR_DELEGATE_TO_UNEXPECTED_PARAMETER } lr_delegate_to_parameters; // **************************************************************************** diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 171da3d..f5d58cc 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -34,11 +34,11 @@ bool compare_addresses(const char a[ADDRESS_STR_LEN], const char b[ADDRESS_STR_L /** * @brief If address is a known erc20, update lr display context with its name - * otherwise set it to unkwown (UNKNOW_LR_STRATEGY) + * otherwise set it to unkwown (UNKNOW_LR_ERC20) * * @param address: address to compare * - * @returns index of the erc20 in the context or UNKNOW_LR_STRATEGY if not found + * @returns index of the erc20 in the context or UNKNOW_LR_ERC20 if not found */ uint8_t find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { for (size_t i = 0; i < LR_STRATEGIES_COUNT; i++) { @@ -47,7 +47,7 @@ uint8_t find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { } } // if unknown erc20, indicate it - return UNKNOW_LR_STRATEGY; + return UNKNOW_LR_ERC20; } /** diff --git a/src/provide_parameter/provide_parameter.h b/src/provide_parameter/provide_parameter.h index 63c41d6..6ac5634 100644 --- a/src/provide_parameter/provide_parameter.h +++ b/src/provide_parameter/provide_parameter.h @@ -23,4 +23,4 @@ void handle_lr_deposit_into_strategy(ethPluginProvideParameter_t *msg, context_t *context); void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *context); void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, context_t *context); -void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context); \ No newline at end of file +void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context); diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c index ac65260..efe9350 100644 --- a/src/query_contract_ui/eigenlayer.c +++ b/src/query_contract_ui/eigenlayer.c @@ -47,7 +47,7 @@ bool deposit_into_strategy_ui(ethQueryContractUI_t *msg, context_t *context) { amountToString(params->erc20_amount_to_display, sizeof(params->erc20_amount_to_display), ERC20_DECIMALS, - params->erc20_to_display == UNKNOW_LR_STRATEGY || + params->erc20_to_display == UNKNOW_LR_ERC20 || params->erc20_to_display >= LR_STRATEGIES_COUNT ? "UNKNOWN" : lr_tickers[params->erc20_to_display], diff --git a/tests/src/lrCompleteQueuedWithdrawals.test.js b/tests/src/lrCompleteQueuedWithdrawals.test.js index c0adb91..c290600 100644 --- a/tests/src/lrCompleteQueuedWithdrawals.test.js +++ b/tests/src/lrCompleteQueuedWithdrawals.test.js @@ -5,7 +5,7 @@ import { ethers } from 'ethers'; import { parseEther } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // delegation manager +const contractAddr = '0x858646372cc42e1a627fce94aa7a7033e7cf075a'; // strategy manager const abi_path = `../cal/abis/${contractAddr}.json`; const abi = require(abi_path); @@ -66,6 +66,10 @@ nano_models.forEach(function (model) { '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH ], + [ + '0xBe9895146f7AF43049ca1c1AE358B0541Ea49704', // cbETH + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', // stETH + ], ], [0, 0], [false, false] diff --git a/tests/src/lrDepositIntoStrategy.test.js b/tests/src/lrDepositIntoStrategy.test.js index 3ac1f24..3491634 100644 --- a/tests/src/lrDepositIntoStrategy.test.js +++ b/tests/src/lrDepositIntoStrategy.test.js @@ -108,7 +108,7 @@ nano_models.forEach(function (model) { const { data } = await contract.populateTransaction.depositIntoStrategy( '0x298aFB19A105D59E74658C4C334Ff360BadE6dd2', // mETH strategy - '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270', // sfrxETH erc20 + '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270', // unknown erc20 '420000000000000' ); diff --git a/tests/src/withdraw.test.js b/tests/src/withdraw.test.js index fa210e1..d2de4d9 100644 --- a/tests/src/withdraw.test.js +++ b/tests/src/withdraw.test.js @@ -26,7 +26,6 @@ nano_models.forEach(function (model) { const validatorAddress = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; - const deadline = Number(1632843280); const { data } = await contract.populateTransaction.withdraw( validatorAddress diff --git a/tests/src/withdrawCL.test.js b/tests/src/withdrawCL.test.js index 3729230..855fca9 100644 --- a/tests/src/withdrawCL.test.js +++ b/tests/src/withdrawCL.test.js @@ -1,5 +1,5 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; import { waitForAppScreen, zemu, @@ -7,26 +7,25 @@ import { nano_models, SPECULOS_ADDRESS, txFromEtherscan, -} from "./test.fixture"; -import { ethers } from "ethers"; -import { parseEther, parseUnits } from "ethers/lib/utils"; -import { ledgerService } from "@ledgerhq/hw-app-eth"; +} from './test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = "0xe8ff2a04837aac535199eecb5ece52b2735b3543"; +const contractAddr = '0xe8ff2a04837aac535199eecb5ece52b2735b3543'; -const pluginName = "Kiln" +const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { test( - "[Nano " + model.letter + "] Withdraw CL", + '[Nano ' + model.letter + '] Withdraw CL', zemu(model, async (sim, eth) => { const contract = new ethers.Contract(contractAddr, abi); const validatorAddress = - "0x8905410ae09a0b89d6af7296e2d0ae19adb672744f600d8da9b6293259641aa6e316bee60936cc1459b3f8697343d0f0"; - const deadline = Number(1632843280); + '0x8905410ae09a0b89d6af7296e2d0ae19adb672744f600d8da9b6293259641aa6e316bee60936cc1459b3f8697343d0f0'; const { data } = await contract.populateTransaction.withdrawCLFee( validatorAddress @@ -53,7 +52,7 @@ nano_models.forEach(function (model) { await waitForAppScreen(sim); - await sim.navigateAndCompareSnapshots(".", model.name + "_withdrawCL", [ + await sim.navigateAndCompareSnapshots('.', model.name + '_withdrawCL', [ right_clicks, 0, ]); diff --git a/tests/src/withdrawEL.test.js b/tests/src/withdrawEL.test.js index 87f25e5..70a22c4 100644 --- a/tests/src/withdrawEL.test.js +++ b/tests/src/withdrawEL.test.js @@ -1,5 +1,5 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; import { waitForAppScreen, zemu, @@ -7,26 +7,25 @@ import { nano_models, SPECULOS_ADDRESS, txFromEtherscan, -} from "./test.fixture"; -import { ethers } from "ethers"; -import { parseEther, parseUnits } from "ethers/lib/utils"; -import { ledgerService } from "@ledgerhq/hw-app-eth"; +} from './test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = "0xe8ff2a04837aac535199eecb5ece52b2735b3543"; +const contractAddr = '0xe8ff2a04837aac535199eecb5ece52b2735b3543'; -const pluginName = "Kiln"; +const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { test( - "[Nano " + model.letter + "] Withdraw EL", + '[Nano ' + model.letter + '] Withdraw EL', zemu(model, async (sim, eth) => { const contract = new ethers.Contract(contractAddr, abi); const validatorAddress = - "0x8905410ae09a0b89d6af7296e2d0ae19adb672744f600d8da9b6293259641aa6e316bee60936cc1459b3f8697343d0f0"; - const deadline = Number(1632843280); + '0x8905410ae09a0b89d6af7296e2d0ae19adb672744f600d8da9b6293259641aa6e316bee60936cc1459b3f8697343d0f0'; const { data } = await contract.populateTransaction.withdrawELFee( validatorAddress @@ -53,7 +52,7 @@ nano_models.forEach(function (model) { await waitForAppScreen(sim); - await sim.navigateAndCompareSnapshots(".", model.name + "_withdrawEL", [ + await sim.navigateAndCompareSnapshots('.', model.name + '_withdrawEL', [ right_clicks, 0, ]); From 6b61c818dcd5aa142b3e223714023314fe28c2e9 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Tue, 30 Apr 2024 00:28:58 +0200 Subject: [PATCH 26/46] fix(lr): remove withdrawer uncomplete clear signing --- README.md | 8 ++++---- src/handle_finalize.c | 8 ++++---- src/kiln_plugin.h | 2 -- src/provide_parameter/eigenlayer.c | 19 ------------------ src/query_contract_ui/eigenlayer.c | 16 ++------------- .../00004.png | Bin 509 -> 349 bytes .../00005.png | Bin 497 -> 357 bytes .../00006.png | Bin 438 -> 349 bytes .../00007.png | Bin 349 -> 357 bytes .../00008.png | Bin 357 -> 358 bytes .../00009.png | Bin 349 -> 414 bytes .../00010.png | Bin 357 -> 349 bytes .../00011.png | Bin 358 -> 0 bytes .../00012.png | Bin 414 -> 0 bytes .../00013.png | Bin 349 -> 0 bytes .../00004.png | Bin 509 -> 319 bytes .../00005.png | Bin 497 -> 358 bytes .../00006.png | Bin 438 -> 414 bytes .../00007.png | Bin 319 -> 349 bytes .../00008.png | Bin 358 -> 0 bytes .../00009.png | Bin 414 -> 0 bytes .../00010.png | Bin 349 -> 0 bytes .../00004.png | Bin 509 -> 349 bytes .../00005.png | Bin 497 -> 357 bytes .../00006.png | Bin 438 -> 356 bytes .../00007.png | Bin 349 -> 360 bytes .../00008.png | Bin 357 -> 319 bytes .../00009.png | Bin 356 -> 333 bytes .../00010.png | Bin 360 -> 367 bytes .../00011.png | Bin 319 -> 317 bytes .../00012.png | Bin 333 -> 358 bytes .../00013.png | Bin 367 -> 414 bytes .../00014.png | Bin 317 -> 349 bytes .../00015.png | Bin 358 -> 0 bytes .../00016.png | Bin 414 -> 0 bytes .../00017.png | Bin 349 -> 0 bytes .../00004.png | Bin 509 -> 349 bytes .../00005.png | Bin 497 -> 358 bytes .../00006.png | Bin 438 -> 414 bytes .../00007.png | Bin 349 -> 349 bytes .../00008.png | Bin 358 -> 0 bytes .../00009.png | Bin 414 -> 0 bytes .../00010.png | Bin 349 -> 0 bytes .../00003.png | Bin 509 -> 349 bytes .../00004.png | Bin 497 -> 368 bytes .../00005.png | Bin 438 -> 358 bytes .../00006.png | Bin 349 -> 414 bytes .../00007.png | Bin 368 -> 349 bytes .../00008.png | Bin 358 -> 0 bytes .../00009.png | Bin 414 -> 0 bytes .../00010.png | Bin 349 -> 0 bytes .../00003.png | Bin 509 -> 349 bytes .../00004.png | Bin 497 -> 368 bytes .../00005.png | Bin 438 -> 353 bytes .../00006.png | Bin 349 -> 341 bytes .../00007.png | Bin 368 -> 349 bytes .../00008.png | Bin 353 -> 345 bytes .../00009.png | Bin 341 -> 358 bytes .../00010.png | Bin 349 -> 414 bytes .../00011.png | Bin 345 -> 349 bytes .../00012.png | Bin 358 -> 0 bytes .../00013.png | Bin 414 -> 0 bytes .../00014.png | Bin 349 -> 0 bytes .../00003.png | Bin 509 -> 349 bytes .../00004.png | Bin 497 -> 396 bytes .../00005.png | Bin 438 -> 353 bytes .../00006.png | Bin 349 -> 341 bytes .../00007.png | Bin 396 -> 345 bytes .../00008.png | Bin 353 -> 396 bytes .../00009.png | Bin 341 -> 358 bytes .../00010.png | Bin 345 -> 414 bytes .../00011.png | Bin 396 -> 349 bytes .../00012.png | Bin 358 -> 0 bytes .../00013.png | Bin 414 -> 0 bytes .../00014.png | Bin 349 -> 0 bytes .../00003.png | Bin 811 -> 417 bytes .../00004.png | Bin 417 -> 425 bytes .../00005.png | Bin 425 -> 417 bytes .../00006.png | Bin 417 -> 425 bytes .../00007.png | Bin 425 -> 415 bytes .../00008.png | Bin 415 -> 472 bytes .../00009.png | Bin 472 -> 381 bytes .../00010.png | Bin 381 -> 0 bytes .../00003.png | Bin 811 -> 387 bytes .../00004.png | Bin 387 -> 415 bytes .../00005.png | Bin 415 -> 472 bytes .../00006.png | Bin 472 -> 381 bytes .../00007.png | Bin 381 -> 0 bytes .../00003.png | Bin 811 -> 417 bytes .../00004.png | Bin 417 -> 425 bytes .../00005.png | Bin 425 -> 424 bytes .../00006.png | Bin 424 -> 429 bytes .../00007.png | Bin 429 -> 387 bytes .../00008.png | Bin 387 -> 386 bytes .../00009.png | Bin 386 -> 419 bytes .../00010.png | Bin 419 -> 371 bytes .../00011.png | Bin 371 -> 415 bytes .../00012.png | Bin 415 -> 472 bytes .../00013.png | Bin 472 -> 381 bytes .../00014.png | Bin 381 -> 0 bytes .../00003.png | Bin 811 -> 417 bytes .../00004.png | Bin 417 -> 415 bytes .../00005.png | Bin 415 -> 472 bytes .../00006.png | Bin 472 -> 381 bytes .../00007.png | Bin 381 -> 0 bytes .../00003.png | Bin 811 -> 402 bytes .../00004.png | Bin 402 -> 418 bytes .../00005.png | Bin 418 -> 415 bytes .../00006.png | Bin 415 -> 472 bytes .../00007.png | Bin 472 -> 381 bytes .../00008.png | Bin 381 -> 0 bytes .../00003.png | Bin 811 -> 402 bytes .../00004.png | Bin 402 -> 418 bytes .../00005.png | Bin 418 -> 410 bytes .../00006.png | Bin 410 -> 392 bytes .../00007.png | Bin 392 -> 402 bytes .../00008.png | Bin 402 -> 393 bytes .../00009.png | Bin 393 -> 415 bytes .../00010.png | Bin 415 -> 472 bytes .../00011.png | Bin 472 -> 381 bytes .../00012.png | Bin 381 -> 0 bytes .../00003.png | Bin 811 -> 402 bytes .../00004.png | Bin 402 -> 445 bytes .../00005.png | Bin 445 -> 410 bytes .../00006.png | Bin 410 -> 392 bytes .../00007.png | Bin 392 -> 393 bytes .../00008.png | Bin 393 -> 445 bytes .../00009.png | Bin 445 -> 415 bytes .../00010.png | Bin 415 -> 472 bytes .../00011.png | Bin 472 -> 381 bytes .../00012.png | Bin 381 -> 0 bytes tests/src/lrCompleteQueuedWithdrawals.test.js | 8 ++++---- tests/src/lrQueueWithdrawals.test.js | 6 +++--- 133 files changed, 17 insertions(+), 50 deletions(-) delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00011.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00012.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00013.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00008.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00009.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00015.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00016.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00017.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00009.png delete mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00008.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00009.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00010.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00012.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00013.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00013.png delete mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00010.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00014.png delete mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00007.png delete mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png delete mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png delete mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png diff --git a/README.md b/README.md index d65fdf0..c84acf1 100644 --- a/README.md +++ b/README.md @@ -138,11 +138,11 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ### Queue Withdrawals -![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00008.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00009.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00010.png) +![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png) ### LR Complete Queued Withdrawals -![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000010.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000011.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000012.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000013.png) +![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000010.png) ## NANO X @@ -210,8 +210,8 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ### Queue Withdrawals -![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00007.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png) +![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00007.png) ### LR Complete Queued Withdrawals -![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/000010.png) +![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png) diff --git a/src/handle_finalize.c b/src/handle_finalize.c index 841bcc4..96856f0 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -48,8 +48,8 @@ void handle_finalize(ethPluginFinalize_t *msg) { case KILN_LR_QUEUE_WITHDRAWALS: { { lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; - // function + withdrawer screens - msg->numScreens = 2; + // function screen + msg->numScreens = 1; // one screen per withdrawal msg->numScreens += params->strategies_count; PRINTF("NUMBER OF STRATEGIES TO DISPLAY: %d\n", params->strategies_count); @@ -61,8 +61,8 @@ void handle_finalize(ethPluginFinalize_t *msg) { { lr_complete_queued_withdrawals_t *params = &context->param_data.lr_complete_queued_withdrawals; - // function + withdrawer screens - msg->numScreens = 2; + // function screen + msg->numScreens = 1; // one screen per strategy msg->numScreens += params->strategies_count; PRINTF("NUMBER OF STRATEGIES TO DISPLAY: %d\n", params->strategies_count); diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index f102aa5..dd150e0 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -192,7 +192,6 @@ typedef struct { // -- display uint8_t strategies_count; - char withdrawer[ADDRESS_STR_LEN]; // list of strategies indexes **INCREMENTED BY 1** to display in the UI // 0 is reserved for end of array // UNKNOW_LR_STRATEGY is used to display the "unknown" strategy @@ -214,7 +213,6 @@ typedef struct { uint16_t strategies_count; // -- display - char withdrawer[ADDRESS_STR_LEN]; // list of strategies indexes **INCREMENTED BY 1** to display in the UI // 0 is reserved for end of array // UNKNOW_LR_STRATEGY is used to display the "unknown" strategy diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index f5d58cc..c15b7ad 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -213,16 +213,6 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER: - // EigenLayer contract does not allow withdrawer to be different than msg.sender - // https://github.com/Layr-Labs/eigenlayer-contracts/blob/7229f2b426b6f2a24c7795 - // b1a4687a010eac8ef2/src/contracts/core/DelegationManager.sol#L275 - // so we can only copy it once - if (params->withdrawer[0] == '\0') { - uint8_t buffer[ADDRESS_LENGTH]; - copy_address(buffer, msg->parameter, sizeof(buffer)); - getEthDisplayableAddress(buffer, params->withdrawer, sizeof(params->withdrawer), 0); - } - PRINTF("WITHDRAWER: %s\n", params->withdrawer); context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH: @@ -434,15 +424,6 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con context->next_param = LRCQW_WITHDRAWALS__ITEM__WITHDRAWER; break; case LRCQW_WITHDRAWALS__ITEM__WITHDRAWER: - // withdrawer is the same for all queuedWithdrawals - // so we only copy it once - if (params->withdrawer[0] == '\0') { - uint8_t buffer[ADDRESS_LENGTH]; - copy_address(buffer, msg->parameter, sizeof(buffer)); - getEthDisplayableAddress(buffer, params->withdrawer, sizeof(params->withdrawer), 0); - } - PRINTF("WITHDRAWER: %s\n", params->withdrawer); - context->next_param = LRCQW_WITHDRAWALS__ITEM__NONCE; break; case LRCQW_WITHDRAWALS__ITEM__NONCE: diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c index efe9350..08f38f0 100644 --- a/src/query_contract_ui/eigenlayer.c +++ b/src/query_contract_ui/eigenlayer.c @@ -80,17 +80,11 @@ bool queue_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context) { ret = true; break; - case 1: - strlcpy(msg->title, "Withdrawer", msg->titleLength); - strlcpy(msg->msg, params->withdrawer, msg->msgLength); - ret = true; - break; - default: { { // removing the first screen to current screen index // to get the index of the withdrawal - uint8_t withdrawal_index = msg->screenIndex - 2; + uint8_t withdrawal_index = msg->screenIndex - 1; if (withdrawal_index < params->strategies_count) { strlcpy(msg->title, "Strategy", msg->titleLength); @@ -131,17 +125,11 @@ bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *contex ret = true; break; - case 1: - strlcpy(msg->title, "Withdrawer", msg->titleLength); - strlcpy(msg->msg, params->withdrawer, msg->msgLength); - ret = true; - break; - default: { { // removing the first screen to current screen index // to get the index of the withdrawal - uint8_t strategy_index = msg->screenIndex - 2; + uint8_t strategy_index = msg->screenIndex - 1; uint8_t withdrawal_index = params->withdrawals[strategy_index]; PRINTF("strat: %d || withdrawal_index: %d\n", strategy_index, withdrawal_index); diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png index 06c3c59a9000082a980407c1e47a01c43dbfef53..82030b711fe69207d044d44c0ff7bbee83f4da1c 100644 GIT binary patch delta 322 zcmV-I0lohH1Kk3UB!47HL_t(|ob8$062c%1M5$x{|AYHbAF7C4Vt|&cxMv(k375c@ zAkjHO2q9z;`}Th6n>3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qHU1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmFuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$g0(l5cK`qY delta 471 zcmV;|0Vw|E0`UWoB!9R`L_t(|ob8!i7s4P2hFPcn{}1k>E_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1hUa>dpWF diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png index 7e249955e2b473ebedb8c0648fd457edc6127033..82030b711fe69207d044d44c0ff7bbee83f4da1c 100644 GIT binary patch delta 322 zcmV-I0logV1Kk3UB!47HL_t(|ob8$062c%1M5$x{|AYHbAF7C4Vt|&cxMv(k375c@ zAkjHO2q9z;`}Th6n>3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI0000uFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f|@3kVgLXD delta 322 zcmV-I0log^0^I_TB!47HL_t(|ob8$062c%1M5$x{|AYHbAF7C4Vt|&cxMv(k375c@ zAkjHO2q9z;`}Th6n>3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uBuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f~CNfYXATM diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png index 82030b711fe69207d044d44c0ff7bbee83f4da1c..1c9156c31edf73cb072eaebf2db3fbe1ba5c612b 100644 GIT binary patch delta 387 zcmV-}0et@50-ghqB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=3a delta 322 zcmV-I0log71Kk3UB!47HL_t(|ob8$062c%1M5$x{|AYHbAF7C4Vt|&cxMv(k375c@ zAkjHO2q9z;`}Th6n>3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qHCfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&iuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f|@3kVgLXD diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00011.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00011.png deleted file mode 100644 index eeec6324a1f33b9b155d3e979728a086251adb10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00013.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00013.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00004.png index 06c3c59a9000082a980407c1e47a01c43dbfef53..5d10a09010526e7de70eab95e0b3a8b29ae7d6d7 100644 GIT binary patch delta 292 zcmV+<0o(rl1HS^0B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF?|c9N diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00005.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00005.png index 53e7aa041e7dc3e9453476b700c868cce35e5416..eeec6324a1f33b9b155d3e979728a086251adb10 100644 GIT binary patch delta 331 zcmV-R0kr<{1LgvdB!4YQL_t(|ob8#*62l+}MYYrX{|9H0E}S}66dzI0=AKnTEwLAs zK#c(a0Ps|-=EJYk7-Q_gS(;pVIy@-x)}FvP_7Oc~;Q)k-+KGFe@kONvKRB|`0nfty zey>7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uBE_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1hZ|>dycG diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00006.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00006.png index 7e249955e2b473ebedb8c0648fd457edc6127033..1c9156c31edf73cb072eaebf2db3fbe1ba5c612b 100644 GIT binary patch delta 387 zcmV-}0et?p1D*qrB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI0000CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&i1)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00004.png index 06c3c59a9000082a980407c1e47a01c43dbfef53..82030b711fe69207d044d44c0ff7bbee83f4da1c 100644 GIT binary patch delta 322 zcmV-I0lohH1Kk3UB!47HL_t(|ob8$062c%1M5$x{|AYHbAF7C4Vt|&cxMv(k375c@ zAkjHO2q9z;`}Th6n>3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qHU1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmFuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$g0(l5cK`qY delta 471 zcmV;|0Vw|E0`UWoB!9R`L_t(|ob8!i7s4P2hFPcn{}1k>E_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1hUa>dpWF diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00006.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00006.png index 7e249955e2b473ebedb8c0648fd457edc6127033..a3f84470ac161bd75bb2966852d72414df5870f1 100644 GIT binary patch delta 329 zcmV-P0k;0O1LOjbB!4SOL_t(|ob8y~62c%1M5$x{|AT$d2ei@vG4w)Kx@R1xEl@(X z36~HEA%u`lJRjemy~&0mQYLko(S7F$0HEL9+kg*?FQ!>O(W}*pMDuB0Jy~w!zi5)b zd>o1qpj;TM8DG`ZOBXyMp!lJ6NJslCoPdV_wG?4*Yb;9Bi+|E}s||;8>)+)Yk(5vB z0zR8#Ov0%c(Pc$>@@jgKWny2VM0t5v09IxPAVz^Rs2`T#7`hW!0fJ%-l$HD0u;uPX z!6ZN{$A%hsa+NHE$=b!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI0000 zk?$z7rlCQB!eN-^f%Sxwx;@s3eVWZkXi23h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH1)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000uFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f^&M6L;wH) diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00009.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00009.png index a3f84470ac161bd75bb2966852d72414df5870f1..4fe8a80119d949f651fb52a2d7a2705d68969fc5 100644 GIT binary patch delta 306 zcmV-20nPs80?h)DB!3i1L_t(|ob8#-4#FT1gu%%BKd=Wq&=AV*f+h_+Yv(%{{w%mt zrm{_m5JCvq%KLRH57l9S`mN<KUVuSWqTdZwlBP#fC}|?~ z!}{J@?bTJww_vauwVH%k$?~$%>Xn}!pzeSR!8S3cXTWB1fq%6ZKLG|i9;(}>-Z`&E z1PkgP!V>EbmApa>BCRzbi|{h~8!&^+=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI( zt#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^iejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;8 z2B_K4n!iMi+AD>i3Q)O$2B;P!U4Hpuk`O`&A%w)?1McgeP`5FwjsO4v07*qoM6N<$ Eg4^4Ui~s-t delta 329 zcmV-P0k;0l0^|aaB!4SOL_t(|ob8y~62c%1M5$x{|AT$d2ei@vG4w)Kx@R1xEl@(X z36~HEA%u`lJRjemy~&0mQYLko(S7F$0HEL9+kg*?FQ!>O(W}*pMDuB0Jy~w!zi5)b zd>o1qpj;TM8DG`ZOBXyMp!lJ6NJslCoPdV_wG?4*Yb;9Bi+|E}s||;8>)+)Yk(5vB z0zR8#Ov0%c(Pc$>@@jgKWny2VM0t5v09IxPAVz^Rs2`T#7`hW!0fJ%-l$HD0u;uPX z!6ZN{$A%hsa+NHE$=b|1XOH#$om! z#nzMn0000}o{x_*sge%jsNuAWaPwLA$f}8t{O(X&w&w2r018Ekb~hABsvcFLB#G2^ zYwwn7tFBo73y7-`tBE-)ULH1TcloCWQFp*ZVmmRXGr*W5hktc1egY78OsZx}Tdpgy zf(vR7VUG5LiqEhHD?RIi49pAb8=x8));B{iHLPz8H1Gso$P>?Vm`tu^4lbn`cw)6) zS_d+=GvRdDL3Q783o5V_;Olo`80HU9H9j-nRX5KKVh)z7kBh@p(*R0ilOc(() zCgut17KwD!MNJYwG>vAjT{b}^0W^ZWvvUb1z@_*7yf7y-uO3RlA# mfnOXRTkkdi0001hIJ^M&AK3{&XDQnN0000 zk?$z7rlCQB!eN-^f%Sxwx;@s3eVWZkXi219dIMDP0Z;TU`%ac?SI8j0Ak0aYBsgyyb>8K zXnqKDv==IVh8$#CYeF{RMf43&gN*2#A%q&yHwGGb0vGb+8ssW;2l-|pcY~OoBMBnX zNb*Gyt}Dng_AK&i+BPNa>uMODk%|aRhA&}`n3P@&3rtP{ezei`e+Dst1vvu&oQY~d oJjW^eNsd=K02=@R002Na05NuxLTXd22><{907*qoM6N<$g75Wr6951J delta 292 zcmV+<0o(q)0>1)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V600007w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uBunyLT* delta 306 zcmV-20nPsA0?h)DB!3i1L_t(|ob8#-4#FT1gu%%BKd=Wq&=AV*f+h_+Yv(%{{w%mt zrm{_m5JCvq%KLRH57l9S`mN<KUVuSWqTdZwlBP#fC}|?~ z!}{J@?bTJww_vauwVH%k$?~$%>Xn}!pzeSR!8S3cXTWB1fq%6ZKLG|i9;(}>-Z`&E z1PkgP!V>EbmApa>BCRzbi|{h~8!&^+=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI( zt#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^iejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;8 z2B_K4n!iMi+AD>i3Q)O$2B;P!U4Hpuk`O`&A%w)?1McgeP`5FwjsO4v07*qoM6N<$ Eg5E!ljsO4v diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00013.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00013.png index 3a9f816d2af790fe1ac4d2841a0fd023ca9877aa..1c9156c31edf73cb072eaebf2db3fbe1ba5c612b 100644 GIT binary patch delta 387 zcmV-}0et@N0-ghqB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=w|)Qs delta 340 zcmV-a0jvI=1MdQmB!4zZL_t(|ob8$04#FS|hMAG~e_${40z|1XOH#$om! z#nzMn0000}o{x_*sge%jsNuAWaPwLA$f}8t{O(X&w&w2r018Ekb~hABsvcFLB#G2^ zYwwn7tFBo73y7-`tBE-)ULH1TcloCWQFp*ZVmmRXGr*W5hktc1egY78OsZx}Tdpgy zf(vR7VUG5LiqEhHD?RIi49pAb8=x8));B{iHLPz8H1Gso$P>?Vm`tu^4lbn`cw)6) zS_d+=GvRdDL3Q783o5V_;Olo`80HU9H9j-nRX5KKVh)z7kBh@p(*R0ilOc(() zCgut17KwD!MNJYwG>vAjT{b}^0W^ZWvvUb1z@_*7yf7y-uO3RlA# mfnOXRTkkdi0001hIJ^M&AK3{&XDQnN0000CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&i19dIMDP0Z;TU`%ac?SI8j0Ak0aYBsgyyb>8K zXnqKDv==IVh8$#CYeF{RMf43&gN*2#A%q&yHwGGb0vGb+8ssW;2l-|pcY~OoBMBnX zNb*Gyt}Dng_AK&i+BPNa>uMODk%|aRhA&}`n3P@&3rtP{ezei`e+Dst1vvu&oQY~d oJjW^eNsd=K02=@R002Na05NuxLTXd22><{907*qoM6N<$f)W6CF#rGn diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00015.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00015.png deleted file mode 100644 index eeec6324a1f33b9b155d3e979728a086251adb10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00017.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00017.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00004.png index 06c3c59a9000082a980407c1e47a01c43dbfef53..82030b711fe69207d044d44c0ff7bbee83f4da1c 100644 GIT binary patch delta 322 zcmV-I0lohH1Kk3UB!47HL_t(|ob8$062c%1M5$x{|AYHbAF7C4Vt|&cxMv(k375c@ zAkjHO2q9z;`}Th6n>3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qHU1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uBE_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1hZ|>dycG diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00006.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00006.png index 7e249955e2b473ebedb8c0648fd457edc6127033..1c9156c31edf73cb072eaebf2db3fbe1ba5c612b 100644 GIT binary patch delta 387 zcmV-}0et?p1D*qrB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI0000Jp&6E+D$bdC^02(jb+ zy4vyF2&dy>z=Az1R zijD2Djex@kBY(Vc{LwH^L9O@5i#m=H<^m*h?!p)f5apaO3xCNYG1nLo9=ti!jP4dkz*)j>Uv z-V4YO{k?VXurf&5A1?yV6+xZw{YDa!tAMG3nu5rL`0P&zA>_*k1^mvtO~`RE00000 LNkvXXu0mjf-xise delta 313 zcmV-90mlB_0^I_TEq~h*!XOMpsbl~DgZoe)s)$@-fR?PdXBqD9TFDeOU)GNj|Mhr}nxvi2Lv{xUAC%RU zT~&=T1dAPzeb5Gkqy7pPU?D&$MCjWpO<{NuhOYJDRBq#ke18%J<%@=ZkLDPMa45#H zWLbIAYO+alu=`yibUqY-UuGu|%>rjqUp&Eav=dkXoZt+Um;E$cxrdQ)3DC>Ap$3-x zOBBN7_s-!`QYZ@XVM!^kU_Lu@2U?J`a&kGE00|fuv6ND36aHpf3#0)1mbvJrCZ#HP zPkjia07@G2cQSZl*d^nLbB+R-0~vzS#H9Qm&U7a;A%qY@$n-n_NNvuor)kuM00000 LNkvXXu0mjf*CCDL diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png deleted file mode 100644 index eeec6324a1f33b9b155d3e979728a086251adb10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png index 06c3c59a9000082a980407c1e47a01c43dbfef53..827de905d9c320a7426bc6a64da96948880e1ecd 100644 GIT binary patch delta 322 zcmV-I0lohH1Kk3UB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g5ztKR{#J2 delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmFoPO(x%2Yc zxTor_7~^G7v^>-Z%=JZP z3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0J@6fyN3ZE_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1i6W>e&DQ diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00005.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00005.png index 7e249955e2b473ebedb8c0648fd457edc6127033..eeec6324a1f33b9b155d3e979728a086251adb10 100644 GIT binary patch delta 331 zcmV-R0kr7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uB!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00007ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=3a delta 322 zcmV-I0log71Kk3UB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$f@|%T_y7O^ diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png index 1f3bd76943eb3d66ccc709e45f8ad422d63be352..ce795f34e8569e986af689fded3b59c9a8af2961 100644 GIT binary patch delta 322 zcmV-I0loh40^I_TB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&ioPO(x%2Yc zxTor_7~^G7v^>-Z%=JZP z3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0J@6fyN3Zpy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00010.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00010.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00003.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00003.png index 06c3c59a9000082a980407c1e47a01c43dbfef53..827de905d9c320a7426bc6a64da96948880e1ecd 100644 GIT binary patch delta 322 zcmV-I0lohH1Kk3UB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g5ztKR{#J2 delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmFoPO(x%2Yc zxTor_7~^G7v^>-Z%=JZP z3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0J@6fyN3ZE_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1i6W>e&DQ diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00005.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00005.png index 7e249955e2b473ebedb8c0648fd457edc6127033..fcae7bce0df5c6b52ce6aaaf424b60c86ebfdc15 100644 GIT binary patch delta 326 zcmV-M0lEIR1K|RYB!4JLL_t(|ob8#>4#OY_Md`Br{|EP>duZY)3T4R_F3NdQrzzti zT1r$DMNzEE7Ht3#5gq%dy}jb>SQajTHsW8K3YZ2*5&PCm#-CFF>UzVbvbtF zDc&8%cpDtf{HhVkGui+mx<;!VlDA&NaH}5-0Zv3pF{Y93=zm^6kFIeb3GgR`>zm9N zl3)m6WO*&3hcm^AE#_l*{Elon)IvMh1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=U zZQ**SBzRHJfj<;LLnKh=R?xmQVDPw~0)i;@%t9UkPNvfUG6gw{nv)*OMNt$*Q4}li Y20yu>UQ$TBBLDyZ07*qoM6N<$f>zm=6#xJL delta 412 zcmV;N0b~B*0=5H?B!7KLL_t(|ob8#*62c%1MN>!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00004#OY_MQOAB{|EP>duZY;BD!P^SH0&+9j1(n zXsrk#gpgI)q8$(sk@NVrw|AT$%aRLF8|j}r6fi3wPkgl?Qa5j#-F&XvA4C zQhC?R@ib^!{?rKN743kC+_TkB$!63r!rBjp02ivHIA&50bbqN|kFIeb3Gfgq^hst6 zNiYO(s(dY@O-r?7D|?KHw-~L4dek=d!2ei0de=XXktW09?Q=8be&Radrekh--VMR< z0l}@MpazkwRfW*F2f4Tl8e$)Iu7K1a+RYDw4}YMxQk@GWXI3Z}FJdLmh3H(M3Ly7a z*|N@bN&=bnIWxcl_;fCX+GhqB_O=Om5(*H^uq9~TZJ7{42q9zzKEOhkOjSi69RL6T M07*qoM6N<$g0s4f)Bpeg delta 322 zcmV-I0log!0^I_TB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g0I?_E&u=k diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00007.png index 1f3bd76943eb3d66ccc709e45f8ad422d63be352..827de905d9c320a7426bc6a64da96948880e1ecd 100644 GIT binary patch delta 322 zcmV-I0loh40^I_TB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g3-{INdN!< delta 341 zcmV-b0jmDp0`LNmB!4$aL_t(|ob8!G5`!=ZMbT;Re_$8w!kIKBKyYg1$M9B3#4+-b zBuJDbNs`RU5oPO(x%2Yc zxTor_7~^G7v^>-Z%=JZP z3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0J@6fyN3ZXYu)dpmP{y% z_!ALA2qCMoWji1uBIogKZ|^)mmZcWJ8ySCgDqv2O-r?6D|?KH_n57QMtBQ*;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L z1A<#iK@Bols|um<8|3CL2xlEu+0bq)#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#l zPQrH?JlvvYeK*aV0t}W>?;8UWEJ4XofMifhP2q8rC0d5YLL|(dz Q?*IS*07*qoM6N<$f)@IcJpcdz delta 326 zcmV-M0lEI!0^tIXB!4JLL_t(|ob8#>4#OY_Md`Br{|EP>duZY)3T4R_F3NdQrzzti zT1r$DMNzEE7Ht3#5gq%dy}jb>SQajTHsW8K3YZ2*5&PCm#-CFF>UzVbvbtF zDc&8%cpDtf{HhVkGui+mx<;!VlDA&NaH}5-0Zv3pF{Y93=zm^6kFIeb3GgR`>zm9N zl3)m6WO*&3hcm^AE#_l*{Elon)IvMh1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=U zZQ**SBzRHJfj<;LLnKh=R?xmQVDPw~0)i;@%t9UkPNvfUG6gw{nv)*OMNt$*Q4}li Y20yu>UQ$TBBLDyZ07*qoM6N<$f`TTOHvj+t diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00009.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00009.png index 9d9f05a0a8b72e6003ed4c63b990c15e5cc59db4..eeec6324a1f33b9b155d3e979728a086251adb10 100644 GIT binary patch delta 331 zcmV-R0kr7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uB4#OY_MQOAB{|EP>duZY;BD!P^SH0&+9j1(n zXsrk#gpgI)q8$(sk@NVrw|AT$%aRLF8|j}r6fi3wPkgl?Qa5j#-F&XvA4C zQhC?R@ib^!{?rKN743kC+_TkB$!63r!rBjp02ivHIA&50bbqN|kFIeb3Gfgq^hst6 zNiYO(s(dY@O-r?7D|?KHw-~L4dek=d!2ei0de=XXktW09?Q=8be&Radrekh--VMR< z0l}@MpazkwRfW*F2f4Tl8e$)Iu7K1a+RYDw4}YMxQk@GWXI3Z}FJdLmh3H(M3Ly7a z*|N@bN&=bnIWxcl_;fCX+GhqB_O=Om5(*H^uq9~TZJ7{42q9zzKEOhkOjSi69RL6T M07*qoM6N<$g1*F!-2eap diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00010.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00010.png index 827de905d9c320a7426bc6a64da96948880e1ecd..1c9156c31edf73cb072eaebf2db3fbe1ba5c612b 100644 GIT binary patch delta 387 zcmV-}0et@50-ghqB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=3a delta 322 zcmV-I0log71Kk3UB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$f@|%T_y7O^ diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00011.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00011.png index bceed68d6a9b6e6ceee1ec9be8c8912b8456c5cf..ce795f34e8569e986af689fded3b59c9a8af2961 100644 GIT binary patch delta 322 zcmV-I0log&0^I_TB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&iXYu)dpmP{y% z_!ALA2qCMoWji1uBIogKZ|^)mmZcWJ8ySCgDqv2O-r?6D|?KH_n57QMtBQ*;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L z1A<#iK@Bols|um<8|3CL2xlEu+0bq)#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#l zPQrH?JlvvYeK*aV0t}W>?;8UWEJ4XofMifhP2q8rC0d5YLL|(dz Q?*IS*07*qoM6N<$f)WCfIRF3v diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00012.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00012.png deleted file mode 100644 index eeec6324a1f33b9b155d3e979728a086251adb10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png index 06c3c59a9000082a980407c1e47a01c43dbfef53..827de905d9c320a7426bc6a64da96948880e1ecd 100644 GIT binary patch delta 322 zcmV-I0lohH1Kk3UB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g5ztKR{#J2 delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmFss_%q#Cgo1+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M z_MYAcQn|MhAZiLDKdX~t=b^=r-cJTbfEEK^O?ZkRZFNWjsIF=G>n@W3Nq`n$F*_D8 z0d~c^Uzp93moia2aKmx@_cT=fh-ll0dSf@P8y?s^Zav$QBuSDaNpSc8GsfKuvdq?W P00000NkvXXu0mjfEM=#N delta 471 zcmV;|0Vw{A1MvfpB!9R`L_t(|ob8!i7s4P2hFPcn{}1k>E_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1kwr>UIDC diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png index 7e249955e2b473ebedb8c0648fd457edc6127033..fcae7bce0df5c6b52ce6aaaf424b60c86ebfdc15 100644 GIT binary patch delta 326 zcmV-M0lEIR1K|RYB!4JLL_t(|ob8#>4#OY_Md`Br{|EP>duZY)3T4R_F3NdQrzzti zT1r$DMNzEE7Ht3#5gq%dy}jb>SQajTHsW8K3YZ2*5&PCm#-CFF>UzVbvbtF zDc&8%cpDtf{HhVkGui+mx<;!VlDA&NaH}5-0Zv3pF{Y93=zm^6kFIeb3GgR`>zm9N zl3)m6WO*&3hcm^AE#_l*{Elon)IvMh1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=U zZQ**SBzRHJfj<;LLnKh=R?xmQVDPw~0)i;@%t9UkPNvfUG6gw{nv)*OMNt$*Q4}li Y20yu>UQ$TBBLDyZ07*qoM6N<$f>zm=6#xJL delta 412 zcmV;N0b~B*0=5H?B!7KLL_t(|ob8#*62c%1MN>!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00004#OY_MQOAB{|EP>duZY;BD!P^SH0&+9j1(n zXsrk#gpgI)q8$(sk@NVrw|AT$%aRLF8|j}r6fi3wPkgl?Qa5j#-F&XvA4C zQhC?R@ib^!{?rKN743kC+_TkB$!63r!rBjp02ivHIA&50bbqN|kFIeb3Gfgq^hst6 zNiYO(s(dY@O-r?7D|?KHw-~L4dek=d!2ei0de=XXktW09?Q=8be&Radrekh--VMR< z0l}@MpazkwRfW*F2f4Tl8e$)Iu7K1a+RYDw4}YMxQk@GWXI3Z}FJdLmh3H(M3Ly7a z*|N@bN&=bnIWxcl_;fCX+GhqB_O=Om5(*H^uq9~TZJ7{42q9zzKEOhkOjSi69RL6T M07*qoM6N<$g0s4f)Bpeg delta 322 zcmV-I0log!0^I_TB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g0I?_E&u=k diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png index f6d556916108fab7602b510c4ceb72780470fd7e..bceed68d6a9b6e6ceee1ec9be8c8912b8456c5cf 100644 GIT binary patch delta 318 zcmV-E0m1%^1K9$QB!3`DL_t(|ob8#-62l+}gh{4-{|C+?J!HmO1T=>XYu)dpmP{y% z_!ALA2qCMoWji1uBIogKZ|^)mmZcWJ8ySCgDqv2O-r?6D|?KH_n57QMtBQ*;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L z1A<#iK@Bols|um<8|3CL2xlEu+0bq)#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#l zPQrH?JlvvYeK*aV0t}W>?;8UWEJ4XofMifhP2q8rC0d5YLL|(dz Q?*IS*07*qoM6N<$g07O0=>Px# delta 369 zcmV-%0gnFJ0*nKYB!5#$L_t(|ob8!G5`!QNMPsME|AAe!3ujUqLWmAFU&)&;ga*O< z01=6jBuSE4S)vC(L`3iPd%e8k#xX6W0IeE-+e-m61IoY`6M~E7wOTCOilQ)6`<<8f zDm_&e)fneW)pFNGD9`8t5Ycb6+9BEX8irf_Uss_%q#Cgo1+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M z_MYAcQn|MhAZiLDKdX~t=b^=r-cJTbfEEK^O?ZkRZFNWjsIF=G>n@W3Nq`n$F*_D8 z0d~c^Uzp93moia2aKmx@_cT=fh-ll0dSf@P8y?s^Zav$QBuSDaNpSc8GsfKuvdq?W P00000NkvXXu0mjf2wkUd diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00008.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00008.png index fcae7bce0df5c6b52ce6aaaf424b60c86ebfdc15..f6d556916108fab7602b510c4ceb72780470fd7e 100644 GIT binary patch delta 369 zcmV-%0gnFR0*nKYB!5#$L_t(|ob8!G5`!QNMPsME|AAe!3ujUqLWmAFU&)&;ga*O< z01=6jBuSE4S)vC(L`3iPd%e8k#xX6W0IeE-+e-m61IoY`6M~E7wOTCOilQ)6`<<8f zDm_&e)fneW)pFNGD9`8t5Ycb6+9BEX8irf_Uss_%q#Cgo1+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M z_MYAcQn|MhAZiLDKdX~t=b^=r-cJTbfEEK^O?ZkRZFNWjsIF=G>n@W3Nq`n$F*_D8 z0d~c^Uzp93moia2aKmx@_cT=fh-ll0dSf@P8y?s^Zav$QBuSDaNpSc8GsfKuvdq?W P00000NkvXXu0mjf6XmCO delta 326 zcmV-M0lEH+1K|RYB!4JLL_t(|ob8#>4#OY_Md`Br{|EP>duZY)3T4R_F3NdQrzzti zT1r$DMNzEE7Ht3#5gq%dy}jb>SQajTHsW8K3YZ2*5&PCm#-CFF>UzVbvbtF zDc&8%cpDtf{HhVkGui+mx<;!VlDA&NaH}5-0Zv3pF{Y93=zm^6kFIeb3GgR`>zm9N zl3)m6WO*&3hcm^AE#_l*{Elon)IvMh1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=U zZQ**SBzRHJfj<;LLnKh=R?xmQVDPw~0)i;@%t9UkPNvfUG6gw{nv)*OMNt$*Q4}li Y20yu>UQ$TBBLDyZ07*qoM6N<$f+1a&>i_@% diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00009.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00009.png index 9d9f05a0a8b72e6003ed4c63b990c15e5cc59db4..eeec6324a1f33b9b155d3e979728a086251adb10 100644 GIT binary patch delta 331 zcmV-R0kr7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uB4#OY_MQOAB{|EP>duZY;BD!P^SH0&+9j1(n zXsrk#gpgI)q8$(sk@NVrw|AT$%aRLF8|j}r6fi3wPkgl?Qa5j#-F&XvA4C zQhC?R@ib^!{?rKN743kC+_TkB$!63r!rBjp02ivHIA&50bbqN|kFIeb3Gfgq^hst6 zNiYO(s(dY@O-r?7D|?KHw-~L4dek=d!2ei0de=XXktW09?Q=8be&Radrekh--VMR< z0l}@MpazkwRfW*F2f4Tl8e$)Iu7K1a+RYDw4}YMxQk@GWXI3Z}FJdLmh3H(M3Ly7a z*|N@bN&=bnIWxcl_;fCX+GhqB_O=Om5(*H^uq9~TZJ7{42q9zzKEOhkOjSi69RL6T M07*qoM6N<$g1*F!-2eap diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00010.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00010.png index bceed68d6a9b6e6ceee1ec9be8c8912b8456c5cf..1c9156c31edf73cb072eaebf2db3fbe1ba5c612b 100644 GIT binary patch delta 387 zcmV-}0et@10-ghqB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=XYu)dpmP{y% z_!ALA2qCMoWji1uBIogKZ|^)mmZcWJ8ySCgDqv2O-r?6D|?KH_n57QMtBQ*;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L z1A<#iK@Bols|um<8|3CL2xlEu+0bq)#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#l zPQrH?JlvvYeK*aV0t}W>?;8UWEJ4XofMifhP2q8rC0d5YLL|(dz Q?*IS*07*qoM6N<$g2e8T`v3p{ diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png index f6d556916108fab7602b510c4ceb72780470fd7e..ce795f34e8569e986af689fded3b59c9a8af2961 100644 GIT binary patch delta 322 zcmV-I0lof=1Kk3UB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&iss_%q#Cgo1+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M z_MYAcQn|MhAZiLDKdX~t=b^=r-cJTbfEEK^O?ZkRZFNWjsIF=G>n@W3Nq`n$F*_D8 z0d~c^Uzp93moia2aKmx@_cT=fh-ll0dSf@P8y?s^Zav$QBuSDaNpSc8GsfKuvdq?W P00000NkvXXu0mjf4k4#= diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png deleted file mode 100644 index eeec6324a1f33b9b155d3e979728a086251adb10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png index 343850a22a7448ea232679f2296b3c327c526eae..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 392 zcmV;30eAkZ2B8CxBYy#CNkl1~S(L0001(`#XJsoO3-+DZTYAAzlr*i-*l+N~YS*h$H9h_{09aE_^Kp$21q} zFd75K^Q4r7uy#m&Hfld(Gy+EThTD6d7M5w`W;4HdVBkg`vJ9*eDlMO zGFpaC%dR>J3ytcjx@TNyY}@T8;osD)EPWT6GPhL_isL27%c|M{0ID0z0ps@VdS~6) z?e(Hf2A(hDzJD~`R0mA4ENBO;c1HI~?v98ZAiOea|FqdFVYgsK#17cBIU4rg_qkvv z?2Ha@)|a3NtBCf0hr%R$$C+74Z@?1ydzMKi`(`GoCi}+d15Z>TPfC*MgQG|<00000 m00000000000001R%oAU11SXAb?JEEP002ovPDHLkU;%=XbFr%c delta 789 zcmV+w1M2*t1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfk0*Dn diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png index d98dc1e95f25c879e2c9b1510df037c6f6cabb0d..c63a3b840a14de66db65b55d3950c561e819ba67 100644 GIT binary patch delta 399 zcmV;A0dW4I1E~X$B!6&8L_t(|obA|Ka>F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1iAazi9vf delta 390 zcmV;10eSwZ1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1iAazi9vf diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png index d98dc1e95f25c879e2c9b1510df037c6f6cabb0d..c63a3b840a14de66db65b55d3950c561e819ba67 100644 GIT binary patch delta 399 zcmV;A0dW4I1E~X$B!6&8L_t(|obA|Ka>F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1iAazi9vf delta 390 zcmV;10eSwZ1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1i13zh?jd diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png index b2401b220a6db139961dbcfed78507c4de86032a..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YUzs1K0zQB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD delta 388 zcmV-~0ek+~1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00010.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00010.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00003.png index 343850a22a7448ea232679f2296b3c327c526eae..af34fd01d1aab1c8d18e2d19a328e40975639de8 100644 GIT binary patch delta 361 zcmZ3@*33LXxt`I>)5S5QV$R!}xqM9qJPi*s_jtaqUvl@TyxQ4IwHmK(Io*3MuEdj( zc`%ZTfq~({yJwXfqOvtzT}p1&h)gV-ee|9Ce&5&cDh-6It{(GqG3nTPt?qGmrOW(= zRIi04+qY@XH9DCQ?emsx*#oiDb}`xqBI1|V-M;3s|GG|!+6$}t6B~HfwcpZ;WtG{K z7tk&A(!JwV={?a4_p5flx0bbk{@HR9>)&_NXYfVOsh`9obRqu9n@w9|#Qr9JODoL~ z06NH`crNeXbJp4b2Y delta 789 zcmV+w1M2*P1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfGO>4$ diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00004.png index af34fd01d1aab1c8d18e2d19a328e40975639de8..b2401b220a6db139961dbcfed78507c4de86032a 100644 GIT binary patch delta 388 zcmV-~0ek*~1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000drQXZa#WAE}&fA;0d`$*C4G%N-c)qV+a`&jb+SyCB8n13S-Fq&s#FLSE zFp`Ubf#JcsXO$bGvNc^@N^aJOOe~vy^qu>D-`DRd4TP(%9`kcC>DYR$?s0de%lw8^ zuZ1Psw`tBbI++pe^OkMd1F_R~G1>V%>-*?kz@I}w5pTs0|A^ypmO@4UF7MxS*-6XeSDrp>9vFM`owbbCwa(>AJ{s+U=k+t0+Ww18>4;yoJJrXbUVQuI ztnSK}H#4Nqeatsfd*Cb|me^d$mSa6ve{QwWJ0=eYgWF9;dtA5FE9uD{O0O~6&zXNn ztkU+ff^e;QbAWJd`V$4ASdB}w6(%>Y<_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD delta 388 zcmV-~0ek+~1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00003.png index 343850a22a7448ea232679f2296b3c327c526eae..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 392 zcmV;30eAkZ2B8CxBYy#CNkl1~S(L0001(`#XJsoO3-+DZTYAAzlr*i-*l+N~YS*h$H9h_{09aE_^Kp$21q} zFd75K^Q4r7uy#m&Hfld(Gy+EThTD6d7M5w`W;4HdVBkg`vJ9*eDlMO zGFpaC%dR>J3ytcjx@TNyY}@T8;osD)EPWT6GPhL_isL27%c|M{0ID0z0ps@VdS~6) z?e(Hf2A(hDzJD~`R0mA4ENBO;c1HI~?v98ZAiOea|FqdFVYgsK#17cBIU4rg_qkvv z?2Ha@)|a3NtBCf0hr%R$$C+74Z@?1ydzMKi`(`GoCi}+d15Z>TPfC*MgQG|<00000 m00000000000001R%oAU11SXAb?JEEP002ovPDHLkU;%=XbFr%c delta 789 zcmV+w1M2*t1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfk0*Dn diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00004.png index d98dc1e95f25c879e2c9b1510df037c6f6cabb0d..c63a3b840a14de66db65b55d3950c561e819ba67 100644 GIT binary patch delta 399 zcmV;A0dW4I1E~X$B!6&8L_t(|obA|Ka>F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1iAazi9vf delta 390 zcmV;10eSwZ1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!R#B!6#7L_t(|obA{_j>8}fK+()-Zo>VK#9d~AiVy}&(_%yP-zr5k z2?h+|x&QzG0CPX99}r{A*CB+r{xzttRyf74&0|ue%FftFjM4GM{=6Q1btXqM7V0#T z736(F2!m?nl)5)-?=hMIQf_eB=4N7P)|{-6Zi+q+Ww||+nMl+ylZ8h%XwJhuf zLaorOtX42fN=6-!rhkmF8r|j3ahugtFi1^u$gA-+Ti$(AP_udSh4U41Ci&#WmNMFg zHq)-U2oDO?TUBFxP*|4RFT&4M?JRvanqzLeASBCEke6Pz0RUvDt^xD=&gxr_#o#;C zlZlz1JMcUW9e=34jG86Suww_5iK4u2o|4LPdA9}c_%%CrKu?vyC#S;vd7q18zJ$}U z+J+JQ&@mm5Jg*Px6tu%et&H+u5k7HQR>J$R!L_GukcqyTMyQFtG5Ww0S;&(TWcpw! s!V3TZ00000000000000004(zlR}~QzwYZ=h00000Ne4wvM6N<$f^Z1BoB#j- delta 399 zcmV;A0dW4P1E~X$B!6&8L_t(|obA|Ka>F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1ihOzibB4ys@8C7rrKwW0(tb z8ubDFc~VMBSUaVjo3+nzngPAq;kM7i!ZM6p45+6n2kB3Lt$)7VXVyB+0MT3V-1WzO z<17(oz%bYha4Skq15l=a&RIO&?MJ=OW+_lgQ~$`D`E`4}pD97Z?yWbj2h>XP%8hO1 zvE$Fl-0LudO!q4M>1C%2=8vR^d(TLQ%IRi&{Pb`%2*fT+1KYmTTtcO^?uR#B!6#7L_t(|obA{_j>8}fK+()-Zo>VK#9d~AiVy}&(_%yP-zr5k z2?h+|x&QzG0CPX99}r{A*CB+r{xzttRyf74&0|ue%FftFjM4GM{=6Q1btXqM7V0#T z736(F2!m?nl)5)-?=hMIQf_eB=4N7P)|{-6Zi+q+Ww||+nMl+ylZ8h%XwJhuf zLaorOtX42fN=6-!rhkmF8r|j3ahugtFi1^u$gA-+Ti$(AP_udSh4U41Ci&#WmNMFg zHq)-U2oDO?TUBFxP*|4RFT&4M?JRvanqzLeASBCEke6Pz0RUvDt^xD=&gxr_#o#;C zlZlz1JMcUW9e=34jG86Suww_5iK4u2o|4LPdA9}c_%%CrKu?vyC#S;vd7q18zJ$}U z+J+JQ&@mm5Jg*Px6tu%et&H+u5k7HQR>J$R!L_GukcqyTMyQFtG5Ww0S;&(TWcpw! s!V3TZ00000000000000004(zlR}~QzwYZ=h00000Ne4wvM6N<$f_6Z diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00007.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00007.png index 8fb41809e7c1eb100443242a3ea7ed2e245db0d2..af34fd01d1aab1c8d18e2d19a328e40975639de8 100644 GIT binary patch delta 360 zcmZ3>+{`>drQXZa#WAE}&fA;0d`$*C4G%N-c)qV+a`&jb+SyCB8n13S-Fq&s#FLSE zFp`Ubf#JcsXO$bGvNc^@N^aJOOe~vy^qu>D-`DRd4TP(%9`kcC>DYR$?s0de%lw8^ zuZ1Psw`tBbI++pe^OkMd1F_R~G1>V%>-*?kz@I}w5pTs0|A^ypmO@4UF7MxS*-6XeSDrp>9vFM`owbbCwa(>AJ{s+U=k+t0+Ww18>4;yoJJrXbUVQuI ztnSK}H#4Nqeatsfd*Cb|me^d$mSa6ve{QwWJ0=eYgWF9;dtA5FE9uD{O0O~6&zXNn ztkU+ff^e;QbAWJd`V$4ASdB}w6(%>Y<bB4ys@8C7rrKwW0(tb z8ubDFc~VMBSUaVjo3+nzngPAq;kM7i!ZM6p45+6n2kB3Lt$)7VXVyB+0MT3V-1WzO z<17(oz%bYha4Skq15l=a&RIO&?MJ=OW+_lgQ~$`D`E`4}pD97Z?yWbj2h>XP%8hO1 zvE$Fl-0LudO!q4M>1C%2=8vR^d(TLQ%IRi&{Pb`%2*fT+1KYmTTtcO^?u0>7%Er_*NJNU;uR(}9Z zl|nH~Ta`|kWVA1)et;@C=Qu`a1t|V?wrBgAu&0Q0<+Wa}cpI5e^^UlO{*y7@ov>*ZYB4?M~%EjpqvpcIplK=n!AXw;b z=ts;pcI<=w-K{#sG4_|UKW6tdkEDA+{g&r;{H5FdyOJiLylxfPexk+n9VFsZl z`oYM-N_3%>c7jX}E=70&000000000000000004l?JOL3a+Tp@X(2W29002ovPDHLk FV1i9yr?vn9 delta 360 zcmZo-Zf2gKQt##I;uumf=k3j0z9s{nhKHGZJm1$ZxqDPz?d+vmjaRpv?mZV*;>pN7 z7|F%J!0_PRv&s!o*_y5{B{yqCCYH@U`p$j7@9TG!2EtWWkNLTnbZos=_qe;#Wqw1d z*TRzR+cf7Ioy>^#dCRu!f!Jxg80`ZQ@yqLOUvt@iT_;8Dh1H4r4ZQ2xZ)wG{%52ID z=oWhE-tnsRp6G@9RlDC?%i2HxY`KZ`@4M+U_@d|3Pht|f5dY-OrmZnze-po@m1YP4 z9b{2Fm-p|v?4;%KD^DLb4~)I}&RRz6TIX^lAB}dw^ZJ=gZU4olbi}XPo$BLIFTVY9 zR(Ivgn;FvQKIR*#J#dx}OKh%W%dwuTKeyWG9g~NH!R;oaJ+52omGtBerPmnk=gdDO zR%v@#LAchuIY78J{fUB5tj49;3X_}Ha_9rCM+O_t3jbPk`bdrCNlB2fr>mdKI;Vst E0JNQ+s{jB1 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00009.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00009.png index fdc3ea2941fb7e3069621b5d6940fbb961b15b3a..460a5e92b658d2e27542e4522f0b7b83ed120c20 100644 GIT binary patch delta 393 zcmV;40e1d^1ET|wB!6m2L_t(|obB0dZo?o9fMGW6Cfxr>++{zaA!Hk;S%R^m_xaTi zhZGyrCM^X3000R06?wAOS}CR0+8>Ljwbn7lIsEFoX?;hYOr*XWb60EaNo=j@;FtN? z{Q)G=3Pmk#(K=;P(XpAv0MT&H;~1eGAo%m_?~Xm8kD8@SB!9gRVs3-}P)nujfJ^)h z%4rcj!mhn8x&!pmTfOf3_&L9ycWy!V-N~uB#l;tCLjm+8XVdQO;_MHzUsjg}0RRBN zo0*sXAHIGXT>gG*cC!F+tTSMMEEi(_w2zx>e((`9GH=G2V{W`e$Wnk=nu^N4AN=^) zSIbg>8J+!`Lw{||wJA{n%+$>C^_nI~RDhXmYxY^W3UFz?e_og)a=hhf?rd8sE&q^t zaL?7ue+T^-@w)SEtPlLhL{`_}B)u>0^gO0XCi`KGRFnN+)L0>7%Er_*NJNU;uR(}9Z zl|nH~Ta`|kWVA1)et;@C=Qu`a1t|V?wrBgAu&0Q0<+Wa}cpI5e^^UlO{*y7@ov>*ZYB4?M~%EjpqvpcIplK=n!AXw;b z=ts;pcI<=w-K{#sG4_|UKW6tdkEDA+{g&r;{H5FdyOJiLylxfPexk+n9VFsZl z`oYM-N_3%>c7jX}E=70&000000000000000004l?JOL3a+Tp@X(2W29002ovPDHLk FV1jx1M>oqB!4#!gjh5KAfj!7uZF`T{JI z3er8=CUs=eqir&^2bhF&mScowfZ^X~-P`6w|EpQZOwem1!+$d9H?>u|3|Qh9C?`ew z7EaZ==nUu|z1`1UZ9nJx`D6*Y?@mmIB`&^`4s<|&le62d>EhIf*~n_C5dZ)H1Ph%F zU1CO!!_V5`7_@F|N4I7b7iKf2!(GGe{%Ri2{t|wHM^47|Gt&NHnLV-teyrx^9kA_k zZlMGnMh6^bOHojg;hOm$Q6}{y!=)~{2yfa#`6kmK6a6rQP!s)N^ub9~p_49xOdo7T qcmV(a000000000000000fNj2i(Z~(KdN(Nm0000N delta 393 zcmV;40e1fL0;2++{zaA!Hk;S%R^m_xaTi zhZGyrCM^X3000R06?wAOS}CR0+8>Ljwbn7lIsEFoX?;hYOr*XWb60EaNo=j@;FtN? z{Q)G=3Pmk#(K=;P(XpAv0MT&H;~1eGAo%m_?~Xm8kD8@SB!9gRVs3-}P)nujfJ^)h z%4rcj!mhn8x&!pmTfOf3_&L9ycWy!V-N~uB#l;tCLjm+8XVdQO;_MHzUsjg}0RRBN zo0*sXAHIGXT>gG*cC!F+tTSMMEEi(_w2zx>e((`9GH=G2V{W`e$Wnk=nu^N4AN=^) zSIbg>8J+!`Lw{||wJA{n%+$>C^_nI~RDhXmYxY^W3UFz?e_og)a=hhf?rd8sE&q^t zaL?7ue+T^-@w)SEtPlLhL{`_}B)u>0^gO0XCi`KGRFnN+)LP-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000oqB!4#!gjh5KAfj!7uZF`T{JI z3er8=CUs=eqir&^2bhF&mScowfZ^X~-P`6w|EpQZOwem1!+$d9H?>u|3|Qh9C?`ew z7EaZ==nUu|z1`1UZ9nJx`D6*Y?@mmIB`&^`4s<|&le62d>EhIf*~n_C5dZ)H1Ph%F zU1CO!!_V5`7_@F|N4I7b7iKf2!(GGe{%Ri2{t|wHM^47|Gt&NHnLV-teyrx^9kA_k zZlMGnMh6^bOHojg;hOm$Q6}{y!=)~{2yfa#`6kmK6a6rQP!s)N^ub9~p_49xOdo7T qcmV(a000000000000000fNj2i(Z~(KdN(Nm0000_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD delta 388 zcmV-~0ek+~1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00014.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00014.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00003.png index 343850a22a7448ea232679f2296b3c327c526eae..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 392 zcmV;30eAkZ2B8CxBYy#CNkl1~S(L0001(`#XJsoO3-+DZTYAAzlr*i-*l+N~YS*h$H9h_{09aE_^Kp$21q} zFd75K^Q4r7uy#m&Hfld(Gy+EThTD6d7M5w`W;4HdVBkg`vJ9*eDlMO zGFpaC%dR>J3ytcjx@TNyY}@T8;osD)EPWT6GPhL_isL27%c|M{0ID0z0ps@VdS~6) z?e(Hf2A(hDzJD~`R0mA4ENBO;c1HI~?v98ZAiOea|FqdFVYgsK#17cBIU4rg_qkvv z?2Ha@)|a3NtBCf0hr%R$$C+74Z@?1ydzMKi`(`GoCi}+d15Z>TPfC*MgQG|<00000 m00000000000001R%oAU11SXAb?JEEP002ovPDHLkU;%=XbFr%c delta 789 zcmV+w1M2*t1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfk0*Dn diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00004.png index d98dc1e95f25c879e2c9b1510df037c6f6cabb0d..b2401b220a6db139961dbcfed78507c4de86032a 100644 GIT binary patch delta 388 zcmV-~0ek+T1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y00008}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD delta 388 zcmV-~0ek+~1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00007.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00007.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png index 343850a22a7448ea232679f2296b3c327c526eae..cdbc0778c6fa19ba83d49d9e6b15325fad70eec5 100644 GIT binary patch delta 376 zcmV-;0f+vp29g7iBYy!|Nklw| z@~}-J8DTjo0RR91+kN>Cud3y_h&XBnW%ten*OOrLC) zpInxjvcW+`$$17m8r*tv%nw^n7jpzNv@ib>^pEB-?IzE+{-g+taMn(Rdiia)AMMgT z?Bb5Ng}F|xUq-lueXA05BIizck4d{g@d5D34p;-aee(K!A=8UREBc;;Z@?1yeuhCN`rC9uP4qV-2cD=xo-Tq+4sJzw0RR9100000000000001h+x!CG Wf#@CFLi>RL0000-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfVC;9E diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00004.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00004.png index cdbc0778c6fa19ba83d49d9e6b15325fad70eec5..cf33e8caa9aaeec7e19d3259490e0d8cfd1fd124 100644 GIT binary patch delta 392 zcmV;30eAkA1EK?vB!6j1L_t(|obA|4j>8}jMN!h~ov{BUv6mj8AXJnw9bq1J?iob! z59}%fh7bS%0D$FQ+UiqE<$sJ(cqiW|rBo-t-Sa^q_o8e8IdJ90H*t(Hrj+t;*{qMc zmjtg>9c9Q=Eop*3>#HrOIW7M= z?P|&iH|mtcE#SYwts6(b*t)rx5=_-v`YvdqeoWouY5SkB!yufsO`#rs+w+euaf=E>6JDb;U7+&;@Xc;B2J~mkCByPDHB4}Wo=J^@DypJivK(`c7^!dX7#GcQA*fbob7E}HhaITPAqCOp2zxkJe2 z+9Cnto|glg0LkM`SrkieQ*P-ZC%3ox-9N)&kcs{>PN<3gV&p)HUPy^?Sc&ig00000 m00000000000001&`2(mF0JLHkGKW^ delta 375 zcmV--0f_#h1Cj%fB!5{+L_t(|obB0La>F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1oT-wlV+! diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png index cf33e8caa9aaeec7e19d3259490e0d8cfd1fd124..b2401b220a6db139961dbcfed78507c4de86032a 100644 GIT binary patch delta 388 zcmV-~0ek+U1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y00008}jMN!h~ov{BUv6mj8AXJnw9bq1J?iob! z59}%fh7bS%0D$FQ+UiqE<$sJ(cqiW|rBo-t-Sa^q_o8e8IdJ90H*t(Hrj+t;*{qMc zmjtg>9c9Q=Eop*3>#HrOIW7M= z?P|&iH|mtcE#SYwts6(b*t)rx5=_-v`YvdqeoWouY5SkB!yufsO`#rs+w+euaf=E>6JDb;U7+&;@Xc;B2J~mkCByPDHB4}Wo=J^@DypJivK(`c7^!dX7#GcQA*fbob7E}HhaITPAqCOp2zxkJe2 z+9Cnto|glg0LkM`SrkieQ*P-ZC%3ox-9N)&kcs{>PN<3gV&p)HUPy^?Sc&ig00000 m00000000000001&`2(mF0JLbceoP( diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png index b2401b220a6db139961dbcfed78507c4de86032a..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YUzs1K0zQB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD delta 388 zcmV-~0ek+~1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00003.png index 343850a22a7448ea232679f2296b3c327c526eae..cdbc0778c6fa19ba83d49d9e6b15325fad70eec5 100644 GIT binary patch delta 376 zcmV-;0f+vp29g7iBYy!|Nklw| z@~}-J8DTjo0RR91+kN>Cud3y_h&XBnW%ten*OOrLC) zpInxjvcW+`$$17m8r*tv%nw^n7jpzNv@ib>^pEB-?IzE+{-g+taMn(Rdiia)AMMgT z?Bb5Ng}F|xUq-lueXA05BIizck4d{g@d5D34p;-aee(K!A=8UREBc;;Z@?1yeuhCN`rC9uP4qV-2cD=xo-Tq+4sJzw0RR9100000000000001h+x!CG Wf#@CFLi>RL0000-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfVC;9E diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00004.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00004.png index cdbc0778c6fa19ba83d49d9e6b15325fad70eec5..cf33e8caa9aaeec7e19d3259490e0d8cfd1fd124 100644 GIT binary patch delta 392 zcmV;30eAkA1EK?vB!6j1L_t(|obA|4j>8}jMN!h~ov{BUv6mj8AXJnw9bq1J?iob! z59}%fh7bS%0D$FQ+UiqE<$sJ(cqiW|rBo-t-Sa^q_o8e8IdJ90H*t(Hrj+t;*{qMc zmjtg>9c9Q=Eop*3>#HrOIW7M= z?P|&iH|mtcE#SYwts6(b*t)rx5=_-v`YvdqeoWouY5SkB!yufsO`#rs+w+euaf=E>6JDb;U7+&;@Xc;B2J~mkCByPDHB4}Wo=J^@DypJivK(`c7^!dX7#GcQA*fbob7E}HhaITPAqCOp2zxkJe2 z+9Cnto|glg0LkM`SrkieQ*P-ZC%3ox-9N)&kcs{>PN<3gV&p)HUPy^?Sc&ig00000 m00000000000001&`2(mF0JLHkGKW^ delta 375 zcmV--0f_#h1Cj%fB!5{+L_t(|obB0La>F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1oT-wlV+! diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00005.png index cf33e8caa9aaeec7e19d3259490e0d8cfd1fd124..b704065d711a0e90112ae1d81dd2be4e523494b3 100644 GIT binary patch delta 383 zcmV-_0f7FZ1DXSnB!6K^L_t(|obA|Ka>F1DKvCN1PPG3ev6p@@Wi;Yp+QvvY_k3iW z#5Rcp!jKXG006Mvhi~&a=Xxw6j=$s`<(zc_x}W^vCTH;+0VQy? zE=x^4;h>`AJOX|jTs=7Ex7EYN+`%;M%fAG@&^)Hy#PC2`HYI16zV3 zJgDg?PbT3Lr{#D)-=-64qQ4nA@I)2zbP;57a4W(K000000000000000 d0002o<{Q^4^$eqiaI63T002ovPDHLkV1jkKv0VTF delta 392 zcmV;30eAkI1EK?vB!6j1L_t(|obA|4j>8}jMN!h~ov{BUv6mj8AXJnw9bq1J?iob! z59}%fh7bS%0D$FQ+UiqE<$sJ(cqiW|rBo-t-Sa^q_o8e8IdJ90H*t(Hrj+t;*{qMc zmjtg>9c9Q=Eop*3>#HrOIW7M= z?P|&iH|mtcE#SYwts6(b*t)rx5=_-v`YvdqeoWouY5SkB!yufsO`#rs+w+euaf=E>6JDb;U7+&;@Xc;B2J~mkCByPDHB4}Wo=J^@DypJivK(`c7^!dX7#GcQA*fbob7E}HhaITPAqCOp2zxkJe2 z+9Cnto|glg0LkM`SrkieQ*P-ZC%3ox-9N)&kcs{>PN<3gV&p)HUPy^?Sc&ig00000 m00000000000001&`2(mF0JLT&$tc% diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00006.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00006.png index b704065d711a0e90112ae1d81dd2be4e523494b3..b54209a0d779c558149a7fc1f1ac84c2a64ce46f 100644 GIT binary patch delta 365 zcmV-z0h0cj1Be5VB!5pyL_t(|obA|avcez?hGBHhPO|?cWiS3wQ_jYL>c5+92 zL~);*f85~~_N!XZiNq`6H3rKCnh$_qcH}i+{-IE@5ToP2NAKRTezrQZmzMHb&_FTA zzj(#8X#&FIdSDbx?+cEd_oj0A|43D~nvYksFbk=Hyq;p6_# ziMl~1`pYyzP4pKd2TF7yC9cCtgckq+0000000000000000Qi_2naSwFpWYq=00000 LNkvXXu0mjfKzgly delta 383 zcmV-_0f7F91DXSnB!6K^L_t(|obA|Ka>F1DKvCN1PPG3ev6p@@Wi;Yp+QvvY_k3iW z#5Rcp!jKXG006Mvhi~&a=Xxw6j=$s`<(zc_x}W^vCTH;+0VQy? zE=x^4;h>`AJOX|jTs=7Ex7EYN+`%;M%fAG@&^)Hy#PC2`HYI16zV3 zJgDg?PbT3Lr{#D)-=-64qQ4nA@I)2zbP;57a4W(K000000000000000 d0002o<{Q^4^$eqiaI63T002ovPDHLkV1iE7u|og= diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00007.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00007.png index b54209a0d779c558149a7fc1f1ac84c2a64ce46f..cdbc0778c6fa19ba83d49d9e6b15325fad70eec5 100644 GIT binary patch delta 375 zcmV--0f_#H1Cj%fB!5{+L_t(|obB0La>F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1n0Bwio~a delta 365 zcmV-z0h0cb1Be5VB!5pyL_t(|obA|avcez?hGBHhPO|?cWiS3wQ_jYL>c5+92 zL~);*f85~~_N!XZiNq`6H3rKCnh$_qcH}i+{-IE@5ToP2NAKRTezrQZmzMHb&_FTA zzj(#8X#&FIdSDbx?+cEd_oj0A|43D~nvYksFbk=Hyq;p6_# ziMl~1`pYyzP4pKd2TF7yC9cCtgckq+0000000000000000Qi_2naSwFpWYq=00000 LNkvXXu0mjfH4?3M diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00008.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00008.png index cdbc0778c6fa19ba83d49d9e6b15325fad70eec5..857b4307fc540feea5dfd719ceeccd7c6fef03a0 100644 GIT binary patch delta 366 zcmV-!0g?Wa1BnBWB!5szL_t(|obB0d4#FS|fZ=MqN$-Co?&1$3A?0ftM>~C=AI8lM zv>hEx5dZ)HV7r@d_bH|FUR52x$v;Xd)d}eC`Jj<&@f-m;aOJ``aa7fmQhqI)^{3ra zq&KQY88ThF48i;UE{zhM^7~b_n-zVLCS>jYQ8L<39iuNI4}X_lvvN`AD}8cUezPn! z<$wznCFc?FZgA_tF>kgWE~W+3wJ-k?^hNWSc9Z8@eXADz-|_TY&) zg_)<;n-Qk4KUIRR$ay8a$7H!c@d5D9;@$(6b4QuZGR^9GzSxG<&JLH48QKS{^9F-p z8tTmRVcf?Ku4iDwUiGz0Cg5N-Z=b{kL;M1& delta 375 zcmV--0f_#I1Cj%fB!5{+L_t(|obB0La>F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1n4kwiy5b diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00009.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00009.png index 857b4307fc540feea5dfd719ceeccd7c6fef03a0..b2401b220a6db139961dbcfed78507c4de86032a 100644 GIT binary patch delta 388 zcmV-~0ek+51D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000~C=AI8lM zv>hEx5dZ)HV7r@d_bH|FUR52x$v;Xd)d}eC`Jj<&@f-m;aOJ``aa7fmQhqI)^{3ra zq&KQY88ThF48i;UE{zhM^7~b_n-zVLCS>jYQ8L<39iuNI4}X_lvvN`AD}8cUezPn! z<$wznCFc?FZgA_tF>kgWE~W+3wJ-k?^hNWSc9Z8@eXADz-|_TY&) zg_)<;n-Qk4KUIRR$ay8a$7H!c@d5D9;@$(6b4QuZGR^9GzSxG<&JLH48QKS{^9F-p z8tTmRVcf?Ku4iDwUiGz0Cg5N-Z=b{kL_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD delta 388 zcmV-~0ek+~1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png index 343850a22a7448ea232679f2296b3c327c526eae..cdbc0778c6fa19ba83d49d9e6b15325fad70eec5 100644 GIT binary patch delta 376 zcmV-;0f+vp29g7iBYy!|Nklw| z@~}-J8DTjo0RR91+kN>Cud3y_h&XBnW%ten*OOrLC) zpInxjvcW+`$$17m8r*tv%nw^n7jpzNv@ib>^pEB-?IzE+{-g+taMn(Rdiia)AMMgT z?Bb5Ng}F|xUq-lueXA05BIizck4d{g@d5D34p;-aee(K!A=8UREBc;;Z@?1yeuhCN`rC9uP4qV-2cD=xo-Tq+4sJzw0RR9100000000000001h+x!CG Wf#@CFLi>RL0000-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfVC;9E diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00004.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00004.png index cdbc0778c6fa19ba83d49d9e6b15325fad70eec5..94771e7febd5e3c47d0ad945f1685bcf46e696d6 100644 GIT binary patch delta 419 zcmV;U0bKr)1HA)~B!7fSL_t(|obB0Lj>8}fKv6pCPT2pF*vovNB4i9nBfw62&&Q}q zc}(m;ChjP_f@=zoV0-X^_f<)+Se`k+|; za5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZGw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NXgfuN!qaUYG85F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1gwAwoL#4 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png index 94771e7febd5e3c47d0ad945f1685bcf46e696d6..b704065d711a0e90112ae1d81dd2be4e523494b3 100644 GIT binary patch delta 383 zcmV-_0f7F!1DXSnB!6K^L_t(|obA|Ka>F1DKvCN1PPG3ev6p@@Wi;Yp+QvvY_k3iW z#5Rcp!jKXG006Mvhi~&a=Xxw6j=$s`<(zc_x}W^vCTH;+0VQy? zE=x^4;h>`AJOX|jTs=7Ex7EYN+`%;M%fAG@&^)Hy#PC2`HYI16zV3 zJgDg?PbT3Lr{#D)-=-64qQ4nA@I)2zbP;57a4W(K000000000000000 d0002o<{Q^4^$eqiaI63T002ovPDHLkV1k|?v3LLg delta 419 zcmV;U0bKr?1HA)~B!7fSL_t(|obB0Lj>8}fKv6pCPT2pF*vovNB4i9nBfw62&&Q}q zc}(m;ChjP_f@=zoV0-X^_f<)+Se`k+|; za5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZGw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NXgfuN!qaUYG85wQ_jYL>c5+92 zL~);*f85~~_N!XZiNq`6H3rKCnh$_qcH}i+{-IE@5ToP2NAKRTezrQZmzMHb&_FTA zzj(#8X#&FIdSDbx?+cEd_oj0A|43D~nvYksFbk=Hyq;p6_# ziMl~1`pYyzP4pKd2TF7yC9cCtgckq+0000000000000000Qi_2naSwFpWYq=00000 LNkvXXu0mjfKzgly delta 383 zcmV-_0f7F91DXSnB!6K^L_t(|obA|Ka>F1DKvCN1PPG3ev6p@@Wi;Yp+QvvY_k3iW z#5Rcp!jKXG006Mvhi~&a=Xxw6j=$s`<(zc_x}W^vCTH;+0VQy? zE=x^4;h>`AJOX|jTs=7Ex7EYN+`%;M%fAG@&^)Hy#PC2`HYI16zV3 zJgDg?PbT3Lr{#D)-=-64qQ4nA@I)2zbP;57a4W(K000000000000000 d0002o<{Q^4^$eqiaI63T002ovPDHLkV1iE7u|og= diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png index b54209a0d779c558149a7fc1f1ac84c2a64ce46f..857b4307fc540feea5dfd719ceeccd7c6fef03a0 100644 GIT binary patch delta 366 zcmV-!0g?WQ1BnBWB!5szL_t(|obB0d4#FS|fZ=MqN$-Co?&1$3A?0ftM>~C=AI8lM zv>hEx5dZ)HV7r@d_bH|FUR52x$v;Xd)d}eC`Jj<&@f-m;aOJ``aa7fmQhqI)^{3ra zq&KQY88ThF48i;UE{zhM^7~b_n-zVLCS>jYQ8L<39iuNI4}X_lvvN`AD}8cUezPn! z<$wznCFc?FZgA_tF>kgWE~W+3wJ-k?^hNWSc9Z8@eXADz-|_TY&) zg_)<;n-Qk4KUIRR$ay8a$7H!c@d5D9;@$(6b4QuZGR^9GzSxG<&JLH48QKS{^9F-p z8tTmRVcf?Ku4iDwUiGz0Cg5N-Z=b{kLwQ_jYL>c5+92 zL~);*f85~~_N!XZiNq`6H3rKCnh$_qcH}i+{-IE@5ToP2NAKRTezrQZmzMHb&_FTA zzj(#8X#&FIdSDbx?+cEd_oj0A|43D~nvYksFbk=Hyq;p6_# ziMl~1`pYyzP4pKd2TF7yC9cCtgckq+0000000000000000Qi_2naSwFpWYq=00000 LNkvXXu0mjfC_Sxh diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00008.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00008.png index 857b4307fc540feea5dfd719ceeccd7c6fef03a0..94771e7febd5e3c47d0ad945f1685bcf46e696d6 100644 GIT binary patch delta 419 zcmV;U0bKrx1HA)~B!7fSL_t(|obB0Lj>8}fKv6pCPT2pF*vovNB4i9nBfw62&&Q}q zc}(m;ChjP_f@=zoV0-X^_f<)+Se`k+|; za5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZGw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NXgfuN!qaUYG85~C=AI8lM zv>hEx5dZ)HV7r@d_bH|FUR52x$v;Xd)d}eC`Jj<&@f-m;aOJ``aa7fmQhqI)^{3ra zq&KQY88ThF48i;UE{zhM^7~b_n-zVLCS>jYQ8L<39iuNI4}X_lvvN`AD}8cUezPn! z<$wznCFc?FZgA_tF>kgWE~W+3wJ-k?^hNWSc9Z8@eXADz-|_TY&) zg_)<;n-Qk4KUIRR$ay8a$7H!c@d5D9;@$(6b4QuZGR^9GzSxG<&JLH48QKS{^9F-p z8tTmRVcf?Ku4iDwUiGz0Cg5N-Z=b{kLP-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y00008}fKv6pCPT2pF*vovNB4i9nBfw62&&Q}q zc}(m;ChjP_f@=zoV0-X^_f<)+Se`k+|; za5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZGw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NXgfuN!qaUYG85_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD delta 388 zcmV-~0ek+~1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/tests/src/lrCompleteQueuedWithdrawals.test.js b/tests/src/lrCompleteQueuedWithdrawals.test.js index c290600..cc7141b 100644 --- a/tests/src/lrCompleteQueuedWithdrawals.test.js +++ b/tests/src/lrCompleteQueuedWithdrawals.test.js @@ -92,7 +92,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 12 : 9; + const right_clicks = model.letter === 'S' ? 9 : 8; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -168,7 +168,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 9 : 6; + const right_clicks = model.letter === 'S' ? 6 : 5; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -244,7 +244,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 9 : 6; + const right_clicks = model.letter === 'S' ? 6 : 5; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -363,7 +363,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 16 : 13; + const right_clicks = model.letter === 'S' ? 13 : 12; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( diff --git a/tests/src/lrQueueWithdrawals.test.js b/tests/src/lrQueueWithdrawals.test.js index 5391986..9261599 100644 --- a/tests/src/lrQueueWithdrawals.test.js +++ b/tests/src/lrQueueWithdrawals.test.js @@ -44,7 +44,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 9 : 7; + const right_clicks = model.letter === 'S' ? 6 : 6; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -100,7 +100,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 13 : 11; + const right_clicks = model.letter === 'S' ? 10 : 10; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -156,7 +156,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 13 : 11; + const right_clicks = model.letter === 'S' ? 10 : 10; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( From df7b9b22f15f94e8d0ac3e7f15638b52f34d5b03 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Tue, 30 Apr 2024 00:33:54 +0200 Subject: [PATCH 27/46] fix: readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c84acf1..9078352 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ The flow processed in [GitHub Actions](https://github.com/features/actions) is t ### LR Complete Queued Withdrawals -![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/000010.png) +![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00010.png) ## NANO X From bbb3f4c8a43b65fedb2847b50f5bb929e6f8849a Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Tue, 30 Apr 2024 00:39:28 +0200 Subject: [PATCH 28/46] fix: sdk version to match ci requirements --- ethereum-plugin-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum-plugin-sdk b/ethereum-plugin-sdk index 8fe6572..2bf928b 160000 --- a/ethereum-plugin-sdk +++ b/ethereum-plugin-sdk @@ -1 +1 @@ -Subproject commit 8fe6572458355828097fa5183a41c83ccb25fece +Subproject commit 2bf928b2c14b15e4f3f42a24af4caf54493fb5b3 From 7e7ccb17345a1850bfa431f0b4a7f1d6b7d52249 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Tue, 30 Apr 2024 01:45:21 +0200 Subject: [PATCH 29/46] feat: docs + fix cal placeholders --- README.md | 290 +++++++++++++----- ...238ce926dec62b3fbc99ab06eb1d85ce0270.json} | 0 ...235b5c7e247488784986e58019fffd98fda4.json} | 0 ...d650500f82c7d978a440348e5a9b886943bf.json} | 0 tests/cal/b2c.json | 6 +- tests/src/batchWithdraw.test.js | 2 +- tests/src/batchWithdrawCL.test.js | 2 +- tests/src/batchWithdrawEL.test.js | 24 +- tests/src/claim.v2.test.js | 2 +- tests/src/deposit.test.js | 2 +- tests/src/multiClaim.v2.test.js | 4 +- tests/src/requestExit.test.js | 24 +- tests/src/requestExit.v2.test.js | 2 +- tests/src/stake.v2.test.js | 2 +- tests/src/withdraw.test.js | 2 +- tests/src/withdrawCL.test.js | 2 +- tests/src/withdrawEL.test.js | 2 +- 17 files changed, 254 insertions(+), 112 deletions(-) rename tests/cal/abis/{0xe8ff2a04837aac535199eecb5ece52b2735b3543.json => 0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270.json} (100%) rename tests/cal/abis/{0x380c7e0ec45f5b62ae5a0a6d6a0b95b532e3dd9c.json => 0x5db5235b5c7e247488784986e58019fffd98fda4.json} (100%) rename tests/cal/abis/{0xb0c8078af582d8b754ef35f3bdaceff8587bd914.json => 0x8d6fd650500f82c7d978a440348e5a9b886943bf.json} (100%) diff --git a/README.md b/README.md index 9078352..2ab04fb 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,7 @@ ![Kiln Logo](https://uploads-ssl.webflow.com/625db3caa8abd6c22d5f0ce3/6260572336892a801afd71e3_Kiln_Logo-Transparent-Dark.svg) This plug-in is compatible with Nano S / X devices, it enables to -interact in a secure wait with the Kiln deposit smart contract to -stake Ethereum. +interact in a secure way with the Kiln On-Chain v1, v2 and EigenLayer Liquid Restaking contracts. ## Prerequisite @@ -28,17 +27,43 @@ git clone --recurse-submodules https://github.com/LedgerHQ/app-ethereum.git ## Documentation -Need more information about the interface, the architecture, or general stuff about ethereum plugins? You can find more about them in the [ethereum-app documentation](https://github.com/LedgerHQ/app-ethereum/blob/master/doc/ethapp_plugins.asc). +### Plugin codebase -## Smart Contracts +This plugin follows the structure of a Ledger Ethereum app plugin described [here](https://developers.ledger.com/docs/device-app/develop/code/plugin). -Smart contracts covered by this plugin are: +It receives data from the Ethereum app, processes it and displays (ie "clearsign") on the device screen. + +All the plugin code is in the `src` folder. + +The plugin codebase follows the 6 steps of the plugin flow: + +1. **initialize** (in `src/handle_init_contract.c`): plugin receives the selector to manage, and init the correct parser initial state for the function (`context->next_param`). +2. **provide parameter** (in `src/provide_parameter/handle_provide_parameter.c`): selected parser receives parameters 32 bytes by 32 bytes, and parse them to the correct state. See files like `src/provide_parameter/eigenlayer.c` for the different parsers. +3. **finalize** (in `src/handle_finalize.c`): plugin returns the number of screens to display +4. **provide_token** not used here +5. **query_contract_id** (in `src/handle_query_contract_id.c`): plugin returns the contract name as the first displayed screen on the device +6. **query_contract_ui** (in `src/query_contract_ui/handle_query_contract_ui.c`): plugin returns the screens to display on the device, each product has its own file like `src/query_contract_ui/eigenlayer.c`. + +Other important files: + +- `src/contracts.c` holds all the constant representing contract functions, parameters or known contracts mappings. +- `src/kiln_plugin.h` is where we define all the parser states and the plugin context structure. + +### Plugin context + +The plugin context is defined in `src/kiln_plugin.h` and holds the state of the plugin. It is passed to all the plugin functions. + +It is defined using a union of all the possible parser parameters of the plugin, and a `next_param` field to know which parser state to use next. + +The plugin context is memset to 0 everytime init_contract is called (beginning of a clearsigning flow), so we make sure that the plugin context union is in a clean state before using it in the parsers. + +### Provide parameter parsers + +The provide parameter parsers are defined in `src/provide_parameter/` and are called by the `handle_provide_parameter` function. -| Network | Version | Smart Contract | -| ------- | ------- | -------------------------------------------- | -| Goerli | V0 | `0xe8Ff2a04837aac535199eEcB5ecE52b2735b3543` | +Each parser is a state machine that receives 32 bytes of data at a time (abi format), and updates the plugin context state accordingly. -## Build +### Build Go to the plugin-tools folder and run the "./start" script. @@ -55,7 +80,13 @@ cd app-plugin-kiln/tests # go to the tests folder in app-plugin-kiln ./build_local_test_elfs.sh # run the script build_local_test_elfs.sh ``` -## Tests +### Tests + +The tests are in the `tests/src` folder. They are written in javascript and use the `@ledgerhq/hw-app-eth` library to simulate the device. + +The tests are run using the `yarn test` command. + +The output of the tests is a series of screenshots stored in the `tests/snapshots-tmp` folder that are compared to the expected screenshots in the `tests/snapshots` folder. The latter are stored in the git repository to make sure we expect the correct outputs. To test the plugin go to the tests folder from the "app-plugin-kiln/tests" and run the script "test" @@ -65,153 +96,264 @@ yarn # install dependencies yarn test # run the script test ``` -## Continuous Integration +### Continuous Integration The flow processed in [GitHub Actions](https://github.com/features/actions) is the following: - Code formatting with [clang-format](http://clang.llvm.org/docs/ClangFormat.html) - Compilation of the application for Ledger Nano S in [ledger-app-builder](https://github.com/LedgerHQ/ledger-app-builder) -# Flows +### Supported Smart Contracts + +Smart contracts covered by this plugin are: + +| Network | Name | Address | +| ------- | ----------------------------- | -------------------------------------------- | +| Mainnet | Kiln On-Chain v1 | `0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270` | +| Mainnet | Kiln On-Chain v2 Native20 | `0x5db5235b5c7e247488784986e58019fffd98fda4` | +| Mainnet | Kiln On-Chain v2 ExitQueue | `0x8d6fd650500f82c7d978a440348e5a9b886943bf` | +| Mainnet | EigenLayer Delegation Manager | `0x858646372cc42e1a627fce94aa7a7033e7cf075a` | +| Mainnet | EigenLayer Strategy Manager | `0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a` | -## NANO S +## Clearsigning -### Deposit +### KILN ON-CHAIN v1 - Deposit + +Function: `deposit()` +Clearsigned: + +- tx.value ![](/tests/snapshots/nanos_deposit/00000.png) ![](/tests/snapshots/nanos_deposit/00001.png) ![](/tests/snapshots/nanos_deposit/00002.png) ![](/tests/snapshots/nanos_deposit/00003.png) ![](/tests/snapshots/nanos_deposit/00004.png) ![](/tests/snapshots/nanos_deposit/00005.png) -### Withdraw +![](/tests/snapshots/nanox_deposit/00000.png) ![](/tests/snapshots/nanox_deposit/00001.png) ![](/tests/snapshots/nanox_deposit/00002.png) ![](/tests/snapshots/nanox_deposit/00003.png) ![](/tests/snapshots/nanox_deposit/00004.png) ![](/tests/snapshots/nanox_deposit/00005.png) + +### KILN ON-CHAIN v1 - Withdraw + +Function `withdraw(bytes validatorPubkey)` +Clearsigned: + +- none as BLS key is not digest to display on device and only owner of the validator can withdraw on its behalf so no attack vector possible. ![](/tests/snapshots/nanos_withdraw/00000.png) ![](/tests/snapshots/nanos_withdraw/00001.png) ![](/tests/snapshots/nanos_withdraw/00002.png) ![](/tests/snapshots/nanos_withdraw/00003.png) ![](/tests/snapshots/nanos_withdraw/00004.png) ![](/tests/snapshots/nanos_withdraw/00005.png) -### Withdraw EL +![](/tests/snapshots/nanox_withdraw/00000.png) ![](/tests/snapshots/nanox_withdraw/00001.png) ![](/tests/snapshots/nanox_withdraw/00002.png) ![](/tests/snapshots/nanox_withdraw/00003.png) ![](/tests/snapshots/nanox_withdraw/00004.png) ![](/tests/snapshots/nanox_withdraw/00005.png) + +### KILN ON-CHAIN v1 - Withdraw EL + +Function `withdrawEL(bytes validatorPubkey)` +Clearsigned: + +- none as BLS key is not digest to display on device and only owner of the validator can withdraw on its behalf so no attack vector possible. ![](/tests/snapshots/nanos_withdrawEL/00000.png) ![](/tests/snapshots/nanos_withdrawEL/00001.png) ![](/tests/snapshots/nanos_withdrawEL/00002.png) ![](/tests/snapshots/nanos_withdrawEL/00003.png) ![](/tests/snapshots/nanos_withdrawEL/00004.png) ![](/tests/snapshots/nanos_withdrawEL/00005.png) -### Withdraw CL +![](/tests/snapshots/nanox_withdrawEL/00000.png) ![](/tests/snapshots/nanox_withdrawEL/00001.png) ![](/tests/snapshots/nanox_withdrawEL/00002.png) ![](/tests/snapshots/nanox_withdrawEL/00003.png) ![](/tests/snapshots/nanox_withdrawEL/00004.png) ![](/tests/snapshots/nanox_withdrawEL/00005.png) + +### KILN ON-CHAIN v1 - Withdraw CL + +Function `withdrawCL(bytes validatorPubkey)` +Clearsigned: + +- none as BLS key is not digest to display on device and only owner of the validator can withdraw on its behalf so no attack vector possible. ![](/tests/snapshots/nanos_withdrawCL/00000.png) ![](/tests/snapshots/nanos_withdrawCL/00001.png) ![](/tests/snapshots/nanos_withdrawCL/00002.png) ![](/tests/snapshots/nanos_withdrawCL/00003.png) ![](/tests/snapshots/nanos_withdrawCL/00004.png) ![](/tests/snapshots/nanos_withdrawCL/00005.png) -### Batch Withdraw +![](/tests/snapshots/nanox_withdrawCL/00000.png) ![](/tests/snapshots/nanox_withdrawCL/00001.png) ![](/tests/snapshots/nanox_withdrawCL/00002.png) ![](/tests/snapshots/nanox_withdrawCL/00003.png) ![](/tests/snapshots/nanox_withdrawCL/00004.png) ![](/tests/snapshots/nanox_withdrawCL/00005.png) + +### KILN ON-CHAIN v1 - Batch Withdraw + +Function `batchWithdraw(bytes validatorPubkeys)` + +- none as validatorPubkeys can represent many BLS keys that we can't store on the device. Also only owner of the validator can withdraw on its behalf so no attack vector possible. ![](/tests/snapshots/nanos_batchWithdraw/00000.png) ![](/tests/snapshots/nanos_batchWithdraw/00001.png) ![](/tests/snapshots/nanos_batchWithdraw/00002.png) ![](/tests/snapshots/nanos_batchWithdraw/00003.png) ![](/tests/snapshots/nanos_batchWithdraw/00004.png) ![](/tests/snapshots/nanos_batchWithdraw/00005.png) -### Batch Withdraw EL +![](/tests/snapshots/nanox_batchWithdraw/00000.png) ![](/tests/snapshots/nanox_batchWithdraw/00001.png) ![](/tests/snapshots/nanox_batchWithdraw/00002.png) ![](/tests/snapshots/nanox_batchWithdraw/00003.png) ![](/tests/snapshots/nanox_batchWithdraw/00004.png) ![](/tests/snapshots/nanox_batchWithdraw/00005.png) + +### KILN ON-CHAIN v1 - Batch Withdraw EL + +Function `batchWithdrawEL(bytes validatorPubkeys)` +Clearsigned: + +- none as validatorPubkeys can represent many BLS keys that we can't store on the device. Also only owner of the validator can withdraw on its behalf so no attack vector possible. ![](/tests/snapshots/nanos_batchWithdrawEL/00000.png) ![](/tests/snapshots/nanos_batchWithdrawEL/00001.png) ![](/tests/snapshots/nanos_batchWithdrawEL/00002.png) ![](/tests/snapshots/nanos_batchWithdrawEL/00003.png) ![](/tests/snapshots/nanos_batchWithdrawEL/00004.png) ![](/tests/snapshots/nanos_batchWithdrawEL/00005.png) -### Batch WithdrawCL +![](/tests/snapshots/nanox_batchWithdrawEL/00000.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00001.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00002.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00003.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00004.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00005.png) + +### KILN ON-CHAIN v1 - Batch WithdrawCL + +Function `batchWithdrawCL(bytes validatorPubkeys)` +Clearsigned: + +- none as validatorPubkeys can represent many BLS keys that we can't store on the device. Also only owner of the validator can withdraw on its behalf so no attack vector possible. ![](/tests/snapshots/nanos_batchWithdrawCL/00000.png) ![](/tests/snapshots/nanos_batchWithdrawCL/00001.png) ![](/tests/snapshots/nanos_batchWithdrawCL/00002.png) ![](/tests/snapshots/nanos_batchWithdrawCL/00003.png) ![](/tests/snapshots/nanos_batchWithdrawCL/00004.png) ![](/tests/snapshots/nanos_batchWithdrawCL/00005.png) -## Request Exits +![](/tests/snapshots/nanox_batchWithdrawCL/00000.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00001.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00002.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00003.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00004.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00005.png) -![](/tests/snapshots/nanos_requestValidatorsExit/00000.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00001.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00002.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00003.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00004.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00005.png) +## KILN ON-CHAIN v1 - Request Exits -### Stake v2 +Function `requestExits(bytes validatorPubkeys)` +Clearsigned: -![](/tests/snapshots/nanos_stakev2/00000.png) ![](/tests/snapshots/nanos_stakev2/00001.png) ![](/tests/snapshots/nanos_stakev2/00002.png) ![](/tests/snapshots/nanos_stakev2/00003.png) ![](/tests/snapshots/nanos_stakev2/00004.png) ![](/tests/snapshots/nanos_stakev2/00005.png) +- none as validatorPubkeys can represent many BLS keys that we can't store on the device. Also only owner of the validator can request exit on its behalf so no attack vector possible. -### RequestExit V2 +![](/tests/snapshots/nanos_requestValidatorsExit/00000.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00001.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00002.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00003.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00004.png) ![](/tests/snapshots/nanos_requestValidatorsExit/00005.png) -![](/tests/snapshots/nanos_requestExitv2/00000.png) ![](/tests/snapshots/nanos_requestExitv2/00001.png) ![](/tests/snapshots/nanos_requestExitv2/00002.png) ![](/tests/snapshots/nanos_requestExitv2/00003.png) ![](/tests/snapshots/nanos_requestExitv2/00004.png) ![](/tests/snapshots/nanos_requestExitv2/00005.png) +![](/tests/snapshots/nanox_requestValidatorsExit/00000.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00001.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00002.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00003.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00004.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00005.png) -### MultiClaim V2 +### KILN ON-CHAIN v2 - Stake -![](/tests/snapshots/nanos_multiClaimv2/00000.png) ![](/tests/snapshots/nanos_multiClaimv2/00001.png) ![](/tests/snapshots/nanos_multiClaimv2/00002.png) ![](/tests/snapshots/nanos_multiClaimv2/00003.png) ![](/tests/snapshots/nanos_multiClaimv2/00004.png) ![](/tests/snapshots/nanos_multiClaimv2/00005.png) +Function: `stake()` +Clearsigned: -### Claim V2 +- tx.value -![](/tests/snapshots/nanos_claimv2/00000.png) ![](/tests/snapshots/nanos_claimv2/00001.png) ![](/tests/snapshots/nanos_claimv2/00002.png) ![](/tests/snapshots/nanos_claimv2/00003.png) ![](/tests/snapshots/nanos_claimv2/00004.png) ![](/tests/snapshots/nanos_claimv2/00005.png) +![](/tests/snapshots/nanos_stakev2/00000.png) ![](/tests/snapshots/nanos_stakev2/00001.png) ![](/tests/snapshots/nanos_stakev2/00002.png) ![](/tests/snapshots/nanos_stakev2/00003.png) ![](/tests/snapshots/nanos_stakev2/00004.png) ![](/tests/snapshots/nanos_stakev2/00005.png) -### LR Deposit Into Strategy +![](/tests/snapshots/nanox_stakev2/00000.png) ![](/tests/snapshots/nanox_stakev2/00001.png) ![](/tests/snapshots/nanox_stakev2/00002.png) ![](/tests/snapshots/nanox_stakev2/00003.png) ![](/tests/snapshots/nanox_stakev2/00004.png) ![](/tests/snapshots/nanox_stakev2/00005.png) -![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00000.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00001.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00002.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00003.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00004.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00005.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00006.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00007.png) +### KILN ON-CHAIN v2 - RequestExit -### Delegate To +Function: `requestExit(uint256 shares)` +Clearsigned: -![](/tests/snapshots/nanos_delegate_to_is_kiln/00000.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00001.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00002.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00003.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00004.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00005.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00006.png) +- none as shares is not 1:1 with ETH value, it would confuse users -### Undelegate +![](/tests/snapshots/nanos_requestExitv2/00000.png) ![](/tests/snapshots/nanos_requestExitv2/00001.png) ![](/tests/snapshots/nanos_requestExitv2/00002.png) ![](/tests/snapshots/nanos_requestExitv2/00003.png) ![](/tests/snapshots/nanos_requestExitv2/00004.png) ![](/tests/snapshots/nanos_requestExitv2/00005.png) -![](/tests/snapshots/nanos_lr_undelegate/00000.png) ![](/tests/snapshots/nanos_lr_undelegate/00001.png) ![](/tests/snapshots/nanos_lr_undelegate/00002.png) ![](/tests/snapshots/nanos_lr_undelegate/00003.png) ![](/tests/snapshots/nanos_lr_undelegate/00004.png) ![](/tests/snapshots/nanos_lr_undelegate/00005.png) +![](/tests/snapshots/nanox_requestExitv2/00000.png) ![](/tests/snapshots/nanox_requestExitv2/00001.png) ![](/tests/snapshots/nanox_requestExitv2/00002.png) ![](/tests/snapshots/nanox_requestExitv2/00003.png) ![](/tests/snapshots/nanox_requestExitv2/00004.png) ![](/tests/snapshots/nanox_requestExitv2/00005.png) -### Queue Withdrawals +### KILN ON-CHAIN v2 - MultiClaim -![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png) +Function: `multiClaim(address[] exitQueues, uint256[][] ticketIds, uint32[][] casksIds)` +Clearsigned: -### LR Complete Queued Withdrawals +- none -![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00010.png) +![](/tests/snapshots/nanos_multiClaimv2/00000.png) ![](/tests/snapshots/nanos_multiClaimv2/00001.png) ![](/tests/snapshots/nanos_multiClaimv2/00002.png) ![](/tests/snapshots/nanos_multiClaimv2/00003.png) ![](/tests/snapshots/nanos_multiClaimv2/00004.png) ![](/tests/snapshots/nanos_multiClaimv2/00005.png) -## NANO X +![](/tests/snapshots/nanox_multiClaimv2/00000.png) ![](/tests/snapshots/nanox_multiClaimv2/00001.png) ![](/tests/snapshots/nanox_multiClaimv2/00002.png) ![](/tests/snapshots/nanox_multiClaimv2/00003.png) ![](/tests/snapshots/nanox_multiClaimv2/00004.png) ![](/tests/snapshots/nanox_multiClaimv2/00005.png) -### Deposit +### KILN ON-CHAIN v2 - Claim -![](/tests/snapshots/nanox_deposit/00000.png) ![](/tests/snapshots/nanox_deposit/00001.png) ![](/tests/snapshots/nanox_deposit/00002.png) ![](/tests/snapshots/nanox_deposit/00003.png) ![](/tests/snapshots/nanox_deposit/00004.png) ![](/tests/snapshots/nanox_deposit/00005.png) +Function: `claim(uint256[] ticketIds, uint32[] caskIds, uint16 maxClaimDepth)` +Clearsigned: -### Withdraw +- none -![](/tests/snapshots/nanox_withdraw/00000.png) ![](/tests/snapshots/nanox_withdraw/00001.png) ![](/tests/snapshots/nanox_withdraw/00002.png) ![](/tests/snapshots/nanox_withdraw/00003.png) ![](/tests/snapshots/nanox_withdraw/00004.png) ![](/tests/snapshots/nanox_withdraw/00005.png) +![](/tests/snapshots/nanos_claimv2/00000.png) ![](/tests/snapshots/nanos_claimv2/00001.png) ![](/tests/snapshots/nanos_claimv2/00002.png) ![](/tests/snapshots/nanos_claimv2/00003.png) ![](/tests/snapshots/nanos_claimv2/00004.png) ![](/tests/snapshots/nanos_claimv2/00005.png) -### Withdraw EL +![](/tests/snapshots/nanox_claimv2/00000.png) ![](/tests/snapshots/nanox_claimv2/00001.png) ![](/tests/snapshots/nanox_claimv2/00002.png) ![](/tests/snapshots/nanox_claimv2/00003.png) ![](/tests/snapshots/nanox_claimv2/00004.png) ![](/tests/snapshots/nanox_claimv2/00005.png) -![](/tests/snapshots/nanox_withdrawEL/00000.png) ![](/tests/snapshots/nanox_withdrawEL/00001.png) ![](/tests/snapshots/nanox_withdrawEL/00002.png) ![](/tests/snapshots/nanox_withdrawEL/00003.png) ![](/tests/snapshots/nanox_withdrawEL/00004.png) ![](/tests/snapshots/nanox_withdrawEL/00005.png) +### EigenLayer Strategy Manager - LR Deposit Into Strategy -### Withdraw CL +Function: `depositIntoStrategy(address strategy, address erc20, uint256 amount)` +Clearsigned: -![](/tests/snapshots/nanox_withdrawCL/00000.png) ![](/tests/snapshots/nanox_withdrawCL/00001.png) ![](/tests/snapshots/nanox_withdrawCL/00002.png) ![](/tests/snapshots/nanox_withdrawCL/00003.png) ![](/tests/snapshots/nanox_withdrawCL/00004.png) ![](/tests/snapshots/nanox_withdrawCL/00005.png) +- strategy: using mapping in `contracts.c`, it is either recognized or displayed as "UNKOWN" +- erc20: using mapping in `contracts.c`, it is either recognized or displayed as "UNKOWN" +- amount -### Batch Withdraw +![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00000.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00001.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00002.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00003.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00004.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00005.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00006.png) ![](/tests/snapshots/nanos_lrDepositIntoStrategyNormal/00007.png) -![](/tests/snapshots/nanox_batchWithdraw/00000.png) ![](/tests/snapshots/nanox_batchWithdraw/00001.png) ![](/tests/snapshots/nanox_batchWithdraw/00002.png) ![](/tests/snapshots/nanox_batchWithdraw/00003.png) ![](/tests/snapshots/nanox_batchWithdraw/00004.png) ![](/tests/snapshots/nanox_batchWithdraw/00005.png) +![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00000.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00001.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00002.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00003.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00004.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00005.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00006.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00007.png) -### Batch Withdraw EL +### EigenLayer Delegation Manager - Delegate To -![](/tests/snapshots/nanox_batchWithdrawEL/00000.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00001.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00002.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00003.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00004.png) ![](/tests/snapshots/nanox_batchWithdrawEL/00005.png) +Function: -### Batch WithdrawCL +```solidity +struct QueuedWithdrawalParams { + address[] strategies; + uint256[] shares; + address withdrawer; +} -![](/tests/snapshots/nanox_batchWithdrawCL/00000.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00001.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00002.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00003.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00004.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00005.png) +function queueWithdrawals( + QueuedWithdrawalParams[] queuedWithdrawalParams +) +``` -### Request Exits +Clearsigned: -![](/tests/snapshots/nanox_requestValidatorsExit/00000.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00001.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00002.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00003.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00004.png) ![](/tests/snapshots/nanox_requestValidatorsExit/00005.png) +- strategies: using mapping in `contracts.c`, they are either recognized or displayed as "UNKOWN" -### Stake V2 +Shares are confusing for users and would be hard to store properly on the device for display. -![](/tests/snapshots/nanox_stakev2/00000.png) ![](/tests/snapshots/nanox_stakev2/00001.png) ![](/tests/snapshots/nanox_stakev2/00002.png) ![](/tests/snapshots/nanox_stakev2/00003.png) ![](/tests/snapshots/nanox_stakev2/00004.png) ![](/tests/snapshots/nanox_stakev2/00005.png) +![](/tests/snapshots/nanos_delegate_to_is_kiln/00000.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00001.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00002.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00003.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00004.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00005.png) ![](/tests/snapshots/nanos_delegate_to_is_kiln/00006.png) -### RequestExit V2 +![](/tests/snapshots/nanox_delegate_to_is_kiln/00000.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00001.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00002.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00003.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00004.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00005.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00006.png) -![](/tests/snapshots/nanox_requestExitv2/00000.png) ![](/tests/snapshots/nanox_requestExitv2/00001.png) ![](/tests/snapshots/nanox_requestExitv2/00002.png) ![](/tests/snapshots/nanox_requestExitv2/00003.png) ![](/tests/snapshots/nanox_requestExitv2/00004.png) ![](/tests/snapshots/nanox_requestExitv2/00005.png) +### EigenLayer Delegation Manager - Undelegate -### MultiClaim V2 +Function: `undelegate(address staker)` +Clearsigned: -![](/tests/snapshots/nanox_multiClaimv2/00000.png) ![](/tests/snapshots/nanox_multiClaimv2/00001.png) ![](/tests/snapshots/nanox_multiClaimv2/00002.png) ![](/tests/snapshots/nanox_multiClaimv2/00003.png) ![](/tests/snapshots/nanox_multiClaimv2/00004.png) ![](/tests/snapshots/nanox_multiClaimv2/00005.png) +- none as there is a staker == msg.sender requirement in the contract -### Claim V2 +![](/tests/snapshots/nanos_lr_undelegate/00000.png) ![](/tests/snapshots/nanos_lr_undelegate/00001.png) ![](/tests/snapshots/nanos_lr_undelegate/00002.png) ![](/tests/snapshots/nanos_lr_undelegate/00003.png) ![](/tests/snapshots/nanos_lr_undelegate/00004.png) ![](/tests/snapshots/nanos_lr_undelegate/00005.png) -![](/tests/snapshots/nanox_claimv2/00000.png) ![](/tests/snapshots/nanox_claimv2/00001.png) ![](/tests/snapshots/nanox_claimv2/00002.png) ![](/tests/snapshots/nanox_claimv2/00003.png) ![](/tests/snapshots/nanox_claimv2/00004.png) ![](/tests/snapshots/nanox_claimv2/00005.png) +![](/tests/snapshots/nanox_lr_undelegate/00000.png) ![](/tests/snapshots/nanox_lr_undelegate/00001.png) ![](/tests/snapshots/nanox_lr_undelegate/00002.png) ![](/tests/snapshots/nanox_lr_undelegate/00003.png) ![](/tests/snapshots/nanox_lr_undelegate/00004.png) ![](/tests/snapshots/nanox_lr_undelegate/00005.png) -# EigenLayer +### EigenLayer Strategy Manager - Queue Withdrawals -### LR Deposit Into Strategy +Function: -![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00000.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00001.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00002.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00003.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00004.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00005.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00006.png) ![](/tests/snapshots/nanox_lrDepositIntoStrategyNormal/00007.png) +```solidity +struct QueuedWithdrawalParams { + address[] strategies; + uint256[] shares; + address withdrawer; +} -### Delegate To +function queueWithdrawals( + QueuedWithdrawalParams[] queuedWithdrawalParams +) +``` -![](/tests/snapshots/nanox_delegate_to_is_kiln/00000.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00001.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00002.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00003.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00004.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00005.png) ![](/tests/snapshots/nanox_delegate_to_is_kiln/00006.png) +Clearsigned: -### Undelegate +- strategies: using mapping in `contracts.c`, they are either recognized or displayed as "UNKOWN" -![](/tests/snapshots/nanox_lr_undelegate/00000.png) ![](/tests/snapshots/nanox_lr_undelegate/00001.png) ![](/tests/snapshots/nanox_lr_undelegate/00002.png) ![](/tests/snapshots/nanox_lr_undelegate/00003.png) ![](/tests/snapshots/nanox_lr_undelegate/00004.png) ![](/tests/snapshots/nanox_lr_undelegate/00005.png) +Shares are confusing for users and would be hard to store properly on the device for display. -### Queue Withdrawals +![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00000.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00001.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00002.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00004.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00006.png) ![](/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00007.png) -### LR Complete Queued Withdrawals +### EigenLayer Strategy Manager - LR Complete Queued Withdrawals + +Function: + +```solidity +struct Withdrawal { + address staker; + address delegatedTo; + address withdrawer; + uint256 nonce; + uint32 startBlock; + address[] strategies; + uint256[] shares; +} + +function completeQueuedWithdrawals( + Withdrawal[] withdrawals, + address[][] tokens, + uint256[] middlewareTimesIndexes, + bool[] receiveAsTokens +) +``` + +Clearsigned: + +- strategies: using mapping in `contracts.c`, they are either recognized or displayed as "UNKOWN" +- if each withdrawal corresponding receiveAsTokens is true, then the corresponding token is displayed as "Withdraw" else as "Redelegation + +Shares are confusing for users and would be hard to store properly on the device for display. + +![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00009.png) ![](/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00010.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00000.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00001.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00002.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00005.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00006.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00007.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00008.png) ![](/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png) diff --git a/tests/cal/abis/0xe8ff2a04837aac535199eecb5ece52b2735b3543.json b/tests/cal/abis/0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270.json similarity index 100% rename from tests/cal/abis/0xe8ff2a04837aac535199eecb5ece52b2735b3543.json rename to tests/cal/abis/0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270.json diff --git a/tests/cal/abis/0x380c7e0ec45f5b62ae5a0a6d6a0b95b532e3dd9c.json b/tests/cal/abis/0x5db5235b5c7e247488784986e58019fffd98fda4.json similarity index 100% rename from tests/cal/abis/0x380c7e0ec45f5b62ae5a0a6d6a0b95b532e3dd9c.json rename to tests/cal/abis/0x5db5235b5c7e247488784986e58019fffd98fda4.json diff --git a/tests/cal/abis/0xb0c8078af582d8b754ef35f3bdaceff8587bd914.json b/tests/cal/abis/0x8d6fd650500f82c7d978a440348e5a9b886943bf.json similarity index 100% rename from tests/cal/abis/0xb0c8078af582d8b754ef35f3bdaceff8587bd914.json rename to tests/cal/abis/0x8d6fd650500f82c7d978a440348e5a9b886943bf.json diff --git a/tests/cal/b2c.json b/tests/cal/b2c.json index 3e8fe7a..178c27f 100644 --- a/tests/cal/b2c.json +++ b/tests/cal/b2c.json @@ -2,7 +2,7 @@ "chainId": 5, "contracts": [ { - "address": "0xe8ff2a04837aac535199eecb5ece52b2735b3543", + "address": "0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270", "contractName": "KilnStakingV1", "selectors": { "0xd0e30db0": { @@ -44,7 +44,7 @@ } }, { - "address": "0x380c7e0ec45f5b62ae5a0a6d6a0b95b532e3dd9c", + "address": "0x5db5235b5c7e247488784986e58019fffd98fda4", "contractName": "LedgerLiveV2", "selectors": { "0x3a4b66f1": { @@ -62,7 +62,7 @@ } }, { - "address": "0xb0c8078af582d8b754ef35f3bdaceff8587bd914", + "address": "0x8d6fd650500f82c7d978a440348e5a9b886943bf", "contractName": "KilnExitQueueV2", "selectors": { "0xadcf1163": { diff --git a/tests/src/batchWithdraw.test.js b/tests/src/batchWithdraw.test.js index 36b12c0..a9fa560 100644 --- a/tests/src/batchWithdraw.test.js +++ b/tests/src/batchWithdraw.test.js @@ -12,7 +12,7 @@ import { ethers } from 'ethers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0xe8ff2a04837aac535199eecb5ece52b2735b3543'; +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; diff --git a/tests/src/batchWithdrawCL.test.js b/tests/src/batchWithdrawCL.test.js index 8b6df3f..91094bb 100644 --- a/tests/src/batchWithdrawCL.test.js +++ b/tests/src/batchWithdrawCL.test.js @@ -12,7 +12,7 @@ import { ethers } from 'ethers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0xe8ff2a04837aac535199eecb5ece52b2735b3543'; +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; diff --git a/tests/src/batchWithdrawEL.test.js b/tests/src/batchWithdrawEL.test.js index 83fde3a..1e68bec 100644 --- a/tests/src/batchWithdrawEL.test.js +++ b/tests/src/batchWithdrawEL.test.js @@ -1,5 +1,5 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; import { waitForAppScreen, zemu, @@ -7,25 +7,25 @@ import { nano_models, SPECULOS_ADDRESS, txFromEtherscan, -} from "./test.fixture"; -import { ethers } from "ethers"; -import { parseEther, parseUnits } from "ethers/lib/utils"; -import { ledgerService } from "@ledgerhq/hw-app-eth"; +} from './test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = "0xe8ff2a04837aac535199eecb5ece52b2735b3543"; +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; -const pluginName = "Kiln"; +const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { test( - "[Nano " + model.letter + "] BatchWithdrawEL", + '[Nano ' + model.letter + '] BatchWithdrawEL', zemu(model, async (sim, eth) => { const contract = new ethers.Contract(contractAddr, abi); const pubkeys = - "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; const { data } = await contract.populateTransaction.batchWithdrawELFee( pubkeys @@ -53,8 +53,8 @@ nano_models.forEach(function (model) { await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( - ".", - model.name + "_batchWithdrawEL", + '.', + model.name + '_batchWithdrawEL', [right_clicks, 0] ); diff --git a/tests/src/claim.v2.test.js b/tests/src/claim.v2.test.js index 2312211..d284671 100644 --- a/tests/src/claim.v2.test.js +++ b/tests/src/claim.v2.test.js @@ -5,7 +5,7 @@ import { ethers } from 'ethers'; import { parseEther } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0xb0c8078af582d8b754ef35f3bdaceff8587bd914'; +const contractAddr = '0x8d6fd650500f82c7d978a440348e5a9b886943bf'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; diff --git a/tests/src/deposit.test.js b/tests/src/deposit.test.js index 22a875e..348ac3b 100644 --- a/tests/src/deposit.test.js +++ b/tests/src/deposit.test.js @@ -13,7 +13,7 @@ import { ethers } from 'ethers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0xe8ff2a04837aac535199eecb5ece52b2735b3543'; +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; diff --git a/tests/src/multiClaim.v2.test.js b/tests/src/multiClaim.v2.test.js index 2071117..dec6373 100644 --- a/tests/src/multiClaim.v2.test.js +++ b/tests/src/multiClaim.v2.test.js @@ -5,7 +5,7 @@ import { ethers } from 'ethers'; import { parseEther } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0x380c7e0ec45f5b62ae5a0a6d6a0b95b532e3dd9c'; +const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; @@ -18,7 +18,7 @@ nano_models.forEach(function (model) { const contract = new ethers.Contract(contractAddr, abi); const { data } = await contract.populateTransaction.multiClaim( - ['0x380c7e0ec45f5b62ae5a0a6d6a0b95b532e3dd9c'], + ['0x5db5235b5c7e247488784986e58019fffd98fda4'], [ [42, 47], [150, 2], diff --git a/tests/src/requestExit.test.js b/tests/src/requestExit.test.js index 017b83c..4b1ad9c 100644 --- a/tests/src/requestExit.test.js +++ b/tests/src/requestExit.test.js @@ -1,5 +1,5 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; import { waitForAppScreen, zemu, @@ -7,25 +7,25 @@ import { nano_models, SPECULOS_ADDRESS, txFromEtherscan, -} from "./test.fixture"; -import { ethers } from "ethers"; -import { parseEther, parseUnits } from "ethers/lib/utils"; -import { ledgerService } from "@ledgerhq/hw-app-eth"; +} from './test.fixture'; +import { ethers } from 'ethers'; +import { parseEther, parseUnits } from 'ethers/lib/utils'; +import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = "0xe8ff2a04837aac535199eecb5ece52b2735b3543"; +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; -const pluginName = "Kiln"; +const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; const abi = require(abi_path); nano_models.forEach(function (model) { test( - "[Nano " + model.letter + "] RequestValidatorsExit", + '[Nano ' + model.letter + '] RequestValidatorsExit', zemu(model, async (sim, eth) => { const contract = new ethers.Contract(contractAddr, abi); const pubkeys = - "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; const { data } = await contract.populateTransaction.requestValidatorsExit( pubkeys @@ -53,8 +53,8 @@ nano_models.forEach(function (model) { await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( - ".", - model.name + "_requestValidatorsExit", + '.', + model.name + '_requestValidatorsExit', [right_clicks, 0] ); diff --git a/tests/src/requestExit.v2.test.js b/tests/src/requestExit.v2.test.js index 26f48a3..6d75922 100644 --- a/tests/src/requestExit.v2.test.js +++ b/tests/src/requestExit.v2.test.js @@ -5,7 +5,7 @@ import { ethers } from 'ethers'; import { parseEther } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0x380c7e0ec45f5b62ae5a0a6d6a0b95b532e3dd9c'; +const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; diff --git a/tests/src/stake.v2.test.js b/tests/src/stake.v2.test.js index fd1c806..86465b8 100644 --- a/tests/src/stake.v2.test.js +++ b/tests/src/stake.v2.test.js @@ -13,7 +13,7 @@ import { ethers } from 'ethers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0x380c7e0ec45f5b62ae5a0a6d6a0b95b532e3dd9c'; +const contractAddr = '0x5db5235b5c7e247488784986e58019fffd98fda4'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; diff --git a/tests/src/withdraw.test.js b/tests/src/withdraw.test.js index d2de4d9..f7b6576 100644 --- a/tests/src/withdraw.test.js +++ b/tests/src/withdraw.test.js @@ -12,7 +12,7 @@ import { ethers } from 'ethers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0xe8ff2a04837aac535199eecb5ece52b2735b3543'; +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; diff --git a/tests/src/withdrawCL.test.js b/tests/src/withdrawCL.test.js index 855fca9..b770f9e 100644 --- a/tests/src/withdrawCL.test.js +++ b/tests/src/withdrawCL.test.js @@ -12,7 +12,7 @@ import { ethers } from 'ethers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0xe8ff2a04837aac535199eecb5ece52b2735b3543'; +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; diff --git a/tests/src/withdrawEL.test.js b/tests/src/withdrawEL.test.js index 70a22c4..9a0de19 100644 --- a/tests/src/withdrawEL.test.js +++ b/tests/src/withdrawEL.test.js @@ -12,7 +12,7 @@ import { ethers } from 'ethers'; import { parseEther, parseUnits } from 'ethers/lib/utils'; import { ledgerService } from '@ledgerhq/hw-app-eth'; -const contractAddr = '0xe8ff2a04837aac535199eecb5ece52b2735b3543'; +const contractAddr = '0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270'; const pluginName = 'Kiln'; const abi_path = `../cal/abis/${contractAddr}.json`; From 438163a36647c091ef08625747bca170ea059650 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Sun, 12 May 2024 19:08:05 +0200 Subject: [PATCH 30/46] fix: I1-documentation-issues --- PLUGIN_SPECIFICATION.md | 40 ++++++++++++++++++++++++++++++++++++++++ README.md | 21 +++++++++++---------- 2 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 PLUGIN_SPECIFICATION.md diff --git a/PLUGIN_SPECIFICATION.md b/PLUGIN_SPECIFICATION.md new file mode 100644 index 0000000..811d32d --- /dev/null +++ b/PLUGIN_SPECIFICATION.md @@ -0,0 +1,40 @@ +# Technical Specification + +## About + +This documentation describes the smart contracts and functions supported by the kiln plugin. + +## Smart Contracts + +Smart contracts covered by the plugin: + +| Network | Version | Smart Contract | Address | +| ------- | ------- | ------------------------------------- | -------------------------------------------- | +| Mainnet | v1.2 | OCV1 - Kiln On-Chain v1 | `0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270` | +| Mainnet | v2.2 | OCV2-N20 - Kiln On-Chain v2 Native 20 | `0x5db5235b5c7e247488784986e58019fffd98fda4` | +| Mainnet | v2.2 | OCV2-EQ - Kiln On-Chain v2 Exit Queue | `0x8d6fd650500f82c7d978a440348e5a9b886943bf` | +| Mainnet | M2 | EL-SM - EigenLayer Strategy Manager | `0x858646372cc42e1a627fce94aa7a7033e7cf075a` | +| Mainnet | M2 | EL-DM - EigenLayer Delegation Manager | `0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a` | + +## Functions + +For the smart contracts implemented, the functions covered by the plugin are: + +| Contract | Function | Selector | Displayed Parameters | +| -------- | ------------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| OCV1 | deposit | `0xd0e30db0` |
uint tx.value
| +| OCV1 | withdraw | `0x0968f264` |
n/r
| +| OCV1 | withdrawELFee | `0xbf509bd4` |
n/r
| +| OCV1 | withdrawCLFee | `0x2ba03a79` |
n/r
| +| OCV1 | batchWithdraw | `0xe8a0c121` |
n/r
| +| OCV1 | batchWithdrawELFee | `0xef5e4682` |
n/r
| +| OCV1 | batchWithdrawCLFee | `0x0ffab6c2` |
n/r
| +| OCV2-N20 | stake | `0x3a4b66f1` |
uint tx.value
| +| OCV2-N20 | requestExit | `0x721c6513` |
n/r
| +| OCV2-N20 | multiClaim | `0xb7ba18c7` |
n/r
| +| OCV2-EQ | claim | `0xadcf1163` |
n/r
| +| EL-SM | depositIntoStrategy | `0xe7a050aa` |
address strategy
address ERC20
| +| EL-SM | queueWithdrawals | `0x0dd8dd02` |
queuedWithdrawalParams.strategies[] as string using an internal mapping
| +| EL-SM | completeQueuedWithdrawals | `0x33404396` |
strategies as string using an internal mapping
redelegated or withdrawal action
| +| EL-DM | delegateTo | `0xeea9064b` |
address operator or "KILN"
| +| EL-DM | undelegate | `0xda8be864` |
type ParameterName
| diff --git a/README.md b/README.md index 2ab04fb..7aa0dae 100644 --- a/README.md +++ b/README.md @@ -112,8 +112,8 @@ Smart contracts covered by this plugin are: | Mainnet | Kiln On-Chain v1 | `0x1e68238ce926dec62b3fbc99ab06eb1d85ce0270` | | Mainnet | Kiln On-Chain v2 Native20 | `0x5db5235b5c7e247488784986e58019fffd98fda4` | | Mainnet | Kiln On-Chain v2 ExitQueue | `0x8d6fd650500f82c7d978a440348e5a9b886943bf` | -| Mainnet | EigenLayer Delegation Manager | `0x858646372cc42e1a627fce94aa7a7033e7cf075a` | -| Mainnet | EigenLayer Strategy Manager | `0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a` | +| Mainnet | EigenLayer Strategy Manager | `0x858646372cc42e1a627fce94aa7a7033e7cf075a` | +| Mainnet | EigenLayer Delegation Manager | `0x39053d51b77dc0d36036fc1fcc8cb819df8ef37a` | ## Clearsigning @@ -195,7 +195,7 @@ Clearsigned: ## KILN ON-CHAIN v1 - Request Exits -Function `requestExits(bytes validatorPubkeys)` +Function `requestValidatorsExit(bytes validatorPubkeys)` Clearsigned: - none as validatorPubkeys can represent many BLS keys that we can't store on the device. Also only owner of the validator can request exit on its behalf so no attack vector possible. @@ -266,20 +266,21 @@ Clearsigned: Function: ```solidity -struct QueuedWithdrawalParams { - address[] strategies; - uint256[] shares; - address withdrawer; +struct SignatureWithExpiry { + bytes signature; + uint256 expiry; } -function queueWithdrawals( - QueuedWithdrawalParams[] queuedWithdrawalParams +function delegateTo( + address operator, + SignatureWithExpiry memory approverSignatureAndExpiry, + bytes32 approverSalt ) ``` Clearsigned: -- strategies: using mapping in `contracts.c`, they are either recognized or displayed as "UNKOWN" +- operator: using mapping in `contracts.c`, it is either recognized or displayed as address Shares are confusing for users and would be hard to store properly on the device for display. From 4afc5618b3bae51404a2a519f1f251b6216e1166 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Sun, 12 May 2024 19:13:22 +0200 Subject: [PATCH 31/46] fix: I4-typographical-error --- src/kiln_plugin.h | 8 ++++---- src/provide_parameter/eigenlayer.c | 20 ++++++++++---------- src/query_contract_ui/eigenlayer.c | 8 ++++---- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index dd150e0..a17a394 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -86,8 +86,8 @@ typedef enum { // globals #define LR_STRATEGIES_COUNT 11 -#define UNKNOW_LR_ERC20 255 -#define UNKNOW_LR_STRATEGY 255 +#define UNKNOWN_LR_ERC20 255 +#define UNKNOWN_LR_STRATEGY 255 #define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) #define ERC20_DECIMALS 18 @@ -194,7 +194,7 @@ typedef struct { uint8_t strategies_count; // list of strategies indexes **INCREMENTED BY 1** to display in the UI // 0 is reserved for end of array - // UNKNOW_LR_STRATEGY is used to display the "unknown" strategy + // UNKNOWN_LR_STRATEGY is used to display the "unknown" strategy // assumptions: // (i) in practice, we should not encounter more than // LR_STRATEGIES_COUNT +~ a few potential unsupported @@ -215,7 +215,7 @@ typedef struct { // -- display // list of strategies indexes **INCREMENTED BY 1** to display in the UI // 0 is reserved for end of array - // UNKNOW_LR_STRATEGY is used to display the "unknown" strategy + // UNKNOWN_LR_STRATEGY is used to display the "unknown" strategy // assumptions: // (i) in practice, we should not encounter more than // LR_STRATEGIES_COUNT +~ a few potential unsupported diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index c15b7ad..e9eb7f7 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -34,11 +34,11 @@ bool compare_addresses(const char a[ADDRESS_STR_LEN], const char b[ADDRESS_STR_L /** * @brief If address is a known erc20, update lr display context with its name - * otherwise set it to unkwown (UNKNOW_LR_ERC20) + * otherwise set it to unkwown (UNKNOWN_LR_ERC20) * * @param address: address to compare * - * @returns index of the erc20 in the context or UNKNOW_LR_ERC20 if not found + * @returns index of the erc20 in the context or UNKNOWN_LR_ERC20 if not found */ uint8_t find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { for (size_t i = 0; i < LR_STRATEGIES_COUNT; i++) { @@ -47,16 +47,16 @@ uint8_t find_lr_known_erc20(const char address[ADDRESS_STR_LEN]) { } } // if unknown erc20, indicate it - return UNKNOW_LR_ERC20; + return UNKNOWN_LR_ERC20; } /** * @brief If address is a known strategy, update lr display context with its name - * otherwise set it to unkwown (UNKNOW_LR_STRATEGY) + * otherwise set it to unkwown (UNKNOWN_LR_STRATEGY) * * @param address: address to compare * - * @returns index of the strategy in the context or UNKNOW_LR_STRATEGY if not found + * @returns index of the strategy in the context or UNKNOWN_LR_STRATEGY if not found */ uint8_t find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { for (size_t i = 0; i < LR_STRATEGIES_COUNT; i++) { @@ -65,7 +65,7 @@ uint8_t find_lr_known_strategy(const char address[ADDRESS_STR_LEN]) { } } // if unknown strategy, indicate it - return UNKNOW_LR_STRATEGY; + return UNKNOWN_LR_STRATEGY; } /** @@ -237,8 +237,8 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co uint8_t strategy_index = find_lr_known_strategy(address_buffer); params->strategies[params->strategies_count] = - (strategy_index != UNKNOW_LR_STRATEGY) ? strategy_index + 1 - : UNKNOW_LR_STRATEGY; + (strategy_index != UNKNOWN_LR_STRATEGY) ? strategy_index + 1 + : UNKNOWN_LR_STRATEGY; PRINTF("STRATEGY #: %d STRATEGY: %d\n", params->strategies_count, strategy_index); } @@ -462,8 +462,8 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con params->withdrawals[params->strategies_count] = params->withdrawals_count; params->strategies[params->strategies_count] = - (strategy_index != UNKNOW_LR_STRATEGY) ? strategy_index + 1 - : UNKNOW_LR_STRATEGY; + (strategy_index != UNKNOWN_LR_STRATEGY) ? strategy_index + 1 + : UNKNOWN_LR_STRATEGY; PRINTF("WITHDRAWAL #: %d STRATEGY #: %d STRATEGY: %d\n", params->parent_item_count, diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c index 08f38f0..84a6a46 100644 --- a/src/query_contract_ui/eigenlayer.c +++ b/src/query_contract_ui/eigenlayer.c @@ -34,7 +34,7 @@ bool deposit_into_strategy_ui(ethQueryContractUI_t *msg, context_t *context) { break; case 1: strlcpy(msg->title, "Strategy", msg->titleLength); - if (params->strategy_to_display == UNKNOW_LR_STRATEGY || + if (params->strategy_to_display == UNKNOWN_LR_STRATEGY || params->strategy_to_display >= LR_STRATEGIES_COUNT) { strlcpy(msg->msg, "UNKNOWN", msg->msgLength); } else { @@ -47,7 +47,7 @@ bool deposit_into_strategy_ui(ethQueryContractUI_t *msg, context_t *context) { amountToString(params->erc20_amount_to_display, sizeof(params->erc20_amount_to_display), ERC20_DECIMALS, - params->erc20_to_display == UNKNOW_LR_ERC20 || + params->erc20_to_display == UNKNOWN_LR_ERC20 || params->erc20_to_display >= LR_STRATEGIES_COUNT ? "UNKNOWN" : lr_tickers[params->erc20_to_display], @@ -90,7 +90,7 @@ bool queue_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context) { strlcpy(msg->title, "Strategy", msg->titleLength); uint8_t strategy = params->strategies[withdrawal_index]; - if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { + if (strategy == UNKNOWN_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { strlcpy(msg->msg, "UNKNOWN", msg->msgLength); } else { strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); @@ -141,7 +141,7 @@ bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *contex } uint8_t strategy = params->strategies[strategy_index]; - if (strategy == UNKNOW_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { + if (strategy == UNKNOWN_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { strlcpy(msg->msg, "UNKNOWN", msg->msgLength); } else { strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); From dcca922de03a1910b963298b81208406e57ec92e Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 16 May 2024 17:23:49 +0200 Subject: [PATCH 32/46] fix: I3 for lrQueueWithdrawals --- src/kiln_plugin.h | 10 +++ src/provide_parameter/eigenlayer.c | 103 +++++++++++++++++++++++++++-- 2 files changed, 109 insertions(+), 4 deletions(-) diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index a17a394..fab9a60 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -18,6 +18,7 @@ #include #include "eth_plugin_interface.h" +#include "cx.h" #include #define PLUGIN_NAME "Kiln" @@ -90,6 +91,7 @@ typedef enum { #define UNKNOWN_LR_STRATEGY 255 #define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) #define ERC20_DECIMALS 18 +#define PARAM_OFFSET 32 extern const char lr_strategy_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN]; extern const char lr_erc20_addresses[LR_STRATEGIES_COUNT][ADDRESS_STR_LEN]; @@ -185,10 +187,18 @@ typedef struct { bool is_kiln; } lr_delegate_to_t; +typedef struct { + uint8_t prev_checksum[CX_KECCAK_256_SIZE]; + uint32_t new_offset; +} checksum_offset_params_t; + typedef struct { // -- utils uint16_t queued_withdrawals_count; uint16_t current_item_count; + uint16_t shares_array_offset; + uint8_t qwithdrawals_offsets_checksum_preview[CX_KECCAK_256_SIZE]; + uint8_t qwithdrawals_offsets_checksum_value[CX_KECCAK_256_SIZE]; // -- display uint8_t strategies_count; diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index e9eb7f7..4e96ea8 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -183,9 +183,18 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co // ******************************************************************** // QUEUEWITHDRAWALPARAMS[] // ******************************************************************** - case LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET: + case LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_OFFSET: { + uint16_t offset; + U2BE_from_parameter(msg->parameter, &offset); + if (offset != PARAM_OFFSET) { + // valid offset should only skip this offset + PRINTF("Unexpected parameter offset\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } context->next_param = LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH; break; + } case LR_QUEUE_WITHDRAWALS_QWITHDRAWALS_LENGTH: U2BE_from_parameter(msg->parameter, ¶ms->queued_withdrawals_count); params->current_item_count = params->queued_withdrawals_count; @@ -195,7 +204,33 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co // ******************************************************************** // QUEUEWITHDRAWALPARAMS STRUCT // ******************************************************************** - case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET: + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRUCT_OFFSET: { + uint16_t offset; + U2BE_from_parameter(msg->parameter, &offset); + + // We have limited size on the context and can't store all the offset values + // of the queuedWithdrawal structs. So we compute their checksum and expect to + // be able to recompute it using the offset of the parsed structures later. + // _preview will be equal to _value at the end of the parsing if everything is fine + checksum_offset_params_t h_params; + memset(&h_params, 0, sizeof(h_params)); + memcpy(&h_params.prev_checksum, + &(params->qwithdrawals_offsets_checksum_preview), + sizeof(h_params.prev_checksum)); + + // we hash the previous checksum with the offset of the beginning of the structure. + // the offset we parse is actually after SELECTOR + the 2 above param so we add them to + // i the 2 above param so we add them to it. + h_params.new_offset = offset + SELECTOR_SIZE + PARAM_OFFSET * 2; + + if (cx_keccak_256_hash((void *) &h_params, + sizeof(h_params), + params->qwithdrawals_offsets_checksum_preview) != CX_OK) { + PRINTF("unable to compute keccak hash\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + // we skip all the queuewithdrawal structs offsets PRINTF("CURRENT ITEM COUNT: %d\n", params->current_item_count); if (params->current_item_count > 0) { @@ -206,20 +241,79 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET; } break; - case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET: + } + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_OFFSET: { + uint16_t offset; + U2BE_from_parameter(msg->parameter, &offset); + // here we are at the beginning of the queuedWithdrawal struct, so we want + // to compute the offset of the struct we're at for the queuedWithdrawal struct array + // offsets checksum + + checksum_offset_params_t h_params; + memset(&h_params, 0, sizeof(h_params)); + memcpy(&h_params.prev_checksum, + &(params->qwithdrawals_offsets_checksum_value), + sizeof(h_params.prev_checksum)); + h_params.new_offset = msg->parameterOffset; + + if (cx_keccak_256_hash((void *) &h_params, + sizeof(h_params), + params->qwithdrawals_offsets_checksum_value) != CX_OK) { + PRINTF("unable to compute keccak hash\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + + if (params->queued_withdrawals_count == 1) { + // if we are on the last item of the array of queuedWithdrawal struct + // we can check the checksum + if (memcmp(params->qwithdrawals_offsets_checksum_preview, + params->qwithdrawals_offsets_checksum_value, + sizeof(params->qwithdrawals_offsets_checksum_preview)) != 0) { + PRINTF("Checksums do not match\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } + + if (offset != PARAM_OFFSET * 3) { + // valid offset should only skip this + shares_offset + withdrawer + PRINTF("Unexpected parameter offset %d != %d\n", offset, PARAM_OFFSET * 3); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET; break; + } case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_OFFSET: + // we can only check this value once we know strategies array length + U2BE_from_parameter(msg->parameter, ¶ms->shares_array_offset); + context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER; break; case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER: context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH; break; - case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH: + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH: { // get number of item to parse U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); PRINTF("STRATEGIES LENGTH: %d\n", params->current_item_count); + { // check that the shares array offset is correct + // -- 1. we skip shares_offset + withdrawer + strategies_length + uint16_t should_be = PARAM_OFFSET * 3 + // -- 2. we skip the strategies array length + + PARAM_OFFSET + PARAM_OFFSET * params->current_item_count; + ; + if (params->shares_array_offset != should_be) { + PRINTF("Unexpected parameter offset %d != %d\n", + params->shares_array_offset, + should_be); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } + if (params->current_item_count == 0) { // if no strategies we go to the shares array context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_SHARES_LENGTH; @@ -227,6 +321,7 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM; } break; + } case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS__STRATEGIES_ITEM: { // get strategy we need to display { From 7ea7e66363604c02f8609a03b863a8c6f54f8371 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 16 May 2024 17:27:49 +0200 Subject: [PATCH 33/46] fix: I3 for lrDelegateTo --- src/provide_parameter/eigenlayer.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 4e96ea8..b703e08 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -784,12 +784,28 @@ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) break; } case LR_DELEGATE_TO_SIGNATURE_OFFSET: + uint16_t offset; + U2BE_from_parameter(msg->parameter, &offset); + if (offset != PARAM_OFFSET * 2) { + // valid offset should only skip this offset + approver_salt + PRINTF("Unexpected parameter offset\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } context->next_param = LR_DELEGATE_TO_APPROVER_SALT; break; case LR_DELEGATE_TO_APPROVER_SALT: context->next_param = LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET; break; case LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET: + uint16_t offset_sig; + U2BE_from_parameter(msg->parameter, &offset_sig); + if (offset_sig != PARAM_OFFSET * 2) { + // valid offset should only skip this offset + expiry + PRINTF("Unexpected parameter offset\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } context->next_param = LR_DELEGATE_TO_SIGNATURE_EXPIRY; break; case LR_DELEGATE_TO_SIGNATURE_EXPIRY: From bcc283d7b6d07807fce0715ceabf40585db9e65c Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 16 May 2024 17:58:31 +0200 Subject: [PATCH 34/46] fix: I3 for lrDelegateTo --- src/kiln_plugin.h | 6 ++++++ src/provide_parameter/eigenlayer.c | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index fab9a60..1b2df32 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -221,6 +221,11 @@ typedef struct { uint16_t relegations_count; uint8_t withdrawals_count; uint16_t strategies_count; + // -- offset verification + uint16_t tokens_offset; + uint16_t middlewareTimesIndexes_offset; + uint16_t receiveAsTokens_offset; + uint8_t withdrawals_offset[CX_KECCAK_256_SIZE]; // -- display // list of strategies indexes **INCREMENTED BY 1** to display in the UI @@ -245,6 +250,7 @@ typedef struct { // **************************************************************************** // * SHARED PLUGIN CONTEXT MEMORY // **************************************************************************** +// [100] receiveAsTokens_offset typedef struct context_t { uint8_t next_param; diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index b703e08..51c15ef 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -783,31 +783,33 @@ void handle_lr_delegate_to(ethPluginProvideParameter_t *msg, context_t *context) context->next_param = LR_DELEGATE_TO_SIGNATURE_OFFSET; break; } - case LR_DELEGATE_TO_SIGNATURE_OFFSET: + case LR_DELEGATE_TO_SIGNATURE_OFFSET: { uint16_t offset; U2BE_from_parameter(msg->parameter, &offset); - if (offset != PARAM_OFFSET * 2) { + if (offset != PARAM_OFFSET * 3) { // valid offset should only skip this offset + approver_salt - PRINTF("Unexpected parameter offset\n"); + PRINTF("Unexpected parameter offset %d != %d\n", offset, PARAM_OFFSET * 3); msg->result = ETH_PLUGIN_RESULT_ERROR; return; } context->next_param = LR_DELEGATE_TO_APPROVER_SALT; break; + } case LR_DELEGATE_TO_APPROVER_SALT: context->next_param = LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET; break; - case LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET: + case LR_DELEGATE_TO_SIGNATURE_SIG_OFFSET: { uint16_t offset_sig; U2BE_from_parameter(msg->parameter, &offset_sig); if (offset_sig != PARAM_OFFSET * 2) { // valid offset should only skip this offset + expiry - PRINTF("Unexpected parameter offset\n"); + PRINTF("Unexpected parameter offset %d != %d\n", offset_sig, PARAM_OFFSET * 2); msg->result = ETH_PLUGIN_RESULT_ERROR; return; } context->next_param = LR_DELEGATE_TO_SIGNATURE_EXPIRY; break; + } case LR_DELEGATE_TO_SIGNATURE_EXPIRY: context->next_param = LR_DELEGATE_TO_SIGNATURE_SIG_LENGTH; break; From c38a68cf529affe37f6c69a8656158a6ca39e70b Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 23 May 2024 09:06:36 +0200 Subject: [PATCH 35/46] fix: I3 for lrCompleteQueuedWithdrawals --- src/kiln_plugin.h | 17 +- src/provide_parameter/eigenlayer.c | 247 ++++++++++++++++++++++++++--- src/query_contract_ui/eigenlayer.c | 10 +- 3 files changed, 240 insertions(+), 34 deletions(-) diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 1b2df32..42667a0 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -88,7 +88,7 @@ typedef enum { #define LR_STRATEGIES_COUNT 11 #define UNKNOWN_LR_ERC20 255 -#define UNKNOWN_LR_STRATEGY 255 +#define UNKNOWN_LR_STRATEGY 15 // must be > LR_STRATEGIES_COUNT < 16 #define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) #define ERC20_DECIMALS 18 #define PARAM_OFFSET 32 @@ -225,25 +225,20 @@ typedef struct { uint16_t tokens_offset; uint16_t middlewareTimesIndexes_offset; uint16_t receiveAsTokens_offset; - uint8_t withdrawals_offset[CX_KECCAK_256_SIZE]; + uint16_t cached_offset; + uint8_t withdrawals_offsets_checksum_preview[CX_KECCAK_256_SIZE]; + uint8_t withdrawals_offsets_checksum_value[CX_KECCAK_256_SIZE]; // -- display // list of strategies indexes **INCREMENTED BY 1** to display in the UI - // 0 is reserved for end of array // UNKNOWN_LR_STRATEGY is used to display the "unknown" strategy // assumptions: // (i) in practice, we should not encounter more than // LR_STRATEGIES_COUNT +~ a few potential unsupported // strategies in the plugin. So * 3 should be a good enough buffer. - // (ii) in practice there should not be more than (2 ** 8) - 2 known strategies + // (ii) in practice there should not be more than (2 ** 4) - 2 known strategies + // (iii) the first 4 bytes are the withdrawal index, the next 4 bytes are the strategy index uint8_t strategies[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; - // follows the indexes of the strategies array in this structure. - // value is the withdrawal number - // assumptions: - // (i) in practice, we should not encounter more than - // 255 strategies in queued withdrawal calls - uint8_t withdrawals[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; - // follows the indexes of the strategies array in this structure bool is_redelegated[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; } lr_complete_queued_withdrawals_t; diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 51c15ef..376e9f7 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -220,7 +220,7 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co // we hash the previous checksum with the offset of the beginning of the structure. // the offset we parse is actually after SELECTOR + the 2 above param so we add them to - // i the 2 above param so we add them to it. + // it. h_params.new_offset = offset + SELECTOR_SIZE + PARAM_OFFSET * 2; if (cx_keccak_256_hash((void *) &h_params, @@ -267,6 +267,11 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co if (params->queued_withdrawals_count == 1) { // if we are on the last item of the array of queuedWithdrawal struct // we can check the checksum + PRINTF("CHECKSUMS %.*H %.*H\n", + sizeof(params->qwithdrawals_offsets_checksum_preview), + params->qwithdrawals_offsets_checksum_preview, + sizeof(params->qwithdrawals_offsets_checksum_value), + params->qwithdrawals_offsets_checksum_value); if (memcmp(params->qwithdrawals_offsets_checksum_preview, params->qwithdrawals_offsets_checksum_value, sizeof(params->qwithdrawals_offsets_checksum_preview)) != 0) { @@ -473,16 +478,29 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con // ******************************************************************** // FUNCTION PARAMETERS PARSING // ******************************************************************** - case LRCQW_WITHDRAWALS_OFFSET: + case LRCQW_WITHDRAWALS_OFFSET: { + uint16_t offset; + U2BE_from_parameter(msg->parameter, &offset); + if (offset != PARAM_OFFSET * 4) { + // valid offset should only skip this offset + tokens + middlewareTimesIndexes + + // receiveAsTokens offsets + PRINTF("Unexpected parameter offset %d != %d\n", offset, PARAM_OFFSET); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } context->next_param = LRCQW_TOKENS_OFFSET; break; + } case LRCQW_TOKENS_OFFSET: + U2BE_from_parameter(msg->parameter, &(params->tokens_offset)); context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_OFFSET; break; case LRCQW_MIDDLEWARE_TIMES_INDEXES_OFFSET: + U2BE_from_parameter(msg->parameter, &(params->middlewareTimesIndexes_offset)); context->next_param = LRCQW_RECEIVE_AS_TOKENS_OFFSET; break; case LRCQW_RECEIVE_AS_TOKENS_OFFSET: + U2BE_from_parameter(msg->parameter, &(params->receiveAsTokens_offset)); context->next_param = LRCQW_WITHDRAWALS_LENGTH; break; @@ -501,20 +519,81 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con context->next_param = LRCQW_WITHDRAWALS__OFFSET_ITEMS; } break; - case LRCQW_WITHDRAWALS__OFFSET_ITEMS: + case LRCQW_WITHDRAWALS__OFFSET_ITEMS: { + uint16_t offset; + U2BE_from_parameter(msg->parameter, &offset); + + // We have limited size on the context and can't store all the offset values + // of the Withdrawal structs. So we compute their checksum and expect to + // be able to recompute it using the offset of the parsed structures later. + // _preview will be equal to _value at the end of the parsing if everything is fine + checksum_offset_params_t h_params; + memset(&h_params, 0, sizeof(h_params)); + memcpy(&h_params.prev_checksum, + &(params->withdrawals_offsets_checksum_preview), + sizeof(h_params.prev_checksum)); + // we hash the previous checksum with the offset of the beginning of the structure. + // the offset we parse is actually after SELECTOR + the 5 above param so we add them to + // it. + h_params.new_offset = offset + SELECTOR_SIZE + PARAM_OFFSET * 5; + + if (cx_keccak_256_hash((void *) &h_params, + sizeof(h_params), + params->withdrawals_offsets_checksum_preview) != CX_OK) { + PRINTF("unable to compute keccak hash\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } params->current_item_count -= 1; if (params->current_item_count == 0) { context->next_param = LRCQW_WITHDRAWALS__ITEM__STAKER; } break; + } // ******************************************************************** // WITHDRAWAL STRUCT PARSING // ******************************************************************** - case LRCQW_WITHDRAWALS__ITEM__STAKER: + case LRCQW_WITHDRAWALS__ITEM__STAKER: { + // here we are at the beginning of the queuedWithdrawal struct, so we want + // to compute the offset of the struct we're at for the queuedWithdrawal struct array + // offsets checksum + + checksum_offset_params_t h_params; + memset(&h_params, 0, sizeof(h_params)); + memcpy(&(h_params.prev_checksum), + &(params->withdrawals_offsets_checksum_value), + sizeof(h_params.prev_checksum)); + h_params.new_offset = msg->parameterOffset; + + if (cx_keccak_256_hash((void *) &h_params, + sizeof(h_params), + params->withdrawals_offsets_checksum_value) != CX_OK) { + PRINTF("unable to compute keccak hash\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + + if (params->parent_item_count == 1) { + // if we are on the last item of the array of withdrawal struct + // we can check the checksum + PRINTF("CHECKSUMS %.*H %.*H\n", + sizeof(params->withdrawals_offsets_checksum_preview), + params->withdrawals_offsets_checksum_preview, + sizeof(params->withdrawals_offsets_checksum_value), + params->withdrawals_offsets_checksum_value); + if (memcmp(params->withdrawals_offsets_checksum_preview, + params->withdrawals_offsets_checksum_value, + sizeof(params->withdrawals_offsets_checksum_preview)) != 0) { + PRINTF("Checksums do not match\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } context->next_param = LRCQW_WITHDRAWALS__ITEM__DELEGATED_TO; break; + } case LRCQW_WITHDRAWALS__ITEM__DELEGATED_TO: context->next_param = LRCQW_WITHDRAWALS__ITEM__WITHDRAWER; break; @@ -527,10 +606,30 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con case LRCQW_WITHDRAWALS__ITEM__START_BLOCK: context->next_param = LRCQW_WITHDRAWALS__ITEM__STRATEGIES_OFFSET; break; - case LRCQW_WITHDRAWALS__ITEM__STRATEGIES_OFFSET: + case LRCQW_WITHDRAWALS__ITEM__STRATEGIES_OFFSET: { + { + uint16_t offset; + + U2BE_from_parameter(msg->parameter, &offset); + if (offset != PARAM_OFFSET * 7) { + // valid offset should only skip the above elements in the structure + this one + // + shares offset + PRINTF("Unexpected parameter offset %d != %d\n", offset, PARAM_OFFSET * 7); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } context->next_param = LRCQW_WITHDRAWALS__ITEM__SHARES_OFFSET; break; - case LRCQW_WITHDRAWALS__ITEM__SHARES_OFFSET: + } + case LRCQW_WITHDRAWALS__ITEM__SHARES_OFFSET: { + uint16_t offset; + U2BE_from_parameter(msg->parameter, &offset); + + // save offset to verify it on array start + // offset starts at the beginning of the structure (current scope) + params->cached_offset = offset + (msg->parameterOffset - PARAM_OFFSET * 6); + } context->next_param = LRCQW_WITHDRAWALS__ITEM__STRATEGIES_LENGTH; break; case LRCQW_WITHDRAWALS__ITEM__STRATEGIES_LENGTH: @@ -554,16 +653,21 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con uint8_t strategy_index = find_lr_known_strategy(address_buffer); if (params->strategies_count < MAX_DISPLAYABLE_LR_STRATEGIES_COUNT) { - params->withdrawals[params->strategies_count] = params->withdrawals_count; + uint8_t withdrawal = params->withdrawals_count; - params->strategies[params->strategies_count] = - (strategy_index != UNKNOWN_LR_STRATEGY) ? strategy_index + 1 - : UNKNOWN_LR_STRATEGY; + uint8_t strategy = (strategy_index != UNKNOWN_LR_STRATEGY) + ? strategy_index + : UNKNOWN_LR_STRATEGY; + + if (withdrawal > 16 || strategy > 16) { + PRINTF("INVALID WITHDRAWAL #: %d STRATEGY #: %d\n", withdrawal, strategy); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } - PRINTF("WITHDRAWAL #: %d STRATEGY #: %d STRATEGY: %d\n", - params->parent_item_count, - params->strategies_count, - strategy_index); + params->strategies[params->strategies_count] = + (withdrawal << 4) | (strategy & 0x0F); + ; } } @@ -578,6 +682,14 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con } case LRCQW_WITHDRAWALS__ITEM__SHARES_LENGTH: + if (params->cached_offset != msg->parameterOffset) { + PRINTF("Unexpected shares parameter offset %d != %d\n", + params->cached_offset, + msg->parameterOffset); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); PRINTF("LRCQW_WITHDRAWALS__ITEM__SHARES_LENGTH: %d\n", params->current_item_count); @@ -615,33 +727,115 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con // ******************************************************************** case LRCQW_TOKENS_LENGTH: + if (params->tokens_offset != msg->parameterOffset - SELECTOR_SIZE) { + PRINTF("Unexpected tokens parameter offset %d != %d\n", + params->tokens_offset, + msg->parameterOffset); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + U2BE_from_parameter(msg->parameter, ¶ms->parent_item_count); params->current_item_count = params->parent_item_count; PRINTF("LRCQW_TOKENS_LENGTH: %d\n", params->parent_item_count); + // reset checksums and cached offset + memset(¶ms->withdrawals_offsets_checksum_preview, + 0, + sizeof(params->withdrawals_offsets_checksum_preview)); + memset(¶ms->withdrawals_offsets_checksum_value, + 0, + sizeof(params->withdrawals_offsets_checksum_value)); + params->cached_offset = 0; + if (params->parent_item_count == 0) { context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH; } else { context->next_param = LRCQW_TOKENS__OFFSET_ITEMS; } break; - case LRCQW_TOKENS__OFFSET_ITEMS: + case LRCQW_TOKENS__OFFSET_ITEMS: { + { + // We have limited size on the context and can't store all the offset values + // of the tokens structs. So we compute their checksum and expect to + // be able to recompute it using the offset of the parsed items later. + // _preview will be equal to _value at the end of the parsing if everything is fine + checksum_offset_params_t h_params; + memset(&h_params, 0, sizeof(h_params)); + memcpy(&h_params.prev_checksum, + &(params->withdrawals_offsets_checksum_preview), + sizeof(h_params.prev_checksum)); + // we hash the previous checksum with the offset we receive. + uint16_t offset; + U2BE_from_parameter(msg->parameter, &offset); + + // if we are on the first element of the array, we save the offset, which all + // received offset values will be based on for checksum computation + if (params->cached_offset == 0) { + params->cached_offset = msg->parameterOffset; + } + + h_params.new_offset = offset + params->cached_offset; + + if (cx_keccak_256_hash((void *) &h_params, + sizeof(h_params), + params->withdrawals_offsets_checksum_preview) != CX_OK) { + PRINTF("unable to compute keccak hash\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } params->current_item_count -= 1; if (params->current_item_count == 0) { context->next_param = LRCQW_TOKENS__ITEM__LENGTH; } break; + } // ******************************************************************** // TOKENS[][] PARSING // ^ // ******************************************************************** - case LRCQW_TOKENS__ITEM__LENGTH: + case LRCQW_TOKENS__ITEM__LENGTH: { + { + checksum_offset_params_t h_params; + memset(&h_params, 0, sizeof(h_params)); + memcpy(&h_params.prev_checksum, + &(params->withdrawals_offsets_checksum_value), + sizeof(h_params.prev_checksum)); + // we hash the previous checksum with the offset of the beginning of the structure. + h_params.new_offset = msg->parameterOffset; + + if (cx_keccak_256_hash((void *) &h_params, + sizeof(h_params), + params->withdrawals_offsets_checksum_value) != CX_OK) { + PRINTF("unable to compute keccak hash\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); PRINTF("LRCQW_TOKENS__ITEM__LENGTH: %d\n", params->current_item_count); + if (params->parent_item_count == 1) { + // if we are on the last item of the array of tokens struct + // we can check the checksum + PRINTF("TOKENS[] CHECKSUMS %.*H %.*H\n", + sizeof(params->withdrawals_offsets_checksum_preview), + params->withdrawals_offsets_checksum_preview, + sizeof(params->withdrawals_offsets_checksum_value), + params->withdrawals_offsets_checksum_value); + if (memcmp(params->withdrawals_offsets_checksum_preview, + params->withdrawals_offsets_checksum_value, + sizeof(params->withdrawals_offsets_checksum_preview)) != 0) { + PRINTF("Checksums do not match\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } + if (params->current_item_count == 0) { context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH; } else { @@ -649,16 +843,17 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con } break; + } case LRCQW_TOKENS__ITEM__ITEMS: params->current_item_count -= 1; if (params->current_item_count == 0) { // we arrive at the end of the tokens array params->parent_item_count -= 1; if (params->parent_item_count == 0) { - // if we don't have other Withdrawals to parse + // if we don't have other Tokens to parse context->next_param = LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH; } else { - // if we have other Withdrawals to parse + // if we have other Tokens to parse context->next_param = LRCQW_TOKENS__ITEM__LENGTH; } } @@ -669,6 +864,14 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con // ******************************************************************** case LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH: + if (params->middlewareTimesIndexes_offset != msg->parameterOffset - SELECTOR_SIZE) { + PRINTF("Unexpected middlewareTimesIndexes parameter offset %d != %d\n", + params->middlewareTimesIndexes_offset, + msg->parameterOffset); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); PRINTF("LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH: %d\n", params->current_item_count); @@ -691,6 +894,14 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con // ******************************************************************** case LRCQW_RECEIVE_AS_TOKENS_LENGTH: + if (params->receiveAsTokens_offset != msg->parameterOffset - SELECTOR_SIZE) { + PRINTF("Unexpected receiveAsTokens parameter offset %d != %d\n", + params->receiveAsTokens_offset, + msg->parameterOffset); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); // we save the number of redelegations to parse params->relegations_count = params->current_item_count; diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c index 84a6a46..d95ffeb 100644 --- a/src/query_contract_ui/eigenlayer.c +++ b/src/query_contract_ui/eigenlayer.c @@ -130,21 +130,21 @@ bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *contex // removing the first screen to current screen index // to get the index of the withdrawal uint8_t strategy_index = msg->screenIndex - 1; - uint8_t withdrawal_index = params->withdrawals[strategy_index]; - PRINTF("strat: %d || withdrawal_index: %d\n", strategy_index, withdrawal_index); if (strategy_index < params->strategies_count) { + uint8_t withdrawal_index = (params->strategies[strategy_index] >> 4) & 0x0F; + if (params->is_redelegated[withdrawal_index]) { strlcpy(msg->title, "Redelegate", msg->titleLength); } else { strlcpy(msg->title, "Withdraw", msg->titleLength); } - uint8_t strategy = params->strategies[strategy_index]; - if (strategy == UNKNOWN_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { + uint8_t strategy = params->strategies[strategy_index] & 0x0F; + if (strategy == UNKNOWN_LR_STRATEGY || strategy >= LR_STRATEGIES_COUNT) { strlcpy(msg->msg, "UNKNOWN", msg->msgLength); } else { - strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); + strlcpy(msg->msg, lr_tickers[strategy], msg->msgLength); } } From 0e7bdc7504151df2ff0c6deda33451fb609cda4f Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 23 May 2024 11:25:58 +0200 Subject: [PATCH 36/46] fix: I7 --- src/provide_parameter/eigenlayer.c | 34 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 376e9f7..073ac5e 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -652,23 +652,25 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); uint8_t strategy_index = find_lr_known_strategy(address_buffer); - if (params->strategies_count < MAX_DISPLAYABLE_LR_STRATEGIES_COUNT) { - uint8_t withdrawal = params->withdrawals_count; - - uint8_t strategy = (strategy_index != UNKNOWN_LR_STRATEGY) - ? strategy_index - : UNKNOWN_LR_STRATEGY; - - if (withdrawal > 16 || strategy > 16) { - PRINTF("INVALID WITHDRAWAL #: %d STRATEGY #: %d\n", withdrawal, strategy); - msg->result = ETH_PLUGIN_RESULT_ERROR; - return; - } - - params->strategies[params->strategies_count] = - (withdrawal << 4) | (strategy & 0x0F); - ; + if (params->strategies_count >= MAX_DISPLAYABLE_LR_STRATEGIES_COUNT) { + PRINTF("Too many strategies to display, reverting\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + uint8_t withdrawal = params->withdrawals_count; + + uint8_t strategy = + (strategy_index != UNKNOWN_LR_STRATEGY) ? strategy_index : UNKNOWN_LR_STRATEGY; + + if (withdrawal > 16 || strategy > 16) { + PRINTF("INVALID WITHDRAWAL #: %d STRATEGY #: %d\n", withdrawal, strategy); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; } + + params->strategies[params->strategies_count] = + (withdrawal << 4) | (strategy & 0x0F); + ; } // we just processed one strategy item From 4f21dd643c289698f12bf39ca6f0b37083eabb3e Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 23 May 2024 16:15:06 +0200 Subject: [PATCH 37/46] fix: I5-1 --- PLUGIN_SPECIFICATION.md | 36 +++++++++--------- README.md | 1 + src/handle_finalize.c | 4 +- src/kiln_plugin.h | 1 + src/provide_parameter/eigenlayer.c | 22 +++++++++-- src/query_contract_ui/eigenlayer.c | 12 ++++-- .../00003.png | Bin 349 -> 509 bytes .../00004.png | Bin 368 -> 497 bytes .../00005.png | Bin 358 -> 438 bytes .../00006.png | Bin 414 -> 349 bytes .../00007.png | Bin 349 -> 368 bytes .../00008.png | Bin 0 -> 358 bytes .../00009.png | Bin 0 -> 414 bytes .../00010.png | Bin 0 -> 349 bytes .../00003.png | Bin 349 -> 509 bytes .../00004.png | Bin 368 -> 497 bytes .../00005.png | Bin 353 -> 438 bytes .../00006.png | Bin 341 -> 349 bytes .../00007.png | Bin 349 -> 368 bytes .../00008.png | Bin 345 -> 353 bytes .../00009.png | Bin 358 -> 341 bytes .../00010.png | Bin 414 -> 349 bytes .../00011.png | Bin 349 -> 345 bytes .../00012.png | Bin 0 -> 358 bytes .../00013.png | Bin 0 -> 414 bytes .../00014.png | Bin 0 -> 349 bytes .../00003.png | Bin 349 -> 509 bytes .../00004.png | Bin 396 -> 497 bytes .../00005.png | Bin 353 -> 438 bytes .../00006.png | Bin 341 -> 349 bytes .../00007.png | Bin 345 -> 396 bytes .../00008.png | Bin 396 -> 353 bytes .../00009.png | Bin 358 -> 341 bytes .../00010.png | Bin 414 -> 345 bytes .../00011.png | Bin 349 -> 396 bytes .../00012.png | Bin 0 -> 358 bytes .../00013.png | Bin 0 -> 414 bytes .../00014.png | Bin 0 -> 349 bytes .../00003.png | Bin 402 -> 811 bytes .../00004.png | Bin 418 -> 402 bytes .../00005.png | Bin 415 -> 418 bytes .../00006.png | Bin 472 -> 415 bytes .../00007.png | Bin 381 -> 472 bytes .../00008.png | Bin 0 -> 381 bytes .../00003.png | Bin 402 -> 811 bytes .../00004.png | Bin 418 -> 402 bytes .../00005.png | Bin 410 -> 418 bytes .../00006.png | Bin 392 -> 410 bytes .../00007.png | Bin 402 -> 392 bytes .../00008.png | Bin 393 -> 402 bytes .../00009.png | Bin 415 -> 393 bytes .../00010.png | Bin 472 -> 415 bytes .../00011.png | Bin 381 -> 472 bytes .../00012.png | Bin 0 -> 381 bytes .../00003.png | Bin 402 -> 811 bytes .../00004.png | Bin 445 -> 402 bytes .../00005.png | Bin 410 -> 445 bytes .../00006.png | Bin 392 -> 410 bytes .../00007.png | Bin 393 -> 392 bytes .../00008.png | Bin 445 -> 393 bytes .../00009.png | Bin 415 -> 445 bytes .../00010.png | Bin 472 -> 415 bytes .../00011.png | Bin 381 -> 472 bytes .../00012.png | Bin 0 -> 381 bytes tests/src/lrQueueWithdrawals.test.js | 6 +-- 65 files changed, 53 insertions(+), 29 deletions(-) create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00008.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00009.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00010.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00012.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00013.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00013.png create mode 100644 tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png create mode 100644 tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png diff --git a/PLUGIN_SPECIFICATION.md b/PLUGIN_SPECIFICATION.md index 811d32d..67fdd07 100644 --- a/PLUGIN_SPECIFICATION.md +++ b/PLUGIN_SPECIFICATION.md @@ -20,21 +20,21 @@ Smart contracts covered by the plugin: For the smart contracts implemented, the functions covered by the plugin are: -| Contract | Function | Selector | Displayed Parameters | -| -------- | ------------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | -| OCV1 | deposit | `0xd0e30db0` |
uint tx.value
| -| OCV1 | withdraw | `0x0968f264` |
n/r
| -| OCV1 | withdrawELFee | `0xbf509bd4` |
n/r
| -| OCV1 | withdrawCLFee | `0x2ba03a79` |
n/r
| -| OCV1 | batchWithdraw | `0xe8a0c121` |
n/r
| -| OCV1 | batchWithdrawELFee | `0xef5e4682` |
n/r
| -| OCV1 | batchWithdrawCLFee | `0x0ffab6c2` |
n/r
| -| OCV2-N20 | stake | `0x3a4b66f1` |
uint tx.value
| -| OCV2-N20 | requestExit | `0x721c6513` |
n/r
| -| OCV2-N20 | multiClaim | `0xb7ba18c7` |
n/r
| -| OCV2-EQ | claim | `0xadcf1163` |
n/r
| -| EL-SM | depositIntoStrategy | `0xe7a050aa` |
address strategy
address ERC20
| -| EL-SM | queueWithdrawals | `0x0dd8dd02` |
queuedWithdrawalParams.strategies[] as string using an internal mapping
| -| EL-SM | completeQueuedWithdrawals | `0x33404396` |
strategies as string using an internal mapping
redelegated or withdrawal action
| -| EL-DM | delegateTo | `0xeea9064b` |
address operator or "KILN"
| -| EL-DM | undelegate | `0xda8be864` |
type ParameterName
| +| Contract | Function | Selector | Displayed Parameters | +| -------- | ------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| OCV1 | deposit | `0xd0e30db0` |
uint tx.value
| +| OCV1 | withdraw | `0x0968f264` |
n/r
| +| OCV1 | withdrawELFee | `0xbf509bd4` |
n/r
| +| OCV1 | withdrawCLFee | `0x2ba03a79` |
n/r
| +| OCV1 | batchWithdraw | `0xe8a0c121` |
n/r
| +| OCV1 | batchWithdrawELFee | `0xef5e4682` |
n/r
| +| OCV1 | batchWithdrawCLFee | `0x0ffab6c2` |
n/r
| +| OCV2-N20 | stake | `0x3a4b66f1` |
uint tx.value
| +| OCV2-N20 | requestExit | `0x721c6513` |
n/r
| +| OCV2-N20 | multiClaim | `0xb7ba18c7` |
n/r
| +| OCV2-EQ | claim | `0xadcf1163` |
n/r
| +| EL-SM | depositIntoStrategy | `0xe7a050aa` |
address strategy
address ERC20
| +| EL-SM | queueWithdrawals | `0x0dd8dd02` |
queuedWithdrawalParams.strategies[] as string using an internal mapping
queuedWithdrawalParams.withdrawer
| +| EL-SM | completeQueuedWithdrawals | `0x33404396` |
strategies as string using an internal mapping
redelegated or withdrawal action
| +| EL-DM | delegateTo | `0xeea9064b` |
address operator or "KILN"
| +| EL-DM | undelegate | `0xda8be864` |
type ParameterName
| diff --git a/README.md b/README.md index 7aa0dae..8c98ae1 100644 --- a/README.md +++ b/README.md @@ -318,6 +318,7 @@ function queueWithdrawals( Clearsigned: - strategies: using mapping in `contracts.c`, they are either recognized or displayed as "UNKOWN" +- withdrawer Shares are confusing for users and would be hard to store properly on the device for display. diff --git a/src/handle_finalize.c b/src/handle_finalize.c index 96856f0..3e48ed8 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -48,8 +48,8 @@ void handle_finalize(ethPluginFinalize_t *msg) { case KILN_LR_QUEUE_WITHDRAWALS: { { lr_queue_withdrawals_t *params = &context->param_data.lr_queue_withdrawals; - // function screen - msg->numScreens = 1; + // function screen + withdrawer + msg->numScreens = 2; // one screen per withdrawal msg->numScreens += params->strategies_count; PRINTF("NUMBER OF STRATEGIES TO DISPLAY: %d\n", params->strategies_count); diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 42667a0..1f9f059 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -201,6 +201,7 @@ typedef struct { uint8_t qwithdrawals_offsets_checksum_value[CX_KECCAK_256_SIZE]; // -- display + char withdrawer[ADDRESS_STR_LEN]; uint8_t strategies_count; // list of strategies indexes **INCREMENTED BY 1** to display in the UI // 0 is reserved for end of array diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 073ac5e..cc9d78e 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -296,9 +296,26 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER; break; - case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER: + case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_WITHDRAWER: { + { + uint8_t buffer[ADDRESS_LENGTH]; + copy_address(buffer, msg->parameter, sizeof(buffer)); + char address_buffer[ADDRESS_STR_LEN]; + getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); + // we only support same withdrawer accross all the withdrawals + if (params->withdrawer[0] == '\0') { + memcpy(params->withdrawer, address_buffer, sizeof(params->withdrawer)); + } else if (strcmp(params->withdrawer, address_buffer) != 0) { + PRINTF("Unexpected withdrawer address, %s != expected %s\n", + msg->parameter, + params->withdrawer); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } context->next_param = LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH; break; + } case LR_QUEUE_WITHDRAWALS__QWITHDRAWALS_STRATEGIES_LENGTH: { // get number of item to parse U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); @@ -337,8 +354,7 @@ void handle_lr_queue_withdrawals(ethPluginProvideParameter_t *msg, context_t *co uint8_t strategy_index = find_lr_known_strategy(address_buffer); params->strategies[params->strategies_count] = - (strategy_index != UNKNOWN_LR_STRATEGY) ? strategy_index + 1 - : UNKNOWN_LR_STRATEGY; + (strategy_index != UNKNOWN_LR_STRATEGY) ? strategy_index : UNKNOWN_LR_STRATEGY; PRINTF("STRATEGY #: %d STRATEGY: %d\n", params->strategies_count, strategy_index); } diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c index d95ffeb..69096af 100644 --- a/src/query_contract_ui/eigenlayer.c +++ b/src/query_contract_ui/eigenlayer.c @@ -80,20 +80,26 @@ bool queue_withdrawals_ui(ethQueryContractUI_t *msg, context_t *context) { ret = true; break; + case 1: + strlcpy(msg->title, "Withdrawer", msg->titleLength); + strlcpy(msg->msg, params->withdrawer, msg->msgLength); + ret = true; + break; + default: { { // removing the first screen to current screen index // to get the index of the withdrawal - uint8_t withdrawal_index = msg->screenIndex - 1; + uint8_t withdrawal_index = msg->screenIndex - 2; if (withdrawal_index < params->strategies_count) { strlcpy(msg->title, "Strategy", msg->titleLength); uint8_t strategy = params->strategies[withdrawal_index]; - if (strategy == UNKNOWN_LR_STRATEGY || strategy - 1 >= LR_STRATEGIES_COUNT) { + if (strategy == UNKNOWN_LR_STRATEGY || strategy >= LR_STRATEGIES_COUNT) { strlcpy(msg->msg, "UNKNOWN", msg->msgLength); } else { - strlcpy(msg->msg, lr_tickers[strategy - 1], msg->msgLength); + strlcpy(msg->msg, lr_tickers[strategy], msg->msgLength); } } diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00003.png index 827de905d9c320a7426bc6a64da96948880e1ecd..06c3c59a9000082a980407c1e47a01c43dbfef53 100644 GIT binary patch delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g5ztKR{#J2 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00004.png index 1f3bd76943eb3d66ccc709e45f8ad422d63be352..53e7aa041e7dc3e9453476b700c868cce35e5416 100644 GIT binary patch delta 471 zcmV;|0Vw|P0`UWoB!9R`L_t(|ob8!i7s4P2hFPcn{}1k>E_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1i6W>e&DQ delta 341 zcmV-b0jmD-1MmWnB!4$aL_t(|ob8!G5`!=ZMbT;Re_$8w!kIKBKyYg1$M9B3#4+-b zBuJDbNs`RU5oPO(x%2Yc zxTor_7~^G7v^>-Z%=JZP z3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0J@6fyN3Z!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00007w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uB4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$f@|%T_y7O^ delta 387 zcmV-}0et@50-ghqB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=3a diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00007.png index ce795f34e8569e986af689fded3b59c9a8af2961..1f3bd76943eb3d66ccc709e45f8ad422d63be352 100644 GIT binary patch delta 341 zcmV-b0jmDp0`LNmB!4$aL_t(|ob8!G5`!=ZMbT;Re_$8w!kIKBKyYg1$M9B3#4+-b zBuJDbNs`RU5oPO(x%2Yc zxTor_7~^G7v^>-Z%=JZP z3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0J@6fyN3ZCfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&ipy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00010.png b/tests/snapshots/nanos_lrQueueWithdrawals_1_2_dimension/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00003.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00003.png index 827de905d9c320a7426bc6a64da96948880e1ecd..06c3c59a9000082a980407c1e47a01c43dbfef53 100644 GIT binary patch delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g5ztKR{#J2 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00004.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00004.png index 1f3bd76943eb3d66ccc709e45f8ad422d63be352..53e7aa041e7dc3e9453476b700c868cce35e5416 100644 GIT binary patch delta 471 zcmV;|0Vw|P0`UWoB!9R`L_t(|ob8!i7s4P2hFPcn{}1k>E_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1i6W>e&DQ delta 341 zcmV-b0jmD-1MmWnB!4$aL_t(|ob8!G5`!=ZMbT;Re_$8w!kIKBKyYg1$M9B3#4+-b zBuJDbNs`RU5oPO(x%2Yc zxTor_7~^G7v^>-Z%=JZP z3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0J@6fyN3Z!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00004#OY_Md`Br{|EP>duZY)3T4R_F3NdQrzzti zT1r$DMNzEE7Ht3#5gq%dy}jb>SQajTHsW8K3YZ2*5&PCm#-CFF>UzVbvbtF zDc&8%cpDtf{HhVkGui+mx<;!VlDA&NaH}5-0Zv3pF{Y93=zm^6kFIeb3GgR`>zm9N zl3)m6WO*&3hcm^AE#_l*{Elon)IvMh1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=U zZQ**SBzRHJfj<;LLnKh=R?xmQVDPw~0)i;@%t9UkPNvfUG6gw{nv)*OMNt$*Q4}li Y20yu>UQ$TBBLDyZ07*qoM6N<$f>zm=6#xJL diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00006.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00006.png index 9d9f05a0a8b72e6003ed4c63b990c15e5cc59db4..827de905d9c320a7426bc6a64da96948880e1ecd 100644 GIT binary patch delta 322 zcmV-I0log!0^I_TB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g0I?_E&u=k delta 314 zcmV-A0mc5^0@VVLB!3)9L_t(|ob8#>4#OY_MQOAB{|EP>duZY;BD!P^SH0&+9j1(n zXsrk#gpgI)q8$(sk@NVrw|AT$%aRLF8|j}r6fi3wPkgl?Qa5j#-F&XvA4C zQhC?R@ib^!{?rKN743kC+_TkB$!63r!rBjp02ivHIA&50bbqN|kFIeb3Gfgq^hst6 zNiYO(s(dY@O-r?7D|?KHw-~L4dek=d!2ei0de=XXktW09?Q=8be&Radrekh--VMR< z0l}@MpazkwRfW*F2f4Tl8e$)Iu7K1a+RYDw4}YMxQk@GWXI3Z}FJdLmh3H(M3Ly7a z*|N@bN&=bnIWxcl_;fCX+GhqB_O=Om5(*H^uq9~TZJ7{42q9zzKEOhkOjSi69RL6T M07*qoM6N<$g0s4f)Bpeg diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00007.png index 827de905d9c320a7426bc6a64da96948880e1ecd..1f3bd76943eb3d66ccc709e45f8ad422d63be352 100644 GIT binary patch delta 341 zcmV-b0jmDp0`LNmB!4$aL_t(|ob8!G5`!=ZMbT;Re_$8w!kIKBKyYg1$M9B3#4+-b zBuJDbNs`RU5oPO(x%2Yc zxTor_7~^G7v^>-Z%=JZP z3`sBqFtWTB(V`_=v6(%F$9s&HLoKw0J@6fyN3Z4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g3-{INdN!< diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00008.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00008.png index bceed68d6a9b6e6ceee1ec9be8c8912b8456c5cf..fcae7bce0df5c6b52ce6aaaf424b60c86ebfdc15 100644 GIT binary patch delta 326 zcmV-M0lEI!0^tIXB!4JLL_t(|ob8#>4#OY_Md`Br{|EP>duZY)3T4R_F3NdQrzzti zT1r$DMNzEE7Ht3#5gq%dy}jb>SQajTHsW8K3YZ2*5&PCm#-CFF>UzVbvbtF zDc&8%cpDtf{HhVkGui+mx<;!VlDA&NaH}5-0Zv3pF{Y93=zm^6kFIeb3GgR`>zm9N zl3)m6WO*&3hcm^AE#_l*{Elon)IvMh1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=U zZQ**SBzRHJfj<;LLnKh=R?xmQVDPw~0)i;@%t9UkPNvfUG6gw{nv)*OMNt$*Q4}li Y20yu>UQ$TBBLDyZ07*qoM6N<$f`TTOHvj+t delta 318 zcmV-E0m1&^0@(tPB!3`DL_t(|ob8#-62l+}gh{4-{|C+?J!HmO1T=>XYu)dpmP{y% z_!ALA2qCMoWji1uBIogKZ|^)mmZcWJ8ySCgDqv2O-r?6D|?KH_n57QMtBQ*;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L z1A<#iK@Bols|um<8|3CL2xlEu+0bq)#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#l zPQrH?JlvvYeK*aV0t}W>?;8UWEJ4XofMifhP2q8rC0d5YLL|(dz Q?*IS*07*qoM6N<$f)@IcJpcdz diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00009.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00009.png index eeec6324a1f33b9b155d3e979728a086251adb10..9d9f05a0a8b72e6003ed4c63b990c15e5cc59db4 100644 GIT binary patch delta 314 zcmV-A0mc620@VVLB!3)9L_t(|ob8#>4#OY_MQOAB{|EP>duZY;BD!P^SH0&+9j1(n zXsrk#gpgI)q8$(sk@NVrw|AT$%aRLF8|j}r6fi3wPkgl?Qa5j#-F&XvA4C zQhC?R@ib^!{?rKN743kC+_TkB$!63r!rBjp02ivHIA&50bbqN|kFIeb3Gfgq^hst6 zNiYO(s(dY@O-r?7D|?KHw-~L4dek=d!2ei0de=XXktW09?Q=8be&Radrekh--VMR< z0l}@MpazkwRfW*F2f4Tl8e$)Iu7K1a+RYDw4}YMxQk@GWXI3Z}FJdLmh3H(M3Ly7a z*|N@bN&=bnIWxcl_;fCX+GhqB_O=Om5(*H^uq9~TZJ7{42q9zzKEOhkOjSi69RL6T M07*qoM6N<$g1*F!-2eap delta 331 zcmV-R0kr7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uB4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$f@|%T_y7O^ delta 387 zcmV-}0et@50-ghqB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=3a diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00011.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00011.png index ce795f34e8569e986af689fded3b59c9a8af2961..bceed68d6a9b6e6ceee1ec9be8c8912b8456c5cf 100644 GIT binary patch delta 318 zcmV-E0m1&=0@(tPB!3`DL_t(|ob8#-62l+}gh{4-{|C+?J!HmO1T=>XYu)dpmP{y% z_!ALA2qCMoWji1uBIogKZ|^)mmZcWJ8ySCgDqv2O-r?6D|?KH_n57QMtBQ*;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L z1A<#iK@Bols|um<8|3CL2xlEu+0bq)#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#l zPQrH?JlvvYeK*aV0t}W>?;8UWEJ4XofMifhP2q8rC0d5YLL|(dz Q?*IS*07*qoM6N<$f)WCfIRF3v delta 322 zcmV-I0log&0^I_TB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&ipy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png index 827de905d9c320a7426bc6a64da96948880e1ecd..06c3c59a9000082a980407c1e47a01c43dbfef53 100644 GIT binary patch delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g5ztKR{#J2 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00004.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00004.png index f6d556916108fab7602b510c4ceb72780470fd7e..53e7aa041e7dc3e9453476b700c868cce35e5416 100644 GIT binary patch delta 471 zcmV;|0Vw{A1MvfpB!9R`L_t(|ob8!i7s4P2hFPcn{}1k>E_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1kwr>UIDC delta 369 zcmV-%0gnFh1B?TZB!5#$L_t(|ob8!G5`!QNMPsME|AAe!3ujUqLWmAFU&)&;ga*O< z01=6jBuSE4S)vC(L`3iPd%e8k#xX6W0IeE-+e-m61IoY`6M~E7wOTCOilQ)6`<<8f zDm_&e)fneW)pFNGD9`8t5Ycb6+9BEX8irf_Uss_%q#Cgo1+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M z_MYAcQn|MhAZiLDKdX~t=b^=r-cJTbfEEK^O?ZkRZFNWjsIF=G>n@W3Nq`n$F*_D8 z0d~c^Uzp93moia2aKmx@_cT=fh-ll0dSf@P8y?s^Zav$QBuSDaNpSc8GsfKuvdq?W P00000NkvXXu0mjfEM=#N diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00005.png index fcae7bce0df5c6b52ce6aaaf424b60c86ebfdc15..7e249955e2b473ebedb8c0648fd457edc6127033 100644 GIT binary patch delta 412 zcmV;N0b~B*0=5H?B!7KLL_t(|ob8#*62c%1MN>!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00004#OY_Md`Br{|EP>duZY)3T4R_F3NdQrzzti zT1r$DMNzEE7Ht3#5gq%dy}jb>SQajTHsW8K3YZ2*5&PCm#-CFF>UzVbvbtF zDc&8%cpDtf{HhVkGui+mx<;!VlDA&NaH}5-0Zv3pF{Y93=zm^6kFIeb3GgR`>zm9N zl3)m6WO*&3hcm^AE#_l*{Elon)IvMh1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=U zZQ**SBzRHJfj<;LLnKh=R?xmQVDPw~0)i;@%t9UkPNvfUG6gw{nv)*OMNt$*Q4}li Y20yu>UQ$TBBLDyZ07*qoM6N<$f>zm=6#xJL diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png index 9d9f05a0a8b72e6003ed4c63b990c15e5cc59db4..827de905d9c320a7426bc6a64da96948880e1ecd 100644 GIT binary patch delta 322 zcmV-I0log!0^I_TB!47HL_t(|ob8#>4#OY_MQOAB{|EP>duZYqirOU&SH0&+9ZfA4 z5uFGjgpgI)q9-6CBIogKZ|}HyEQ=Pv8|i;`C}38A4t%p9QdhT&UHz=-8nfbi*X2B{ zr*yX%<7u#Hd8-l1D|!MV@*A!7kZgJl!>#>b2ykIiO2tfkM}Oz~_2?Q0k^m23T%Tmd zkOV`3N|yH`x@c*3Y-5k%@fM@y&>G&x9{7#ft9SeJ7-2FjwS8`;*iT#qZYp#0dN+i^ z91y0p6x1M+wXzTz4JQL?;1#JlxtkHM;0gb_@Cp1w{Vu3JjwV0`#z8E{yVRVnN`@35 zKaS{Q?cF0TUOUulAO+~8b2WJXG+?l|O~{i_fM6g~P=2XdO!xEd%!Cj^2qDw+0R;1` U{l=5q7ytkO07*qoM6N<$g0I?_E&u=k delta 314 zcmV-A0mc5^0@VVLB!3)9L_t(|ob8#>4#OY_MQOAB{|EP>duZY;BD!P^SH0&+9j1(n zXsrk#gpgI)q8$(sk@NVrw|AT$%aRLF8|j}r6fi3wPkgl?Qa5j#-F&XvA4C zQhC?R@ib^!{?rKN743kC+_TkB$!63r!rBjp02ivHIA&50bbqN|kFIeb3Gfgq^hst6 zNiYO(s(dY@O-r?7D|?KHw-~L4dek=d!2ei0de=XXktW09?Q=8be&Radrekh--VMR< z0l}@MpazkwRfW*F2f4Tl8e$)Iu7K1a+RYDw4}YMxQk@GWXI3Z}FJdLmh3H(M3Ly7a z*|N@bN&=bnIWxcl_;fCX+GhqB_O=Om5(*H^uq9~TZJ7{42q9zzKEOhkOjSi69RL6T M07*qoM6N<$g0s4f)Bpeg diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png index bceed68d6a9b6e6ceee1ec9be8c8912b8456c5cf..f6d556916108fab7602b510c4ceb72780470fd7e 100644 GIT binary patch delta 369 zcmV-%0gnFJ0*nKYB!5#$L_t(|ob8!G5`!QNMPsME|AAe!3ujUqLWmAFU&)&;ga*O< z01=6jBuSE4S)vC(L`3iPd%e8k#xX6W0IeE-+e-m61IoY`6M~E7wOTCOilQ)6`<<8f zDm_&e)fneW)pFNGD9`8t5Ycb6+9BEX8irf_Uss_%q#Cgo1+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M z_MYAcQn|MhAZiLDKdX~t=b^=r-cJTbfEEK^O?ZkRZFNWjsIF=G>n@W3Nq`n$F*_D8 z0d~c^Uzp93moia2aKmx@_cT=fh-ll0dSf@P8y?s^Zav$QBuSDaNpSc8GsfKuvdq?W P00000NkvXXu0mjf2wkUd delta 318 zcmV-E0m1%^1K9$QB!3`DL_t(|ob8#-62l+}gh{4-{|C+?J!HmO1T=>XYu)dpmP{y% z_!ALA2qCMoWji1uBIogKZ|^)mmZcWJ8ySCgDqv2O-r?6D|?KH_n57QMtBQ*;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L z1A<#iK@Bols|um<8|3CL2xlEu+0bq)#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#l zPQrH?JlvvYeK*aV0t}W>?;8UWEJ4XofMifhP2q8rC0d5YLL|(dz Q?*IS*07*qoM6N<$g07O0=>Px# diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00008.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00008.png index f6d556916108fab7602b510c4ceb72780470fd7e..fcae7bce0df5c6b52ce6aaaf424b60c86ebfdc15 100644 GIT binary patch delta 326 zcmV-M0lEH+1K|RYB!4JLL_t(|ob8#>4#OY_Md`Br{|EP>duZY)3T4R_F3NdQrzzti zT1r$DMNzEE7Ht3#5gq%dy}jb>SQajTHsW8K3YZ2*5&PCm#-CFF>UzVbvbtF zDc&8%cpDtf{HhVkGui+mx<;!VlDA&NaH}5-0Zv3pF{Y93=zm^6kFIeb3GgR`>zm9N zl3)m6WO*&3hcm^AE#_l*{Elon)IvMh1OH?9=!g6{N0_9=I_GAJ{lk5tcnBUMXV?N`;-?*0r)=U zZQ**SBzRHJfj<;LLnKh=R?xmQVDPw~0)i;@%t9UkPNvfUG6gw{nv)*OMNt$*Q4}li Y20yu>UQ$TBBLDyZ07*qoM6N<$f+1a&>i_@% delta 369 zcmV-%0gnFR0*nKYB!5#$L_t(|ob8!G5`!QNMPsME|AAe!3ujUqLWmAFU&)&;ga*O< z01=6jBuSE4S)vC(L`3iPd%e8k#xX6W0IeE-+e-m61IoY`6M~E7wOTCOilQ)6`<<8f zDm_&e)fneW)pFNGD9`8t5Ycb6+9BEX8irf_Uss_%q#Cgo1+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M z_MYAcQn|MhAZiLDKdX~t=b^=r-cJTbfEEK^O?ZkRZFNWjsIF=G>n@W3Nq`n$F*_D8 z0d~c^Uzp93moia2aKmx@_cT=fh-ll0dSf@P8y?s^Zav$QBuSDaNpSc8GsfKuvdq?W P00000NkvXXu0mjf6XmCO diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00009.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00009.png index eeec6324a1f33b9b155d3e979728a086251adb10..9d9f05a0a8b72e6003ed4c63b990c15e5cc59db4 100644 GIT binary patch delta 314 zcmV-A0mc620@VVLB!3)9L_t(|ob8#>4#OY_MQOAB{|EP>duZY;BD!P^SH0&+9j1(n zXsrk#gpgI)q8$(sk@NVrw|AT$%aRLF8|j}r6fi3wPkgl?Qa5j#-F&XvA4C zQhC?R@ib^!{?rKN743kC+_TkB$!63r!rBjp02ivHIA&50bbqN|kFIeb3Gfgq^hst6 zNiYO(s(dY@O-r?7D|?KHw-~L4dek=d!2ei0de=XXktW09?Q=8be&Radrekh--VMR< z0l}@MpazkwRfW*F2f4Tl8e$)Iu7K1a+RYDw4}YMxQk@GWXI3Z}FJdLmh3H(M3Ly7a z*|N@bN&=bnIWxcl_;fCX+GhqB_O=Om5(*H^uq9~TZJ7{42q9zzKEOhkOjSi69RL6T M07*qoM6N<$g1*F!-2eap delta 331 zcmV-R0kr7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uBXYu)dpmP{y% z_!ALA2qCMoWji1uBIogKZ|^)mmZcWJ8ySCgDqv2O-r?6D|?KH_n57QMtBQ*;(u&jz3ZRnNRw%a*13Pm{lc}uE!*67zng;L z1A<#iK@Bols|um<8|3CL2xlEu+0bq)#W|FfLBMMt5I6b+_oLo44Q`Wyr?T1mCge#l zPQrH?JlvvYeK*aV0t}W>?;8UWEJ4XofMifhP2q8rC0d5YLL|(dz Q?*IS*07*qoM6N<$g2e8T`v3p{ delta 387 zcmV-}0et@10-ghqB!6W|L_t(|ob8#-4ul{Kgh#W!{{wq)47ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=ss_%q#Cgo1+K5G8H4tr$8xE(F1yNkGY(KVfS|@DEAHN?M z_MYAcQn|MhAZiLDKdX~t=b^=r-cJTbfEEK^O?ZkRZFNWjsIF=G>n@W3Nq`n$F*_D8 z0d~c^Uzp93moia2aKmx@_cT=fh-ll0dSf@P8y?s^Zav$QBuSDaNpSc8GsfKuvdq?W P00000NkvXXu0mjf4k4#= delta 322 zcmV-I0lof=1Kk3UB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&ipy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png b/tests/snapshots/nanos_lrQueueWithdrawals_2_3_dimension_with_unknowns/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00003.png index cdbc0778c6fa19ba83d49d9e6b15325fad70eec5..343850a22a7448ea232679f2296b3c327c526eae 100644 GIT binary patch delta 789 zcmV+w1M2*e1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfVC;9E delta 376 zcmV-;0f+vp29g7iBYy!|Nklw| z@~}-J8DTjo0RR91+kN>Cud3y_h&XBnW%ten*OOrLC) zpInxjvcW+`$$17m8r*tv%nw^n7jpzNv@ib>^pEB-?IzE+{-g+taMn(Rdiia)AMMgT z?Bb5Ng}F|xUq-lueXA05BIizck4d{g@d5D34p;-aee(K!A=8UREBc;;Z@?1yeuhCN`rC9uP4qV-2cD=xo-Tq+4sJzw0RR9100000000000001h+x!CG Wf#@CFLi>RL0000F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1oT-wlV+! delta 392 zcmV;30eAkA1EK?vB!6j1L_t(|obA|4j>8}jMN!h~ov{BUv6mj8AXJnw9bq1J?iob! z59}%fh7bS%0D$FQ+UiqE<$sJ(cqiW|rBo-t-Sa^q_o8e8IdJ90H*t(Hrj+t;*{qMc zmjtg>9c9Q=Eop*3>#HrOIW7M= z?P|&iH|mtcE#SYwts6(b*t)rx5=_-v`YvdqeoWouY5SkB!yufsO`#rs+w+euaf=E>6JDb;U7+&;@Xc;B2J~mkCByPDHB4}Wo=J^@DypJivK(`c7^!dX7#GcQA*fbob7E}HhaITPAqCOp2zxkJe2 z+9Cnto|glg0LkM`SrkieQ*P-ZC%3ox-9N)&kcs{>PN<3gV&p)HUPy^?Sc&ig00000 m00000000000001&`2(mF0JLHkGKW^ diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00005.png index b2401b220a6db139961dbcfed78507c4de86032a..cf33e8caa9aaeec7e19d3259490e0d8cfd1fd124 100644 GIT binary patch delta 392 zcmV;30eAkN1EK?vB!6j1L_t(|obA|4j>8}jMN!h~ov{BUv6mj8AXJnw9bq1J?iob! z59}%fh7bS%0D$FQ+UiqE<$sJ(cqiW|rBo-t-Sa^q_o8e8IdJ90H*t(Hrj+t;*{qMc zmjtg>9c9Q=Eop*3>#HrOIW7M= z?P|&iH|mtcE#SYwts6(b*t)rx5=_-v`YvdqeoWouY5SkB!yufsO`#rs+w+euaf=E>6JDb;U7+&;@Xc;B2J~mkCByPDHB4}Wo=J^@DypJivK(`c7^!dX7#GcQA*fbob7E}HhaITPAqCOp2zxkJe2 z+9Cnto|glg0LkM`SrkieQ*P-ZC%3ox-9N)&kcs{>PN<3gV&p)HUPy^?Sc&ig00000 m00000000000001&`2(mF0JLbceoP( delta 388 zcmV-~0ek+U1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00007.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00007.png index 657887225857cf48be8a8daed2cb3e89d4b29ece..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL delta 354 zcmcb?{FiBhO1+Dxi(^Q|oVPcl`3@-vI0Po$;rtyhRQ<8JMIk?%eObZz=}8L@T*!1t zWzj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png b/tests/snapshots/nanox_lrQueueWithdrawals_1_2_dimension/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..657887225857cf48be8a8daed2cb3e89d4b29ece GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00003.png index cdbc0778c6fa19ba83d49d9e6b15325fad70eec5..343850a22a7448ea232679f2296b3c327c526eae 100644 GIT binary patch delta 789 zcmV+w1M2*e1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfVC;9E delta 376 zcmV-;0f+vp29g7iBYy!|Nklw| z@~}-J8DTjo0RR91+kN>Cud3y_h&XBnW%ten*OOrLC) zpInxjvcW+`$$17m8r*tv%nw^n7jpzNv@ib>^pEB-?IzE+{-g+taMn(Rdiia)AMMgT z?Bb5Ng}F|xUq-lueXA05BIizck4d{g@d5D34p;-aee(K!A=8UREBc;;Z@?1yeuhCN`rC9uP4qV-2cD=xo-Tq+4sJzw0RR9100000000000001h+x!CG Wf#@CFLi>RL0000F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1oT-wlV+! delta 392 zcmV;30eAkA1EK?vB!6j1L_t(|obA|4j>8}jMN!h~ov{BUv6mj8AXJnw9bq1J?iob! z59}%fh7bS%0D$FQ+UiqE<$sJ(cqiW|rBo-t-Sa^q_o8e8IdJ90H*t(Hrj+t;*{qMc zmjtg>9c9Q=Eop*3>#HrOIW7M= z?P|&iH|mtcE#SYwts6(b*t)rx5=_-v`YvdqeoWouY5SkB!yufsO`#rs+w+euaf=E>6JDb;U7+&;@Xc;B2J~mkCByPDHB4}Wo=J^@DypJivK(`c7^!dX7#GcQA*fbob7E}HhaITPAqCOp2zxkJe2 z+9Cnto|glg0LkM`SrkieQ*P-ZC%3ox-9N)&kcs{>PN<3gV&p)HUPy^?Sc&ig00000 m00000000000001&`2(mF0JLHkGKW^ diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00005.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00005.png index b704065d711a0e90112ae1d81dd2be4e523494b3..cf33e8caa9aaeec7e19d3259490e0d8cfd1fd124 100644 GIT binary patch delta 392 zcmV;30eAkI1EK?vB!6j1L_t(|obA|4j>8}jMN!h~ov{BUv6mj8AXJnw9bq1J?iob! z59}%fh7bS%0D$FQ+UiqE<$sJ(cqiW|rBo-t-Sa^q_o8e8IdJ90H*t(Hrj+t;*{qMc zmjtg>9c9Q=Eop*3>#HrOIW7M= z?P|&iH|mtcE#SYwts6(b*t)rx5=_-v`YvdqeoWouY5SkB!yufsO`#rs+w+euaf=E>6JDb;U7+&;@Xc;B2J~mkCByPDHB4}Wo=J^@DypJivK(`c7^!dX7#GcQA*fbob7E}HhaITPAqCOp2zxkJe2 z+9Cnto|glg0LkM`SrkieQ*P-ZC%3ox-9N)&kcs{>PN<3gV&p)HUPy^?Sc&ig00000 m00000000000001&`2(mF0JLT&$tc% delta 383 zcmV-_0f7FZ1DXSnB!6K^L_t(|obA|Ka>F1DKvCN1PPG3ev6p@@Wi;Yp+QvvY_k3iW z#5Rcp!jKXG006Mvhi~&a=Xxw6j=$s`<(zc_x}W^vCTH;+0VQy? zE=x^4;h>`AJOX|jTs=7Ex7EYN+`%;M%fAG@&^)Hy#PC2`HYI16zV3 zJgDg?PbT3Lr{#D)-=-64qQ4nA@I)2zbP;57a4W(K000000000000000 d0002o<{Q^4^$eqiaI63T002ovPDHLkV1jkKv0VTF diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00006.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00006.png index b54209a0d779c558149a7fc1f1ac84c2a64ce46f..b704065d711a0e90112ae1d81dd2be4e523494b3 100644 GIT binary patch delta 383 zcmV-_0f7F91DXSnB!6K^L_t(|obA|Ka>F1DKvCN1PPG3ev6p@@Wi;Yp+QvvY_k3iW z#5Rcp!jKXG006Mvhi~&a=Xxw6j=$s`<(zc_x}W^vCTH;+0VQy? zE=x^4;h>`AJOX|jTs=7Ex7EYN+`%;M%fAG@&^)Hy#PC2`HYI16zV3 zJgDg?PbT3Lr{#D)-=-64qQ4nA@I)2zbP;57a4W(K000000000000000 d0002o<{Q^4^$eqiaI63T002ovPDHLkV1iE7u|og= delta 365 zcmV-z0h0cj1Be5VB!5pyL_t(|obA|avcez?hGBHhPO|?cWiS3wQ_jYL>c5+92 zL~);*f85~~_N!XZiNq`6H3rKCnh$_qcH}i+{-IE@5ToP2NAKRTezrQZmzMHb&_FTA zzj(#8X#&FIdSDbx?+cEd_oj0A|43D~nvYksFbk=Hyq;p6_# ziMl~1`pYyzP4pKd2TF7yC9cCtgckq+0000000000000000Qi_2naSwFpWYq=00000 LNkvXXu0mjfKzgly diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00007.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00007.png index cdbc0778c6fa19ba83d49d9e6b15325fad70eec5..b54209a0d779c558149a7fc1f1ac84c2a64ce46f 100644 GIT binary patch delta 365 zcmV-z0h0cb1Be5VB!5pyL_t(|obA|avcez?hGBHhPO|?cWiS3wQ_jYL>c5+92 zL~);*f85~~_N!XZiNq`6H3rKCnh$_qcH}i+{-IE@5ToP2NAKRTezrQZmzMHb&_FTA zzj(#8X#&FIdSDbx?+cEd_oj0A|43D~nvYksFbk=Hyq;p6_# ziMl~1`pYyzP4pKd2TF7yC9cCtgckq+0000000000000000Qi_2naSwFpWYq=00000 LNkvXXu0mjfH4?3M delta 375 zcmV--0f_#H1Cj%fB!5{+L_t(|obB0La>F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1n0Bwio~a diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00008.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00008.png index 857b4307fc540feea5dfd719ceeccd7c6fef03a0..cdbc0778c6fa19ba83d49d9e6b15325fad70eec5 100644 GIT binary patch delta 375 zcmV--0f_#I1Cj%fB!5{+L_t(|obB0La>F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1n4kwiy5b delta 366 zcmV-!0g?Wa1BnBWB!5szL_t(|obB0d4#FS|fZ=MqN$-Co?&1$3A?0ftM>~C=AI8lM zv>hEx5dZ)HV7r@d_bH|FUR52x$v;Xd)d}eC`Jj<&@f-m;aOJ``aa7fmQhqI)^{3ra zq&KQY88ThF48i;UE{zhM^7~b_n-zVLCS>jYQ8L<39iuNI4}X_lvvN`AD}8cUezPn! z<$wznCFc?FZgA_tF>kgWE~W+3wJ-k?^hNWSc9Z8@eXADz-|_TY&) zg_)<;n-Qk4KUIRR$ay8a$7H!c@d5D9;@$(6b4QuZGR^9GzSxG<&JLH48QKS{^9F-p z8tTmRVcf?Ku4iDwUiGz0Cg5N-Z=b{kL;M1& diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00009.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00009.png index b2401b220a6db139961dbcfed78507c4de86032a..857b4307fc540feea5dfd719ceeccd7c6fef03a0 100644 GIT binary patch delta 366 zcmV-!0g?Wn1BnBWB!5szL_t(|obB0d4#FS|fZ=MqN$-Co?&1$3A?0ftM>~C=AI8lM zv>hEx5dZ)HV7r@d_bH|FUR52x$v;Xd)d}eC`Jj<&@f-m;aOJ``aa7fmQhqI)^{3ra zq&KQY88ThF48i;UE{zhM^7~b_n-zVLCS>jYQ8L<39iuNI4}X_lvvN`AD}8cUezPn! z<$wznCFc?FZgA_tF>kgWE~W+3wJ-k?^hNWSc9Z8@eXADz-|_TY&) zg_)<;n-Qk4KUIRR$ay8a$7H!c@d5D9;@$(6b4QuZGR^9GzSxG<&JLH48QKS{^9F-p z8tTmRVcf?Ku4iDwUiGz0Cg5N-Z=b{kLP-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00011.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00011.png index 657887225857cf48be8a8daed2cb3e89d4b29ece..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL delta 354 zcmcb?{FiBhO1+Dxi(^Q|oVPcl`3@-vI0Po$;rtyhRQ<8JMIk?%eObZz=}8L@T*!1t zWzj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..657887225857cf48be8a8daed2cb3e89d4b29ece GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00003.png index cdbc0778c6fa19ba83d49d9e6b15325fad70eec5..343850a22a7448ea232679f2296b3c327c526eae 100644 GIT binary patch delta 789 zcmV+w1M2*e1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfVC;9E delta 376 zcmV-;0f+vp29g7iBYy!|Nklw| z@~}-J8DTjo0RR91+kN>Cud3y_h&XBnW%ten*OOrLC) zpInxjvcW+`$$17m8r*tv%nw^n7jpzNv@ib>^pEB-?IzE+{-g+taMn(Rdiia)AMMgT z?Bb5Ng}F|xUq-lueXA05BIizck4d{g@d5D34p;-aee(K!A=8UREBc;;Z@?1yeuhCN`rC9uP4qV-2cD=xo-Tq+4sJzw0RR9100000000000001h+x!CG Wf#@CFLi>RL0000F1DKvCN1PPG3eX)pa?$}r+#lGI2f_k3jX zuuUQvVL2%Q0002nefbWrs^z(eIDV5)q^flSy6-%3kh6HsfE>7T;+r^%h^pqt^0NN4 zyG!cLs!@i_&@NN(d;gF|iB9?bBGS!@{7Fs7+V@AvXg_s~et$~o$7R&4oYeVDpKO+& zT$Y-$!9hjIc?LWh+})=q_b`E9o!?b1E$ z;*Pk5xlXNLM!1B1s}gh~=T3N!NxMMt0r1HVSOdC!^7?%t(~Ctb`kuEUUSvYqjd*-P z6ENzn&I;~|h;RvL&*HjweYB5tZ?)zkCScLxY-sPtg+eFnj08BdB`CsGME&pMWD!1b zWxfb+z!Ld>hCwF!+jK%r^fx01o~S~eE`m%BZbf(j000000000000000004m7`~u&B V=pEcb`+)!e002ovPDHLkV1gwAwoL#4 delta 419 zcmV;U0bKr)1HA)~B!7fSL_t(|obB0Lj>8}fKv6pCPT2pF*vovNB4i9nBfw62&&Q}q zc}(m;ChjP_f@=zoV0-X^_f<)+Se`k+|; za5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZGw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NXgfuN!qaUYG858}fKv6pCPT2pF*vovNB4i9nBfw62&&Q}q zc}(m;ChjP_f@=zoV0-X^_f<)+Se`k+|; za5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZGw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NXgfuN!qaUYG85F1DKvCN1PPG3ev6p@@Wi;Yp+QvvY_k3iW z#5Rcp!jKXG006Mvhi~&a=Xxw6j=$s`<(zc_x}W^vCTH;+0VQy? zE=x^4;h>`AJOX|jTs=7Ex7EYN+`%;M%fAG@&^)Hy#PC2`HYI16zV3 zJgDg?PbT3Lr{#D)-=-64qQ4nA@I)2zbP;57a4W(K000000000000000 d0002o<{Q^4^$eqiaI63T002ovPDHLkV1k|?v3LLg diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00006.png index b54209a0d779c558149a7fc1f1ac84c2a64ce46f..b704065d711a0e90112ae1d81dd2be4e523494b3 100644 GIT binary patch delta 383 zcmV-_0f7F91DXSnB!6K^L_t(|obA|Ka>F1DKvCN1PPG3ev6p@@Wi;Yp+QvvY_k3iW z#5Rcp!jKXG006Mvhi~&a=Xxw6j=$s`<(zc_x}W^vCTH;+0VQy? zE=x^4;h>`AJOX|jTs=7Ex7EYN+`%;M%fAG@&^)Hy#PC2`HYI16zV3 zJgDg?PbT3Lr{#D)-=-64qQ4nA@I)2zbP;57a4W(K000000000000000 d0002o<{Q^4^$eqiaI63T002ovPDHLkV1iE7u|og= delta 365 zcmV-z0h0cj1Be5VB!5pyL_t(|obA|avcez?hGBHhPO|?cWiS3wQ_jYL>c5+92 zL~);*f85~~_N!XZiNq`6H3rKCnh$_qcH}i+{-IE@5ToP2NAKRTezrQZmzMHb&_FTA zzj(#8X#&FIdSDbx?+cEd_oj0A|43D~nvYksFbk=Hyq;p6_# ziMl~1`pYyzP4pKd2TF7yC9cCtgckq+0000000000000000Qi_2naSwFpWYq=00000 LNkvXXu0mjfKzgly diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00007.png index 857b4307fc540feea5dfd719ceeccd7c6fef03a0..b54209a0d779c558149a7fc1f1ac84c2a64ce46f 100644 GIT binary patch delta 365 zcmV-z0h0cS1Be5VB!5pyL_t(|obA|avcez?hGBHhPO|?cWiS3wQ_jYL>c5+92 zL~);*f85~~_N!XZiNq`6H3rKCnh$_qcH}i+{-IE@5ToP2NAKRTezrQZmzMHb&_FTA zzj(#8X#&FIdSDbx?+cEd_oj0A|43D~nvYksFbk=Hyq;p6_# ziMl~1`pYyzP4pKd2TF7yC9cCtgckq+0000000000000000Qi_2naSwFpWYq=00000 LNkvXXu0mjfC_Sxh delta 366 zcmV-!0g?WQ1BnBWB!5szL_t(|obB0d4#FS|fZ=MqN$-Co?&1$3A?0ftM>~C=AI8lM zv>hEx5dZ)HV7r@d_bH|FUR52x$v;Xd)d}eC`Jj<&@f-m;aOJ``aa7fmQhqI)^{3ra zq&KQY88ThF48i;UE{zhM^7~b_n-zVLCS>jYQ8L<39iuNI4}X_lvvN`AD}8cUezPn! z<$wznCFc?FZgA_tF>kgWE~W+3wJ-k?^hNWSc9Z8@eXADz-|_TY&) zg_)<;n-Qk4KUIRR$ay8a$7H!c@d5D9;@$(6b4QuZGR^9GzSxG<&JLH48QKS{^9F-p z8tTmRVcf?Ku4iDwUiGz0Cg5N-Z=b{kL~C=AI8lM zv>hEx5dZ)HV7r@d_bH|FUR52x$v;Xd)d}eC`Jj<&@f-m;aOJ``aa7fmQhqI)^{3ra zq&KQY88ThF48i;UE{zhM^7~b_n-zVLCS>jYQ8L<39iuNI4}X_lvvN`AD}8cUezPn! z<$wznCFc?FZgA_tF>kgWE~W+3wJ-k?^hNWSc9Z8@eXADz-|_TY&) zg_)<;n-Qk4KUIRR$ay8a$7H!c@d5D9;@$(6b4QuZGR^9GzSxG<&JLH48QKS{^9F-p z8tTmRVcf?Ku4iDwUiGz0Cg5N-Z=b{kL8}fKv6pCPT2pF*vovNB4i9nBfw62&&Q}q zc}(m;ChjP_f@=zoV0-X^_f<)+Se`k+|; za5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZGw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NXgfuN!qaUYG858}fKv6pCPT2pF*vovNB4i9nBfw62&&Q}q zc}(m;ChjP_f@=zoV0-X^_f<)+Se`k+|; za5&YJ0ymnJj7Pw?!L0|!xY>HRh!#ZGw(O^%iN-NilV>~s1P>44tQ`vV(u(t!xHvUQ_vk5{}SF~@NXgfuN!qaUYG85P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00011.png index 657887225857cf48be8a8daed2cb3e89d4b29ece..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL delta 354 zcmcb?{FiBhO1+Dxi(^Q|oVPcl`3@-vI0Po$;rtyhRQ<8JMIk?%eObZz=}8L@T*!1t zWzj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X diff --git a/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png b/tests/snapshots/nanox_lrQueueWithdrawals_2_3_dimension_with_unknowns/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..657887225857cf48be8a8daed2cb3e89d4b29ece GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/src/lrQueueWithdrawals.test.js b/tests/src/lrQueueWithdrawals.test.js index 9261599..5391986 100644 --- a/tests/src/lrQueueWithdrawals.test.js +++ b/tests/src/lrQueueWithdrawals.test.js @@ -44,7 +44,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 6 : 6; + const right_clicks = model.letter === 'S' ? 9 : 7; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -100,7 +100,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 10 : 10; + const right_clicks = model.letter === 'S' ? 13 : 11; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -156,7 +156,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 10 : 10; + const right_clicks = model.letter === 'S' ? 13 : 11; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( From 40b139c661e1304d58069c6a78810baa96099753 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Thu, 23 May 2024 19:14:18 +0200 Subject: [PATCH 38/46] fix: I5-3 --- src/provide_parameter/eigenlayer.c | 22 +++++++++++++++++++ tests/src/lrCompleteQueuedWithdrawals.test.js | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index cc9d78e..441abda 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -754,6 +754,14 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con } U2BE_from_parameter(msg->parameter, ¶ms->parent_item_count); + if (params->parent_item_count > params->withdrawals_count) { + PRINTF("Unexpected number of tokens, %d > withdrawals %d\n", + params->parent_item_count, + params->withdrawals_count); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + params->current_item_count = params->parent_item_count; PRINTF("LRCQW_TOKENS_LENGTH: %d\n", params->parent_item_count); @@ -891,6 +899,13 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con } U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + if (params->current_item_count > params->withdrawals_count) { + PRINTF("Unexpected middlewareTimesIndexes parameter length %d > withdrawals %d\n", + params->current_item_count, + msg->parameterOffset); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } PRINTF("LRCQW_MIDDLEWARE_TIMES_INDEXES_LENGTH: %d\n", params->current_item_count); if (params->current_item_count == 0) { @@ -921,6 +936,13 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con } U2BE_from_parameter(msg->parameter, ¶ms->current_item_count); + if (params->current_item_count > params->withdrawals_count) { + PRINTF("Unexpected receiveAsTokens length %d > withdrawals length %d\n", + params->current_item_count, + params->withdrawals_count); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } // we save the number of redelegations to parse params->relegations_count = params->current_item_count; PRINTF("LRCQW_RECEIVE_AS_TOKENS_LENGTH: %d\n", params->current_item_count); diff --git a/tests/src/lrCompleteQueuedWithdrawals.test.js b/tests/src/lrCompleteQueuedWithdrawals.test.js index cc7141b..813af1f 100644 --- a/tests/src/lrCompleteQueuedWithdrawals.test.js +++ b/tests/src/lrCompleteQueuedWithdrawals.test.js @@ -343,7 +343,7 @@ nano_models.forEach(function (model) { ], ], [0, 0, 1], - [false, true, true, false, true, true, true, true] + [false, true, true] ); let unsignedTx = genericTx; From e5b032df9233337bdc6d8faea2bc10c2139616ab Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Tue, 28 May 2024 15:58:40 +0200 Subject: [PATCH 39/46] fix: I5-4 --- src/kiln_plugin.h | 3 ++- src/provide_parameter/eigenlayer.c | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index 1f9f059..d5f9cab 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -87,7 +87,7 @@ typedef enum { // globals #define LR_STRATEGIES_COUNT 11 -#define UNKNOWN_LR_ERC20 255 +#define UNKNOWN_LR_ERC20 15 // must be > LR_STRATEGIES_COUNT < 16 #define UNKNOWN_LR_STRATEGY 15 // must be > LR_STRATEGIES_COUNT < 16 #define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) #define ERC20_DECIMALS 18 @@ -222,6 +222,7 @@ typedef struct { uint16_t relegations_count; uint8_t withdrawals_count; uint16_t strategies_count; + uint16_t tokens_count; // -- offset verification uint16_t tokens_offset; uint16_t middlewareTimesIndexes_offset; diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 441abda..9f16ece 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -870,7 +870,27 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con break; } - case LRCQW_TOKENS__ITEM__ITEMS: + case LRCQW_TOKENS__ITEM__ITEMS: { + { + uint8_t buffer[ADDRESS_LENGTH]; + copy_address(buffer, msg->parameter, sizeof(buffer)); + char address_buffer[ADDRESS_STR_LEN]; + getEthDisplayableAddress(buffer, address_buffer, sizeof(address_buffer), 0); + + uint8_t token_index = find_lr_known_erc20(address_buffer); + // we check if the token matches the corresponding strategy + uint8_t strategy_index = params->strategies[params->tokens_count] & 0x0F; + if (strategy_index != UNKNOWN_LR_STRATEGY && token_index != strategy_index) { + PRINTF("Token idx %d does not match strategy idx %d\n", + token_index, + strategy_index); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + + params->tokens_count += 1; + } + params->current_item_count -= 1; if (params->current_item_count == 0) { // we arrive at the end of the tokens array @@ -884,6 +904,7 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con } } break; + } // ******************************************************************** // MIDDLEWARETIMESINDEXES[] PARSING From 25a8ba1b83a1ea69b57f08bf71045536cbe09cfa Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Tue, 28 May 2024 15:58:58 +0200 Subject: [PATCH 40/46] fix: doc nt --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c98ae1..8df185c 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,7 @@ Clearsigned: ![](/tests/snapshots/nanox_batchWithdrawCL/00000.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00001.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00002.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00003.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00004.png) ![](/tests/snapshots/nanox_batchWithdrawCL/00005.png) -## KILN ON-CHAIN v1 - Request Exits +### KILN ON-CHAIN v1 - Request Exits Function `requestValidatorsExit(bytes validatorPubkeys)` Clearsigned: From 157b0fa693b09319449c3d9057c0f7d87bf9bba9 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Tue, 28 May 2024 17:37:39 +0200 Subject: [PATCH 41/46] fix: I5-2 --- src/handle_finalize.c | 4 +- src/kiln_plugin.h | 11 ++++- src/provide_parameter/eigenlayer.c | 39 +++++++++++++++++- src/query_contract_ui/eigenlayer.c | 29 +++++++++++-- .../00004.png | Bin 349 -> 509 bytes .../00005.png | Bin 357 -> 497 bytes .../00006.png | Bin 349 -> 438 bytes .../00007.png | Bin 357 -> 349 bytes .../00008.png | Bin 358 -> 357 bytes .../00009.png | Bin 414 -> 349 bytes .../00010.png | Bin 349 -> 357 bytes .../00011.png | Bin 0 -> 358 bytes .../00012.png | Bin 0 -> 414 bytes .../00013.png | Bin 0 -> 349 bytes .../00004.png | Bin 319 -> 509 bytes .../00005.png | Bin 358 -> 497 bytes .../00006.png | Bin 414 -> 438 bytes .../00007.png | Bin 349 -> 319 bytes .../00008.png | Bin 0 -> 358 bytes .../00009.png | Bin 0 -> 414 bytes .../00010.png | Bin 0 -> 349 bytes .../00004.png | Bin 349 -> 509 bytes .../00005.png | Bin 357 -> 497 bytes .../00006.png | Bin 356 -> 438 bytes .../00007.png | Bin 360 -> 349 bytes .../00008.png | Bin 319 -> 357 bytes .../00009.png | Bin 333 -> 356 bytes .../00010.png | Bin 367 -> 360 bytes .../00011.png | Bin 317 -> 319 bytes .../00012.png | Bin 358 -> 333 bytes .../00013.png | Bin 414 -> 367 bytes .../00014.png | Bin 349 -> 317 bytes .../00015.png | Bin 0 -> 358 bytes .../00016.png | Bin 0 -> 414 bytes .../00017.png | Bin 0 -> 349 bytes .../00004.png | Bin 349 -> 509 bytes .../00005.png | Bin 358 -> 497 bytes .../00006.png | Bin 414 -> 438 bytes .../00007.png | Bin 349 -> 349 bytes .../00008.png | Bin 0 -> 358 bytes .../00009.png | Bin 0 -> 414 bytes .../00010.png | Bin 0 -> 349 bytes .../00003.png | Bin 417 -> 811 bytes .../00004.png | Bin 425 -> 417 bytes .../00005.png | Bin 417 -> 425 bytes .../00006.png | Bin 425 -> 417 bytes .../00007.png | Bin 415 -> 425 bytes .../00008.png | Bin 472 -> 415 bytes .../00009.png | Bin 381 -> 472 bytes .../00010.png | Bin 0 -> 381 bytes .../00003.png | Bin 387 -> 811 bytes .../00004.png | Bin 415 -> 387 bytes .../00005.png | Bin 472 -> 415 bytes .../00006.png | Bin 381 -> 472 bytes .../00007.png | Bin 0 -> 381 bytes .../00003.png | Bin 417 -> 811 bytes .../00004.png | Bin 425 -> 417 bytes .../00005.png | Bin 424 -> 425 bytes .../00006.png | Bin 429 -> 424 bytes .../00007.png | Bin 387 -> 429 bytes .../00008.png | Bin 386 -> 387 bytes .../00009.png | Bin 419 -> 386 bytes .../00010.png | Bin 371 -> 419 bytes .../00011.png | Bin 415 -> 371 bytes .../00012.png | Bin 472 -> 415 bytes .../00013.png | Bin 381 -> 472 bytes .../00014.png | Bin 0 -> 381 bytes .../00003.png | Bin 417 -> 811 bytes .../00004.png | Bin 415 -> 417 bytes .../00005.png | Bin 472 -> 415 bytes .../00006.png | Bin 381 -> 472 bytes .../00007.png | Bin 0 -> 381 bytes tests/src/lrCompleteQueuedWithdrawals.test.js | 8 ++-- 73 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00011.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00012.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00013.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00008.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00009.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00015.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00016.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00017.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00009.png create mode 100644 tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00010.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00014.png create mode 100644 tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00007.png diff --git a/src/handle_finalize.c b/src/handle_finalize.c index 3e48ed8..41c595d 100644 --- a/src/handle_finalize.c +++ b/src/handle_finalize.c @@ -61,8 +61,8 @@ void handle_finalize(ethPluginFinalize_t *msg) { { lr_complete_queued_withdrawals_t *params = &context->param_data.lr_complete_queued_withdrawals; - // function screen - msg->numScreens = 1; + // function screen + withdrawer + msg->numScreens = 2; // one screen per strategy msg->numScreens += params->strategies_count; PRINTF("NUMBER OF STRATEGIES TO DISPLAY: %d\n", params->strategies_count); diff --git a/src/kiln_plugin.h b/src/kiln_plugin.h index d5f9cab..7aa35cc 100644 --- a/src/kiln_plugin.h +++ b/src/kiln_plugin.h @@ -89,7 +89,7 @@ typedef enum { #define LR_STRATEGIES_COUNT 11 #define UNKNOWN_LR_ERC20 15 // must be > LR_STRATEGIES_COUNT < 16 #define UNKNOWN_LR_STRATEGY 15 // must be > LR_STRATEGIES_COUNT < 16 -#define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT (LR_STRATEGIES_COUNT * 3) +#define MAX_DISPLAYABLE_LR_STRATEGIES_COUNT 32 // must be > LR_STRATEGIES_COUNT #define ERC20_DECIMALS 18 #define PARAM_OFFSET 32 @@ -214,6 +214,11 @@ typedef struct { uint8_t strategies[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; } lr_queue_withdrawals_t; +// must be size of MAX_DISPLAYABLE_LR_STRATEGIES_COUNT +typedef struct { + uint32_t bits; +} bitfield; + typedef struct { // -- utils uint16_t parent_item_count; @@ -232,6 +237,7 @@ typedef struct { uint8_t withdrawals_offsets_checksum_value[CX_KECCAK_256_SIZE]; // -- display + uint8_t withdrawer[ADDRESS_LENGTH]; // list of strategies indexes **INCREMENTED BY 1** to display in the UI // UNKNOWN_LR_STRATEGY is used to display the "unknown" strategy // assumptions: @@ -241,7 +247,8 @@ typedef struct { // (ii) in practice there should not be more than (2 ** 4) - 2 known strategies // (iii) the first 4 bytes are the withdrawal index, the next 4 bytes are the strategy index uint8_t strategies[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; - bool is_redelegated[MAX_DISPLAYABLE_LR_STRATEGIES_COUNT]; + // follows the strategies array indexes + bitfield is_redelegated; } lr_complete_queued_withdrawals_t; // **************************************************************************** diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 9f16ece..4664b60 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -15,6 +15,25 @@ #include "provide_parameter.h" +/** + * @brief Set a bit in a bitfield + * + * @param bf: bitfield to update + * @param index: index of the bit to update + * @param value: value to set the bit to (0 or 1) + * + */ +void set_bit(bitfield *bf, int index, bool value) { + if (index < 0 || index >= MAX_DISPLAYABLE_LR_STRATEGIES_COUNT) { + return; // Index out of range + } + if (value) { + bf->bits |= (1U << index); + } else { + bf->bits &= ~(1U << index); + } +} + /** * @brief Compare two addresses * @@ -613,9 +632,25 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con case LRCQW_WITHDRAWALS__ITEM__DELEGATED_TO: context->next_param = LRCQW_WITHDRAWALS__ITEM__WITHDRAWER; break; - case LRCQW_WITHDRAWALS__ITEM__WITHDRAWER: + case LRCQW_WITHDRAWALS__ITEM__WITHDRAWER: { + { + uint8_t buffer[ADDRESS_LENGTH]; + copy_address(buffer, msg->parameter, sizeof(buffer)); + // we only support same withdrawer accross all the withdrawals + if (params->withdrawer[0] == '\0') { + memcpy(params->withdrawer, buffer, sizeof(params->withdrawer)); + } else if (strcmp((const char *) params->withdrawer, (const char *) buffer) != 0) { + PRINTF("Unexpected withdrawer address, %s != expected %s\n", + msg->parameter, + params->withdrawer); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + } + context->next_param = LRCQW_WITHDRAWALS__ITEM__NONCE; break; + } case LRCQW_WITHDRAWALS__ITEM__NONCE: context->next_param = LRCQW_WITHDRAWALS__ITEM__START_BLOCK; break; @@ -982,7 +1017,7 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con uint16_t value; U2BE_from_parameter(msg->parameter, &value); // if false, token is redelegated - params->is_redelegated[index] = value == 0; + set_bit(&(params->is_redelegated), index, value == 0); PRINTF("RECEIVE AS TOKENS #%d: %d\n", index, value); } params->current_item_count -= 1; diff --git a/src/query_contract_ui/eigenlayer.c b/src/query_contract_ui/eigenlayer.c index 69096af..161e678 100644 --- a/src/query_contract_ui/eigenlayer.c +++ b/src/query_contract_ui/eigenlayer.c @@ -15,6 +15,21 @@ #include "query_contract_ui.h" +/** + * @brief Get the bit at the given index + * + * @param bf: Bitfield to get the bit from + * @param index: Index of the bit to get + * + * @return int: The bit at the given index + */ +int get_bit(const bitfield *bf, int index) { + if (index < 0 || index >= MAX_DISPLAYABLE_LR_STRATEGIES_COUNT) { + return -1; // Index out of range + } + return (bf->bits & (1U << index)) != 0; +} + /** * @brief UI for depositing into an EigenLayer strategy * @@ -131,16 +146,24 @@ bool complete_queued_withdrawals_ui(ethQueryContractUI_t *msg, context_t *contex ret = true; break; + case 1: + strlcpy(msg->title, "Withdrawer", msg->titleLength); + char address_buffer[ADDRESS_STR_LEN]; + getEthDisplayableAddress(params->withdrawer, address_buffer, sizeof(address_buffer), 0); + strlcpy(msg->msg, address_buffer, msg->msgLength); + ret = true; + break; + default: { { - // removing the first screen to current screen index + // removing the 2 known screens to current screen index // to get the index of the withdrawal - uint8_t strategy_index = msg->screenIndex - 1; + uint8_t strategy_index = msg->screenIndex - 2; if (strategy_index < params->strategies_count) { uint8_t withdrawal_index = (params->strategies[strategy_index] >> 4) & 0x0F; - if (params->is_redelegated[withdrawal_index]) { + if (get_bit(¶ms->is_redelegated, withdrawal_index) == 1) { strlcpy(msg->title, "Redelegate", msg->titleLength); } else { strlcpy(msg->title, "Withdraw", msg->titleLength); diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00004.png index 82030b711fe69207d044d44c0ff7bbee83f4da1c..06c3c59a9000082a980407c1e47a01c43dbfef53 100644 GIT binary patch delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qHE_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1hUa>dpWF delta 330 zcmV-Q0k!_|1LXpcB!4VPL_t(|ob8$062c%1M5$x{|AT$74``(!#PkL`uxA{nmRrb{ z6k-U35JE^L-ml-s-{e3M(MetAbl-gf0OuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$g0(l5cK`qY diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00006.png index 82030b711fe69207d044d44c0ff7bbee83f4da1c..7e249955e2b473ebedb8c0648fd457edc6127033 100644 GIT binary patch delta 412 zcmV;N0b~B%0=5H?B!7KLL_t(|ob8#*62c%1MN>!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00003h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qHuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f|@3kVgLXD diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00008.png index eeec6324a1f33b9b155d3e979728a086251adb10..2860eca5b1726ce914983a4ef62b57addd4696a3 100644 GIT binary patch delta 330 zcmV-Q0k!_-0_6gbB!4VPL_t(|ob8$062c%1M5$x{|AT$74``(!#PkL`uxA{nmRrb{ z6k-U35JE^L-ml-s-{e3M(MetAbl-gf0OuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f~CNfYXATM delta 331 zcmV-R0kr<*0_FmcB!4YQL_t(|ob8#*62l+}MYYrX{|9H0E}S}66dzI0=AKnTEwLAs zK#c(a0Ps|-=EJYk7-Q_gS(;pVIy@-x)}FvP_7Oc~;Q)k-+KGFe@kONvKRB|`0nfty zey>7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uB3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH7ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=3a diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00010.png index ce795f34e8569e986af689fded3b59c9a8af2961..2860eca5b1726ce914983a4ef62b57addd4696a3 100644 GIT binary patch delta 330 zcmV-Q0k!_!0_6gbB!4VPL_t(|ob8$062c%1M5$x{|AT$74``(!#PkL`uxA{nmRrb{ z6k-U35JE^L-ml-s-{e3M(MetAbl-gf0OuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f|@3kVgLXD delta 322 zcmV-I0log^0^I_TB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&ipy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00013.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00004.png index 5d10a09010526e7de70eab95e0b3a8b29ae7d6d7..06c3c59a9000082a980407c1e47a01c43dbfef53 100644 GIT binary patch delta 483 zcmV<90UZ9n0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF?|c9N delta 292 zcmV+<0o(rl1HS^0B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000E_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1hZ|>dycG delta 331 zcmV-R0kr<{1LgvdB!4YQL_t(|ob8#*62l+}MYYrX{|9H0E}S}66dzI0=AKnTEwLAs zK#c(a0Ps|-=EJYk7-Q_gS(;pVIy@-x)}FvP_7Oc~;Q)k-+KGFe@kONvKRB|`0nfty zey>7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uB!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00007ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=1)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&ipy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_1/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00004.png index 82030b711fe69207d044d44c0ff7bbee83f4da1c..06c3c59a9000082a980407c1e47a01c43dbfef53 100644 GIT binary patch delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qHE_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1hUa>dpWF delta 330 zcmV-Q0k!_|1LXpcB!4VPL_t(|ob8$062c%1M5$x{|AT$74``(!#PkL`uxA{nmRrb{ z6k-U35JE^L-ml-s-{e3M(MetAbl-gf0OuFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$g0(l5cK`qY diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00006.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00006.png index a3f84470ac161bd75bb2966852d72414df5870f1..7e249955e2b473ebedb8c0648fd457edc6127033 100644 GIT binary patch delta 412 zcmV;N0b~B;0=5H?B!7KLL_t(|ob8#*62c%1MN>!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI0000O(W}*pMDuB0Jy~w!zi5)b zd>o1qpj;TM8DG`ZOBXyMp!lJ6NJslCoPdV_wG?4*Yb;9Bi+|E}s||;8>)+)Yk(5vB z0zR8#Ov0%c(Pc$>@@jgKWny2VM0t5v09IxPAVz^Rs2`T#7`hW!0fJ%-l$HD0u;uPX z!6ZN{$A%hsa+NHE$=b3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qH zk?$z7rlCQB!eN-^f%Sxwx;@s3eVWZkXi2uFfN?coL%i2r3x)pfcl_S2uJ5D+&~KfN+H7E)>)K>7k^{uy*6CRqyCT|L{PqI z2>57@@e)qOh%Qs*$*b8#o)`PNN{r5{0>Fy(l2M`%CR-;@N-_A}S)_DA;Y=qc0x~ZUGj`+2q1rni)WwZ)5X(u=M0wh> zBTxkhiLavuYD4DE)&upaPXQLd2$u&kcc@~tOUBuVyN@Nc7-ytD{ c5JE`LEN=|O0{=1^F#rGn07*qoM6N<$f^&M6L;wH) delta 292 zcmV+<0o(rN0>1)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V60000O(W}*pMDuB0Jy~w!zi5)b zd>o1qpj;TM8DG`ZOBXyMp!lJ6NJslCoPdV_wG?4*Yb;9Bi+|E}s||;8>)+)Yk(5vB z0zR8#Ov0%c(Pc$>@@jgKWny2VM0t5v09IxPAVz^Rs2`T#7`hW!0fJ%-l$HD0u;uPX z!6ZN{$A%hsa+NHE$=bKUVuSWqTdZwlBP#fC}|?~ z!}{J@?bTJww_vauwVH%k$?~$%>Xn}!pzeSR!8S3cXTWB1fq%6ZKLG|i9;(}>-Z`&E z1PkgP!V>EbmApa>BCRzbi|{h~8!&^+=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI( zt#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^iejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;8 z2B_K4n!iMi+AD>i3Q)O$2B;P!U4Hpuk`O`&A%w)?1McgeP`5FwjsO4v07*qoM6N<$ Eg4^4Ui~s-t diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00010.png index 3a9f816d2af790fe1ac4d2841a0fd023ca9877aa..7fc94cf1cea8443d1665619d63b721cebc31c7d1 100644 GIT binary patch delta 333 zcmV-T0kZz@0_XyeB!4eSL_t(|ob8$05`!QNM72}@|AYHbA80AY7y~M7anE!dE4Pp> zk?$z7rlCQB!eN-^f%Sxwx;@s3eVWZkXi2|1XOH#$om! z#nzMn0000}o{x_*sge%jsNuAWaPwLA$f}8t{O(X&w&w2r018Ekb~hABsvcFLB#G2^ zYwwn7tFBo73y7-`tBE-)ULH1TcloCWQFp*ZVmmRXGr*W5hktc1egY78OsZx}Tdpgy zf(vR7VUG5LiqEhHD?RIi49pAb8=x8));B{iHLPz8H1Gso$P>?Vm`tu^4lbn`cw)6) zS_d+=GvRdDL3Q783o5V_;Olo`80HU9H9j-nRX5KKVh)z7kBh@p(*R0ilOc(() zCgut17KwD!MNJYwG>vAjT{b}^0W^ZWvvUb1z@_*7yf7y-uO3RlA# mfnOXRTkkdi0001hIJ^M&AK3{&XDQnN00001)~B!31;L_t(|ob8$04#FS|hMAG~e_${40z+yK1C415`@bv;rvd99 z%2rAN00017c|JbUEXx|GPYt_Wgj>w8M>S1+)OUkkvNiYU2^cgb=xS(^bUnI4MH7iO zqqQwd)m77%fVmnqTZFTc>0zN&EAJ6xT>*b2w-XE61DrW(T7UNvCjfKDEbBJ3=eQax zxFEU-ORNtn*~1#FG}i?gm>1S}z%(+f?}lP(Sl=0F5DC0cBguh+* z1b*SG(Db>*^Syu8A2Am7RD+;fkWv5{8?XY%tk&u+F)0O@WO6l}pBzMUjc90MAV4rF qT@Vd$&YVPUw;eMB00000Y|jhGOsM;fe(0V6000019dIMDP0Z;TU`%ac?SI8j0Ak0aYBsgyyb>8K zXnqKDv==IVh8$#CYeF{RMf43&gN*2#A%q&yHwGGb0vGb+8ssW;2l-|pcY~OoBMBnX zNb*Gyt}Dng_AK&i+BPNa>uMODk%|aRhA&}`n3P@&3rtP{ezei`e+Dst1vvu&oQY~d oJjW^eNsd=K02=@R002Na05NuxLTXd22><{907*qoM6N<$g75Wr6951J diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00012.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00012.png index eeec6324a1f33b9b155d3e979728a086251adb10..4fe8a80119d949f651fb52a2d7a2705d68969fc5 100644 GIT binary patch delta 306 zcmV-20nPsA0?h)DB!3i1L_t(|ob8#-4#FT1gu%%BKd=Wq&=AV*f+h_+Yv(%{{w%mt zrm{_m5JCvq%KLRH57l9S`mN<KUVuSWqTdZwlBP#fC}|?~ z!}{J@?bTJww_vauwVH%k$?~$%>Xn}!pzeSR!8S3cXTWB1fq%6ZKLG|i9;(}>-Z`&E z1PkgP!V>EbmApa>BCRzbi|{h~8!&^+=x;*_HKV^7YTyZ7$dhxBv(k-vW;qygJ4xI( zt#QZ~A^a|oW&Dhl5wgZCt1zG*#AG^iejE!6ssJg?vJ`4kT7r7l_W%npvCA*_!Tg;8 z2B_K4n!iMi+AD>i3Q)O$2B;P!U4Hpuk`O`&A%w)?1McgeP`5FwjsO4v07*qoM6N<$ Eg5E!ljsO4v delta 331 zcmV-R0kr7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uBunyLT* diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00013.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00013.png index 1c9156c31edf73cb072eaebf2db3fbe1ba5c612b..3a9f816d2af790fe1ac4d2841a0fd023ca9877aa 100644 GIT binary patch delta 340 zcmV-a0jvI=1MdQmB!4zZL_t(|ob8$04#FS|hMAG~e_${40z|1XOH#$om! z#nzMn0000}o{x_*sge%jsNuAWaPwLA$f}8t{O(X&w&w2r018Ekb~hABsvcFLB#G2^ zYwwn7tFBo73y7-`tBE-)ULH1TcloCWQFp*ZVmmRXGr*W5hktc1egY78OsZx}Tdpgy zf(vR7VUG5LiqEhHD?RIi49pAb8=x8));B{iHLPz8H1Gso$P>?Vm`tu^4lbn`cw)6) zS_d+=GvRdDL3Q783o5V_;Olo`80HU9H9j-nRX5KKVh)z7kBh@p(*R0ilOc(() zCgut17KwD!MNJYwG>vAjT{b}^0W^ZWvvUb1z@_*7yf7y-uO3RlA# mfnOXRTkkdi0001hIJ^M&AK3{&XDQnN00007ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=w|)Qs diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00014.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00014.png index ce795f34e8569e986af689fded3b59c9a8af2961..13edc51248172e480e5c663133bd830a8a2f8a9c 100644 GIT binary patch delta 290 zcmV+-0p0%H0=)u|B!2`+L_t(|ob8#(5`!QRL?IRa|ATXg2P_I_fgG$^V!uO*O~Gkt zby5ld003ah_j4(eDj6UiwLNVTUOv;-riQq-bHHf%Yu?@qQ0Pj`yP-=m^cV^iNu+t$ z+}o?Ox?=ee5UUZZg_#vEZyU8<{_8>19dIMDP0Z;TU`%ac?SI8j0Ak0aYBsgyyb>8K zXnqKDv==IVh8$#CYeF{RMf43&gN*2#A%q&yHwGGb0vGb+8ssW;2l-|pcY~OoBMBnX zNb*Gyt}Dng_AK&i+BPNa>uMODk%|aRhA&}`n3P@&3rtP{ezei`e+Dst1vvu&oQY~d oJjW^eNsd=K02=@R002Na05NuxLTXd22><{907*qoM6N<$f)W6CF#rGn delta 322 zcmV-I0logc0^I_TB!47HL_t(|ob8#-62c%1gsEfS|A9T|fw6-G0=6YAu-~c0@)I@* zLv)T1LI|CfH^_}!yz*BZkv^2=?Hdxc{A*JQ7n8RtPp zK=N5{Easxhaf*%Yv5kPk2P1#Has1IRPeHBs$cs9T66OLVbARr_7zz;OoG=T?BQe() z5gxob-#-pvr56zPj+vZs*7zvc)y3?k1aOLJy=-1h0GG6GZi4}#20ekxLQ8>o4!52c z$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4Es9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}l9*&ipy!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00017.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_8/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00004.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00004.png index 82030b711fe69207d044d44c0ff7bbee83f4da1c..06c3c59a9000082a980407c1e47a01c43dbfef53 100644 GIT binary patch delta 483 zcmV<90UZ9_0{sJ!B!9$7L_t(|ob8#*62l+}MNOyu{}1k>U1Vwr;1!jaWWrfh1;htx zXi7m41VPZx=e_yOicCP&s+!#u;6D{uo8;(DL3V|@SQ<&G6$tMNbC~rDM&aS%bKFFo z&pR!z&G44j|938CVX2N41sJOH;cn_KDuMv*;djhhjzLhO?jME&$TH=jaExnrmmF3h6o^Z*O%Xggs0Q%jn9eCl_Vp-!7xmw8-HDA_`694shkD8>N z&qHE_RMNV6WiNwc@!-MeqxB zM3f{+k|h1So}1sS$OP10O|?TQhStGLyJZ&Y?7jjv2UaP?)K(xo6z@2}1pVBPt7!9j z((>4N!}9q2F2y1&yBD##buE^@>ThO3wfGCLP@@)U|72kS9Dl)TTTQ$8u;a0j2(WwI zJxuX{K)e&~SfD+xqRNfp9O!BrKq8n}gzbbbu7z8S8WxUOaVWK|gLbE{KAqqJ^(8D} z*DTOrq1J{i)-gw|XHBIhe#5@#Z99wZDfeA4Lxyr`W^MrL^`EPM3d&OF>Q5&3;7l?K zoym5Q7p0j!t$*0A$QK*!Kk~4QeE;EB9g|Vth0GkNQEjPDPosW3HdVigX7&U44R$F@ zt_BFZnk-{ev(3iLXvYAEDE>ptl5R8xy2+W#I%PZ2?%@r!<6ptRzX2BuSF|0dKrWc0EhQO@06X N002ovPDHLkV1hZ|>dycG delta 331 zcmV-R0kr<{1LgvdB!4YQL_t(|ob8#*62l+}MYYrX{|9H0E}S}66dzI0=AKnTEwLAs zK#c(a0Ps|-=EJYk7-Q_gS(;pVIy@-x)}FvP_7Oc~;Q)k-+KGFe@kONvKRB|`0nfty zey>7w8x2cd&@naNV*H4+$qsPXgG&<09aHpKxtXT1KmZt7bALMK{Ipt{4zxMEv>x1p zQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcmATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>o zbVJ8hCB^DASqdfRP^^LZu4>Ved?oGf&gPIV`f^(;vh%m0~_? zr8>V7uB!r|ASrVqBBTuZbLx|(dMk6Bm@#( zMv)*0f*@$;_1u)93IbHC*zKt#L+jwR-82h2I~Twl;G-6!t%mTa)Q;1bU_JNmyD0N| z%JSIkhUM`or)m<`>PakbU8_l#mcazI_z%EQL#wjCvTOnS1b@qI746!KUDOe(hh(%i zF=PjHq;|r!@@b<$fwuPG*8(8wFgYUZm|LH2;5dfrspPgs+U>;f9gttb8n|YS9*&Ur zW?S65vFYo8Ui;l}^tK&E^OPGD3n~}%zKjikrFBj3Pl32Pyg!(T!A#;5n#tD53uzwn zj)ts`EeQhpEq_bjh4DJ)@wtu8hI00007ENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQ zhD#B5ZCio#FnpZvsgyOJV*hwd>m7MA*2TC`gvbxExlw9P*GWl3w#fa$g^{OWU5rzv zURSsL8^HL;(=ZJ{t@3k$n&|FdPSzHrM5CkhAHD9@5i$)x%zaJzw-<`s4Tqj`@b>t( hEI~pDA%qap!xv8s=`=qD9TFDeOU)GNj|Mhr}nxvi2Lv{xUAC%RU zT~&=T1dAPzeb5Gkqy7pPU?D&$MCjWpO<{NuhOYJDRBq#ke18%J<%@=ZkLDPMa45#H zWLbIAYO+alu=`yibUqY-UuGu|%>rjqUp&Eav=dkXoZt+Um;E$cxrdQ)3DC>Ap$3-x zOBBN7_s-!`QYZ@XVM!^kU_Lu@2U?J`a&kGE00|fuv6ND36aHpf3#0)1mbvJrCZ#HP zPkjia07@G2cQSZl*d^nLbB+R-0~vzS#H9Qm&U7a;A%qY@$n-n_NNvuor)kuM00000 LNkvXXu0mjf*CCDL delta 313 zcmV-90mlB_0^I_TEq~1t!XONUsbk;&fj#Jfv4aExwk0gE->Jp&6E+D$bdC^02(jb+ zy4vyF2&dy>z=Az1R zijD2Djex@kBY(Vc{LwH^L9O@5i#m=H<^m*h?!p)f5apaO3xCNYG1nLo9=ti!jP4dkz*)j>Uv z-V4YO{k?VXurf&5A1?yV6+xZw{YDa!tAMG3nu5rL`0P&zA>_*k1^mvtO~`RE00000 LNkvXXu0mjf-xise diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..eeec6324a1f33b9b155d3e979728a086251adb10 GIT binary patch literal 358 zcmV-s0h#`ZP)py!C9JIc{)5O z@z$QeIQ9`eWZ?jWi`t2Mo$*Db2R}Hn&;ifF{eG`PbQ=vzUeGZ$-(viTv&jx{*n>+F z$sJSlS-F{}u|NPAS#vt({Ipt{4zxMEv>x1pQ_2Ty6vG|1u)q#rxT8xbt6SjIvSJcm zATRwh1$m*q09lctz8DFqp}sJPfhIVGH2D>obVJ8hCB^DASqdfRP^^LZu4>Ved?oGf z&gPIV`f^(;vh%m0~_?r8>V7uBj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png b/tests/snapshots/nanos_lrCompleteQueuedWithdrawals_redelegate_1/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..ce795f34e8569e986af689fded3b59c9a8af2961 GIT binary patch literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00003.png index d98dc1e95f25c879e2c9b1510df037c6f6cabb0d..343850a22a7448ea232679f2296b3c327c526eae 100644 GIT binary patch delta 789 zcmV+w1M2*t1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfk0*Dn delta 392 zcmV;30eAkZ2B8CxBYy#CNkl1~S(L0001(`#XJsoO3-+DZTYAAzlr*i-*l+N~YS*h$H9h_{09aE_^Kp$21q} zFd75K^Q4r7uy#m&Hfld(Gy+EThTD6d7M5w`W;4HdVBkg`vJ9*eDlMO zGFpaC%dR>J3ytcjx@TNyY}@T8;osD)EPWT6GPhL_isL27%c|M{0ID0z0ps@VdS~6) z?e(Hf2A(hDzJD~`R0mA4ENBO;c1HI~?v98ZAiOea|FqdFVYgsK#17cBIU4rg_qkvv z?2Ha@)|a3NtBCf0hr%R$$C+74Z@?1ydzMKi`(`GoCi}+d15Z>TPfC*MgQG|<00000 m00000000000001R%oAU11SXAb?JEEP002ovPDHLkU;%=XbFr%c diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00004.png index c63a3b840a14de66db65b55d3950c561e819ba67..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 390 zcmV;10eSwZ1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1iAazi9vf diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00005.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00005.png index d98dc1e95f25c879e2c9b1510df037c6f6cabb0d..c63a3b840a14de66db65b55d3950c561e819ba67 100644 GIT binary patch delta 399 zcmV;A0dW4I1E~X$B!6&8L_t(|obA|Ka>F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1iAazi9vf delta 390 zcmV;10eSwZ1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1iAazi9vf diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00007.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00007.png index b2401b220a6db139961dbcfed78507c4de86032a..c63a3b840a14de66db65b55d3950c561e819ba67 100644 GIT binary patch delta 399 zcmV;A0dW4G1E~X$B!6&8L_t(|obA|Ka>F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1i13zh?jd delta 388 zcmV-~0ek+b1D^wsB!6Z}L_t(|obA|KZp0uAKv6pCPT2pF*vouGLDU#R9@td5=L?b6 zWNbnLApigX0Oo$|hfFDLjTmFA=W@)OaqRti-@udpQQkAp0;H5;jAHVJztefkY59nZ zKQ48ge(;f)kNX&pHzMxBo}D@`YNk?3Ih*+(%Q$LhIp~C6bAMpPC8&NT!any~^~irC zB9x)jPI1+~25toqi%C6mLnBjXN6GEh+9gIeu7UFsG@jy9g;A5($*kA<6Bb;8%B3c| z@F<8lTYl9}-P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00009.png index 657887225857cf48be8a8daed2cb3e89d4b29ece..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL delta 354 zcmcb?{FiBhO1+Dxi(^Q|oVPcl`3@-vI0Po$;rtyhRQ<8JMIk?%eObZz=}8L@T*!1t zWzj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00010.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..657887225857cf48be8a8daed2cb3e89d4b29ece GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00003.png index af34fd01d1aab1c8d18e2d19a328e40975639de8..343850a22a7448ea232679f2296b3c327c526eae 100644 GIT binary patch delta 789 zcmV+w1M2*P1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfGO>4$ delta 361 zcmZ3@*33LXxt`I>)5S5QV$R!}xqM9qJPi*s_jtaqUvl@TyxQ4IwHmK(Io*3MuEdj( zc`%ZTfq~({yJwXfqOvtzT}p1&h)gV-ee|9Ce&5&cDh-6It{(GqG3nTPt?qGmrOW(= zRIi04+qY@XH9DCQ?emsx*#oiDb}`xqBI1|V-M;3s|GG|!+6$}t6B~HfwcpZ;WtG{K z7tk&A(!JwV={?a4_p5flx0bbk{@HR9>)&_NXYfVOsh`9obRqu9n@w9|#Qr9JODoL~ z06NH`crNeXbJp4b2Y diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00004.png index b2401b220a6db139961dbcfed78507c4de86032a..af34fd01d1aab1c8d18e2d19a328e40975639de8 100644 GIT binary patch delta 360 zcmbQw+{`>drQXZa#WAE}&fA;0d`$*C4G%N-c)qV+a`&jb+SyCB8n13S-Fq&s#FLSE zFp`Ubf#JcsXO$bGvNc^@N^aJOOe~vy^qu>D-`DRd4TP(%9`kcC>DYR$?s0de%lw8^ zuZ1Psw`tBbI++pe^OkMd1F_R~G1>V%>-*?kz@I}w5pTs0|A^ypmO@4UF7MxS*-6XeSDrp>9vFM`owbbCwa(>AJ{s+U=k+t0+Ww18>4;yoJJrXbUVQuI ztnSK}H#4Nqeatsfd*Cb|me^d$mSa6ve{QwWJ0=eYgWF9;dtA5FE9uD{O0O~6&zXNn ztkU+ff^e;QbAWJd`V$4ASdB}w6(%>Y<P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00006.png index 657887225857cf48be8a8daed2cb3e89d4b29ece..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL delta 354 zcmcb?{FiBhO1+Dxi(^Q|oVPcl`3@-vI0Po$;rtyhRQ<8JMIk?%eObZz=}8L@T*!1t zWzj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_1/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..657887225857cf48be8a8daed2cb3e89d4b29ece GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00003.png index d98dc1e95f25c879e2c9b1510df037c6f6cabb0d..343850a22a7448ea232679f2296b3c327c526eae 100644 GIT binary patch delta 789 zcmV+w1M2*t1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfk0*Dn delta 392 zcmV;30eAkZ2B8CxBYy#CNkl1~S(L0001(`#XJsoO3-+DZTYAAzlr*i-*l+N~YS*h$H9h_{09aE_^Kp$21q} zFd75K^Q4r7uy#m&Hfld(Gy+EThTD6d7M5w`W;4HdVBkg`vJ9*eDlMO zGFpaC%dR>J3ytcjx@TNyY}@T8;osD)EPWT6GPhL_isL27%c|M{0ID0z0ps@VdS~6) z?e(Hf2A(hDzJD~`R0mA4ENBO;c1HI~?v98ZAiOea|FqdFVYgsK#17cBIU4rg_qkvv z?2Ha@)|a3NtBCf0hr%R$$C+74Z@?1ydzMKi`(`GoCi}+d15Z>TPfC*MgQG|<00000 m00000000000001R%oAU11SXAb?JEEP002ovPDHLkU;%=XbFr%c diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00004.png index c63a3b840a14de66db65b55d3950c561e819ba67..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 390 zcmV;10eSwZ1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1iAazi9vf diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00005.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00005.png index 7de9fc92d0d326e6d211b130962c6da727e28a4f..c63a3b840a14de66db65b55d3950c561e819ba67 100644 GIT binary patch delta 399 zcmV;A0dW4P1E~X$B!6&8L_t(|obA|Ka>F1DKvAdDov{BUv6p@@VJN~9af49Yd%he- z@k4-&ISv2-0Kna2^#yXy^*E*U(!Z2=GvHHv`CO)Cs_l$8a?TrX?0eURkCVwU%!N6P zWPm(RN=XT8r_{AsdyUf!km>`s&pa$F!^p{ida81ep5(P;yMNEDb(#U)({|%d9?QnF zM3@1?U^Bq2C^>aNnf^KFZgjUl^=CFqfl`{}kT>(|_Ilq_f`*Sb-#8yoE6HDOY$>N@ z=&?9<&q&<;3$?^DWp(!~sg9rdla9iUY0$$2op)3;I3FX6I@ z7B*{d6tn}1|Ii102@0}YlU07Wn;+p;Ut*;9_QNfL(D%PDHLkV1ihOziR#B!6#7L_t(|obA{_j>8}fK+()-Zo>VK#9d~AiVy}&(_%yP-zr5k z2?h+|x&QzG0CPX99}r{A*CB+r{xzttRyf74&0|ue%FftFjM4GM{=6Q1btXqM7V0#T z736(F2!m?nl)5)-?=hMIQf_eB=4N7P)|{-6Zi+q+Ww||+nMl+ylZ8h%XwJhuf zLaorOtX42fN=6-!rhkmF8r|j3ahugtFi1^u$gA-+Ti$(AP_udSh4U41Ci&#WmNMFg zHq)-U2oDO?TUBFxP*|4RFT&4M?JRvanqzLeASBCEke6Pz0RUvDt^xD=&gxr_#o#;C zlZlz1JMcUW9e=34jG86Suww_5iK4u2o|4LPdA9}c_%%CrKu?vyC#S;vd7q18zJ$}U z+J+JQ&@mm5Jg*Px6tu%et&H+u5k7HQR>J$R!L_GukcqyTMyQFtG5Ww0S;&(TWcpw! s!V3TZ00000000000000004(zlR}~QzwYZ=h00000Ne4wvM6N<$f^Z1BoB#j- diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00006.png index 8fb41809e7c1eb100443242a3ea7ed2e245db0d2..7de9fc92d0d326e6d211b130962c6da727e28a4f 100644 GIT binary patch delta 398 zcmV;90dfAV1E>R#B!6#7L_t(|obA{_j>8}fK+()-Zo>VK#9d~AiVy}&(_%yP-zr5k z2?h+|x&QzG0CPX99}r{A*CB+r{xzttRyf74&0|ue%FftFjM4GM{=6Q1btXqM7V0#T z736(F2!m?nl)5)-?=hMIQf_eB=4N7P)|{-6Zi+q+Ww||+nMl+ylZ8h%XwJhuf zLaorOtX42fN=6-!rhkmF8r|j3ahugtFi1^u$gA-+Ti$(AP_udSh4U41Ci&#WmNMFg zHq)-U2oDO?TUBFxP*|4RFT&4M?JRvanqzLeASBCEke6Pz0RUvDt^xD=&gxr_#o#;C zlZlz1JMcUW9e=34jG86Suww_5iK4u2o|4LPdA9}c_%%CrKu?vyC#S;vd7q18zJ$}U z+J+JQ&@mm5Jg*Px6tu%et&H+u5k7HQR>J$R!L_GukcqyTMyQFtG5Ww0S;&(TWcpw! s!V3TZ00000000000000004(zlR}~QzwYZ=h00000Ne4wvM6N<$f_6Z delta 403 zcmV;E0c`%L1FZv)B!6^CL_t(|obB0LZp0uAK+&}7PT2pF*h@c95i(#i4~!?h=cCFX zPZCUU7bB4ys@8C7rrKwW0(tb z8ubDFc~VMBSUaVjo3+nzngPAq;kM7i!ZM6p45+6n2kB3Lt$)7VXVyB+0MT3V-1WzO z<17(oz%bYha4Skq15l=a&RIO&?MJ=OW+_lgQ~$`D`E`4}pD97Z?yWbj2h>XP%8hO1 zvE$Fl-0LudO!q4M>1C%2=8vR^d(TLQ%IRi&{Pb`%2*fT+1KYmTTtcO^?ubB4ys@8C7rrKwW0(tb z8ubDFc~VMBSUaVjo3+nzngPAq;kM7i!ZM6p45+6n2kB3Lt$)7VXVyB+0MT3V-1WzO z<17(oz%bYha4Skq15l=a&RIO&?MJ=OW+_lgQ~$`D`E`4}pD97Z?yWbj2h>XP%8hO1 zvE$Fl-0LudO!q4M>1C%2=8vR^d(TLQ%IRi&{Pb`%2*fT+1KYmTTtcO^?u+{`>drQXZa#WAE}&fA;0d`$*C4G%N-c)qV+a`&jb+SyCB8n13S-Fq&s#FLSE zFp`Ubf#JcsXO$bGvNc^@N^aJOOe~vy^qu>D-`DRd4TP(%9`kcC>DYR$?s0de%lw8^ zuZ1Psw`tBbI++pe^OkMd1F_R~G1>V%>-*?kz@I}w5pTs0|A^ypmO@4UF7MxS*-6XeSDrp>9vFM`owbbCwa(>AJ{s+U=k+t0+Ww18>4;yoJJrXbUVQuI ztnSK}H#4Nqeatsfd*Cb|me^d$mSa6ve{QwWJ0=eYgWF9;dtA5FE9uD{O0O~6&zXNn ztkU+ff^e;QbAWJd`V$4ASdB}w6(%>Y<pN7 z7|F%J!0_PRv&s!o*_y5{B{yqCCYH@U`p$j7@9TG!2EtWWkNLTnbZos=_qe;#Wqw1d z*TRzR+cf7Ioy>^#dCRu!f!Jxg80`ZQ@yqLOUvt@iT_;8Dh1H4r4ZQ2xZ)wG{%52ID z=oWhE-tnsRp6G@9RlDC?%i2HxY`KZ`@4M+U_@d|3Pht|f5dY-OrmZnze-po@m1YP4 z9b{2Fm-p|v?4;%KD^DLb4~)I}&RRz6TIX^lAB}dw^ZJ=gZU4olbi}XPo$BLIFTVY9 zR(Ivgn;FvQKIR*#J#dx}OKh%W%dwuTKeyWG9g~NH!R;oaJ+52omGtBerPmnk=gdDO zR%v@#LAchuIY78J{fUB5tj49;3X_}Ha_9rCM+O_t3jbPk`bdrCNlB2fr>mdKI;Vst E0JNQ+s{jB1 delta 359 zcmV-t0hs=S1A+sPB!5XsL_t(|obB0B4#FS|fMGP=r1w7(cky8f!4^7~xl;B2o;F2v zEv*wv0RR91!rda@tkzme5s`MRPDP|20>7%Er_*NJNU;uR(}9Z zl|nH~Ta`|kWVA1)et;@C=Qu`a1t|V?wrBgAu&0Q0<+Wa}cpI5e^^UlO{*y7@ov>*ZYB4?M~%EjpqvpcIplK=n!AXw;b z=ts;pcI<=w-K{#sG4_|UKW6tdkEDA+{g&r;{H5FdyOJiLylxfPexk+n9VFsZl z`oYM-N_3%>c7jX}E=70&000000000000000004l?JOL3a+Tp@X(2W29002ovPDHLk FV1i9yr?vn9 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00009.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00009.png index 460a5e92b658d2e27542e4522f0b7b83ed120c20..fdc3ea2941fb7e3069621b5d6940fbb961b15b3a 100644 GIT binary patch delta 359 zcmV-t0hs=y1A+sPB!5XsL_t(|obB0B4#FS|fMGP=r1w7(cky8f!4^7~xl;B2o;F2v zEv*wv0RR91!rda@tkzme5s`MRPDP|20>7%Er_*NJNU;uR(}9Z zl|nH~Ta`|kWVA1)et;@C=Qu`a1t|V?wrBgAu&0Q0<+Wa}cpI5e^^UlO{*y7@ov>*ZYB4?M~%EjpqvpcIplK=n!AXw;b z=ts;pcI<=w-K{#sG4_|UKW6tdkEDA+{g&r;{H5FdyOJiLylxfPexk+n9VFsZl z`oYM-N_3%>c7jX}E=70&000000000000000004l?JOL3a+Tp@X(2W29002ovPDHLk FV1jx++{zaA!Hk;S%R^m_xaTi zhZGyrCM^X3000R06?wAOS}CR0+8>Ljwbn7lIsEFoX?;hYOr*XWb60EaNo=j@;FtN? z{Q)G=3Pmk#(K=;P(XpAv0MT&H;~1eGAo%m_?~Xm8kD8@SB!9gRVs3-}P)nujfJ^)h z%4rcj!mhn8x&!pmTfOf3_&L9ycWy!V-N~uB#l;tCLjm+8XVdQO;_MHzUsjg}0RRBN zo0*sXAHIGXT>gG*cC!F+tTSMMEEi(_w2zx>e((`9GH=G2V{W`e$Wnk=nu^N4AN=^) zSIbg>8J+!`Lw{||wJA{n%+$>C^_nI~RDhXmYxY^W3UFz?e_og)a=hhf?rd8sE&q^t zaL?7ue+T^-@w)SEtPlLhL{`_}B)u>0^gO0XCi`KGRFnN+)L++{zaA!Hk;S%R^m_xaTi zhZGyrCM^X3000R06?wAOS}CR0+8>Ljwbn7lIsEFoX?;hYOr*XWb60EaNo=j@;FtN? z{Q)G=3Pmk#(K=;P(XpAv0MT&H;~1eGAo%m_?~Xm8kD8@SB!9gRVs3-}P)nujfJ^)h z%4rcj!mhn8x&!pmTfOf3_&L9ycWy!V-N~uB#l;tCLjm+8XVdQO;_MHzUsjg}0RRBN zo0*sXAHIGXT>gG*cC!F+tTSMMEEi(_w2zx>e((`9GH=G2V{W`e$Wnk=nu^N4AN=^) zSIbg>8J+!`Lw{||wJA{n%+$>C^_nI~RDhXmYxY^W3UFz?e_og)a=hhf?rd8sE&q^t zaL?7ue+T^-@w)SEtPlLhL{`_}B)u>0^gO0XCi`KGRFnN+)L1M>oqB!4#!gjh5KAfj!7uZF`T{JI z3er8=CUs=eqir&^2bhF&mScowfZ^X~-P`6w|EpQZOwem1!+$d9H?>u|3|Qh9C?`ew z7EaZ==nUu|z1`1UZ9nJx`D6*Y?@mmIB`&^`4s<|&le62d>EhIf*~n_C5dZ)H1Ph%F zU1CO!!_V5`7_@F|N4I7b7iKf2!(GGe{%Ri2{t|wHM^47|Gt&NHnLV-teyrx^9kA_k zZlMGnMh6^bOHojg;hOm$Q6}{y!=)~{2yfa#`6kmK6a6rQP!s)N^ub9~p_49xOdo7T qcmV(a000000000000000fNj2i(Z~(KdN(Nm0000N diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00011.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00011.png index b2401b220a6db139961dbcfed78507c4de86032a..ee1fa1893661c5ea5d1f00bbe2bf39b0a888f2e8 100644 GIT binary patch delta 344 zcmV-e0jK_-1M>oqB!4#!gjh5KAfj!7uZF`T{JI z3er8=CUs=eqir&^2bhF&mScowfZ^X~-P`6w|EpQZOwem1!+$d9H?>u|3|Qh9C?`ew z7EaZ==nUu|z1`1UZ9nJx`D6*Y?@mmIB`&^`4s<|&le62d>EhIf*~n_C5dZ)H1Ph%F zU1CO!!_V5`7_@F|N4I7b7iKf2!(GGe{%Ri2{t|wHM^47|Gt&NHnLV-teyrx^9kA_k zZlMGnMh6^bOHojg;hOm$Q6}{y!=)~{2yfa#`6kmK6a6rQP!s)N^ub9~p_49xOdo7T qcmV(a000000000000000fNj2i(Z~(KdN(Nm0000P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00013.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00013.png index 657887225857cf48be8a8daed2cb3e89d4b29ece..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL delta 354 zcmcb?{FiBhO1+Dxi(^Q|oVPcl`3@-vI0Po$;rtyhRQ<8JMIk?%eObZz=}8L@T*!1t zWzj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00014.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_8/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..657887225857cf48be8a8daed2cb3e89d4b29ece GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00003.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00003.png index d98dc1e95f25c879e2c9b1510df037c6f6cabb0d..343850a22a7448ea232679f2296b3c327c526eae 100644 GIT binary patch delta 789 zcmV+w1M2*t1FHs*BYy(&Nkl-omWpa~;20m3NizX3s^scG0mW{!jZmXz zTrZG4-$_%_eMbFmIGuWRz*or8PqN9oW+qz}H_MVSGk@&%3t?-(69UI|c$WfgsgK)Vg?2W;|M}9ROVdSBx61-9GNyJaXrb3m9+Jcf-}q zxxO{Rr+-(Y^>*MUSc-7TUe8ShB8AUA?LG}aGmQY*%cWqerqp7ob6OtGRC8j3JuQq! z>s2G5;C(P~MIwW0(Z!~PESF|wY~@h^RN-jCj%#5L2MC`Vc!eB&mTkhPiYWlb#8iJ1 z?`e~&eN{KLi<v-u1C|A_iMthp;MC1Zr%A4b4 z0D597o}=enc2@EPyl4cdL}ln%$rJFd05rL;zBUS^(}{OIDO(ak2qA=!Z{$B{H&{-w TeGcdd00000NkvXXu0mjfk0*Dn delta 392 zcmV;30eAkZ2B8CxBYy#CNkl1~S(L0001(`#XJsoO3-+DZTYAAzlr*i-*l+N~YS*h$H9h_{09aE_^Kp$21q} zFd75K^Q4r7uy#m&Hfld(Gy+EThTD6d7M5w`W;4HdVBkg`vJ9*eDlMO zGFpaC%dR>J3ytcjx@TNyY}@T8;osD)EPWT6GPhL_isL27%c|M{0ID0z0ps@VdS~6) z?e(Hf2A(hDzJD~`R0mA4ENBO;c1HI~?v98ZAiOea|FqdFVYgsK#17cBIU4rg_qkvv z?2Ha@)|a3NtBCf0hr%R$$C+74Z@?1ydzMKi`(`GoCi}+d15Z>TPfC*MgQG|<00000 m00000000000001R%oAU11SXAb?JEEP002ovPDHLkU;%=XbFr%c diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00004.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00004.png index b2401b220a6db139961dbcfed78507c4de86032a..d98dc1e95f25c879e2c9b1510df037c6f6cabb0d 100644 GIT binary patch delta 390 zcmV;10eSwP1EB+uB!6g0L_t(|obB0Lj>8}fK+#M!J7NDzVlVwbMTmz@TVXrZJzpu~ zCXEROGS>wF005Z#JAHwib3INez4a|2UJba5hs|Y5rrOSkBj@b+!~VT4d@TmYG#BbH z8Ux1jq?ClPc1V3TYCmH%0!HKs{ACNH62H#(#F3QEM~;y1VV3yYYBz zTqQycmW<|-U1IqBvId@NY`%%7UwG;@YX?*0>{F+VgJ|$>+d;5+10kx8R^TUoZ zT82)`t~v<|jq0hoXIyA(+wCXe-_)%veHWTCw^a~|<0Z(;s@ebmsvFD!P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000P-jHUi&7r)J!tjH>0GQ>>Hy7o>+xE@gDX>dI10c00000 i0000000000fN8#7PD6W~&i|+Y0000_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$g5fRJ4FCWD diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00006.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00006.png index 657887225857cf48be8a8daed2cb3e89d4b29ece..570ce28d53e82ac396ba25c370110058f3a638f9 100644 GIT binary patch delta 446 zcmV;v0YU!#0@wqPB!8btL_t(|obB0Ba)clZfMM+HO}PJ&xJw_HvRNaFRyK+Ae@_l| zDJF;*Qvv`000000fD1|~r4;K?obY2kfIGzsef69KwCLxYZAWrSumtp0n4r;5;Sx}- zau7HADO>_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f`dcWY5)KL delta 354 zcmcb?{FiBhO1+Dxi(^Q|oVPcl`3@-vI0Po$;rtyhRQ<8JMIk?%eObZz=}8L@T*!1t zWzj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCyx8>t5X diff --git a/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00007.png b/tests/snapshots/nanox_lrCompleteQueuedWithdrawals_redelegate_1/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..657887225857cf48be8a8daed2cb3e89d4b29ece GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/src/lrCompleteQueuedWithdrawals.test.js b/tests/src/lrCompleteQueuedWithdrawals.test.js index 813af1f..1e10128 100644 --- a/tests/src/lrCompleteQueuedWithdrawals.test.js +++ b/tests/src/lrCompleteQueuedWithdrawals.test.js @@ -92,7 +92,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 9 : 8; + const right_clicks = model.letter === 'S' ? 12 : 9; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -168,7 +168,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 6 : 5; + const right_clicks = model.letter === 'S' ? 9 : 6; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -244,7 +244,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 6 : 5; + const right_clicks = model.letter === 'S' ? 9 : 6; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( @@ -363,7 +363,7 @@ nano_models.forEach(function (model) { } ); const tx = eth.signTransaction("44'/60'/0'/0", serializedTx, resolution); - const right_clicks = model.letter === 'S' ? 13 : 12; + const right_clicks = model.letter === 'S' ? 16 : 13; await waitForAppScreen(sim); await sim.navigateAndCompareSnapshots( From 6eaf9d95369a6e65d99e26a93cc2dd70ec179842 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Wed, 29 May 2024 10:08:21 +0200 Subject: [PATCH 42/46] fix: I5-4 off by one issue --- src/provide_parameter/eigenlayer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 4664b60..7fb75da 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -713,7 +713,7 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con uint8_t strategy = (strategy_index != UNKNOWN_LR_STRATEGY) ? strategy_index : UNKNOWN_LR_STRATEGY; - if (withdrawal > 16 || strategy > 16) { + if (withdrawal >= 16 || strategy >= 16) { PRINTF("INVALID WITHDRAWAL #: %d STRATEGY #: %d\n", withdrawal, strategy); msg->result = ETH_PLUGIN_RESULT_ERROR; return; From 8d41f094ae921d86df0f57490444e4a2e9582b5a Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Wed, 29 May 2024 10:11:21 +0200 Subject: [PATCH 43/46] fix: I5-2 --- src/provide_parameter/eigenlayer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/provide_parameter/eigenlayer.c b/src/provide_parameter/eigenlayer.c index 7fb75da..3ecc56a 100644 --- a/src/provide_parameter/eigenlayer.c +++ b/src/provide_parameter/eigenlayer.c @@ -637,7 +637,7 @@ void handle_lr_complete_queued_withdrawals(ethPluginProvideParameter_t *msg, con uint8_t buffer[ADDRESS_LENGTH]; copy_address(buffer, msg->parameter, sizeof(buffer)); // we only support same withdrawer accross all the withdrawals - if (params->withdrawer[0] == '\0') { + if (allzeroes(params->withdrawer, sizeof(params->withdrawer)) == 1) { memcpy(params->withdrawer, buffer, sizeof(params->withdrawer)); } else if (strcmp((const char *) params->withdrawer, (const char *) buffer) != 0) { PRINTF("Unexpected withdrawer address, %s != expected %s\n", From ad0d5dd2ac641f25c41d4daa808f3d2e0b7eb564 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Wed, 29 May 2024 10:16:08 +0200 Subject: [PATCH 44/46] fix: I1 --- PLUGIN_SPECIFICATION.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PLUGIN_SPECIFICATION.md b/PLUGIN_SPECIFICATION.md index 67fdd07..3e564ad 100644 --- a/PLUGIN_SPECIFICATION.md +++ b/PLUGIN_SPECIFICATION.md @@ -29,12 +29,13 @@ For the smart contracts implemented, the functions covered by the plugin are: | OCV1 | batchWithdraw | `0xe8a0c121` |
n/r
| | OCV1 | batchWithdrawELFee | `0xef5e4682` |
n/r
| | OCV1 | batchWithdrawCLFee | `0x0ffab6c2` |
n/r
| +| OCV1 | requestValidatorsExit | `0xb6b06dec` |
n/r
| | OCV2-N20 | stake | `0x3a4b66f1` |
uint tx.value
| | OCV2-N20 | requestExit | `0x721c6513` |
n/r
| | OCV2-N20 | multiClaim | `0xb7ba18c7` |
n/r
| | OCV2-EQ | claim | `0xadcf1163` |
n/r
| -| EL-SM | depositIntoStrategy | `0xe7a050aa` |
address strategy
address ERC20
| +| EL-SM | depositIntoStrategy | `0xe7a050aa` |
address strategy
address ERC20
deposited amount
| | EL-SM | queueWithdrawals | `0x0dd8dd02` |
queuedWithdrawalParams.strategies[] as string using an internal mapping
queuedWithdrawalParams.withdrawer
| | EL-SM | completeQueuedWithdrawals | `0x33404396` |
strategies as string using an internal mapping
redelegated or withdrawal action
| | EL-DM | delegateTo | `0xeea9064b` |
address operator or "KILN"
| -| EL-DM | undelegate | `0xda8be864` |
type ParameterName
| +| EL-DM | undelegate | `0xda8be864` |
| From 46ea3056c42b195ecc19d3c05230543d694c9934 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Wed, 29 May 2024 10:21:06 +0200 Subject: [PATCH 45/46] fix: I2 --- src/handle_init_contract.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/handle_init_contract.c b/src/handle_init_contract.c index e6d79b5..1ac485b 100644 --- a/src/handle_init_contract.c +++ b/src/handle_init_contract.c @@ -40,6 +40,13 @@ void handle_init_contract(ethPluginInitContract_t *msg) { } context->selectorIndex = index; + // check for overflow + if ((size_t) context->selectorIndex != index) { + PRINTF("Error: overflow detected on selector index!\n"); + msg->result = ETH_PLUGIN_RESULT_ERROR; + return; + } + msg->result = ETH_PLUGIN_RESULT_OK; switch (context->selectorIndex) { From ca1cdc3c215eb423f476f186b5de052961cd7546 Mon Sep 17 00:00:00 2001 From: "pwnh4 (@loicttn)" Date: Wed, 29 May 2024 17:39:28 +0200 Subject: [PATCH 46/46] fix: ethereum plugin sdk version --- ethereum-plugin-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum-plugin-sdk b/ethereum-plugin-sdk index 2bf928b..35a7f76 160000 --- a/ethereum-plugin-sdk +++ b/ethereum-plugin-sdk @@ -1 +1 @@ -Subproject commit 2bf928b2c14b15e4f3f42a24af4caf54493fb5b3 +Subproject commit 35a7f7650e3aab943093ea608016f1c107539db6