From f2ab316fb1c01aa92d537c3d3d601227cde6e1cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 30 Mar 2021 21:28:54 +0200 Subject: [PATCH 1/3] Local retrieval support --- api/api_full.go | 6 +- cli/client.go | 133 ++++++++++++++++-------------- node/impl/client/client.go | 163 ++++++++++++++++++++++--------------- 3 files changed, 175 insertions(+), 127 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index b66b0e402a6..774dd7df1fd 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -880,7 +880,7 @@ func (o *QueryOffer) Order(client address.Address) RetrievalOrder { Client: client, Miner: o.Miner, - MinerPeer: o.MinerPeer, + MinerPeer: &o.MinerPeer, } } @@ -899,6 +899,8 @@ type RetrievalOrder struct { Root cid.Cid Piece *cid.Cid Size uint64 + + LocalStore *multistore.StoreID // if specified, get data from local store // TODO: support offset Total types.BigInt UnsealPrice types.BigInt @@ -906,7 +908,7 @@ type RetrievalOrder struct { PaymentIntervalIncrease uint64 Client address.Address Miner address.Address - MinerPeer retrievalmarket.RetrievalPeer + MinerPeer *retrievalmarket.RetrievalPeer } type InvocResult struct { diff --git a/cli/client.go b/cli/client.go index 8dfe2e7be2f..0550690c6c5 100644 --- a/cli/client.go +++ b/cli/client.go @@ -999,7 +999,7 @@ var clientFindCmd = &cli.Command{ }, } -const DefaultMaxRetrievePrice = 1 +const DefaultMaxRetrievePrice = "0.01" var clientRetrieveCmd = &cli.Command{ Name: "retrieve", @@ -1020,12 +1020,15 @@ var clientRetrieveCmd = &cli.Command{ }, &cli.StringFlag{ Name: "maxPrice", - Usage: fmt.Sprintf("maximum price the client is willing to consider (default: %d FIL)", DefaultMaxRetrievePrice), + Usage: fmt.Sprintf("maximum price the client is willing to consider (default: %s FIL)", DefaultMaxRetrievePrice), }, &cli.StringFlag{ Name: "pieceCid", Usage: "require data to be retrieved from a specific Piece CID", }, + &cli.BoolFlag{ + Name: "allow-local", + }, }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { @@ -1055,18 +1058,6 @@ var clientRetrieveCmd = &cli.Command{ return err } - // Check if we already have this data locally - - /*has, err := api.ClientHasLocal(ctx, file) - if err != nil { - return err - } - - if has { - fmt.Println("Success: Already in local storage") - return nil - }*/ // TODO: fix - var pieceCid *cid.Cid if cctx.String("pieceCid") != "" { parsed, err := cid.Parse(cctx.String("pieceCid")) @@ -1076,69 +1067,93 @@ var clientRetrieveCmd = &cli.Command{ pieceCid = &parsed } - var offer api.QueryOffer - minerStrAddr := cctx.String("miner") - if minerStrAddr == "" { // Local discovery - offers, err := fapi.ClientFindData(ctx, file, pieceCid) + var order *lapi.RetrievalOrder + if cctx.Bool("allow-local") { + imports, err := fapi.ClientListImports(ctx) + if err != nil { + return err + } - var cleaned []api.QueryOffer - // filter out offers that errored - for _, o := range offers { - if o.Err == "" { - cleaned = append(cleaned, o) + for _, i := range imports { + if i.Root != nil && i.Root.Equals(file) { + order = &lapi.RetrievalOrder{ + Root: file, + LocalStore: &i.Key, + + Total: big.Zero(), + UnsealPrice: big.Zero(), + } + break } } + } - offers = cleaned + if order == nil { + var offer api.QueryOffer + minerStrAddr := cctx.String("miner") + if minerStrAddr == "" { // Local discovery + offers, err := fapi.ClientFindData(ctx, file, pieceCid) - // sort by price low to high - sort.Slice(offers, func(i, j int) bool { - return offers[i].MinPrice.LessThan(offers[j].MinPrice) - }) - if err != nil { - return err - } + var cleaned []api.QueryOffer + // filter out offers that errored + for _, o := range offers { + if o.Err == "" { + cleaned = append(cleaned, o) + } + } - // TODO: parse offer strings from `client find`, make this smarter - if len(offers) < 1 { - fmt.Println("Failed to find file") - return nil - } - offer = offers[0] - } else { // Directed retrieval - minerAddr, err := address.NewFromString(minerStrAddr) - if err != nil { - return err + offers = cleaned + + // sort by price low to high + sort.Slice(offers, func(i, j int) bool { + return offers[i].MinPrice.LessThan(offers[j].MinPrice) + }) + if err != nil { + return err + } + + // TODO: parse offer strings from `client find`, make this smarter + if len(offers) < 1 { + fmt.Println("Failed to find file") + return nil + } + offer = offers[0] + } else { // Directed retrieval + minerAddr, err := address.NewFromString(minerStrAddr) + if err != nil { + return err + } + offer, err = fapi.ClientMinerQueryOffer(ctx, minerAddr, file, pieceCid) + if err != nil { + return err + } } - offer, err = fapi.ClientMinerQueryOffer(ctx, minerAddr, file, pieceCid) - if err != nil { - return err + if offer.Err != "" { + return fmt.Errorf("The received offer errored: %s", offer.Err) } - } - if offer.Err != "" { - return fmt.Errorf("The received offer errored: %s", offer.Err) - } - maxPrice := types.FromFil(DefaultMaxRetrievePrice) + maxPrice := types.MustParseFIL(DefaultMaxRetrievePrice) - if cctx.String("maxPrice") != "" { - maxPriceFil, err := types.ParseFIL(cctx.String("maxPrice")) - if err != nil { - return xerrors.Errorf("parsing maxPrice: %w", err) + if cctx.String("maxPrice") != "" { + maxPrice, err = types.ParseFIL(cctx.String("maxPrice")) + if err != nil { + return xerrors.Errorf("parsing maxPrice: %w", err) + } } - maxPrice = types.BigInt(maxPriceFil) - } + if offer.MinPrice.GreaterThan(big.Int(maxPrice)) { + return xerrors.Errorf("failed to find offer satisfying maxPrice: %s", maxPrice) + } - if offer.MinPrice.GreaterThan(maxPrice) { - return xerrors.Errorf("failed to find offer satisfying maxPrice: %s", maxPrice) + o := offer.Order(payer) + order = &o } - ref := &lapi.FileRef{ Path: cctx.Args().Get(1), IsCAR: cctx.Bool("car"), } - updates, err := fapi.ClientRetrieveWithEvents(ctx, offer.Order(payer), ref) + + updates, err := fapi.ClientRetrieveWithEvents(ctx, *order, ref) if err != nil { return xerrors.Errorf("error setting up retrieval: %w", err) } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index ac526ac6030..ffc1696673d 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -57,6 +57,7 @@ import ( "github.com/filecoin-project/lotus/node/impl/paych" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/importmgr" + "github.com/filecoin-project/lotus/node/repo/retrievalstoremgr" ) var DefaultHashFunction = uint64(mh.BLAKE2B_MIN + 31) @@ -77,6 +78,7 @@ type API struct { Chain *store.ChainStore Imports dtypes.ClientImportMgr + Mds dtypes.ClientMultiDstore CombinedBstore dtypes.ClientBlockstore // TODO: try to remove RetrievalStoreMgr dtypes.ClientRetrievalStoreManager @@ -555,86 +557,102 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref } } - if order.MinerPeer.ID == "" { - mi, err := a.StateMinerInfo(ctx, order.Miner, types.EmptyTSK) - if err != nil { - finish(err) - return - } + var store retrievalstoremgr.RetrievalStore - order.MinerPeer = retrievalmarket.RetrievalPeer{ - ID: *mi.PeerId, - Address: order.Miner, - } - } + if order.LocalStore == nil { + if order.MinerPeer == nil || order.MinerPeer.ID == "" { + mi, err := a.StateMinerInfo(ctx, order.Miner, types.EmptyTSK) + if err != nil { + finish(err) + return + } - if order.Size == 0 { - finish(xerrors.Errorf("cannot make retrieval deal for zero bytes")) - return - } + order.MinerPeer = &retrievalmarket.RetrievalPeer{ + ID: *mi.PeerId, + Address: order.Miner, + } + } - /*id, st, err := a.imgr().NewStore() - if err != nil { - return err - } - if err := a.imgr().AddLabel(id, "source", "retrieval"); err != nil { - return err - }*/ + if order.Size == 0 { + finish(xerrors.Errorf("cannot make retrieval deal for zero bytes")) + return + } - ppb := types.BigDiv(order.Total, types.NewInt(order.Size)) + /*id, st, err := a.imgr().NewStore() + if err != nil { + return err + } + if err := a.imgr().AddLabel(id, "source", "retrieval"); err != nil { + return err + }*/ - params, err := rm.NewParamsV1(ppb, order.PaymentInterval, order.PaymentIntervalIncrease, shared.AllSelector(), order.Piece, order.UnsealPrice) - if err != nil { - finish(xerrors.Errorf("Error in retrieval params: %s", err)) - return - } + ppb := types.BigDiv(order.Total, types.NewInt(order.Size)) - store, err := a.RetrievalStoreMgr.NewStore() - if err != nil { - finish(xerrors.Errorf("Error setting up new store: %w", err)) - return - } + params, err := rm.NewParamsV1(ppb, order.PaymentInterval, order.PaymentIntervalIncrease, shared.AllSelector(), order.Piece, order.UnsealPrice) + if err != nil { + finish(xerrors.Errorf("Error in retrieval params: %s", err)) + return + } - defer func() { - _ = a.RetrievalStoreMgr.ReleaseStore(store) - }() + store, err := a.RetrievalStoreMgr.NewStore() + if err != nil { + finish(xerrors.Errorf("Error setting up new store: %w", err)) + return + } - // Subscribe to events before retrieving to avoid losing events. - subscribeEvents := make(chan retrievalSubscribeEvent, 1) - subscribeCtx, cancel := context.WithCancel(ctx) - defer cancel() - unsubscribe := a.Retrieval.SubscribeToEvents(func(event rm.ClientEvent, state rm.ClientDealState) { - // We'll check the deal IDs inside readSubscribeEvents. - if state.PayloadCID.Equals(order.Root) { - select { - case <-subscribeCtx.Done(): - case subscribeEvents <- retrievalSubscribeEvent{event, state}: + defer func() { + _ = a.RetrievalStoreMgr.ReleaseStore(store) + }() + + // Subscribe to events before retrieving to avoid losing events. + subscribeEvents := make(chan retrievalSubscribeEvent, 1) + subscribeCtx, cancel := context.WithCancel(ctx) + defer cancel() + unsubscribe := a.Retrieval.SubscribeToEvents(func(event rm.ClientEvent, state rm.ClientDealState) { + // We'll check the deal IDs inside readSubscribeEvents. + if state.PayloadCID.Equals(order.Root) { + select { + case <-subscribeCtx.Done(): + case subscribeEvents <- retrievalSubscribeEvent{event, state}: + } } + }) + + dealID, err := a.Retrieval.Retrieve( + ctx, + order.Root, + params, + order.Total, + *order.MinerPeer, + order.Client, + order.Miner, + store.StoreID()) + + if err != nil { + unsubscribe() + finish(xerrors.Errorf("Retrieve failed: %w", err)) + return } - }) - dealID, err := a.Retrieval.Retrieve( - ctx, - order.Root, - params, - order.Total, - order.MinerPeer, - order.Client, - order.Miner, - store.StoreID()) + err = readSubscribeEvents(ctx, dealID, subscribeEvents, events) - if err != nil { unsubscribe() - finish(xerrors.Errorf("Retrieve failed: %w", err)) - return - } - - err = readSubscribeEvents(ctx, dealID, subscribeEvents, events) + if err != nil { + finish(xerrors.Errorf("Retrieve: %w", err)) + return + } + } else { + // local retrieval + st, err := ((*multistore.MultiStore)(a.Mds)).Get(*order.LocalStore) + if err != nil { + finish(xerrors.Errorf("Retrieve: %w", err)) + return + } - unsubscribe() - if err != nil { - finish(xerrors.Errorf("Retrieve: %w", err)) - return + store = &multiStoreRetrievalStore{ + storeID: *order.LocalStore, + store: st, + } } // If ref is nil, it only fetches the data into the configured blockstore. @@ -674,6 +692,19 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref return } +type multiStoreRetrievalStore struct { + storeID multistore.StoreID + store *multistore.Store +} + +func (mrs *multiStoreRetrievalStore) StoreID() *multistore.StoreID { + return &mrs.storeID +} + +func (mrs *multiStoreRetrievalStore) DAGService() ipld.DAGService { + return mrs.store.DAG +} + func (a *API) ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) { mi, err := a.StateMinerInfo(ctx, miner, types.EmptyTSK) if err != nil { From dfe8a1c1e25b6246cb212b7b3f9560f734f4013e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Mar 2021 19:38:02 +0200 Subject: [PATCH 2/3] client: Set the client var in the correct scope --- node/impl/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/client/client.go b/node/impl/client/client.go index ffc1696673d..28496cd159e 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -594,7 +594,7 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref return } - store, err := a.RetrievalStoreMgr.NewStore() + store, err = a.RetrievalStoreMgr.NewStore() if err != nil { finish(xerrors.Errorf("Error setting up new store: %w", err)) return From 823c6600e3b73b01b109d24b1c3208341d439456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Mar 2021 19:38:34 +0200 Subject: [PATCH 3/3] docsgen --- build/openrpc/full.json.gz | Bin 22595 -> 22613 bytes documentation/en/api-methods.md | 2 ++ 2 files changed, 2 insertions(+) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1e145564473343db9948a23339e79cd6467c4c4a..e34c8fcea4d8c06cfcabbd9c6196b6cf51acc578 100644 GIT binary patch delta 16933 zcmYhCQ;;S+xUJi^ZQHhO+qV6+ZQHhO+qR8qPj^pGpZRN_UFX~+sme{NlDw7mWUY}# z;I&5JMhOf6^+Tr=)-w0z)}4m~b;Lf*YqpIvO!Qnu(N!$OftrN0;x(v@lEzQh(5Iq5 zQVzq?f>O?Uc$VM&yLvwDQ>C14{?Ss$klqXeW@y+5v4@%2PGYD1UM8Fl$4iq{sQh)0 zZmqA@rc4#z7}pEmDaB?uu*|WMZa+!Ppz?lze{n5flu0P?aj^^3AyUkiYYh`CdY)s0 zaD-rK6}gU`>a|oXLFeEg{zem@a|-8JWy6KH4~#J&ZZBI-PV&kCBd@uW?pK*&!%IqH z&`%iwNd2~u+FMXKpHes-0K|B_AL>&T@u6(TeZH6^$9OB#IH~4^`IT={87YRCM@f9J z4YUKmQIIPJF*X|LD(01dxm0{E>gd~1|>-e`IpSkd6`qlR%_=#Eb5*u zD!T%jK!#~$Da=?H==L``zA6KZp#IV~q=qzMzFSxrxMV4MSXcn+Ltohyrw_Wql$Qs@ zR4$#2zuE+N;L!`jJ)@|z=F3&ClP^3Ij18b{Lq}x6yU8|FQms00+?RhMymo%>@Z<2G z1WjKa0N*t$cc~JU_;7xhapgk<`<_&ytOEHhOE+IVzCRDdTY2z#fPK00o)hT4la?S~ z0OZ5F_K6(ex(1K~QoichQCWSl0ESjh+1iwDu+S$h=+iXkwr_(!;7Kt#<`M(X6g2cF zm1`CKMU9R`)Unh~bM$vBxPbas19+`@_^&TvwM9f+uU~sGaDT*Qz2jYQlG4!kDy}e~ z0tY6>`G~%JJqHrrL{Ny{3l1XQ%>XYOH+}q`3HJ|=15<$dftc^FFJ~tAan;q2$GfFf zPwRXY=A=hi(A4H{A1fX76m@0@|;Fkp4#D+&{lCVN_KuthqdBBn8=jXG0 zAhwF2!*u{|#fHWQ^DR9w&GeJ&?zGRsbMuag(qbZ?o&laTVGB9ywxG-L(C?dVY9JBPmdzFEW$gxz%vJrhGV{hzG=o3DoYu_#kq4jA&@kMj(I5 zK&{J=5P!fXE9Nun5b$d4S6?gK#p^UQbTyAtW4i!SO7ybLPiG}h#U1FFQz~qlvP>6^ zT{oK6wD4wfS5-xXFG$Y50xmRcn;+ZbaMY}g51fuMV8q6e6U*glZl|H1zj6(RzF14+^+w?F*ZkZxU29kkr{gFU=jfX{M)y&^UP<0; z<1YcUy~FipMCqa%{J{ihv7_LJ=!#dp3raVNxN$CT%IW`>!BGybIdSPIJs5k%=gi9upCDX~XS1w985V1~9NMSW<7~|TA z{;txUY9YeQ-M$*9CS}|g2yZBs)%$DPrYMR+YS=`ZygOOmYR_tF4d9?pWa5(FvGC`Q z8IzQjIsTYygVsjy3Tf`0iugw`F+R>4?E=HnsDi5ZQ*k3|Ptuw(@$PQZW&U~w9sYoF zN}oJQ+c5&#H@o)DmKJ^EAdS=;*mG0Pz?O73-s-=s)*d!+=;dl4s*9 zYP>Kd_OBYY{5rCO^uPyhAO_}6gJ9sF%PocabJAY*LEC}s&7<_$zX?vM9wCzx8aAzn zs~FzY>$-K!@v>(-<@Z3In)K?8iRJ;z(;nB=x95BF^d9$WX0Z#LmK(rjBP_O!u{^~F z0S|sdrKvXM3e$n~4TvJGL1ieHgJW0C|37Ng3gIEb5}k*)9>Xw1#!=%@nEUa6IK1UTm$ z)XfDRWYjBxLsKZ?3Fmli{Q5B+gEAqy=1qEOx_Z}r(9u2#h4b$E$)uBLZC;beA)OA0 z1`5!KPQe=eM#-S0RjNsUKfnP;OPRI>J@20p5Zu+Fazg#bTA|Ixb3l%XA&m_RH#XUd zuIFp5UT#~wcyS+>w>0UvY9Z1xtqtDsGAdBMSTE}G+}22(>FN9 zuhh^YyfzkLMC2A`n4K&Vi8+O56(|;pw!7*Krp|C=vlzHec~HaSEC=|K0(MBRZj~Vl zS+K0yB<#WG+KwBGeaX$OdKX*tmv2026@TII);w>bH6c>m2OvlM1Y!!6Ep7KQErZ<= z5ut=nCKgh&iPp_?UtWL&aPr@}P!}diJRufHggm)Z3r&LhOkngAj~nl8FILz$BW3*3 zKX#;$e{XdY$3irnYd8$YH+?+hEmh81_O3hxhy+T8^gopmxpN_+RKg)VsgP#URZyx} zXfA*D|L)&-4m|Yj`95p>Qel%9W646+nUVZ@%??osTdazZ^g09-vEo!N*ry2^kBE&X zOIJ;@BQd(G!sYFu&pjicy$z;hUcQub48=VPTX&TBuux|+%b<@X?U0n|vnh%HXtu$s znhjZy5A1GjRdq`rsb1p?-^VtHayTHou&mV>?Qb}4!!3@G2J6wQ^@1_>2e7(t%)G0* zdQ+>S!HpUYB5nb+U=ZZufl5W<#lmLu6V^e zRgZ&@;qHPQ<*H@ozeF%+yGi?l?z6x(r_*m5@A=xUZB)ZS)xl$}$93FkVYzRMk?fPN z(jO}<@VKz&gL7id+n)Hi$r7g02xAC!=WV!c#i?@IPk#ZjB3NiGXV8syOk8BSIYM2u zo2s)?+;(0c*BG%*5Co5*vmFmM+n}%DD_zsWK%_aC0h6YU1(N<11Qj4T z4waB&#Wx2CrRrlxpdA>wX^oCc-Q`U-+k%p@?^mlUXqo6QAPbh8MaE#-#JGwFee|(1VEF0aft^hm=OyKui91CRM}knW=&Y1v&w%%V&I&)8rpzd z$yn5x4R(<;J!wwXF1o@?_qAwVU^>NjiX7NSCDhszEU~f4sAfC*0prHWRAZHc?YRn_ zK2QPpsGpNajWS`eNEl$+KTkt4y|B00&i0@woEY|mAfbd5C^xr23b0fNb2uE0hPi_8 zuSeJ0o+0T=dW^jZhF|3?+Rq_d<~zOW7L9sbt7tXxXNp^1Q6NT28^9~nFk_2Ef<4i> zBAp(t5z<~i+cYq03|g+)YYcpO~-@> zyOxQ=G?GYiAo72D;dIimbu6s1ir~9!MC<>OMXFeO>ueKl4x(@FB6s$w9jt3c4zmH= zOe}#w#R86^h8q+=Ph%=mTgQ1tW#um_)0JyY8m&Nq{}qXp_>gvt;`i@U3GBmtQ*s~3xcUsFS1%eJUvJi z-_WlNak&~T{WmrSZTDE@XV~ahTIB#MEb=v#ZPDB6ML8Sp`3d}|QTSUh>y_Q%_v$Kw zyf0Lzj&B*RZP7jKixbt&O)cnP1Qsk+zK_|!@IVytn9+4GOi2VO%TX?e$`|uKru>bZ z8g=E;54a^$+gp3vwl_4^`onac&4<@jAvJSu(7yT?lzY1OpK1-~pK9al*?Isnmad-+ z2ah0zfBTPhOxN{L!6*x?0Gm;*b@@f0A=Px{PlGyA(#K}bD9`^=M(r!eM(pHR?Pq{Z zfZu&z^Z@C$J)B3T>c2&HyEI1+7&v{sNw#!+v9~rAcL?ab+WamyTuQL&2+p*qru~Vl zN^SfGl4pj`;)FcDR3+{p>;}|_)(9W_xeNhEcuFN562J2Cpt>X%=Ry_|IygRXtLRvI zq4_uXMR$MJb?amFp)RLe$s&TwZBps-5y+Q1_j4_Qf0C(^P(8#KW-V(&Ze6r6ADfoe z_gA^ngrnf2>WBT`w<5~1VIYxcy^W=-W1GDa#n)?}dq!-xmnOg|@8b7s3eH^)JIt+7 zT8jqv4%UlWRz5nRVECx8IGa_Zx7r$g)GO0C)9ivn0 z&?IOE6a*6%oDR*4N9pjLhPTedZzH;(bqu8Yv)QQdx7`3fh}3vW1W?==0d zW+Hkz&8MxGQJ%$*I*FSE9DT9?r0XE46qeg)FO;zxdM@)l<3>9jnzQ0qChKbfHKi|% z$N}o1ReGM5M>CAaQ~UgJ?d8oKzc=Des4fj#6VACxRX9LhfmYJXO}LYd7Zdh7zx4~l z@0%m@nF2F*TA*^8gPsSqkIu}ryQ+M*HV45TiN*N^A~nHPPl^!UnZ_hb{ukP4SSmRw zHI;RfqMG934oF88SEXAeBt+S;wv<^jMg%V3CE_Kj8zTPwoVnxGQDm}T z>{Q+#SO|cXZ5v!?p*aLa`!f*t<^*+enm>P-0hMFm6eITdlO5S5N9)Ut^%)x1;xmad z{||K6u#-*)jm?;PT6c=tDI?CT9*#em?H>RbD%MeyN^ zg{p2R_cq3dcBBLGrwoygdMb0cq%4;t+k31Q&=kP+SI;ggo5RVw#;=}rYm(r-wZxur z*J2!N!QS*s;UcRv*KqM-j3|LLZU&Mi_fZeUJ^L5x+Z_^;w#|8yo{E?|8$ZJYP%v*^ z)BI|kusajDcG&&^+E*v+!@3jZ(bLt6`AxjtGFbLe_ocub!&hbXAkv?xjv647f3+$S zcNoyI2~PefqwGZkIh<;t__=dQnof&^lEC9R2oLHFU=k6zCa1_Wy$k|=0i$DesaHSH z9CRd|{HKB}*R*b^oq|ZtY3xoRp?Djcb=TXN=v?0j?65uBJ=;AAMg`YNTGmKg+Okw* zeCh7B!SB5_PcD7qe;=WlAR_R&mHsxPMFOZTE1=qAGMosL=08(rhF z$tT_Csk1EqbOF1&;Y1(!$3yIk(>ciOx7-R~sddzs7g7as$E9dKP5h9gn=V6fe67fyK5eu%t=1DK}MiQ8U;w$MSG7f;KoP9xMjG+LH&H>tnOnCBJZ zREOcS7pYZ{*>!>Q+(2)Tg8+1#B+po8SJBYL$b5QqD`-A40&BvGX5+JNd@N2++M%S3$ipNxfZpl~-cjqUd$O8- z;w@Pahi%^7s0mh#F@P@Idm3xJ7$gQpBN)ae_Xvztcf5>5{f8J1UN$6%!&*`06(t5V zNB96U2f#Ux+l)}9NSARy#4s>l;t#UB_ar;Rs5#6?yNlRxw2MvXLx2uC5L(JTLDy+G_wr^?HFzhdG4;Z8>9MzW6TYpM5+h!7^ ze6qQH#6k(~wZpZrq&%qO=Qr71Yti|gzg+CAaY{Cu$iRj2o&Ks#3?% zD}@A5Ucm+10xVeT=*p|F=v;l+Xmj$m!8WQLL3r38XTKd>KY487FapwiQLX&KFvX#Z z__AZ>JY+S6Z%W$J7b$DA5lh3>0DTUs-oq;>&Ge8hc(X1{GeaKlw6{meqlBspsD|6o z=2z3_E>T7MJR6;90<|a$G>qWeFAYi4KYmZn=@^bI+#}B6{eZF zkXAK?p$TD88NeAiFss*c3>T3x)IGwBc^wox&amn)x*<^+hvGptIm)MQh=}n!bT1!K zixq6U0QsP}THYLO$LL?(^Mh_t+Oj~DHt9-0*ae+)T^o1w{_8U%Lk!z$iZsYm*$*8& z=I@YfJ>jmv**kaLrGJ~3M>ZTmM6BZ!7bF$PL@wXr#3N@DF=SCR*tA-fFvLTK*S&s6 zF0yFYy8`+7EP!@4>eMqvtQ2}{QYMb9Hx2#%ZcrC&O9`Ghl8yLy7( z;b{-on~rsopJcWe#Y3mf2ke5_lfO;qc~sL=Cz8Qa4CF(q8_uC5&gnPooh$PvKGFyR z!jG;(kZt-x&%gZ&c@WHV7N#cl6Q)*tLnTf7kCEMY`A@+j4I!Zv524x&MhFOyD}f|S z0NVOCC%e;-cjq5VmtJ$*I`FE%2Ln~C;5Gt#FgrEfh^A1nJMA7qwvc+N=9}FGUp%}< z38Dn;Zb};NxI7dUHrdF5m8h~n%OVnI(`jf-C@fS*z-v}q$ZQHufocwAA>~aYtn?fZ zebNI991y>Acw!RMvk~^rtwUU1b1qK;0I%YE^w?iRYw}iQyGHZM#O~fBbRuI(S^C<0 zY9LBA*|fSb7C2#lj28x-^2CWk&R$!3^;F^Lb5Ro8R&!oZqDpy_taNJ$V)DOwng+@L z#)|o0ZD=R%zg&_it9gf5gi?~P-mbgtCXQ?Gg{<*w?Txgo^4G3AJfaSFZtU9`0&FR1 z9iBtz6Bqyu&kT!B$6m3yJ^2Zdu#om?qGj@RIIiO#<`Ahq@=6xQS{P0`gVw+m;JN=Z zxHtixZ<{hJUE%u^yNh@ek9G40bj9nM^+iTbEpDmU&O*ENw@Q$(DIJ!(4P%$?AIryr zF#yJo_MdmMM?>uP4+!2&6ZRbdfbG8L*6GmR!=b<%KXWl%!RRQpsJtqO*8V)+_ zkeS_rH(4>I5IrKo>6&gG>m}c@G1cj9I_oytHz^i%xP+a@bwMS5jCgXtTz1vjAC2l| zgawq9*zVjw1E?@+g=^@rr-8C`7-uW+XZMkgBDH@OGd<#dc6@= zdiO5reV@NA>fXL5Rsy#9P^_CCd?f4jybE>Iu4KQR4visqi@XJ}ub>o>fiWqaK~^rZ zbl5s{Buey`l5Wp)uz&m7&4M-$c)ovGF_Hnh{CxO(DZWVp`u2BR-!K0X{N&tz_G}Ie z5JIY2@`>jW9uUa$T7{IRqaI1=m@mjdEsNH`LgdYQRjt61v` zjSUB+Z9D9yVgt{Bx=w++{_dPHJ}kgE$@U0C%KsoiIL&zAde7PXX7z>3Br zqS+Ky151fekoD=H8?gdQ>)F(_CH;sWm>A45naM~;+doSclhcbHe6=p-6SB|L{;Glf z#)R<0f;x(blF>c%i2Wp^iO!mJF4l1dCU4++HMHibhgBV;{_>{+Yt_triL&vvHDBfL zQ7K2zm%&hjnY9z>^lR@-Eq`Wx5h+E_yGYbOhCa^=@qC)V7MWO7G%$d)3LcRz#gJdE z+4wA(ercJ&q|6iXTT2m>q64t6XSK`zN&mdZP=EcCg*5pR%5gWPcd{jwfmvs&>#md2 z>uU4EUXNk_CaGMi{kz$1unkR?`rT{}gNfKn)6Ok+kHpy;xA!ADPRw*6Fn-#x&-s)j zZ{IXPPJfkq^WMXO?2DdoklU;vQ|rnz+6!Nm0ynaAb$XrnUP@sB*$i+AS47Ir@OXNH z23`?+0*&@X`6?nZZ!1 zoeQ0d`5e-SW}ttE8yd87{v+q^w_sb)IFqRmJS4(PFO`Q+3k0r6NGUvOdnM#k-{fO7 z?>QwL34hw1TnZss5d*+_8#@agVNdhDQcFB2#CO%2SC5!34dI=ROnP$W&y1{{1%REo znq|cMsQe6$`DE2ixV)S+HyeIwa=G@i6>5*NAHd9MQ=A`-opJO;b8oJ~WfD?H z(SHky>XCsoG+abelNoFPUrqs9qJx)XRi2$6jD^cF6ObR~5(nssQ#M@5Hs5Tv#zmgA z%Wvl&FQIQM-+DHUY9b$}B^}pUcJPYk%!zb77q98Ni;mHdnPYgpuXlU4v&NifYa&Xi zZ&e}FcBfqYsa`+HSst8{n6*ReGLVl&zoNnRWg;X6T07awWGStMmeVC41bW04nU)*0 zRNLV;!*=p>9tM1#zMV`>fG*;$EV`lLZ+l`ZfE6Qm0A>`Y@^h%!*! zx`+Eaes62BEX{HB?<9gkTV#@D=UcR;J53#^r7Ag_%K@Af@VJT~xhYBvF24+9F*ik6 z)vby~Z`=br9Io(5uFqq!#i*|8KP^1G(_(*UyCV=F6;vRY)FTmu*^Ggnf^#-C3U*=S z3cry>giDFD7RITBn!bdExZNuunK04%X|3rj0#O_pE;%FHqcfQ>6i!DQ=Ea9_gmAs; zE#6J4SOJD_eQ{le!tNf|eD?`gqlmg^fMC1BT#y_k|03K{C*~w?1v)^o2l$!OnOo z;YxqfNijfUk==j^WLU7*P~^q!Df10={w&YybrGCqs0s$;xFFx40vQBhhEA`aLYhEe zN%lXP;uaFaBV{VAc1&k&{59Qvh7*?<&Zwq0XIo_&;E1xShx3t>kI%s5A2)KY%x}3nUVs&G|+ZVx!Ok zm}fn5wX>KB;*u(%q?&sa|}e;0R$vHQSlS2a?F_T{q5h*+KhZRVU~TrYBBS}h-|@y|MjoK zEe2leunQmSZG>TLK)m&zD66Wgh#1iGHX7VHY)CvKW6fonv+6+b%u2V{EEri?-Ay1 zbf>Ngq^1oPe%JC064Eg5*?v|d`!zqhy4?dN2Nh4uE4)XS0Y6d&lr;l}?)wJ$2ja4B z_Re6mwE0Nl{73Iy1~|l9C*jGhFEfi(Ju+h3eYY4XeTf@qpGXrQGcy zjJGK;7t7cws8}LjbRxk)gk(%O{>#!__A8EAt>CsM9BaT!1vE_*Rm@s4$wEn`>~8OF+1vpN|))7&hF4u9t? zr`D+H>3j=7VeOX_iz)5@0AFi3*e0`>dTBj$uurGFCD2<2{(!8kJnT|8$>!23SnI{xnGmC zI>NMNy=4S9cX*}4(gh95(kIQMAo$XIn!O75+!P3~VkRqBNrbv2BjM2>vCYh zGV#qr+J6e0S!ll4T>XP(#eF{oL|@Y!v-l*Is=`ymY&Q5vgt0SU!HO1gY5Q@av}fF* zv@HU-k`G`0a+lC4W9{RzmZo*Pn@|kOzTOhrAxOh$B^|V??&D1XtJty&v_k%KW&Pv1)=ci2K8x)Yu~E?9j3NO@$Lk7dlkMCdvDXtUw#cS&D<-IO{CzgR zf5Sr>tFwy=)|c*LUJdLz#DYG|xn*1&2QkWV?GhB4MU#8VO)iR4Xq_!YE|It#>@!tfQFo;rLehi#&XJI)}f*A$x}VHAiV7J$2Wr1FA*9@ zZSD2~RUA+Xndbkyq#hwBr}W>iF8Q9J$hhD~z1H0>6W`?cm875s)*(+{Jbbmd>%rzm zBNM;8u9U{q=#EfBfOKufOS%2|NG4!AS3+~}M1Jc*q`1!M4{O+oMYk#~kS_2h%wPfykRw)VjVn`SKa=-nGAPLoRDKLoDU2BxQ`Z?9Cvw72!c71JwHmRiszHWQMfgb z_Pt-u))nM}lf_%*i-KhRme_NZWPa$XFCiy%Wk4y)ciUq_H3;WwF%>{5ir7{6D|5Tb zrf!Z$b|l3Ewr4t*$aem~Hm{jXG)LriC@3P`b)Lr7hMS=wAMa=>%s6?eni;F*O>ZqW zdZ!{tZGVwCFgovNn1sIL_?0Jb^WU|`9mED^1Dcf_<+0Yr7>FFJc=s6-8)vkKSb@=b z_pSTqA8V$B>L#GDcLd~H>}Y9(FD+@Ao1VYW@AXj|$K04PWQ-p%PC<1#N9nENDDN#Z z$_`){!pPj6H{%L#Z6MM{=Ng?y=sCGS8z-1wTe8{{n)hNNP-ITc=3{7TEN|;@LJPCc z8(p@&B}n0D#ZMzJ5t^KK=}Kl6LUc(puiT-lLA-`(PnI@VCGH5mB)7u zQ1oP-Oy1GzQGfK{;S};1y=B8fN z%R^^T8I*6$`_O60m{X@EMQD3$VB}51Jjmyw3Cv5aV;{o8-#04?6ly;fak&G(B9v@` z(iGXMeS5)8K>^I|UpAn?G5-nF)Ald~_;*Xt(aNiVLRUjV60k+s8V*zYcnG>7CgXB8sPQGd)3K=@+Bv zE9h&xN8@0s{o(vCjRX?TWd$`z6WVl=(Jc+e*t$;j{|v!nzm#On<>2JPx~jk6*5r0U z+;MVZYSKql>Gu?2^R+Fk&${#ndxdi-7qmTn+W}Tv7fXl*PG+nMQY5mCN{~?hS`2_d zQPWE8HgaQ3$Cg3=k*2Yr0|Y#AMa$un=1!vgmTQXB8HDWNXc>r>Wle`-bgY(h66&gB z`TmRiheBD##*spa(8u7WTV;aPQUBW|%lUvPLLn)Tg+9kipncsF_FKnHZq+<9uX4bw zT>#*{LFZ5l?7HHgqeH3oXQS3O->Z18a$U$6TO>y}b#0>Z_db)hhuYDh?*+ts{5js$ z!4uEXfas;MfS}utO#U>}E1nPibzj6S4C=R(Uw~+zNO?fkW&U>|1U)9iZl<~!h4B{e z#|L#lw_$UU&7&u*evC=k33RgApIC+kU|K-7p5U0*oRnrAHfD~P2e{r^##*FqT<8Bb z=CNy$4bVp02L_kjUUl`}YM&RJL(*C4>8se29PQcMtQe9;wcL~IUO zUPx2&$T08BRt#GsvbaR5h1yki`=2Chyu78a_JDXiw}f+vCPHA+&Bs?(ADKVING&DV z1tr8;ZH-k(S-Zy3WhjQ}07`+oz!c(Z2+ZA*Y5O)3e?!q}_j(;#!(weQJZin?ZsP;$ z<72;eVDYg@Z5LEH9aAI%w#yo4k>s2uRi+MIw2*ejZo!#jC~v`=UWr{`zvENijuxLQ zKf~Wr88%cJThlNs&=mC9 zFEv<#e`m>T{yvh(G>S(6N3M*ccOX6Jn=E;f1=SJ=|KlToUR5+9(YFXbwtBcKw}xo z)_k`f7^5~+3r9s@WeTipzIw1K9$eVS?VJe9We5h9YOitPM^x&OkymXq6!9VzSKQ1Tid zb3O7Yh7C}9VGy%aKJS_yNRMUjy~?=VdddmNdZ)0NrE(0PN0HKR9k#{csnJ>K4SdYR zvHZO<;z%{WN(oT4eW7z`xO-UBZaf`}@z(98zs3QG@JP4f-#Xx%a+0iLn#tthdQ-qv zwcRg9s>L)DCH^#$-C>)+#VcV7jSoXpkOp#R3S-#Pr={8a^Rd)pMT-IV*9lyu#1IF5 za{i-6K~R2a21|D`F&Jw8yv2xnHB@Y+#Q!Mf;6EQu_dgqWCXqlnL#8of_dNuWGAjsH zE-gTj4xYcH-6Ao`u+v5nF>-MlIVyV*Q<7yc7;xp137oLZdm6l`IWj(CCFRU%1h!QJ z^a1QqTu$XpK2d;%DoRMie=rH&07Owto)sQWd?!sI0N+K__DlCaH2K zFlB>{fQW8TF?bM6?67?H`3S7|mh_o$O)cqYqtHPK`bB|2GQvR-`%DB#>UT3D0B1W0 zim;^KUG#X?BSCo!l^FRsLu1)}B6>nvTkpJdeI|4gPq#@$9pE_<;Tz|#{{N;jcg zFqt|+OW&{(BZI;NU6IamrOUNDl%Xh)?&{#{;E}w#jCD}2gPSE7jn>t@S`;+qeOv9L zNyw!j%w!5wU~t|en$@#Hb}*71fFkBPqE2U9-NRs79BjEnSO`}jVY+uwqQpQ@gUS%3 zAcw9t(F9Y;UjH*uNu`!bOlECHcJ6dy--*Pyj%Jb_oAiOYfJzkfaw}zSx>*dSXdq(g z?d!%vblj+Mk}MsZ8AofL&R1*FbghdOJrf?=|8#h=c})JqE)D#=G6wn1I8Y)&^v6i77$H9JrWRonE^J-C ze(&}DyeHnyhtCT-QmpJfhVDOZ4fYL$yno4&jL>p){|}I^7rOH3a3$5&`2dFQy#Uz{zuP5i|VAb)a>9+!(B8DPjkg^-$r%MdU z6hKHgagnN zeoO=~yyXF0j?EVt-_6nMGDsB^h2BonfMKF#Re&`PvH&lNH9wW@e;`^x-^qq3*Mpb9 zeH%e@(ywfUA2teg!Rqf>*-_t5b0mlN4I^tVri0G>FN}@vl%$=s7a0}zOC|&-5wNMLejgi!5(Zr$+P4B@%+bGj~v<~2>|??>ToAq z#(RqMQ(Po`d-m^UM7d3U5ir<@>RJ;RA9fY3awD}EQ`9-N6;&kD5et|Fx>Va;``Aw$ zOFZhK^f^*Tn#8SE1DFH`!jL%>Q`uNe>Dac?y7b zB6150oT_<9Oy}WWsX-)kR74DHZO+_OP6g?=lDtBNI;M^a0msnwBQKaB@2Ge2h)W&r zRg7m;03sAEmM5kz3Cs^M#Jl}lthT$SR>J9nU{+#6Uqo|2DFcqx1(+_9l8Prl8}E6w zqDVSURnrkW)zrR)^hPpOP!O=&z0f7>pW`S@np%<>piR2=HmCJr zZCFeCT>m#G598j#&_%&bbXe%sZG)CZuiazkmB&_) zlrim0&S_TCC5BQu@l_Se>)E4MTa!Kdx{lYs9l8GP#$l&AjZdy(q`aDu0Qs zUp>Gnjw`%Ay{iD%P$T)M9)lci2ZXbm0h%AtD0$Z~T4W^J!s+uZZTWt5BS$Q#4($O2 zg}+FT#sH5J4nUN#u9CGZ$~NCkWLBA50;(_s_1I}rP$PawN1A946yT@tc_vt3<_ryn&H1#5^_0vb4`@TUYGMygbQWhC9W{3*X*>Ay zJFGRgUA~+D zS&H)o2(FY3+=JI#ETD4kw{*9Q1T*pg^NO6-xk=WH1#5=5 z>8`L`&=Bujm|U8o%=qH(NH8?yA=ObnBvI7Z0W*hHwDEb5srS34D%UKIoTmD)um1<% z`!|oY{GgfoBSrRYGu5`PzYFiU9FqE@j8A1S5a5IDaJoySdnY{f1R6vu))WdKj7weE z6Wgh>XE?D3qm6xLTz!+KjJj)DChM?;_0~V#VI4;^*Z2V@c&wz+{J5z(Jsm!Z!OZfX z{w`)k%XE%=a>ml@q^`+Y^6E?!Jsdo}jy3^a+IW$^^$p?=Bxi&^J%bPdCgIDJ)KobR z=fd-%vZ?>~hninjKiXVJ;qcQnqI~>eNN3#mxr5mH%T|Hx#&4Zu*eOJ!_~}o$N}pgx zVM^CH4$w8QM8;gs5!Mj^(M#_X=zf88BTp63 z;Ht3LBd7%&4->!>45MRIF<49ylf9maqqEwoW1?m0^aH}|h|eXb$q}`PWHNkk+YvLH z=w>Q(;&$YQ7k*s`%ks!pv^~`i%cNr~BOov}I0%h9-g69w#DTlODa{D{<$MVh7UJU{_ZAikrQ5kz3+j*eQ z6=)I2y$Z{Ei(~e&!_8D*ys>o{2yRckL!qvY5dOLB&Y}c9-~wD&>`sS z6Zlch(dG&{pgA##MOdk zt&-O@tz)l1RnJ#jvVNwf7%N>IPZiPNd`nL*H6bpG+-568Z>}tbr7K3011v&P21M;L zWD-e@%E)f1B*MxB90AEI6U8s#2eNWOjsz+Iov+{hSbBl@LG>NiVSO`+o0_WKd*?Xw z9jJdW&PBO`hpg-AZRk&qViHW27JaT%&ZOaqPgUD092y~P=5kH$U8g9@)rkL7K#8$d zl=f&I{pMHF z$?Z^gRcI%0>!4oOMQ38k2Cn=!^IPdl=w76dr2_2E!1j#utj4=~$CD93c-c0z6 z6bxVHUn=P|O1UL9k4{(r zx%&vc{eLq_C~yz|7=lJ}!Jfkfn2S~uLx)!|Rs;amaLgfTr#eEid~LysC>r%rTD~#9 zDI978`eE(cYKcL%U$f2*k^8Uyo3ZFywsk8@|FkOb)!Z$Z_j)ScFACJm9VYqX?MeP6 zj@NF##dyjKC~01`w$)2VE2(VaKpd$g0VhS{PguFap+Z!QC6`0!5o^xh|K*pe=?9r@ z9RRN@a$U}J1$0&Rnth=|?6`i=pbjfSJB518MqcN5L_^LAo@6r!+AzwQc-eFic9Qd~ z@K~c3=>MWzdg=yCmX;YMwPFar_-^jDHMrVgMpMZQOt-$oD405VUwYf$Lfk;hu1CXM zJnO@3ig@*rej781EL#+c+d}e~uKu%XQUclq&Ic=EkAf&m+@-@vDyDHWfCYtA**@ z)7#}7_q&?<;Dhs0y>Q)2!bY?LX94~gUrLz9#{eU2a z`GhPI=s<`-C5JqTfZ&zLO~f$hRYc5%>`Q8Ky5hzOT<1Vf+SnPx!VBU6Fn+1rbBJ>} z`w=BB#vxeyroj@}VNCo3Kg=~sPE{7uV1i4_?YG=0M^y2cxY<=xusyE%Td%TRzq{e} zRQ#fsZMDVX-(_(4fcEvU^`G7)VIDP~4$C=wjb6jfAUshOA^~FcsE9vxlI9?3M zy?W|g-FaLo^mGsJ#-x>XUe6kp$i?XIO0b%xZsw*E%CuK!I(nm+YQl%p05vP;KH;() z#~t{O)2naSG^;lnHf)=Y-2E>$D~6d;+ME&MyP-$O>>RTA>DMN!gPLIMX}~R{7YsLu zr<4Jm0)7}d)pLp<)RuasON+EYj@Q=iH5d&+inaY|D=c>XtY>jnjc9k1d0jtxd+gk? zjW0S5oV(2aNITapKU*BIO=W`=XV0b6Kt!zwZ&I4`uV;a64SFSanm5}u5X=6 zL3`DdmG)+t-HGCmVwhkcZh#a-Xb{nPd(!guqljj|bd#iiiJFFmkcG0O2|RaAuLvmo0MxbWw3}*Fe~af{ zgJxg#fXVIAQ(?|0lRd&*G4r9A?p&vgP><%r4KkeaazBAG{nEl@I{n?#aIkw<`q%G_ z*fTU(;3}-&EJ+jx2t`3D5dTtq&2zBE?N0v}44(cQSgoALbTqtyPxG8r`(a=W+q2Gi z^ET;Mx5n0T%PODpB#ZeOaq ze`AyGSPW&eMvtt|+7uUaom@+pt5RbDQ8hsqPoG<$3-)j$ zk>ckLce$r|2Z-$sdY)f@zH&D&37gTMyI+2?|I_N(_X@pg%ez-q{o`?VJ|=u?%kqqO zzP~PZ=axjfuTPGC0Q>;Tdxju z&(#T9^EB(o^>sq!>=G*vgnkHPmc+T`Co4^4Ju{EV@ge$C%CVs`!EET*;Qx4KrYJ9GEn V+vESm85sWmf9%QUD3r&-006>5NxA?4 delta 16864 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 T{rLX^00960?@x)}(rp9)M|4+p diff --git a/documentation/en/api-methods.md b/documentation/en/api-methods.md index b8764d5b1fb..51d64859b21 100644 --- a/documentation/en/api-methods.md +++ b/documentation/en/api-methods.md @@ -1352,6 +1352,7 @@ Inputs: }, "Piece": null, "Size": 42, + "LocalStore": 12, "Total": "0", "UnsealPrice": "0", "PaymentInterval": 42, @@ -1405,6 +1406,7 @@ Inputs: }, "Piece": null, "Size": 42, + "LocalStore": 12, "Total": "0", "UnsealPrice": "0", "PaymentInterval": 42,