make Chain Hub ( zone , agoricNames , vowTools , opts ? ) :  Guarded < {       coerceCosmosAddress ( partialId :  ` ${ string } 1 ${ string } `  |  AccountIdArg ) :  CosmosChainAddress ;       getAsset ( denom :  string , srcChainName :  string ) :  undefined  |  DenomDetail ;       getChainInfo < K > ( chainName :  K ) :  Vow < ActualChainInfo < K > > ;       getChainInfoByChainId ( chainId :  ` ${ string } : ${ string } ` ) :  ChainInfo ;       getChainsAndConnection < C1 ,  C2 > ( primaryName :  C1 , counterName :  C2 ) :  Vow < [ ActualChainInfo < C1 > ,  ActualChainInfo < C2 > ,  IBCConnectionInfo ] > ;       getConnectionInfo ( primary :  string  |  {           chainId :  string ;       } , counter :  string  |  {           chainId :  string ;       } ) :  Vow < IBCConnectionInfo > ;       getDenom ( brand :  Brand ) :  undefined  |  string ;       isEmpty ( ) :  boolean ;       makeTransferRoute ( destination :  ` ${ string } 1 ${ string } `  |  AccountIdArg , denomAmount :  DenomAmount , srcChainName :  string , forwardOpts ?:  {           intermediateRecipient ?:  CosmosChainAddress ;           retries ?:  number ;           timeout ?:               |  ` ${ number } ms `              |  ` ${ number } s `              |  ` ${ number } m `              |  ` ${ number } h `              |  ` ${ number } us `              |  ` ${ number } ns ` ;       } ) :  TransferRoute ;       registerAsset ( denom :  string , detail :  DenomDetail ) :  void ;       registerChain ( name :  string , chainInfo :  ChainInfo ) :  void ;       registerConnection ( primaryChainId :  string , counterpartyChainId :  string , connectionInfo :  IBCConnectionInfo ) :  void ;       resolveAccountId ( partialId :  ` ${ string } 1 ${ string } `  |  ` ${ string } : ${ string } : ${ string } ` ) :  ` ${ string } : ${ string } : ${ string } ` ;       updateAsset ( denom :  string , detail :  DenomDetail ) :  void ;       updateChain ( chainName :  string , chainInfo :  ChainInfo ) :  void ;       updateConnection ( primaryChainId :  string , counterpartyChainId :  string , connectionInfo :  IBCConnectionInfo ) :  void ;  } > Parameters zone : Zone agoricNames : Remote < NameHub > vowTools : VowTools Optionalopts : {       chainInfoValueShape :  Pattern ;  }  = {} Returns Guarded < {       coerceCosmosAddress ( partialId :  ` ${ string } 1 ${ string } `  |  AccountIdArg ) :  CosmosChainAddress ;       getAsset ( denom :  string , srcChainName :  string ) :  undefined  |  DenomDetail ;       getChainInfo < K > ( chainName :  K ) :  Vow < ActualChainInfo < K > > ;       getChainInfoByChainId ( chainId :  ` ${ string } : ${ string } ` ) :  ChainInfo ;       getChainsAndConnection < C1 ,  C2 > ( primaryName :  C1 , counterName :  C2 ) :  Vow < [ ActualChainInfo < C1 > ,  ActualChainInfo < C2 > ,  IBCConnectionInfo ] > ;       getConnectionInfo ( primary :  string  |  {           chainId :  string ;       } , counter :  string  |  {           chainId :  string ;       } ) :  Vow < IBCConnectionInfo > ;       getDenom ( brand :  Brand ) :  undefined  |  string ;       isEmpty ( ) :  boolean ;       makeTransferRoute ( destination :  ` ${ string } 1 ${ string } `  |  AccountIdArg , denomAmount :  DenomAmount , srcChainName :  string , forwardOpts ?:  {           intermediateRecipient ?:  CosmosChainAddress ;           retries ?:  number ;           timeout ?:               |  ` ${ number } ms `              |  ` ${ number } s `              |  ` ${ number } m `              |  ` ${ number } h `              |  ` ${ number } us `              |  ` ${ number } ns ` ;       } ) :  TransferRoute ;       registerAsset ( denom :  string , detail :  DenomDetail ) :  void ;       registerChain ( name :  string , chainInfo :  ChainInfo ) :  void ;       registerConnection ( primaryChainId :  string , counterpartyChainId :  string , connectionInfo :  IBCConnectionInfo ) :  void ;       resolveAccountId ( partialId :  ` ${ string } 1 ${ string } `  |  ` ${ string } : ${ string } : ${ string } ` ) :  ` ${ string } : ${ string } : ${ string } ` ;       updateAsset ( denom :  string , detail :  DenomDetail ) :  void ;       updateChain ( chainName :  string , chainInfo :  ChainInfo ) :  void ;       updateConnection ( primaryChainId :  string , counterpartyChainId :  string , connectionInfo :  IBCConnectionInfo ) :  void ;  } >  
Make a new ChainHub in the zone.
The resulting object is an Exo singleton. It has no precious state. Its only state is a cache of queries to agoricNames and whatever info was provided in registration calls. When you need a newer version you can simply make a hub and repeat the registrations.