Eric Mastro
a99827ed39
Reinstate mapping index, add ActiveSlotId
...
Reinstate the index mapping for `activeSlots`, however with a modified data structure. The main difference comes from a change in `mySlots`: it now requires a `RequestId` as a parameter (which can be obtained using `myRequests`. This allowed for the `activeSlots` mapping to be keyed on `RequestId`, which gives a mapping of `ActiveSlotId => EnumerableSet.Bytes32`. `ActiveSlotId` is a keccak hash of `address + activeSlotIdx`, which not only allows retrieval of all active slot ids per request, but also allows clearing of all active slot ids for a request by incrementing the `activeSlotIdx`.
```
requestId => [ keccak(address + activeSlotIdx) => EnumerableSet.Bytes32 ]
```
2022-12-22 10:29:06 +01:00
Eric Mastro
5f056b055a
Revert mapping index for clearing active slots
...
Instead, iterate all active slots and remove them individually, only if they are part of a specific request. This is only for the case of request failure.
2022-12-22 10:29:06 +01:00
Eric Mastro
48eba1fe27
Clear active slots by host
...
Allow for clearing of active slots by host, by incrementing an mapping index. The new index points to a fresh instance of EnumerableSet, effectively wiping it clean.
2022-12-22 10:29:06 +01:00
Eric Mastro
b2de745d9a
add tests for active slots
2022-12-22 10:29:06 +01:00
Eric Mastro
5b6187afc4
list active sales
2022-12-22 10:29:06 +01:00
Mark Spanbroek
fb47176450
[marketplace] formatting
...
reformatting using prettier
2022-10-26 10:58:29 +02:00
Mark Spanbroek
c29fb75a48
[marketplace] Remove duplication
2022-10-26 10:58:05 +02:00
Eric Mastro
4a470c7dc7
[marketplace] improve requestEnd to check all states
...
There may be cases where the the request end is not accurate as the state of the request hasn’t yet been updated. For example, when a request is cancelled, the request end would not have been updated to be in the past, and would still be set for the end of the request (which could be in the future).
2022-10-26 13:36:32 +11:00
Mark Spanbroek
9a6a321d5b
[marketplace] Add method to get request end time
2022-10-25 14:49:37 +02:00
Eric Mastro
2ac6c0b2de
remove duplicate _toProofId function
2022-10-25 13:13:31 +11:00
Eric Mastro
51a02c09ba
[marketplace] remove request from list of active requests
2022-10-25 13:06:52 +11:00
Eric Mastro
29dcfb52b4
[marketplace] formatting
...
reformatting using prettier
2022-10-25 13:04:16 +11:00
Eric Mastro
b2f9e07c56
[marketplace] add list of active requests
2022-10-25 13:00:48 +11:00
Eric Mastro
e97583befd
[marketplace] alias bytes32 types
...
`RequestId`, `SlotId`, `LockId`, `ProofId`, `EndId` types were created to avoid confusion and enforce compiler restrictions.
2022-10-25 13:00:24 +11:00
Eric Mastro
2478e36aba
add back proof end mappings
2022-10-25 12:47:50 +11:00
Eric Mastro
cfb70897f8
[marketplace] alias bytes32 types
...
`RequestId`, `SlotId`, `LockId`, `ProofId`, `EndId` types were created to avoid confusion and enforce compiler restrictions.
2022-10-25 12:47:50 +11:00
Eric Mastro
bac2675bb2
set proof end when storage requested
...
1. set proof end to now + duration when storage is requested
2. set proof end to past when contract is failed
3. add back proof end mappings
2022-10-25 12:38:19 +11:00
Eric Mastro
fd74268a8a
Remove proof extension, test clean up
...
1. Remove proof extension as it is not needed. Host are required to provide proofs from the moment they fill a slot, for the duration specified by the contract. This means that the ending of their requirements will be staggered at the end, as they were at the start, but this is more predicable for determining the cost of a request.
2. The proof end time was modified so that if the request state is not accepting proofs, it takes the min of the slot proof end time, the request end time, or block.timestamp - 1, which ensures that it returns a time in the past. If the slot is accepting proofs, it returns the slot end time.
3. Modify marketplace tests so that `waitUntilFinished` advances time to the proof ending of the last slot filled.
2022-10-25 12:38:19 +11:00
Eric Mastro
321132b6fa
clean up tests
...
1. Replace all instances of `now()` with `await currentTime()` to get a more accurate representation of time from the block timestamp. Update examples.js to be async.
2. Move `RequestState` to `marketplace.js`
3. Delete `TestStorage` as `slashAmount` function no longer needed.
2022-10-25 12:38:19 +11:00
Eric Mastro
ad040cfee6
[marketplace] extend proof ending
...
Allow proof ending to be extending once a contract is started, so that all filled slots share an ending time that is equal to the contract end time. Added tests.
Add a mapping for proof id to endId so that proof expectations can be extended for all proofs that share a given endId.
Add function modifiers that require the request state to allow proofs, with accompanying tests.
General clean up of each function’s request state context, with accompanying tests.
General clean up of all tests, including state change “wait” functions and normalising the time advancement functions.
2022-10-25 12:38:19 +11:00
Eric Mastro
1fff2f7295
[marketplace] add isFinished
...
Add function `isFinished` that checks whethere the state has been set to `RequestState.Finished` (which is not being set yet) or if the contract was started (`RequestState.Started`) and the contract duration has lapsed.
To facilitate `isFinished`, the contract start time (`startedAt`) was added to calculate the contract end time.
2022-10-25 12:38:19 +11:00
Eric Mastro
2170d6bd19
[marketplace] tests for Failed state
2022-10-25 12:38:19 +11:00
Eric Mastro
08e73d9348
[marketplace] Add tests for freeing a slot
2022-10-25 12:38:19 +11:00
Eric Mastro
0ffe5d7697
[marketplace] free slot after too many proofs missed
...
Needs tests
2022-10-25 12:38:19 +11:00
Eric Mastro
087c13a7fc
update fillSlot and freeSlot state requirements
...
`fillSlot` and `freeSlot` must both be in a state of New or Started and not Cancelled (Finished to be added later).
Update tests to support the above.
2022-09-21 20:52:44 +10:00
Eric Mastro
cce70b44a1
reorder fillSlot and freeSlot to be chronological
2022-09-21 20:52:44 +10:00
Eric Mastro
1b216f6655
slash first then check collateral threshold
...
Once a proof is marked as missing, if that missing proof is enough to slash a host, first slash the host, then check the hosts balance. If the balance has dropped below the minimum allowable collateral threshold, then remove them from the slot.
2022-09-21 20:52:44 +10:00
Eric Mastro
7726db2a8d
modify collateral threshold test to remove TestStorage dep
2022-09-21 20:52:44 +10:00
Eric Mastro
cf0ab20b6c
[chore/marketplace] update coment
2022-09-21 20:52:44 +10:00
Eric Mastro
2b8c8fc42a
[marketplace] tests for Failed state
2022-09-21 20:52:44 +10:00
Eric Mastro
980647876f
[marketplace] update contract state to failed
...
Update contract state to failed when too many slots have been freed.
2022-09-21 20:52:44 +10:00
Eric Mastro
9f8affdcaa
[marketplace] Add tests for freeing a slot
2022-09-21 20:52:44 +10:00
Eric Mastro
7487663534
[marketplace] free slot after too many proofs missed
...
Needs tests
2022-09-21 20:52:44 +10:00
Eric Mastro
fdc0e7d58a
proofEnd returns end or past timestamp
2022-09-20 15:59:03 +10:00
Eric Mastro
716b864f02
[marketplace] update state getter
...
Update `Marketplace.state` getter to to take `isCancelled` into account. This state can then be used internally and externally.
Add checks to `proofEnd`, `isProofRequired`, `willProofBeRequired`, and `getChallenge` that understands if the request is in a state to accept proofs. If not, return other values.
Add `slotMustAcceptProofs` modifier, originally introduced in a later PR, which requires the request to be in state of the request accepting proofs.
Add tests for all the above.
2022-09-20 15:59:03 +10:00
Eric Mastro
4cb7ad79a5
[marketplace] add indexing to RequestCancelled event
...
Index the `RequestCancelled.requestId` field so that subscriptions to this event can be made.
2022-09-20 15:59:03 +10:00
Eric Mastro
8be756808c
[marketplace] address various PR comments
...
- Remove `FundsWithdrawn` event
- do not copy request to memory
- todo for changing withdraw amount to not include proof payments
- test lock expiry border
- in tests, move `RequestState` to exported const in marketplace.js
- move test for state checks on `fillSlot` to the “filling a slot” section.
2022-09-20 15:59:03 +10:00
Eric Mastro
b580ffd8a3
[refactor] do not expose cancelled logic externally
2022-09-20 15:59:03 +10:00
Eric Mastro
34553ad7d9
[marketplace] add slot/request mapping, cancelled check
...
Add a requestId mapping to the Slot type. This allows the requestId to be obtained for a slot and the StorageRequest can be looked up from the id.
Add `isSlotCancelled` to check if the request that a slot belongs to has been cancelled (not enough slots filled before expiry).
2022-09-20 15:59:03 +10:00
Eric Mastro
20938ab448
[marketplace] Add cancelled check for marking missing proofs
...
Add check for cancelled requests when marking proofs as missing.
Add NatSpec documentation for `withdrawFunds` and `isCancelled`.
2022-09-20 15:59:03 +10:00
Eric Mastro
949a359626
[marketplace] Add isCancelled check for slot
...
Add cancelled check for slot state which checks the contract state and also the slot expiry time. This handles the case where the client may not have withdrawn funds yet (which sets the contract state to Cancelled).
Add tests for contract state.
2022-09-20 15:59:03 +10:00
Eric Mastro
3a97330e72
[marketplace] extend lock expiry
...
Add ability to extend lock expiry once all slots are filled.
Tests to support lock expiry.
2022-09-20 15:59:03 +10:00
Eric Mastro
37004e0e1f
[marketplace] Allow client to withdraw when cancelled
...
Adds ability for client to withdraw funds from a cancelled storage request.
Tests to check if request has timed out, if the client address is requesting withdraw, if the request state is new, and the funds were successfully transferred.
2022-09-20 15:59:03 +10:00
Eric Mastro
1933ed489a
[marketplace] set request state to started once fulfilled
...
Once all slots are filled, the request state is set to Started.
2022-09-20 15:59:03 +10:00
Eric Mastro
08a3fbb12b
[chore] clean up bytes32 parameters
...
Change the names of some bytes32 parameters to `slotId` and `requestId` to avoid confusion.
2022-08-26 11:03:56 +10:00
Mark Spanbroek
9ab65ae5a6
[marketplace] Specify size per slot, instead of total size
...
Reasoning: it was unclear exactly how much storage a
host should have available for a slot. The division
size/slots can have a non-integer value.
2022-08-08 11:51:14 +02:00
Mark Spanbroek
3e9fffb526
[marketplace] Reward is paid out per second per slot
2022-08-08 11:51:14 +02:00
Mark Spanbroek
1d951ef8f8
[marketplace] Rename Erasure.totalNodes -> Ask.slots
2022-08-08 11:51:14 +02:00
Mark Spanbroek
b3fededbad
[marketplace] Remove nodeId from Request
...
No longer needed now that we have slots.
2022-08-08 11:51:14 +02:00
Mark Spanbroek
9a76c04d45
[marketplace] Emit RequestFulfilled when all slots are filled
2022-08-08 11:51:14 +02:00
Mark Spanbroek
f32974b496
[marketplace] Remove fulfillRequest()
2022-08-08 11:51:14 +02:00
Mark Spanbroek
80f0cc6005
[storage] Slash based on slots
2022-08-08 11:51:14 +02:00
Mark Spanbroek
e5ed3bd59d
[storage] Remove finishContract()
...
Is superceded by Marketplace.payoutSlot().
2022-08-08 11:51:14 +02:00
Mark Spanbroek
9bc84dafe0
[marketplace] payout reward for a slot
2022-08-08 11:51:14 +02:00
Mark Spanbroek
141abce186
[marketplace] Add slots
2022-08-08 11:51:14 +02:00
Mark Spanbroek
97ef1bcd9f
Add getHost() to retrieve host that fulfills request
2022-07-20 11:12:00 +02:00
Mark Spanbroek
389f5299d6
[marketplace] Rename maxPrice -> reward
2022-07-20 11:12:00 +02:00
Mark Spanbroek
8d7b7aed1d
[marketplace] remove `offer`, `select` and `startContract`
...
Contract is started when first proof is submitted.
2022-07-20 11:12:00 +02:00
Mark Spanbroek
f3b969fd7c
[marketplace] require storage proofs when fulfilling request
2022-07-20 11:12:00 +02:00
Mark Spanbroek
83291ef06b
[marketplace] fulfill request by presenting proof of storage
2022-07-20 11:12:00 +02:00
Mark Spanbroek
2bf01da728
[proofs] Submitting proof emits event containing proof
2022-04-12 09:04:29 +02:00
Mark Spanbroek
6aa2894521
[marketplace] Use dynamically sized arrays for PoR
...
ABI encoding sometimes fails on large byte arrays of fixed size.
2022-04-11 12:10:57 +02:00
Mark Spanbroek
b145e66a68
[storage] add getRequest() and getOffer()
2022-04-11 12:10:57 +02:00
Mark Spanbroek
b8ce6c3682
[marketplace] Add erasure coding and PoR attributes to request
2022-04-11 12:10:57 +02:00
Mark Spanbroek
29b5775951
[proofs] willProofBeRequired() predicts proof requirement
2022-04-05 11:36:31 +02:00
Mark Spanbroek
81c7dcd25a
Disallow finishing of contract that wasn't started
2022-03-22 12:41:13 +01:00
Mark Spanbroek
c606b455d6
Disallow starting an offer that was not selected
2022-03-22 12:41:13 +01:00
Mark Spanbroek
3fd7c756d9
Fix flaky tests
...
By ensuring that there's enough blocks left
for submitting a proof.
2022-03-15 10:01:12 +01:00
Mark Spanbroek
f8ddc4a2f6
Add getChallenge() to Storage contract
2022-03-15 10:01:12 +01:00
Mark Spanbroek
fd55afcc5a
Make pointer downtime configurable
2022-03-15 10:01:12 +01:00
Mark Spanbroek
476956c4d5
Replace pointer duos with pointer downtime design
2022-03-15 10:01:12 +01:00
Mark Spanbroek
6d726fc2cc
Require a block height of at least 256
2022-03-15 10:01:12 +01:00
Mark Spanbroek
07d0e33789
Disable solhint about relying on timestamp
2022-03-15 10:01:12 +01:00
Mark Spanbroek
78eaaa7812
Replace Proof implementation with new design
...
More info: https://github.com/status-im/dagger-research/pull/66
2022-03-15 10:01:12 +01:00
Mark Spanbroek
ee4683e50c
Add proof probability to Request
2022-03-15 10:01:12 +01:00
Mark Spanbroek
036a214427
Proof period and proof timeout are network constants now
2022-03-15 10:01:12 +01:00
Mark Spanbroek
e818d70b85
Remove Contracts in favor of Marketplace
2022-03-15 10:01:12 +01:00
Mark Spanbroek
7e7134b99d
Allow events to be filtered by request id
2022-03-15 10:01:12 +01:00
Mark Spanbroek
c835ac1cc4
Emit event when offer is selected
2022-03-15 10:01:12 +01:00
Mark Spanbroek
05fbd244e2
Formatting
2022-03-15 10:01:12 +01:00
Mark Spanbroek
6e6cc1a230
Reject offer for expired request
2022-03-15 10:01:12 +01:00
Mark Spanbroek
85b212c703
Select a storage offer
2022-03-15 10:01:12 +01:00
Mark Spanbroek
cc57155792
Lock collateral of host that offers storage
2022-03-15 10:01:12 +01:00
Mark Spanbroek
980e2343ed
Add expiry to storage requests
2022-03-15 10:01:12 +01:00
Mark Spanbroek
18e667bf19
Use client/host address to check for duplicates
...
Removes the need for the extra correctness checks
on request size and offer expiry, since these are
no longer used to check for duplicates.
2022-03-15 10:01:12 +01:00
Mark Spanbroek
ae92f63987
Add host address to offers
2022-03-15 10:01:12 +01:00
Mark Spanbroek
51e2d65596
Add client address to requests
2022-03-15 10:01:12 +01:00
Mark Spanbroek
b349b76ab7
Offer storage using Marketplace contract
2022-03-15 10:01:12 +01:00
Mark Spanbroek
f9cc73d62f
Rename invariants to avoid name clashes
2022-03-15 10:01:12 +01:00
Mark Spanbroek
e1ef2a2216
Request storage using Marketplace contract
2022-03-15 10:01:12 +01:00
Mark Spanbroek
e963a25c94
Replace Stakes with Collateral
...
Removes the old Stakes implementation in favor of the
new Collateral implementation.
2022-03-01 09:38:53 +01:00
Mark Spanbroek
1f01704afd
Document the account locking design
2022-03-01 09:38:53 +01:00
Mark Spanbroek
91a976a007
Prevent withdrawal of locked collateral
2022-03-01 09:38:53 +01:00
Mark Spanbroek
c5fab40535
Account locking
2022-03-01 09:38:53 +01:00
Mark Spanbroek
ab38473688
Slash collateral
2022-03-01 09:38:53 +01:00
Mark Spanbroek
2f59927b30
Check result of ERC20 transferFrom call
2022-03-01 09:38:53 +01:00
Mark Spanbroek
9e0d05965d
Update collateral totals and balance at the same time
2022-03-01 09:38:53 +01:00
Mark Spanbroek
c86fdfbec1
Withdraw collateral
2022-03-01 09:38:53 +01:00
Mark Spanbroek
3d50e56fe7
Collateral invariant
2022-03-01 09:38:53 +01:00
Mark Spanbroek
6e0aded775
Deposit collateral
2022-03-01 09:38:53 +01:00
Mark Spanbroek
f7af18eb2d
Lint with solhint
2022-02-10 07:46:03 +01:00
Mark Spanbroek
78755ecaa2
Format using prettier
2022-02-10 07:46:03 +01:00
Mark Spanbroek
0fedd8875f
Use standard ABI encoding instead of the non-standard
...
packing mode.
2021-11-24 11:43:31 +01:00
Mark Spanbroek
b9a9be350a
Simplify signature of TestToken.mint
...
To be compatible with nim-web3, which doesn't
support arrays in a method signature.
2021-11-23 14:35:00 +01:00
Mark Spanbroek
a69a6d6975
Use deployment fixture for Storage contract tests
2021-11-18 13:56:12 +01:00
Mark Spanbroek
7b16841534
Change test token to allow arbitrary minting
2021-11-18 13:56:12 +01:00
Mark Spanbroek
8bb8441bce
Slash host stake when too many proofs are missing
2021-11-04 14:19:58 +01:00
Mark Spanbroek
50bab88447
Allow slashing of stake
2021-11-04 13:16:11 +01:00
Mark Spanbroek
38fee6d83a
Pay host when contract is finished
2021-11-04 11:55:47 +01:00
Mark Spanbroek
d2a3cc4a89
Client pays price when creating contract
2021-11-04 11:40:03 +01:00
Mark Spanbroek
afad0e49ec
Mint test tokens for both client and host
2021-11-04 11:32:21 +01:00
Mark Spanbroek
54cc2987df
Ensure that finishing a contract can only be done once
2021-11-04 11:18:05 +01:00
Mark Spanbroek
aa673ff71c
Unlock host stake at end of contract
2021-11-04 10:19:23 +01:00
Mark Spanbroek
6de82709ca
Only host can call start on a contract
2021-11-04 10:00:41 +01:00
Mark Spanbroek
376962322d
Only expect proofs when the contract is started
2021-11-04 10:00:41 +01:00
Mark Spanbroek
c0fb0c725c
Do not require proofs before start of contract
2021-11-03 17:15:03 +01:00
Mark Spanbroek
8efa9fe162
Stop requiring proofs when contract has ended
2021-11-03 17:02:12 +01:00
Mark Spanbroek
2784800c3e
Add end time to proofs based on contract duration
2021-11-03 17:01:11 +01:00
Mark Spanbroek
3326c4fe74
Make isProofRequired() work for the current block
...
The block hash of the current block is not known yet, so
we use the block hash of the previous block to determine
whether a proof is required for a block.
2021-11-03 13:20:40 +01:00
Mark Spanbroek
e7f3dc3dae
Define contract duration in number of blocks
...
This makes calculation with duration in Solidity simpler
and less prone to errors.
2021-11-03 11:10:42 +01:00
Mark Spanbroek
65c3cacb66
Host stake is locked up when contract is created
2021-11-02 12:50:20 +01:00
Mark Spanbroek
d49c75a74b
Make amount of stake configurable
2021-11-02 12:45:53 +01:00
Mark Spanbroek
8736e5a1aa
Host has to put up stake before entering into a contract
2021-11-02 11:25:01 +01:00
Mark Spanbroek
3b6ec4126d
Fix comments
2021-11-02 11:22:34 +01:00
Mark Spanbroek
7b6c6c2fc5
Rename: StorageContracts -> Storage
2021-11-01 16:34:01 +01:00
Mark Spanbroek
eefa23ff02
Change parameter order
...
Move parameters belonging to the bid together.
2021-11-01 16:23:37 +01:00
Mark Spanbroek
650f5d1f1a
Checking of new storage contracts is moved to Contracts.sol
2021-11-01 16:17:42 +01:00
Mark Spanbroek
aa0def1127
Move timeout validity check to Proofs contract
2021-11-01 15:28:22 +01:00
Mark Spanbroek
d5dede6e6b
Change visibility of stake functions to 'internal'
...
This ensures that any contract that inherits from Stakes
doesn't expose its functions by default.
2021-11-01 15:17:19 +01:00
Mark Spanbroek
d1f5ce0786
Extract logic around proofs into separate contract
2021-11-01 15:12:05 +01:00
Mark Spanbroek
c013a37229
Add contract for keeping track of stakes in ERC20 tokens
2021-10-21 14:09:37 +02:00
Mark Spanbroek
23887f9190
Do not mark proof as missing twice
2021-10-21 10:32:29 +02:00
Mark Spanbroek
c3e85c675a
Use bid hash as contract id
...
Adds nonce to storage request to ensure uniqueness.
2021-10-20 14:30:31 +02:00
Mark Spanbroek
08cedae4bf
Multiple storage contracts in solidity contract
2021-10-20 14:30:31 +02:00
Mark Spanbroek
d005bf7c3c
Rename StorageContract -> StorageContracts
2021-10-20 10:59:08 +02:00
Mark Spanbroek
4913edb6ce
Allow anyone to mark missing proofs
2021-10-19 09:37:03 +02:00
Mark Spanbroek
47f0746f06
Add expiration time to bids
2021-10-18 15:31:19 +02:00
Mark Spanbroek
71efdd36c7
Add (dummy) proof submission
2021-10-18 14:55:59 +02:00
Mark Spanbroek
04b2a31f74
Add hash of data that is to be stored to the contract
2021-10-14 14:49:29 +02:00
Mark Spanbroek
23a4b84816
Add proof period and timeout to request for storage
2021-10-14 14:01:28 +02:00
Mark Spanbroek
cbf34df013
Require proofs on average once every proof period
2021-10-14 12:37:14 +02:00
Mark Spanbroek
550fcf4afe
Add proof period and timeout to contract
2021-10-14 09:10:57 +02:00
Mark Spanbroek
6ef71f0419
Introduces StorageContract
...
A StorageContract can only be instantiated when a request
for storage and a bid have been signed.
2021-10-12 16:59:34 +02:00