From 6db87ef98ed5d57b8702c7a6390003cf6c632a4b Mon Sep 17 00:00:00 2001 From: Gideon Kaempfer Date: Tue, 9 Nov 2021 17:33:17 +0200 Subject: [PATCH] StarkEx v4.0.1 --- .../contracts/src/components/ECDSA.sol | 2 +- .../contracts/src/components/Users.sol | 6 ++-- .../src/interactions/CompositeActions.sol | 28 +++++++++++++++++++ .../contracts/src/libraries/Common.sol | 12 -------- .../src/perpetual/StarkPerpetual.sol | 4 +-- .../PerpetualTokensAndRamping.sol | 2 ++ .../contracts/src/starkex/StarkExchange.sol | 12 ++++---- .../TokensAndRamping.sol | 2 ++ 8 files changed, 44 insertions(+), 24 deletions(-) create mode 100644 scalable-dex/contracts/src/interactions/CompositeActions.sol diff --git a/scalable-dex/contracts/src/components/ECDSA.sol b/scalable-dex/contracts/src/components/ECDSA.sol index 457c513..6b4205a 100644 --- a/scalable-dex/contracts/src/components/ECDSA.sol +++ b/scalable-dex/contracts/src/components/ECDSA.sol @@ -23,7 +23,7 @@ library ECDSA { uint256 pubX, uint256 pubY ) internal pure { - require(msgHash % FIELD_PRIME == msgHash, "msgHash out of range"); + require(msgHash % EC_ORDER == msgHash, "msgHash out of range"); require((1 <= s) && (s < EC_ORDER), "s out of range"); uint256 w = s.invMod(EC_ORDER); require((1 <= r) && (r < (1 << N_ELEMENT_BITS_ECDSA)), "r out of range"); diff --git a/scalable-dex/contracts/src/components/Users.sol b/scalable-dex/contracts/src/components/Users.sol index f4e76f8..91ccb5f 100644 --- a/scalable-dex/contracts/src/components/Users.sol +++ b/scalable-dex/contracts/src/components/Users.sol @@ -28,7 +28,7 @@ import "../libraries/LibConstants.sol"; The only flows that require user registration are the anti-concorship flows: forced actions and deposit cancellation. - User registration is performed by calling :sol:func:`registerEthAddress` with the selected + User registration is performed by calling :sol:func:`registerEthAddress` with the selected Stark Key, representing an `x` coordinate on the Stark-friendly elliptic curve, and the `y` coordinate of the key on the curve (due to the nature of the curve, only two such possible `y` coordinates exist). @@ -65,14 +65,14 @@ abstract contract Users is MainStorage, LibConstants { require(ethKey != ZERO_ADDRESS, "INVALID_ETH_ADDRESS"); require(ethKeys[starkKey] == ZERO_ADDRESS, "STARK_KEY_UNAVAILABLE"); require(isOnCurve(starkKey), "INVALID_STARK_KEY"); - require(starkSignature.length == 32 * 3, "INVALID_STARK_SIGNATURE"); + require(starkSignature.length == 32 * 3, "INVALID_STARK_SIGNATURE_LENGTH"); bytes memory sig = starkSignature; (uint256 r, uint256 s, uint256 StarkKeyY) = abi.decode(sig, (uint256, uint256, uint256)); uint256 msgHash = uint256( keccak256(abi.encodePacked("UserRegistration:", ethKey, starkKey)) - ) % K_MODULUS; + ) % ECDSA.EC_ORDER; ECDSA.verify(msgHash, r, s, starkKey, StarkKeyY); diff --git a/scalable-dex/contracts/src/interactions/CompositeActions.sol b/scalable-dex/contracts/src/interactions/CompositeActions.sol new file mode 100644 index 0000000..01a72a8 --- /dev/null +++ b/scalable-dex/contracts/src/interactions/CompositeActions.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0. +pragma solidity ^0.6.11; + +import "../interfaces/MDeposits.sol"; + +abstract contract CompositeActions is MDeposits { + function registerAndDepositERC20( + address ethKey, + uint256 starkKey, + bytes calldata signature, + uint256 assetType, + uint256 vaultId, + uint256 quantizedAmount + ) external { + depositERC20(starkKey, assetType, vaultId, quantizedAmount); + } + + // NOLINTNEXTLINE: locked-ether. + function registerAndDepositEth( + address ethKey, + uint256 starkKey, + bytes calldata signature, + uint256 assetType, + uint256 vaultId + ) external payable { + depositEth(starkKey, assetType, vaultId); + } +} diff --git a/scalable-dex/contracts/src/libraries/Common.sol b/scalable-dex/contracts/src/libraries/Common.sol index a6bdf08..39fdecd 100644 --- a/scalable-dex/contracts/src/libraries/Common.sol +++ b/scalable-dex/contracts/src/libraries/Common.sol @@ -51,18 +51,6 @@ library Addresses { "UNEXPECTED_CONTRACT_IDENTIFIER" ); } - - /* - Similar to safeTokenContractCall, but always ignores the return value. - - Assumes some other method is used to detect the failures - (e.g. balance is checked before and after the call). - */ - function uncheckedTokenContractCall(address tokenAddress, bytes memory callData) internal { - // NOLINTNEXTLINE: low-level-calls. - (bool success, bytes memory returndata) = tokenAddress.call(callData); - require(success, string(returndata)); - } } /* diff --git a/scalable-dex/contracts/src/perpetual/StarkPerpetual.sol b/scalable-dex/contracts/src/perpetual/StarkPerpetual.sol index 73f6481..d86d571 100644 --- a/scalable-dex/contracts/src/perpetual/StarkPerpetual.sol +++ b/scalable-dex/contracts/src/perpetual/StarkPerpetual.sol @@ -11,9 +11,9 @@ contract StarkPerpetual is MainDispatcher, PerpetualStorage { // ---------- The following code was auto-generated. PLEASE DO NOT EDIT. ---------- uint256 constant MAGIC_SALT = 24748; uint256 constant IDX_MAP_0 = 0x3000130000203000002010004002010003003000010000001222000021002010; - uint256 constant IDX_MAP_1 = 0x4300000140200010000300201000030000300100000022303302; + uint256 constant IDX_MAP_1 = 0x4300000140200010000300201000030000300100000222303302; uint256 constant IDX_MAP_2 = 0x10001300000020200020000200201000020000300000000031100030020012; - uint256 constant IDX_MAP_3 = 0x120300002000000000000100000000002001002000040101130302000000; + uint256 constant IDX_MAP_3 = 0x120300002000000000000100000000202001002000040101130302000000; // ---------- End of auto-generated code. ---------- diff --git a/scalable-dex/contracts/src/perpetual/toplevel_subcontracts/PerpetualTokensAndRamping.sol b/scalable-dex/contracts/src/perpetual/toplevel_subcontracts/PerpetualTokensAndRamping.sol index e5dcf73..f6ebdd3 100644 --- a/scalable-dex/contracts/src/perpetual/toplevel_subcontracts/PerpetualTokensAndRamping.sol +++ b/scalable-dex/contracts/src/perpetual/toplevel_subcontracts/PerpetualTokensAndRamping.sol @@ -9,6 +9,7 @@ import "../../components/KeyGetters.sol"; import "../../components/Users.sol"; import "../../components/MainGovernance.sol"; import "../../interactions/AcceptModifications.sol"; +import "../../interactions/CompositeActions.sol"; import "../../interactions/Deposits.sol"; import "../../interactions/TokenAssetData.sol"; import "../../interactions/TokenQuantization.sol"; @@ -28,6 +29,7 @@ contract PerpetualTokensAndRamping is KeyGetters, Users, Deposits, + CompositeActions, Withdrawals { function initialize( diff --git a/scalable-dex/contracts/src/starkex/StarkExchange.sol b/scalable-dex/contracts/src/starkex/StarkExchange.sol index f31bb90..b4758b2 100644 --- a/scalable-dex/contracts/src/starkex/StarkExchange.sol +++ b/scalable-dex/contracts/src/starkex/StarkExchange.sol @@ -4,15 +4,15 @@ pragma solidity ^0.6.11; import "../interfaces/MainDispatcher.sol"; contract StarkExchange is MainDispatcher { - string public constant VERSION = "4.0.0"; + string public constant VERSION = "4.0.1"; // Salt for a 8 bit unique spread of all relevant selectors. Pre-caclulated. // ---------- The following code was auto-generated. PLEASE DO NOT EDIT. ---------- - uint256 constant MAGIC_SALT = 25249; - uint256 constant IDX_MAP_0 = 0x302000300020020000502000000100000230000550000020220001050200000; - uint256 constant IDX_MAP_1 = 0x2001000000001000000000000220120204000002023062500000300002400132; - uint256 constant IDX_MAP_2 = 0x100000011000000100030550001200120001003000000000005100000002032; - uint256 constant IDX_MAP_3 = 0x1010000105100000000300000321012000002150002002002000001100020300; + uint256 constant MAGIC_SALT = 46110; + uint256 constant IDX_MAP_0 = 0x30006100050005012000102002000001200000010001100500200000000020; + uint256 constant IDX_MAP_1 = 0x120000105000000501200000120502000000200452005000202002030500003; + uint256 constant IDX_MAP_2 = 0x1020000000003020000502203000300000200000000001000100330010220001; + uint256 constant IDX_MAP_3 = 0x200230200020300001401200000000100020011200000002020000010000301; // ---------- End of auto-generated code. ---------- diff --git a/scalable-dex/contracts/src/starkex/toplevel_subcontracts/TokensAndRamping.sol b/scalable-dex/contracts/src/starkex/toplevel_subcontracts/TokensAndRamping.sol index d1322b2..ebbb3e0 100644 --- a/scalable-dex/contracts/src/starkex/toplevel_subcontracts/TokensAndRamping.sol +++ b/scalable-dex/contracts/src/starkex/toplevel_subcontracts/TokensAndRamping.sol @@ -10,6 +10,7 @@ import "../../components/TokenTransfers.sol"; import "../../components/Users.sol"; import "../../components/MainGovernance.sol"; import "../../interactions/AcceptModifications.sol"; +import "../../interactions/CompositeActions.sol"; import "../../interactions/Deposits.sol"; import "../../interactions/TokenAssetData.sol"; import "../../interactions/TokenQuantization.sol"; @@ -30,6 +31,7 @@ contract TokensAndRamping is KeyGetters, Users, Deposits, + CompositeActions, Withdrawals { function initialize(