1919// or implied. See the License for the specific language governing permissions and limitations under
2020// the License.
2121
22+ use std:: collections:: HashSet ;
2223use std:: convert:: Infallible ;
2324use std:: ops:: ControlFlow ;
2425
26+ use bpstd:: psbt:: PsbtConstructor ;
2527use bpstd:: seals:: TxoSeal ;
28+ use bpstd:: { Network , XpubDerivable } ;
2629use microservices:: { USender , UService } ;
2730use rgb:: { Contracts , Pile , Stockpile } ;
31+ use rgbp:: resolvers:: MultiResolver ;
32+ use rgbp:: { Owner , OwnerProvider , RgbRuntime } ;
2833
2934use super :: Request2Reader ;
35+ use crate :: services:: reader:: RoWallet ;
36+ use crate :: { DbHolder , DbUtxos } ;
3037
3138pub enum Request2Writer {
3239 Consign ( ) ,
3845 Sp : Stockpile ,
3946 Sp :: Pile : Pile < Seal = TxoSeal > ,
4047{
41- contracts : Contracts < Sp > ,
48+ runtime : RgbRuntime < Owner < MultiResolver , DbHolder , XpubDerivable , DbUtxos > , Sp > ,
4249 reader : USender < Request2Reader > ,
4350}
4451
@@ -48,18 +55,48 @@ where
4855 Sp :: Stock : Send ,
4956 Sp :: Pile : Pile < Seal = TxoSeal > + Send ,
5057{
51- pub fn new ( stockpile : Sp , reader : USender < Request2Reader > ) -> Self {
58+ pub fn new ( network : Network , stockpile : Sp , reader : USender < Request2Reader > ) -> Self {
5259 log:: info!( target: Self :: NAME , "Loading contracts from persistence" ) ;
53- let me = Self { contracts : Contracts :: load ( stockpile) , reader } ;
60+ let contracts = Contracts :: load ( stockpile) ;
61+
62+ // TODO: Use real resolver
63+ let resolver = MultiResolver :: new_absent ( ) . unwrap_or_else ( |err| {
64+ log:: error!( target: Self :: NAME , "Unable to connect to the resolver. {err}" ) ;
65+ panic ! ( "Unable to connect to the resolver due to {err}" ) ;
66+ } ) ;
67+
68+ log:: info!( target: Self :: NAME , "Loading wallets from database" ) ;
69+ let holder = DbHolder :: load ( ) . unwrap_or_else ( |err| {
70+ log:: error!( target: Self :: NAME , "Unable to load database. {err}" ) ;
71+ panic ! ( "Unable to load database due to {err}" ) ;
72+ } ) ;
73+ let owner = Owner :: with_components ( network, holder, resolver) ;
74+
75+ let runtime = RgbRuntime :: with_components ( owner, contracts) ;
76+ let mut me = Self { runtime, reader } ;
5477
5578 log:: info!( target: Self :: NAME , "Contracts loaded successfully, sending state to the reader" ) ;
56- for id in me. contracts . contract_ids ( ) {
57- let state = me. contracts . contract_state ( id) ;
79+ for id in me. runtime . contracts . contract_ids ( ) {
80+ let state = me. runtime . contracts . contract_state ( id) ;
5881 log:: debug!( target: Self :: NAME , "Sending contract state for {id}" ) ;
5982 me. reader
6083 . send ( Request2Reader :: UpsertContract ( id, state) )
6184 . unwrap_or_else ( |err| panic ! ( "Failed to send state for contract {id}: {err}" ) ) ;
6285 }
86+
87+ log:: info!( target: Self :: NAME , "Wallets loaded successfully, sending state to the reader" ) ;
88+ let all_wallets = me. runtime . wallet . wallet_ids ( ) . collect :: < HashSet < _ > > ( ) ;
89+ for id in all_wallets {
90+ me. runtime . wallet . switch ( id) ;
91+ let descriptor = me. runtime . wallet . descriptor ( ) . clone ( ) ;
92+ let utxo = me. runtime . wallet . utxos ( ) ;
93+ let wallet = RoWallet { descriptor, utxos : utxo. utxos ( ) } ;
94+ log:: debug!( target: Self :: NAME , "Sending wallet state for {id}" ) ;
95+ me. reader
96+ . send ( Request2Reader :: UpsertWallet ( id, wallet) )
97+ . unwrap_or_else ( |err| panic ! ( "Failed to send state for wallet {id}: {err}" ) ) ;
98+ }
99+
63100 me
64101 }
65102}
0 commit comments