Commit Graph
100 Commits
Author SHA1 Message Date
markspanbroek 470a4df415 fix(vault): do no allow reuse of fund ids (#238)
* fix(vault): do no allow reuse of fund ids

Fixes an attack where all tokens can be drained from
the Vault by allowing a token flow to persist after
a Fund is deleted.

* chore(vault): update state diagram
2025-05-19 10:23:01 +00:00
e49abc4104 Vault (#220)
* vault: deposit and withdraw

* vault: change data structure to be recipient oriented

* vault: burning funds

* vault: transfer tokens from one recipient to the other

* vault: designate tokens for a single recipient

* vault: lock up tokens until expiry time

* vault: lock is deleted upon withdrawal

* vault: simplify test setup

* vault: remove duplication in tests

* vault: further test for locks

* vault: allow recipient to withdraw

* vault: flow tokens from one recipient to the other

* vault: designate tokens that flow

* vault: move flow accumulation calculation into VaultBase

* vault: use custom operators to improve readability

* vault: stop flowing when lock expires

* vault: reject flow when insufficient tokens available

* vault: do not allow flow when lock already expired

* vault: allow automine to be disabled in time sensitive tests

* vault: improve naming of public functions

* vault: flow to multiple recipients

- changes balance from uint256 -> uint128
  so that entire Balance can be read or written
  with a single operation
- moves Lock to library
- simplifies lock checks

* vault: reject negative flows

* vault: make tests a bit more robust

* vault: change flows over time

* vault: check Lock invariant before writing

* vault: allow flows to be diverted to others

* vault: simplify example flow rates in test

* vault: disallow transfer of flowing tokens

* vault: cannot burn flowing tokens

* vault: delete flow when burning or withdrawing

* vault: fix flaky time sensitive tests

Ensures that setting of lock and starting of
flow happen in the same block.
Therefore hardhat cannot occasionally increase
the timestamp between the two operations.
This makes predicting the balances over time
much easier.

* vault: disallow designating of flowing tokens

* vault: document setAutomine()

* vault: delete lock all tokens are withdrawn or burned

* vault: cleanup

* vault: reorder tests

* vault: only allow deposit, transfer, etc when locked

* vault: reorder functions

in roughly chronological order

* vault: rename context -> fund

* vault: rename balance -> account

* vault: combine account and flow mappings

* vault: _getAccount updates to the latest timestamp

* vault: simplify _getAccount()

* vault: reordering

* vault: formatting

* vault: do not delete lock when burning

* vault: combine Account and Flow structs

* vault: cleanup

* vault: split flow into incoming and outgoing

- no need to deal with signed integers anymore
- allows flow to self to designate tokens over time

* vault: fix transfer to self

* vault: remove _getAccount()

- no longer calculate flow updates when not needed
- use account.update(timestamp) where needed
- use _getBalance() to view current balance

* vault: rename error

* vault: reduce size of timestamp further

* vault: prevent approval hijacking

- transfer ERC20 funds into the vault from the
  controller, not from the user
- prevents an attacker from hijacking a user's
  ERC20 approval to move tokens into a part of
  the vault that is controlled by the attacker

* vault: extract common tests for unlocked funds

* vault: burn entire fund

* vault: transfer tokens to 0xdead when fund is burned

* vault: do not expose Lock internals on public api

* vault: formatting

* vault: test lock state transitions

* vault: clean up errors

* vault: rename burn -> burnAccount, burnAll -> burnFund

* vault: burn part of designated tokens

* vault: burn designated/fund allowed when flowing

* vault: prefix errors with 'Vault'

* vault: cleanup

* vault: remove dead code

* vault: add documentation

* vault: fix accounting of locked value when burning designated tokens

* vault: update documentation

* update openzeppelin contracts to 5.2.0

* vault: format all solidity files

* vault: cleanup tests

* vault: pausing and unpausing

* vault: rename account->holder in tests

* vault: allow for multiple accounts for one account holder

* vault: only allow account holder to withdraw for itself

* vault: freezeFund() instead of burnFund()

* vault: rename Fund -> FundId

* vault: rename lock states

- NoLock -> Inactive
- Unlocked -> Withdrawing

* vault: rename Lock -> Fund

* vault: clarification

Co-Authored-by: Adam Uhlíř <adam@uhlir.dev>

* vault: rename update() -> accumulateFlows()

Reason: update() is too generic, and can easily be
interpreted as changing the on-chain state, whereas
it actually updates the in-memory struct.

Co-Authored-By: Eric <5089238+emizzle@users.noreply.github.com>
Co-Authored-By: Adam Uhlíř <adam@uhlir.dev>

* vault: rephrase

Co-Authored-By: Adam Uhlíř <adam@uhlir.dev>

---------

Co-authored-by: Adam Uhlíř <adam@uhlir.dev>
Co-authored-by: Eric <5089238+emizzle@users.noreply.github.com>
2025-04-16 11:57:07 +02:00
Mark Spanbroek 1982e71d52 update prettier-plugin-solidity to 1.4.2 2025-03-04 09:33:20 +01:00
Mark Spanbroek 441d96bb08 update solhint to 5.0.5 2025-03-04 09:33:20 +01:00
Mark Spanbroek 9826f31788 update solidity to version 0.8.28 2025-03-04 09:33:20 +01:00
Mark Spanbroek e4ff7b6c78 marketplace: fix more flaky tests 2025-03-04 08:58:10 +01:00
Mark Spanbroek 69e97bd21d marketplace: fix flaky tests 2025-03-04 08:58:10 +01:00
Mark Spanbroek e31e39f22c simplify time-based logic in tests, and fix requestEnd()
- use the `allowBlocksWithSameTimestamp` hardhat option
- remove block time gymnastics from marketplace tests
- fix erroneous implementation of requestEnd() which
  surfaced because of the the improved tests
2025-03-04 08:58:10 +01:00
Mark Spanbroek 875e4d53ec change constructor param to config
Changes the Marketplace constructor parameter `configuration` to `config` to prevent overshadowing the `configuration()` method.
2025-02-13 10:44:14 +01:00
Mark Spanbroek 945f6008c8 Increase proof period to 90 seconds on hardhat network
reason: on windows, integration tests run so slow that
they cannot fill a slot within 60 seconds
2024-11-14 14:53:37 +01:00
Mark Spanbroek 11ccefd720 Different configurations for different networks
By default we have a proof period of 2 minutes,
but on hardhat it's 1 minute.
2024-11-08 06:36:31 +01:00
Mark Spanbroek 8ecc5bfc66 readme: update todo list, we have actual proofs 2024-03-13 15:28:49 +01:00
Mark SpanbroekandBalazs Komuves 53999c74d3 Provide all gas to precompiles
Rationale: subtracting 2000 from the provided gas seems
arbitrary, and doesn't provide any benefits. Whether
verify() fails with an out-of-gas error, or returns
'false', in both cases the proof is not verified.

Co-Authored-By: Balazs Komuves <bkomuves@gmail.com>
2024-03-13 15:25:59 +01:00
Mark SpanbroekandBalazs Komuves 84eba26f76 Document that group elements are checked by precompiles
Co-Authored-By: Balazs Komuves <bkomuves@gmail.com>
2024-03-13 15:25:59 +01:00
Mark SpanbroekandBalazs Komuves c55b34fc76 uint -> uint256
Co-Authored-By: Balazs Komuves <bkomuves@gmail.com>
2024-03-13 15:25:59 +01:00
Mark SpanbroekandBalazs Komuves 3b6f7b8ec7 Rename _Q -> _R
Using 'r' for the size of the scalar field is
standard practice.

Co-Authored-By: Balazs Komuves <bkomuves@gmail.com>
2024-03-13 15:25:59 +01:00
Mark Spanbroek ab1b91fe49 Return false when incorrect amount of public inputs 2024-03-13 15:25:59 +01:00
Mark Spanbroek bd489c7f9a Groth16Verifier implements its interface 2024-03-13 15:25:59 +01:00
Mark Spanbroek f9637f192b Rename: vkX -> combination 2024-03-13 15:25:59 +01:00
Mark Spanbroek a4ce10f4de One less addition 2024-03-13 15:25:59 +01:00
Mark Spanbroek df58f2d3db Formatting 2024-03-13 15:25:59 +01:00
Mark Spanbroek 576254423e Return false when public inputs are invalid 2024-03-13 15:25:59 +01:00
Mark Spanbroek d38e0f5954 make functions private 2024-03-13 15:25:59 +01:00
Mark Spanbroek b676b245d6 Improve argument names 2024-03-13 15:25:59 +01:00
Mark Spanbroek 235f11a863 Primes are named as in EIP-197 2024-03-13 15:25:59 +01:00
Mark Spanbroek a4777bade5 Reordering, formatting 2024-03-13 15:25:59 +01:00
Mark Spanbroek c7687c5b83 Remove library 2024-03-13 15:25:59 +01:00
Mark Spanbroek 3840e2bf92 Remove unnecessary if-statement 2024-03-13 15:25:59 +01:00
Mark Spanbroek 949909fd98 Simpify pairing check 2024-03-13 15:25:59 +01:00
Mark Spanbroek 601ed18455 Verifier returns false when one of the operations fails 2024-03-13 15:25:59 +01:00
Mark Spanbroek c495770679 Pairing check returns boolean success and outcome 2024-03-13 15:25:59 +01:00
Mark Spanbroek a97a598b0e Add and multiply return bool success 2024-03-13 15:25:59 +01:00
Mark Spanbroek 111ed0826c Rename addition -> add, scalarMul -> multiply 2024-03-13 15:25:59 +01:00
Mark Spanbroek 91388096c1 Fix: size in bytes of input and output were too high 2024-03-13 15:25:59 +01:00
Mark Spanbroek 80dfa41e32 Remove calls to invalid()
Gas estimation seems to work just fine without them?
2024-03-13 15:25:59 +01:00
Mark Spanbroek 118ee0b22b Slash and free slot sooner when proofs are missed
This makes it faster to test these scenarios in the
codex integration tests.
2024-03-03 06:54:22 +01:00
Mark Spanbroek f413f1ea64 Represent elements from field F_{p^2} as real + i * imag
Reason: Circom and Ethereum EIP-197 both represent these
elements as arrays of two elements, but they do it in
reverse order of each other. This change makes it explicit
which number is the real part, and which number is the
imaginary part.
2024-02-21 10:42:41 +01:00
Mark Spanbroek ed54b80fc9 Increase proof period
In Codex's integration tests we now create real ZK proofs,
which take a bit longer to generate. We therefore need a
period that remains the same while the proof is generated.
2024-02-21 10:34:32 +01:00
Mark Spanbroek e5cb3bc571 verifier: circuit assets for a 5 sample storage proof 2024-02-14 13:33:37 +01:00
Mark Spanbroek 6c9f797f40 Explicit getters for token and config
Implicit getters have slightly different semantics when
it comes to ABI encoding their results.
2024-02-06 12:27:40 +01:00
Mark Spanbroek fb17fb5843 Fix deployment bug in loading zkey hash 2024-01-31 16:52:43 +01:00
Mark Spanbroek 31bbd702c2 Remove contract aliasing; doesn't work
Contract aliasing (specifying a fixed address for a
contract) doesn't work. We're now echoing the
addresses of the deployed contracts instead.
2024-01-31 15:45:01 +01:00
Mark Spanbroek c7b18af7cd Deploy 2 versions of the marketplace on local network
One with the real Groth16 verifier,
and one with a dummy verifier used for testing.
2024-01-31 15:45:01 +01:00
Mark Spanbroek ec803adb3d Test verifier accepts any proof, except all 0 values 2024-01-31 15:45:01 +01:00
Mark Spanbroek a186cb4045 Formatting 2024-01-25 13:16:49 +01:00
Mark Spanbroek 79d9c43beb Fix marketplace deployment script 2024-01-25 13:08:10 +01:00
Mark Spanbroek 079ac4766c Cleanup verifer.js 2024-01-25 13:08:10 +01:00
Mark Spanbroek 5d2842c69b Deploy verifier with verifier key per network 2024-01-25 13:08:10 +01:00
Mark Spanbroek 903cdf3541 Refactor verifier contract: formatting 2024-01-25 13:08:10 +01:00
Mark Spanbroek 70b22b241f Refactor verifier contract: remove unnecessary conversions 2024-01-25 13:08:10 +01:00
Mark Spanbroek 65655e3646 Refactor verifier contract: Formatting 2024-01-25 13:08:10 +01:00
Mark Spanbroek 676f4fc85e Refactor verifier contract: use structs from Groth16.sol 2024-01-25 13:08:10 +01:00
Mark Spanbroek dc0c2b7956 Refactor verifier contract: remove dead code 2024-01-25 13:08:10 +01:00
Mark Spanbroek 90c821fb61 Refactor verifier contract: remove unnecessary conversions 2024-01-25 13:08:10 +01:00
Mark Spanbroek a066b6a007 Refactor verifier contract: fix linter warnings 2024-01-25 13:08:10 +01:00
Mark Spanbroek 6baf80d6f4 Refactor verifier contract: remove preprocessing 2024-01-25 13:08:10 +01:00
Mark Spanbroek c0ca508a6b Refactor verifier contract: public input as dynamic array 2024-01-25 13:08:10 +01:00
Mark Spanbroek 39a2d56a63 Refactor verifier contract: verification key as parameter 2024-01-25 13:08:10 +01:00
Mark Spanbroek f2869ff94f Refactor verifier contract: X -> x, Y -> y 2024-01-25 13:08:10 +01:00
Mark Spanbroek d30dff1781 Refactor verifier contract: set verifying key in constructor 2024-01-25 13:08:10 +01:00
Mark Spanbroek ef32ad9c1b Refactor verifier contract: fix typo 2024-01-25 13:08:10 +01:00
Mark Spanbroek 296447724a Refactor verifier contract: extract constants 2024-01-25 13:08:10 +01:00
Mark Spanbroek b2509e4257 Refactor verifier contract: formatting 2024-01-25 13:08:10 +01:00
Mark Spanbroek f3e2186ec2 Update solidity to 0.8.23 2024-01-25 13:08:10 +01:00
Mark Spanbroek 862ea56e8b Formatting 2024-01-25 13:08:10 +01:00
Mark Spanbroek 33614ee218 Calculate public inputs for ZK proof verificition 2024-01-25 13:08:10 +01:00
Mark Spanbroek 1b3b258ccc Conversion between little and big endian 2024-01-25 13:08:10 +01:00
Mark Spanbroek 38411c27ca Move submitProof() function to Marketplace 2024-01-25 13:08:10 +01:00
Mark Spanbroek e6a918fed9 Submit proof as Groth16Proof struct 2024-01-25 13:08:10 +01:00
Mark Spanbroek ae03690d51 Submit proof as field elements, not bytes 2024-01-25 13:08:10 +01:00
Mark Spanbroek 534f8cbf51 Cleanup verifier template 2024-01-25 13:08:10 +01:00
Mark Spanbroek 1af40f1790 Read proof from file in test 2024-01-25 13:08:10 +01:00
Mark Spanbroek bf64de7e50 Update to solidity 0.8.8 2024-01-25 13:08:10 +01:00
Mark Spanbroek 3e3f2307d8 Remove GPL'ed verifier, replace by MIT verifier 2024-01-25 13:08:10 +01:00
Mark Spanbroek 61be76da0e Add preprocessing to generate verification contract 2024-01-25 13:08:10 +01:00
Mark Spanbroek c08e8be8f9 Add verification keys and example proof for local deployment 2024-01-25 13:08:10 +01:00
Mark Spanbroek 6b8d3ca83b MIT licensed version of solidity Groth16 verifier
Copied from https://github.com/iden3/snarkjs/blob/2e9be769328f3cc781c65a503c323b480712cb43/templates/verifier_original.sol
2024-01-25 13:08:10 +01:00
Mark Spanbroek e1657acdd0 Stub out zk proof verification in marketplace tests 2024-01-25 13:08:10 +01:00
Mark Spanbroek e59f0f961e Submit proofs as array of bytes 2024-01-25 13:08:10 +01:00
Mark Spanbroek d29a259090 Fix linter warnings 2024-01-25 13:08:10 +01:00
Mark Spanbroek 327ae14112 Formatting with prettier 2024-01-25 13:08:10 +01:00
Mark Spanbroek db124ddbd9 Re-arrange marketplace constructor parameters
first configuration, then contracts that we depend on
2024-01-25 13:08:10 +01:00
Mark Spanbroek b625f0d519 Merkle root is 32 bytes 2023-11-22 14:43:11 +01:00
Mark Spanbroek efafa43910 Remove PoR parameters, add merkle root for storage proofs 2023-11-22 14:43:11 +01:00
Mark Spanbroek 1854dfba99 Redeployed on taiko test net after rebase 2023-09-13 15:05:08 +02:00
Mark Spanbroek ed4717e5ea Fix hardhat error "invalid account" 2023-09-13 15:05:08 +02:00
Mark Spanbroek ffcc0e5ee6 Deployed on taiko test net 2023-09-13 15:05:08 +02:00
Mark Spanbroek 0e89d293e4 [taiko] Add RPC endpoint for Taiko test net 2023-09-13 15:05:08 +02:00
Mark Spanbroek 6801f2c009 [fuzzing] document npm run fuzz in readme 2023-06-19 14:58:47 +02:00
markspanbroekandAdam Uhlíř 96aa98c734 [fuzzing] Use correct hashbang
Co-authored-by: Adam Uhlíř <adam@uhlir.dev>
2023-06-19 14:58:47 +02:00
Mark Spanbroek f530bc5081 [fuzzing] Only use docker image on x86_64 machines
The echidna docker image does not support ARM
Macs, for example.
2023-06-19 14:58:47 +02:00
Mark Spanbroek b396f13359 [fuzzing] Fix CI 2023-06-19 14:58:47 +02:00
Mark Spanbroek 05ef48bf7f [fuzzing] Add suggestions for a long test run 2023-06-19 14:58:47 +02:00
Mark Spanbroek d4fc6bbf7c [fuzzing] update to Echidna 2.2.0 2023-06-19 14:58:47 +02:00
Mark Spanbroek a7dd840eaa [fuzzing] transfers out of the contract should always pass
When a transfer of tokens from the contract fails, then the
fuzzer has found a bug. Changing `require` to `assert`
ensures that the fuzzer considers this a test failure.
2023-06-19 14:58:47 +02:00
Mark Spanbroek 03e5546121 [marketplace] formatting 2023-06-19 14:58:47 +02:00
Mark Spanbroek 42d4778dcc [fuzzing] compile contracts before invoking docker
Ensures that `npm run fuzz` will succeed whether or
not the contracts were compiled beforehand.
2023-06-19 14:58:47 +02:00
Mark Spanbroek c1b412c589 [fuzzing] allow fuzz.sh to be called from any directory 2023-06-19 14:58:47 +02:00
Mark Spanbroek 25f52c72b1 [ci] Run fuzzing in CI 2023-06-19 14:58:47 +02:00
Mark Spanbroek 3390e21071 [fuzzing] Enable fuzzing for Marketplace
Replaces runtime invariant checks with fuzzing tests,
simplifying the contract code and lowering gas costs.
2023-06-19 14:58:47 +02:00