@@ -10,6 +10,31 @@ namespace fc::markets::storage::provider {
1010 // Key to store last ask in datastore
1111 const Bytes kBestAskKey {codec::cbor::encode (" latest-ask" ).value ()};
1212
13+ outcome::result<std::shared_ptr<StoredAsk>> StoredAsk::newStoredAsk (
14+ std::shared_ptr<Datastore> datastore,
15+ std::shared_ptr<FullNodeApi> api,
16+ Address actor_address) {
17+ struct make_unique_enabler : StoredAsk {
18+ make_unique_enabler (std::shared_ptr<Datastore> datastore,
19+ std::shared_ptr<FullNodeApi> api,
20+ Address actor_address)
21+ : StoredAsk(
22+ std::move (datastore), std::move(api), std::move(actor_address)){};
23+ };
24+
25+ std::unique_ptr<StoredAsk> stored_ask =
26+ std::make_unique<make_unique_enabler>(
27+ std::move (datastore), std::move(api), std::move(actor_address));
28+
29+ OUTCOME_TRY (maybe_ask, stored_ask->tryLoadSignedAsk ());
30+
31+ if (not maybe_ask.has_value()) {
32+ OUTCOME_TRY (stored_ask->addAsk (kDefaultPrice , kDefaultDuration ));
33+ }
34+
35+ return std::move(stored_ask);
36+ }
37+
1338 StoredAsk::StoredAsk (std::shared_ptr<Datastore> datastore,
1439 std::shared_ptr<FullNodeApi> api,
1540 Address actor_address)
@@ -31,12 +56,21 @@ namespace fc::markets::storage::provider {
3156
3257 outcome::result<void > StoredAsk::addAsk (const TokenAmount &price,
3358 ChainEpoch duration) {
59+ auto min_size = kDefaultMinPieceSize ;
60+ auto max_size = kDefaultMaxPieceSize ;
61+
62+ if (last_signed_storage_ask_.has_value ()) {
63+ auto &ask{(*last_signed_storage_ask_).ask };
64+ min_size = ask.min_piece_size ;
65+ max_size = ask.max_piece_size ;
66+ }
67+
3468 return addAsk (
3569 {
3670 .price = price,
3771 .verified_price = price,
38- .min_piece_size = kDefaultMinPieceSize ,
39- .max_piece_size = kDefaultMaxPieceSize ,
72+ .min_piece_size = min_size ,
73+ .max_piece_size = max_size ,
4074 .miner = actor_,
4175 },
4276 duration);
@@ -54,26 +88,18 @@ namespace fc::markets::storage::provider {
5488 }
5589
5690 outcome::result<SignedStorageAsk> StoredAsk::loadSignedAsk () {
57- if (datastore_->contains (kBestAskKey )) {
58- OUTCOME_TRY (ask_bytes, datastore_->get (kBestAskKey ));
59- OUTCOME_TRY (ask, codec::cbor::decode<SignedStorageAsk>(ask_bytes));
60- return std::move (ask);
61- }
91+ OUTCOME_TRY (ask_bytes, datastore_->get (kBestAskKey ));
92+ OUTCOME_TRY (ask, codec::cbor::decode<SignedStorageAsk>(ask_bytes));
93+ return std::move (ask);
94+ }
6295
63- // otherwise return default which 'not actively accepting deals'
64- OUTCOME_TRY (chain_head, api_->ChainHead ());
65- ChainEpoch timestamp = chain_head->height ();
66- ChainEpoch expiry = chain_head->height () + kDefaultDuration ;
67- StorageAsk default_ask{.price = kDefaultPrice ,
68- .verified_price = kDefaultPrice ,
69- .min_piece_size = kDefaultMinPieceSize ,
70- .max_piece_size = kDefaultMaxPieceSize ,
71- .miner = actor_,
72- .timestamp = timestamp,
73- .expiry = expiry,
74- .seq_no = 0 };
75- OUTCOME_TRY (signed_ask, signAsk (default_ask, *chain_head));
76- return std::move (signed_ask);
96+ outcome::result<boost::optional<SignedStorageAsk>>
97+ StoredAsk::tryLoadSignedAsk () {
98+ if (not datastore_->contains (kBestAskKey )) {
99+ return boost::none;
100+ }
101+ OUTCOME_TRY (ask, loadSignedAsk ());
102+ return std::move (ask);
77103 }
78104
79105 outcome::result<void > StoredAsk::saveSignedAsk (const SignedStorageAsk &ask) {
0 commit comments