Commit Graph
485 Commits
Author SHA1 Message Date
Eric cd6a78e548 reduce proof period
Proving is now on a new thread, and generates proofs much faster
2025-06-26 18:33:05 +10:00
Eric 533cad59fa chore: increase period during for windows ci
Because windows is so slow, increase the period duration in the hopes that it can fill slots in time.
2025-06-09 11:07:57 +02:00
Arnaud 98e73ed0a0 Ensure to get the next block timestamp 2025-06-09 09:16:56 +02:00
Dmitriy Ryajov abdbb48a3c bumping hardhat to v2.24.2 2025-06-06 11:33:59 -06:00
EricandDmitriy Ryajov 3661376327 fix(integration): fixes hardhat not recognising custom error (#243)
Co-authored-by: Dmitriy Ryajov <dryajov@gmail.com>
2025-06-05 12:42:01 -07:00
Adam Uhlíř 06c76e59b5 build: docker uses npm ci (#244) 2025-06-05 10:25:12 +02:00
Arnaud aee91f1ac4 chore: add a new canMarkProofAsMissing function (#229)
* Add a new canProofBeMarkedAsMissing function

* Rename modifier

* Rename canProofBeMarkedAsMissing to canMarkProofAsMissing
2025-06-03 09:06:57 +02:00
Slava b5ca8a61db chore: codex_testnet deployment artifacts (#241)
https://github.com/codex-storage/nim-codex/issues/1241
2025-05-30 12:30:12 +03:00
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
Adam Uhlíř a1680df42e fix: avoid redeploying token contract (#236) 2025-05-15 09:49:38 +00:00
Slava 8d19f7650b chore: codex_testnet deployment artifacts (#237)
https://github.com/codex-storage/nim-codex/issues/1203
2025-05-15 04:24:53 +00:00
EricandArnaud 92537a5120 fix(slot reservations): clear AddressSet instead of delete (#235)
* fix(slot-reservations): Allows slot to be reserved when in repair

Previous to when SlotState.Repair was implemented, slots in repair would be considered free and the slots could be reserved in this state. Now that SlotState.Repair has been implemented, the `canReserveSlot` needs to check that the SlotState is in Repair or is Free before allowing reservation.

* fix(slot reservations): clear AddressSet instead of delete

Deleting an AddressSet causes corrupted memory. Each address must be removed individually, which is OK to do since there is a maxReservations parameter that keeps this number small.

https://docs.openzeppelin.com/contracts/5.x/api/utils#EnumerableSet

* Switch to EnumerableSet clear function provided by openzeppelin

---------

Co-authored-by: Arnaud <arnaud@status.im>
2025-05-15 11:40:14 +10:00
Eric baded845f3 fix(slot-reservations): Allows slot to be reserved when in repair (#234)
Previous to when SlotState.Repair was implemented, slots in repair would be considered free and the slots could be reserved in this state. Now that SlotState.Repair has been implemented, the `canReserveSlot` needs to check that the SlotState is in Repair or is Free before allowing reservation.
2025-05-15 11:37:50 +10: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
Adam Uhlíř 0bf138512b fix: only slots host should be able to submit proof (#227)
* fix: only slots host should be able to submit proof

* chore: formatting
2025-03-26 11:05:21 +01: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
Slava 407beed0af ci: use common docker reusable workflow (#222) 2025-02-26 11:08:19 +01:00
Slava a25c10e0d3 chore: codex_testnet deployment artifacts (#221)
https://github.com/codex-storage/nim-codex/issues/1126
2025-02-25 09:52:04 +02:00
c00152e621 perf: optimizing parameters sizing (#207)
* perf: optimizing parameters sizing

* chore: feedback

Co-authored-by: markspanbroek <mark@spanbroek.net>

* style: formatting

* perf: more optimizations

* chore: fixes

* chore: fix certora spec

* chore: more fixes for certora spec

* chore: more and more fixes for certora spec

* fix: ends type

* test(certora): timestamp conversion

* test(certora): timestamp conversion again

* test(certora): timestamp conversion revert to assert_uint64

* test(certora): timestamp with mathint

* test(certora): timestamp back with uint64 with require

* Add missing configuration

* Fix previous merge

* Update StorageRequested to use int64 for expiry

* requestDurationLimit => uint64

---------

Co-authored-by: markspanbroek <mark@spanbroek.net>
Co-authored-by: Arnaud <arnaud@status.im>
Co-authored-by: Eric <5089238+emizzle@users.noreply.github.com>
2025-02-20 16:54:41 +11:00
Adam UhlířandArnaud ff82c26b36 feat: request duration limit (#206)
* feat: request duration limit

* Merge master and use custom error

* Remove slashCriterion

---------

Co-authored-by: Arnaud <arnaud@status.im>
2025-02-18 15:27:47 +01:00
Arnaud 0f2012b144 Change the cid from string to bytes (#214)
* Change the cid from string to bytes

* Fix content definition

* Fix cid invalid test
2025-02-13 13:03:45 +00: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
Arnaud 51bae145fc Reward validator when marking missing proof (#209) 2025-01-27 11:33:23 +01:00
Arnaud 6753d20b17 Remove missing proof leniency (#210) 2025-01-27 10:14:53 +00:00
Arnaud 78c15710f3 Remove the mapping _probabilities (#215)
* Remove the mapping _probabilities
* Fix the slot propability calculation test by filling slot only instead of requiring proofs
* Remove custom errorr Proofs_InvalidProbability not used anymore
2025-01-27 10:02:27 +00:00
Marcin Czenko e74d3397a1 Feat: price per byte (#208)
* changes reward => pricePerByte

* collateral => collateralPerByte

* updates tests

* introduces AskHelpers to compute price and collateral per slot

* adds public view function returning currentCollateral for the slot

* updates names for price and collateral

* uses pricePerSlotPerSecond in maxPriceHelper

* adds collateralPerSlot helper

* makes sure that the intended use of the <<currentCollateral>> view function is demonstrated in tests

* formatting

* fix comment

* mints more tokens so that it can be used with contracts tests in nim-codex

* Renaming <<collateral>> and <<reward>> to <<collateralPerByte>> and <<pricePerBytePerSecond>> respectively (merged in the meantime to the master)
2025-01-24 15:28:29 +01:00
Arnaud d04acafde2 Add request validations (#213)
* Add request validations
* Apply custom errors
2025-01-24 12:49:06 +01:00
Arnaud 500498f8bc Replace assert by revert (#216)
* Replace assert with revert
2025-01-24 11:07:55 +01:00
Arnaud 604d4c87eb Reject when probability is 0 (#212)
* Reject when probability is 0
* Apply custom error
2025-01-24 10:13:45 +01:00
Arnaud bfa5a78b4f Verify than secondsPerPeriod cannot be zero (#211)
* Assert than secondsPerPeriod cannot be zero
* Apply custom error
2025-01-24 09:22:21 +01:00
r4bbitandAdam Uhlíř 02e3b8d22b refactor(Marketplace): Use custom errors instead of string messages (#141)
Co-authored-by: Adam Uhlíř <adam@uhlir.dev>
2025-01-15 14:11:40 +01:00
Adam Uhlíř dfab6102e7 feat: repair reward (#193) 2024-12-12 18:39:42 +01:00
Adam Uhlíř 06f9f56cd2 ci: tweaks run triggers and checkout hash (#205) 2024-12-05 11:10:29 +01:00
Slava b181639bb6 Add codex_testnet deployment artifacts (#204)
https://github.com/codex-storage/nim-codex/issues/1000
2024-11-26 11:43:22 +02:00
Slava c970c632b8 Add codex_testnet deployment artifacts (#199)
https://github.com/codex-storage/nim-codex/issues/983
2024-11-25 20:27:00 +02: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
Eric 1ce3d10fa2 fix(slot-reservations): ensure slot is free (#196)
Ensure that the slot state is free before allowing reservations
2024-10-30 15:48:37 +11:00
Eric 7645df19ab renames config to configuration (#198)
This is not the right reason to be making this kind of change, but a very hard to debug symbol clash in codex for `config`. Changing this to `configuration` is the easiest way to fix the issue.
2024-10-29 19:02:42 +11:00
r4bbit 0b39274ed5 refactor(certora): extract allowedRequestStateChanges rule into own
file

Closes #192
2024-10-21 15:36:29 +02:00
Slava c3e4fdd321 Add codex_testnet deployment artifacts (#197)
https://github.com/codex-storage/infra-codex/issues/248
2024-10-21 10:00:46 +02:00
Andrea Franz 2a1bef5255 chore(certora): verify slots transitions and that a slot can be paid only once 2024-10-15 11:06:46 +02:00
Slava 997696a20e Add codex_testnet deployment artifacts (#190) 2024-10-08 14:27:06 +02:00
7e6187d4b1 feat: hosts payed by actual time hosting a slot (#160)
Co-authored-by: Eric <5089238+emizzle@users.noreply.github.com>
Co-authored-by: r4bbit <445106+0x-r4bbit@users.noreply.github.com>
2024-10-08 09:38:19 +02:00
Eric f5a54c7ed4 feat(slot-reservations): require slots to be reserved before filling slot (#185)
* Require slots to be reserved before filling slot

* Add test that checks filling slot fails without reservation
2024-10-08 15:55:17 +11:00