Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code review #19

Merged
merged 11 commits into from
Feb 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
- name: Install node
uses: actions/setup-node@v2
with:
node-version: "14.4.0"
node-version: "16.4.0"
- name: Install yarn
run: |
npm install -g yarn
Expand Down
148 changes: 148 additions & 0 deletions src/contract.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
#include "quickswap_plugin.h"

// Function: swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path,
// address to, uint256 deadline)
// MethodID: 0x38ed1739
static const uint8_t SWAP_EXACT_TOKENS_FOR_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x38,
0xed,
0x17,
0x39};

// Function: swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address
// to, uint256 deadline)
// MethodID: 0x18cbafe5
static const uint8_t SWAP_EXACT_TOKENS_FOR_ETH_SELECTOR[SELECTOR_SIZE] = {0x18, 0xcb, 0xaf, 0xe5};

// Function: swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256
// deadline)
// MethodID : 0x7ff36ab5
static const uint8_t SWAP_EXACT_ETH_FOR_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x7f, 0xf3, 0x6a, 0xb5};

// Function: swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path,
// address to, uint256 deadline)
// MethodID : 0x8803dbee
static const uint8_t SWAP_TOKENS_FOR_EXACT_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x88,
0x03,
0xdb,
0xee};

// Function: swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256
// amountOutMin, address[] path, address to, uint256 deadline)
// MethodID: 0x5c11d795
static const uint8_t
SWAP_EXACT_TOKENS_FOR_TOKENS_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x5c,
0x11,
0xd7,
0x95};

// Function: swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline)
// MethodID: 0xfb3bdb41
static const uint8_t SWAP_ETH_FOR_EXACT_TOKENS_SELECTOR[SELECTOR_SIZE] = {0xfb, 0x3b, 0xdb, 0x41};

// Function: swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256
// amountOutMin, address[] path, address to, uint256 deadline)
// MethodID: 0x791ac947
static const uint8_t
SWAP_EXACT_TOKENS_FOR_ETH_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x79,
0x1a,
0xc9,
0x47};

// Function: swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address
// to, uint256 deadline)
// MethodID: 0x4a25d94a
static const uint8_t SWAP_TOKENS_FOR_EXACT_ETH_SELECTOR[SELECTOR_SIZE] = {0x4a, 0x25, 0xd9, 0x4a};

// Function: swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[]
// path, address to, uint256 deadline)
// MethodID: 0xb6f9de95
static const uint8_t
SWAP_EXACT_ETH_FOR_TOKENS_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR[SELECTOR_SIZE] = {0xb6,
0xf9,
0xde,
0x95};

// Function: addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256
// amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline)
// MethodID: 0xe8e33700
static const uint8_t ADD_LIQUIDITY_SELECTOR[SELECTOR_SIZE] = {0xe8, 0xe3, 0x37, 0x00};

// Function: addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin,
// uint256 amountETHMin, address to, uint256 deadline)
// MethodID: 0xf305d719
static const uint8_t ADD_LIQUIDITY_ETH_SELECTOR[SELECTOR_SIZE] = {0xf3, 0x05, 0xd7, 0x19};

// Function: removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin,
// uint256 amountBMin, address to, uint256 deadline)
// MethodID: 0xbaa2abde
static const uint8_t REMOVE_LIQUIDITY_SELECTOR[SELECTOR_SIZE] = {0xba, 0xa2, 0xab, 0xde};

// Function: removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256
// amountETHMin, address to, uint256 deadline)
// MethodID: 0x02751cec
static const uint8_t REMOVE_LIQUIDITY_ETH_SELECTOR[SELECTOR_SIZE] = {0x02, 0x75, 0x1c, 0xec};

// Function: removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256
// amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32
// r, bytes32 s)
// MethodID: 0x2195995c
static const uint8_t REMOVE_LIQUIDITY_WITH_PERMIT_SELECTOR[SELECTOR_SIZE] = {0x21,
0x95,
0x99,
0x5c};

// Function: removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin,
// uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32
// s)
// MethodID: 0xded9382a
static const uint8_t REMOVE_LIQUIDITY_ETH_WITH_PERMIT_SELECTOR[SELECTOR_SIZE] = {0xde,
0xd9,
0x38,
0x2a};

// Function: removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity,
// uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline)
// MethodID: 0xaf2979eb
static const uint8_t REMOVE_LIQUIDITY_ETH_SUPPORTING_FEE_ON_TRANSFER_SELECTOR[SELECTOR_SIZE] = {
0xaf,
0x29,
0x79,
0xeb};

// Function: removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256
// liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool
// approveMax, uint8 v, bytes32 r, bytes32 s)
// MethodID: 0x5b0d5984
static const uint8_t
REMOVE_LIQUIDITY_ETH_WITH_PERMIT_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR[SELECTOR_SIZE] =
{0x5b, 0x0d, 0x59, 0x84};

// Array of all the different quickswap selectors.
const uint8_t *const QUICKSWAP_SELECTORS[NUM_QUICKSWAP_SELECTORS] = {
SWAP_EXACT_TOKENS_FOR_TOKENS_SELECTOR,
SWAP_EXACT_TOKENS_FOR_ETH_SELECTOR,
SWAP_EXACT_ETH_FOR_TOKENS_SELECTOR,
SWAP_TOKENS_FOR_EXACT_TOKENS_SELECTOR,
SWAP_EXACT_TOKENS_FOR_TOKENS_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR,
SWAP_ETH_FOR_EXACT_TOKENS_SELECTOR,
SWAP_EXACT_TOKENS_FOR_ETH_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR,
SWAP_TOKENS_FOR_EXACT_ETH_SELECTOR,
SWAP_EXACT_ETH_FOR_TOKENS_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR,
ADD_LIQUIDITY_SELECTOR,
ADD_LIQUIDITY_ETH_SELECTOR,
REMOVE_LIQUIDITY_SELECTOR,
REMOVE_LIQUIDITY_ETH_SELECTOR,
REMOVE_LIQUIDITY_WITH_PERMIT_SELECTOR,
REMOVE_LIQUIDITY_ETH_WITH_PERMIT_SELECTOR,
REMOVE_LIQUIDITY_ETH_SUPPORTING_FEE_ON_TRANSFER_SELECTOR,
REMOVE_LIQUIDITY_ETH_WITH_PERMIT_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR};

// QuickSwap uses `0xeeeee` as a dummy address to represent ETH.
const uint8_t QUICKSWAP_ETH_ADDRESS[ADDRESS_LENGTH] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x10};

// Used to indicate that the beneficiary should be the sender.
const uint8_t NULL_ETH_ADDRESS[ADDRESS_LENGTH] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
6 changes: 3 additions & 3 deletions src/handle_finalize.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ void handle_finalize(void *parameters) {
ethPluginFinalize_t *msg = (ethPluginFinalize_t *) parameters;
quickswap_parameters_t *context = (quickswap_parameters_t *) msg->pluginContext;

if (context->valid) {
if (context->valid && context->next_param == NONE) {
msg->numScreens = 2;
if ((strncmp(context->beneficiary, (const char *) NULL_ETH_ADDRESS, ADDRESS_LENGTH) != 0)) {
// An addiitonal screen is required to display the `beneficiary` field.
if (memcmp(context->beneficiary, NULL_ETH_ADDRESS, ADDRESS_LENGTH) != 0) {
// An additional screen is required to display the `beneficiary` field.
msg->numScreens += 1;
}
if (!ADDRESS_IS_NETWORK_TOKEN(context->contract_address_sent)) {
Expand Down
2 changes: 1 addition & 1 deletion src/handle_provide_parameter.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ static void handle_token_sent_eth(quickswap_parameters_t *context) {
// Copy amount sent parameter to amount_sent
static void handle_value_sent(const ethPluginProvideParameter_t *msg,
quickswap_parameters_t *context) {
ethPluginSharedRO_t *pluginSharedRO = (ethPluginSharedRO_t *) msg->pluginSharedRO;
ethPluginSharedRO_t *pluginSharedRO = msg->pluginSharedRO;

copy_parameter(context->amount_sent,
pluginSharedRO->txContent->value.value,
Expand Down
6 changes: 1 addition & 5 deletions src/handle_query_contract_ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ static void set_beneficiary_ui(ethQueryContractUI_t *msg, quickswap_parameters_t
msg->msg[1] = 'x';

getEthAddressStringFromBinary((uint8_t *) context->beneficiary,
(char *) msg->msg + 2,
msg->msg + 2,
msg->pluginSharedRW->sha3,
0);
}
Expand Down Expand Up @@ -282,7 +282,6 @@ static screens_t get_screen(const ethQueryContractUI_t *msg,
} else {
return RECEIVE_SCREEN;
}
break;
case 3:
if (both_tokens_found) {
return ERROR;
Expand All @@ -291,17 +290,14 @@ static screens_t get_screen(const ethQueryContractUI_t *msg,
} else {
return BENEFICIARY_SCREEN;
}
break;
case 4:
if (both_tokens_not_found) {
return BENEFICIARY_SCREEN;
} else {
return ERROR;
}
break;
default:
return ERROR;
break;
}
return ERROR;
}
Expand Down
147 changes: 0 additions & 147 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,153 +25,6 @@

#include "quickswap_plugin.h"

// Function: swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path,
// address to, uint256 deadline)
// MethodID: 0x38ed1739
static const uint8_t SWAP_EXACT_TOKENS_FOR_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x38,
0xed,
0x17,
0x39};

// Function: swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] path, address
// to, uint256 deadline)
// MethodID: 0x18cbafe5
static const uint8_t SWAP_EXACT_TOKENS_FOR_ETH_SELECTOR[SELECTOR_SIZE] = {0x18, 0xcb, 0xaf, 0xe5};

// Function: swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256
// deadline)
// MethodID : 0x7ff36ab5
static const uint8_t SWAP_EXACT_ETH_FOR_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x7f, 0xf3, 0x6a, 0xb5};

// Function: swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] path,
// address to, uint256 deadline)
// MethodID : 0x8803dbee
static const uint8_t SWAP_TOKENS_FOR_EXACT_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x88,
0x03,
0xdb,
0xee};

// Function: swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256
// amountOutMin, address[] path, address to, uint256 deadline)
// MethodID: 0x5c11d795
static const uint8_t
SWAP_EXACT_TOKENS_FOR_TOKENS_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x5c,
0x11,
0xd7,
0x95};

// Function: swapETHForExactTokens(uint256 amountOut, address[] path, address to, uint256 deadline)
// MethodID: 0xfb3bdb41
static const uint8_t SWAP_ETH_FOR_EXACT_TOKENS_SELECTOR[SELECTOR_SIZE] = {0xfb, 0x3b, 0xdb, 0x41};

// Function: swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256
// amountOutMin, address[] path, address to, uint256 deadline)
// MethodID: 0x791ac947
static const uint8_t
SWAP_EXACT_TOKENS_FOR_ETH_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR[SELECTOR_SIZE] = {0x79,
0x1a,
0xc9,
0x47};

// Function: swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] path, address
// to, uint256 deadline)
// MethodID: 0x4a25d94a
static const uint8_t SWAP_TOKENS_FOR_EXACT_ETH_SELECTOR[SELECTOR_SIZE] = {0x4a, 0x25, 0xd9, 0x4a};

// Function: swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[]
// path, address to, uint256 deadline)
// MethodID: 0xb6f9de95
static const uint8_t
SWAP_EXACT_ETH_FOR_TOKENS_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR[SELECTOR_SIZE] = {0xb6,
0xf9,
0xde,
0x95};

// Function: addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256
// amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline)
// MethodID: 0xe8e33700
static const uint8_t ADD_LIQUIDITY_SELECTOR[SELECTOR_SIZE] = {0xe8, 0xe3, 0x37, 0x00};

// Function: addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin,
// uint256 amountETHMin, address to, uint256 deadline)
// MethodID: 0xf305d719
static const uint8_t ADD_LIQUIDITY_ETH_SELECTOR[SELECTOR_SIZE] = {0xf3, 0x05, 0xd7, 0x19};

// Function: removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin,
// uint256 amountBMin, address to, uint256 deadline)
// MethodID: 0xbaa2abde
static const uint8_t REMOVE_LIQUIDITY_SELECTOR[SELECTOR_SIZE] = {0xba, 0xa2, 0xab, 0xde};

// Function: removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin, uint256
// amountETHMin, address to, uint256 deadline)
// MethodID: 0x02751cec
static const uint8_t REMOVE_LIQUIDITY_ETH_SELECTOR[SELECTOR_SIZE] = {0x02, 0x75, 0x1c, 0xec};

// Function: removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256
// amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32
// r, bytes32 s)
// MethodID: 0x2195995c
static const uint8_t REMOVE_LIQUIDITY_WITH_PERMIT_SELECTOR[SELECTOR_SIZE] = {0x21,
0x95,
0x99,
0x5c};

// Function: removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin,
// uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32
// s)
// MethodID: 0xded9382a
static const uint8_t REMOVE_LIQUIDITY_ETH_WITH_PERMIT_SELECTOR[SELECTOR_SIZE] = {0xde,
0xd9,
0x38,
0x2a};

// Function: removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity,
// uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline)
// MethodID: 0xaf2979eb
static const uint8_t REMOVE_LIQUIDITY_ETH_SUPPORTING_FEE_ON_TRANSFER_SELECTOR[SELECTOR_SIZE] = {
0xaf,
0x29,
0x79,
0xeb};

// Function: removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256
// liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool
// approveMax, uint8 v, bytes32 r, bytes32 s)
// MethodID: 0x5b0d5984
static const uint8_t
REMOVE_LIQUIDITY_ETH_WITH_PERMIT_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR[SELECTOR_SIZE] =
{0x5b, 0x0d, 0x59, 0x84};

// Array of all the different quickswap selectors.
const uint8_t *const QUICKSWAP_SELECTORS[NUM_QUICKSWAP_SELECTORS] = {
SWAP_EXACT_TOKENS_FOR_TOKENS_SELECTOR,
SWAP_EXACT_TOKENS_FOR_ETH_SELECTOR,
SWAP_EXACT_ETH_FOR_TOKENS_SELECTOR,
SWAP_TOKENS_FOR_EXACT_TOKENS_SELECTOR,
SWAP_EXACT_TOKENS_FOR_TOKENS_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR,
SWAP_ETH_FOR_EXACT_TOKENS_SELECTOR,
SWAP_EXACT_TOKENS_FOR_ETH_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR,
SWAP_TOKENS_FOR_EXACT_ETH_SELECTOR,
SWAP_EXACT_ETH_FOR_TOKENS_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR,
ADD_LIQUIDITY_SELECTOR,
ADD_LIQUIDITY_ETH_SELECTOR,
REMOVE_LIQUIDITY_SELECTOR,
REMOVE_LIQUIDITY_ETH_SELECTOR,
REMOVE_LIQUIDITY_WITH_PERMIT_SELECTOR,
REMOVE_LIQUIDITY_ETH_WITH_PERMIT_SELECTOR,
REMOVE_LIQUIDITY_ETH_SUPPORTING_FEE_ON_TRANSFER_SELECTOR,
REMOVE_LIQUIDITY_ETH_WITH_PERMIT_SUPPORTING_FEE_ON_TRANSFER_TOKENS_SELECTOR};

// QuickSwap uses `0xeeeee` as a dummy address to represent ETH.
const uint8_t QUICKSWAP_ETH_ADDRESS[ADDRESS_LENGTH] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x10};

// Used to indicate that the beneficiary should be the sender.
const uint8_t NULL_ETH_ADDRESS[ADDRESS_LENGTH] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

void quickswap_plugin_call(int message, void *parameters) {
switch (message) {
case ETH_PLUGIN_INIT_CONTRACT:
Expand Down
15 changes: 15 additions & 0 deletions tests/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module.exports = {
env: {
es2021: true,
node: true,
jest: true,
},
extends: ["eslint:recommended"],
parserOptions: {
sourceType: "module",
},
rules: {
"linebreak-style": ["error", "unix"],
semi: ["error", "always"],
},
};
Binary file modified tests/elfs/ethereum_nanos.elf
Binary file not shown.
Binary file modified tests/elfs/ethereum_nanox.elf
Binary file not shown.
Binary file modified tests/elfs/quickswap_nanos.elf
Binary file not shown.
Binary file modified tests/elfs/quickswap_nanox.elf
Binary file not shown.
2 changes: 1 addition & 1 deletion tests/globalsetup.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ module.exports = async () => {
await catchExit();
await Zemu.checkAndPullImage();
await Zemu.stopAllEmuContainers();
fsExtra.emptyDirSync("snapshots/tmp")
fsExtra.emptyDirSync("snapshots/tmp");
};
Loading