diff --git a/.github/workflows/sdk-generation.yml b/.github/workflows/sdk-generation.yml index b563e0f..363c89b 100644 --- a/.github/workflows/sdk-generation.yml +++ b/.github/workflows/sdk-generation.yml @@ -26,7 +26,7 @@ jobs: persist-credentials: false - name: Build new SDK - run: python tools/build_sdk.py + run: ./tools/build_sdk.sh - name: Extract branch name shell: bash diff --git a/Makefile b/Makefile index 119abfd..a78c813 100644 --- a/Makefile +++ b/Makefile @@ -277,7 +277,7 @@ ifeq ($(CHAIN),ethereum) endif # rebuild SDK - $(shell python3 tools/build_sdk.py) + $(shell ./tools/build_sdk.sh) # check if a difference is noticed (fail if it happens in CI build) ifneq ($(shell git status | grep 'ethereum-plugin-sdk'),) diff --git a/src_common/eth_plugin_interface.h b/src_common/eth_plugin_interface.h index 9c93dfd..9821836 100644 --- a/src_common/eth_plugin_interface.h +++ b/src_common/eth_plugin_interface.h @@ -1,11 +1,15 @@ // clang-format off -#ifndef _ETH_PLUGIN_INTERFACE_H_ -#define _ETH_PLUGIN_INTERFACE_H_ +#pragma once #include "os.h" #include "cx.h" + +// Include other header compatible with plugins #include "asset_info.h" +#include "caller_api.h" +#include "common_utils.h" +#include "plugin_utils.h" #include "tx_content.h" /************************************************************************************************* @@ -217,6 +221,4 @@ typedef struct ethQueryContractUI_s { } ethQueryContractUI_t; // void handle_query_contract_ui(ethQueryContractUI_t *parameters); -#endif // _ETH_PLUGIN_INTERFACE_H_ - // clang-format on diff --git a/src_common/plugin_utils.h b/src_common/plugin_utils.h index 569c202..b37da7a 100644 --- a/src_common/plugin_utils.h +++ b/src_common/plugin_utils.h @@ -20,6 +20,8 @@ #include #include +#include "eth_plugin_interface.h" + #define SELECTOR_SIZE 4 #define PARAMETER_LENGTH 32 diff --git a/src_plugin_sdk/README.md b/src_plugin_sdk/README.md index b183cab..a5c308d 100644 --- a/src_plugin_sdk/README.md +++ b/src_plugin_sdk/README.md @@ -14,5 +14,5 @@ Be careful, and weight your choices. If for some reasons you want to rebuild this SDK manually from [app-ethereum](https://github.com/LedgerHQ/app-ethereum) (reminder: it is rebuild automatically when building app-ethereum itself): ```shell -$> python3 tools/build_sdk.py +$> ./tools/build_sdk.sh ``` diff --git a/src_plugin_sdk/plugin_utils.c b/src_plugin_sdk/plugin_utils.c deleted file mode 100644 index 42ecef0..0000000 --- a/src_plugin_sdk/plugin_utils.c +++ /dev/null @@ -1,28 +0,0 @@ -/***************************************************************************** - * Ledger Plugin SDK - * (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. - *****************************************************************************/ - -#include "plugin_utils.h" - -bool find_selector(uint32_t selector, const uint32_t *array, size_t size, size_t *idx) { - for (size_t i = 0; i < size; ++i) { - if (selector == array[i]) { - if (idx != NULL) *idx = i; - return true; - } - } - return false; -} diff --git a/src_plugin_sdk/plugin_utils.h b/src_plugin_sdk/plugin_utils.h deleted file mode 100644 index e2816f9..0000000 --- a/src_plugin_sdk/plugin_utils.h +++ /dev/null @@ -1,27 +0,0 @@ -/***************************************************************************** - * Ledger Plugin SDK - * (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. - *****************************************************************************/ - -#ifndef UTILS_H_ -#define UTILS_H_ - -#include -#include -#include - -bool find_selector(uint32_t selector, const uint32_t *array, size_t size, size_t *idx); - -#endif // UTILS_H_ diff --git a/src_plugin_sdk/main.c b/src_plugin_sdk/src/main.c similarity index 99% rename from src_plugin_sdk/main.c rename to src_plugin_sdk/src/main.c index f3acb54..bd5b56c 100644 --- a/src_plugin_sdk/main.c +++ b/src_plugin_sdk/src/main.c @@ -15,7 +15,6 @@ * limitations under the License. *****************************************************************************/ -#include "eth_internals.h" #include "eth_plugin_interface.h" #include "lib_standard_app/swap_lib_calls.h" // RUN_APPLICATION diff --git a/tools/build_sdk.py b/tools/build_sdk.py deleted file mode 100755 index 746e0f2..0000000 --- a/tools/build_sdk.py +++ /dev/null @@ -1,222 +0,0 @@ -#!/usr/bin/env python3 - -''' -This script extract a few specific definitions from app-ethereum that are -required to exchange information with ethereum external plugins. -It should always be launched from app-ethereum: - -python3 tools/build_sdk.py - -''' - -import os -import shutil - - -def extract_from_headers(sources, nodes_to_extract): - cat_sources = [] - for source in sources: - with open(source, 'r') as f: - cat_sources += f.readlines() - - sdk_body = [] - for key, values in nodes_to_extract.items(): - for value in values: - node = [] - unclosed_curvy_brackets = False - unclosed_parantheses = False - for line in cat_sources: - if key in line and value in line: - node += [line] - unclosed_curvy_brackets = line.count('{') - line.count('}') - if not unclosed_curvy_brackets: - break - elif (key == "fn" and value in line) or unclosed_parantheses: - node += [line] - unclosed_parantheses = line.find(")") == -1 - if not unclosed_parantheses: - break - elif unclosed_curvy_brackets: - node += [line] - unclosed_curvy_brackets += line.count( - '{') - line.count('}') - if unclosed_curvy_brackets: - continue - else: - break - - sdk_body += [''.join(node)] - - return '\n'.join(sdk_body) - - -def extract_from_c_files(sources, nodes_to_extract): - cat_sources = [] - for source in sources: - with open(source, 'r') as f: - cat_sources += f.readlines() - - sdk_body = [] - for node_name in nodes_to_extract: - node = [] - copying = False - wait_curvy_bracket = True - for line in cat_sources: - if node_name in line: - copying = True - node += [line] - unclosed_curvy_brackets = line.count('{') - line.count('}') - elif copying: - node += [line] - unclosed_curvy_brackets += line.count('{') - line.count('}') - if wait_curvy_bracket: - wait_curvy_bracket = line.count('}') == 0 - if unclosed_curvy_brackets != 0 or wait_curvy_bracket: - continue - else: - break - - sdk_body += [''.join(node)] - - return '\n'.join(sdk_body) - - -def merge_headers(sources, nodes_to_extract): - includes = [ - '#include ', - '#include ', - '#include "os.h"', - '#include "cx.h"', - '#ifdef HAVE_NBGL', - '#include "nbgl_types.h"', - '#include "glyphs.h"', - '#endif' - ] - - body = extract_from_headers(sources, nodes_to_extract) - - eth_internals_h = '\n\n'.join([ - "/* This file is auto-generated, don't edit it */", - "#pragma once", - '\n'.join(includes), - body - ]) - - with open("ethereum-plugin-sdk/include/eth_internals.h", 'w') as f: - f.write(eth_internals_h) - - -def copy_header(header_to_copy, merged_headers): - - merged_headers = [os.path.basename(path) for path in merged_headers] - - with open(header_to_copy, 'r') as f: - source = f.readlines() - - eth_plugin_interface_h = [ - "/* This file is auto-generated, don't edit it */\n"] - for line in source: - eth_plugin_interface_h += [line] - for header in merged_headers: - if header in line: - del eth_plugin_interface_h[-1] - break - - # add '#include "eth_internals.h"' - include_index = eth_plugin_interface_h.index('#include "cx.h"\n') - eth_plugin_interface_h.insert( - include_index+1, '#include "eth_internals.h"\n') - - # dump to file - with open("ethereum-plugin-sdk/include/eth_plugin_interface.h", 'w') as f: - f.writelines(eth_plugin_interface_h) - - -def merge_c_files(sources, nodes_to_extract): - includes = [ - '#include "eth_internals.h"' - ] - - body = extract_from_c_files(sources, nodes_to_extract) - - eth_internals_h = '\n\n'.join([ - "/* This file is auto-generated, don't edit it */", - '\n'.join(includes), - body - ]) - - with open("ethereum-plugin-sdk/include/eth_internals.c", 'w') as f: - f.write(eth_internals_h) - - -if __name__ == "__main__": - - # some nodes will be extracted from these headers and merged into a new - # one, copied to sdk - headers_to_merge = [ - "src_common/asset_info.h", - "src_common/common_utils.h", - "src_common/tx_content.h", - "src_common/plugin_utils.h", - "src_common/caller_api.h", - ] - nodes_to_extract = { - "#define": ["MAX_TICKER_LEN", - "ADDRESS_LENGTH", - "INT256_LENGTH", - "WEI_TO_ETHER", - "SELECTOR_SIZE", - "PARAMETER_LENGTH", - "COLLECTION_NAME_MAX_LEN"], - "typedef enum": [], - "typedef struct": ["tokenDefinition_t", - "txInt256_t", - "txContent_t", - "nftInfo_t", - "caller_app_t"], - "typedef union": ["extraInfo_t"], - "__attribute__((no_instrument_function)) inline": ["int allzeroes"], - "const": ["HEXDIGITS"], - "fn": ["bool getEthAddressStringFromBinary", - "bool getEthAddressFromKey", - "bool getEthDisplayableAddress", - "bool adjustDecimals", - "bool uint256_to_decimal", - "bool amountToString", - "bool u64_to_string", - "void copy_address", - "void copy_parameter", - "bool U2BE_from_parameter", - "bool U4BE_from_parameter"] - } - merge_headers(headers_to_merge, nodes_to_extract) - - # this header will be stripped from all #include related to previously - # merged headers, then copied to sdk - copy_header("src_common/eth_plugin_interface.h", headers_to_merge) - - # extract and merge function bodies - c_files_to_merge = [ - "src_common/common_utils.c", - "src_common/plugin_utils.c", - ] - merge_c_files(c_files_to_merge, nodes_to_extract["fn"]) - - files_to_copy = [ - "main.c", - "plugin_utils.c", - "plugin_utils.h", - ] - for file in files_to_copy: - shutil.copyfile("src_plugin_sdk/" + file, - "ethereum-plugin-sdk/include/" + file) - - files_to_copy = [ - "CHANGELOG.md", - "README.md", - "LICENSE", - "standard_plugin.mk", - ] - for file in files_to_copy: - shutil.copyfile("src_plugin_sdk/" + file, - "ethereum-plugin-sdk/" + file) diff --git a/tools/build_sdk.sh b/tools/build_sdk.sh new file mode 100755 index 0000000..f4ec6a3 --- /dev/null +++ b/tools/build_sdk.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Clean the sdk +find ./ethereum-plugin-sdk/ -mindepth 1 -maxdepth 1 ! -name .git -exec rm -r {} \; + +# Copy exclusive files +cp -r src_plugin_sdk/* ./ethereum-plugin-sdk/ + +# Copy common sources +cp -r src_common/* ./ethereum-plugin-sdk/src/