117 Commits

Author SHA1 Message Date
Arnaud
dee3d7b654
feat: move to hardhat ignition for deployments (#231)
* Move to ethers 6 and use hardhat ignition for deployments

* Update prettier to the last version

* Remove comment

* Remove npx call in package.json

* Remove useless comment

* Add localhost configuration for hardhat ignition

* Use contract initial balance instead of const value

* Update dependencies and use extract mining to a script in order to use hardhat ignition deploy command

* Fix deployment modules for local env

* Remove unused function

* Export contract deployment custom error assert into a function

* Refactoring

* Remove old deployments folder

* Add process names when running concurrently

* Remove conditional allowBlocksWithSameTimestamp, set true everytime

* Update dependencies

* Update Vault tests for ignition

* Update token description

* Add vault ignition module

* Remove old .tool-versions

* Fix formatting

* Remove deployments folder and add README for previous files references

* Put back the comment related to hardhat automine

* Set hardhat gas limit to auto and restore manual mining for Vault tests

* Apply prettier formatting and bug test with ignition syntax

* Add deployments artifacts

* Fix build-info ignore

* Use HARDHAT_NETWORK env variable to deploy marketplace contract

* Add guard to check that configs has tags

* Add testnet deployment addresses

* Add TOKEN_ADDRESS to reuse the token contract deployed

* Fix token deployment with contractAt

* Remove localhost deployment artifacts

* Add section in README for deployments

* Ignore localhost deployments in git

* Set mine script for localhost deployment only and add deploy reset command

* Remove previous deployment scripts

* Fix typo in documentation

* Add log when reusing token address

* Update testnet artifact reference

* Remove HARDHAT_NETWORK and update documentation

* fix md format

* Npm audit fix

* Update dependencies

* Remove default deployer

* Update commit for last testnet artifacts

* Remove deployments files from linea and testnet and update the last commit hashes to those artifacts
2025-06-20 16:05:57 +02:00
Eric
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
markspanbroek
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
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
Adam Uhlíř
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
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
r4bbit
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íř
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
r4bbit
cc0b2732ad fix(Marketplace): ensure requests include ask with sufficient slots
There is a missing check in `requestStorage()` on whether the `Request`
contains an `Ask` where its `slots` is `> 0`.

This allows for making storage request without slots. Not harmful but
not a valid state of the system either.

This commit adds that check and a test with batteries included.
2024-08-27 17:14:52 +02:00
Eric
73a2ca0bd3
feat: adds an optional payoutAddress to allow payouts to be paid to separate address (#144)
* initial commit for splitting payouts

Collateral goes to slot's host address, while reward payouts go to the slot's host payoutAddress

* Add fillSlot overload to make payoutAddress "optional"

* add tests for payoutAddress

* add doc to patchFillSlotOverloads

* formatting

* remove optional payoutAddress parameter

* Move payoutAddress to freeSlot

- remove payoutAddress parameter from `fillSlot`
- remove `payoutAddress` from slot struct and storage
- add payoutAddress parameter to `freeSlot`, preventing the need for storage

* formatting

* update certora spec to match updated function signature

* Add withdrawAddress to withdrawFunds

- prevent erc20 msg.sender blacklisting

* Update tests for paying out to withdrawAddress

* formatting

* Add collateralRecipient

* refactor: change withdrawFunds and freeSlot overloads

- `withdrawFunds` now has an option withdrawRecipient parameter
- `freeSlot` now has two optional parameters: rewardRecipient, and collateralRecipient. Both or none must be specified.

* update certora spec for new sigs
2024-08-19 17:09:48 +10:00
r4bbit
e62ebf6b0e
fix: ensure requestStorage() reverts if maxSlotloss > slots (#140) 2024-08-05 10:58:51 +02:00
Adam Uhlíř
57e8cd5013
feat: expiry specified as duration (#99) 2024-05-06 15:13:32 +02:00
Mark Spanbroek
ec803adb3d Test verifier accepts any proof, except all 0 values 2024-01-31 15:45:01 +01:00
Mark Spanbroek
33614ee218 Calculate public inputs for ZK proof verificition 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
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
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
Adam Uhlíř
87461f6b83
fix: check expiration is before request end (#77) 2023-12-05 11:18:43 +01:00
Adam Uhlíř
14e453ac31
feat: partial payouts for cancelled requests (#69) 2023-10-16 11:14:02 +02:00
Eric Mastro
230e7276e2
Support slot queue (#61)
* feat: add request expiry to StorageRequested event

* add slot index to SlotFreed event

* copy slotIndex before delete for emit

* Update tests
2023-06-22 06:18:33 +10:00
Mark Spanbroek
03e5546121 [marketplace] formatting 2023-06-19 14:58:47 +02:00
Eric Mastro
6e66abbfcd
retreive active slot for sales state restoration (#51)
Store slotIndex in slot struct and expose the slot via getActiveSlot. This is to be used when restoring state in the sales module after a node restart.
2023-04-14 09:28:39 +10:00
Adam Uhlíř
2b5d079882
feat: collateral fractions (#47)
Co-authored-by: Eric Mastro <github@egonat.me>
2023-03-30 11:11:21 +02:00
Adam Uhlíř
8b39ef8f4a
fix: reset missed counter when slot is freed (#48) 2023-03-08 17:19:49 +01:00
Adam Uhlíř
dfdbd16d5b
feat: collateral per slot (#44) 2023-03-08 12:02:34 +01:00
Eric Mastro
cde5436262
get request from slot id (#34)
* get request from slot id

- Add public function to get request from slot id.
- Add chai test assertion that compares requests. Usage: `expect(await marketplace.getRequestFromSlotId(slotId(slot))).to.be.request(request)`

This is used when restoring active sales, and a node calls `mySlots`, then iterates the slots and needs originating request details.

* merge upstream changes
2023-01-24 15:59:56 +11:00
Mark Spanbroek
b81e6e6532 [marketplace] better wording
Avoids the word 'expired' which is associated
with cancelling a request

Co-authored-by: Eric Mastro <eric.mastro@gmail.com>
2023-01-23 15:10:23 +01:00
Mark Spanbroek
019c1c34c0 [marketplace] rewrite slot freeing test
To make it independent of values chosen in exampleRequest().
Uses the recently introduced slotState().
2023-01-23 15:10:23 +01:00
Mark Spanbroek
b62eeb564a [marketplace] test & fix slotState() 2023-01-23 15:10:23 +01:00
Mark Spanbroek
334da1144d [marketplace] renaming and reshuffling of request state test 2023-01-23 15:10:23 +01:00
Mark Spanbroek
ae70fd7c6f [marketplace] introduce MarketplaceConfiguration struct
Container for all configuration values, replaces separate
constructor parameters and getters.
2023-01-23 15:10:23 +01:00
Mark Spanbroek
8c6891f1e2 [marketplace] slotIsNotFree() modifier
Replaces _slot getter
2023-01-23 15:10:23 +01:00
Mark Spanbroek
1316682a6f [marketplace] remove slotMustAcceptProofs modifier
Replaced by checks on slot state
2023-01-23 15:10:23 +01:00
Mark Spanbroek
7d377a3739 [marketplace] remove requestMustAcceptProofs modifier
Is already covered by the slot state check later on
2023-01-23 15:10:23 +01:00
Mark Spanbroek
5eeac8a782 [marketplace] remove unused import 2023-01-23 15:10:23 +01:00
Mark Spanbroek
c8dda37300 [marketplace] introduce SlotState
- replace proofEnd() by slotState()
- replace _slotAcceptsProofs() by slotState()
- remove _stopRequiringProofs()
2023-01-23 15:10:23 +01:00
Mark Spanbroek
de0595edb3 [marketplace] rename state(id) -> requestState(id) 2023-01-23 15:10:23 +01:00
Mark Spanbroek
e496ac3550 [marketplace] remove _isCancelled and _isFinished 2023-01-23 15:10:23 +01:00