@@ -26,6 +26,108 @@ async function asyncForEach(array, callback) {
2626 }
2727}
2828
29+ async function getAssetsFromChainRegistry ( localChainName , asset_datas ) {
30+
31+ //get network_type (mainnet vs testnet)
32+ const localNetworkType = chain_reg . getFileProperty ( localChainName , "chain" , "network_type" ) ;
33+ if ( localNetworkType !== "mainnet" && localNetworkType !== "testnet" && localNetworkType !== "devnet" ) return ;
34+
35+ //try each chain of that network_type
36+ let chains = chain_reg . getChains ( ) || [ ] ;
37+
38+ await asyncForEach ( chains , async ( chainName ) => {
39+
40+ if ( chainName === localChainName ) return ; //we'll check assets under this chain separately
41+
42+ const networkType = chain_reg . getFileProperty ( chainName , "chain" , "network_type" ) ;
43+ if ( networkType !== localNetworkType ) return ; // must match the local chain's network type
44+
45+ const chainType = chain_reg . getFileProperty ( chainName , "chain" , "chain_type" ) ;
46+ if ( chainType !== "cosmos" ) return ; // must be a cosmos chain
47+
48+ // Checkpoint: the chain now qualifies, but we still need to check that there exists an ibc connection
49+
50+ //get IBC channels
51+ const channels = chain_reg . getIBCFileProperty ( chainName , localChainName , "channels" ) || [ ] ;
52+ if ( channels . length <= 0 ) return ;
53+
54+ //find the transfer/transfer channel
55+ const defaultChannel = channels . find ( channel => (
56+ channel . chain_1 . port_id === "transfer" && channel . chain_2 . port_id === "transfer"
57+ ) ) ;
58+
59+ //find the only cw20 channel
60+ const cw20Channels = channels . filter ( channel => (
61+ channel . chain_1 . port_id . startsWith ( "cw20:" ) || channel . chain_2 . port_id . startsWith ( "cw20:" )
62+ ) ) ;
63+ let cw20Channel ;
64+ if ( cw20Channels . length === 1 ) cw20Channel = cw20Channels [ 0 ] ;
65+
66+ if ( ! defaultChannel && ! cw20Channel ) return ;
67+ const isChain1 = chainName === [ chainName , localChainName ] . sort ( ) ?. [ 0 ] ? true : false ;
68+
69+ // Checkpoint: now that we know there exists an ibc connection, we can iterate the assets
70+
71+ //get the chain's assets
72+ const assets = chain_reg . getFileProperty ( chainName , "assetlist" , "assets" ) || [ ] ;
73+
74+ //iterate the assets
75+ await asyncForEach ( assets , async ( asset ) => {
76+ //assets.forEach((asset) => {
77+
78+ //get asset type
79+ const typeAsset = asset . type_asset ;
80+ if ( typeAsset !== "sdk.coin" && typeAsset !== "cw20" ) return ;
81+
82+ //set base_denom
83+ const baseDenom = asset . base ;
84+
85+ //--Establish Asset Data--
86+ let asset_data = {
87+ chainName : localChainName , //osmosis vs osmosistestnet vs osmosistestnet4 vs ...
88+ zone_config : { } ,
89+ zone_asset : { } ,
90+ frontend : { } ,
91+ chain_reg : { } ,
92+ asset_detail : { } ,
93+ }
94+
95+ //we should check to make sure it's not already in the zone_assets
96+ let existingAsset = asset_datas . find ( ( asset_data ) => {
97+ asset_data . zone_asset . chain_name === chainName && asset_data . zone_asset . base_denom === baseDenom
98+ } ) ;
99+ // but this doesn't check cases where it's registered directly under osmosis
100+ if ( existingAsset ) return ;
101+
102+ asset_data . zone_asset . chain_name = chainName ;
103+ asset_data . zone_asset . base_denom = baseDenom ;
104+
105+ //source_asset (the most recent ibc transfer source (not necessarily the origin))
106+ assetlist . setSourceAsset ( asset_data ) ;
107+
108+ const channel = typeAsset === "cw20" ? cw20Channel : defaultChannel ;
109+ if ( typeAsset === "cw20" && ! cw20Channel ) return ;
110+ const channel_id = isChain1 ? channel . chain_2 . channel_id : channel . chain_1 . channel_id ;
111+ const path = "transfer" + "/" + channel_id + "/" + baseDenom ;
112+
113+ asset_data . zone_asset . path = path ;
114+
115+ await assetlist . setLocalAsset ( asset_data ) ;
116+
117+ existingAsset = asset_datas . find ( ( existingAssetData ) => (
118+ existingAssetData . local_asset . base_denom === asset_data . local_asset . base_denom
119+ ) ) ;
120+ if ( existingAsset ) return ;
121+
122+ //add to asset_datas array
123+ asset_datas . push ( asset_data ) ;
124+
125+ } ) ;
126+
127+ } ) ;
128+
129+ }
130+
29131const generateAssets = async (
30132 chainName ,
31133 zoneConfig ,
@@ -66,7 +168,7 @@ const generateAssets = async (
66168 //source_asset (the most recent ibc transfer source (not necessarily the origin))
67169 assetlist . setSourceAsset ( asset_data ) ;
68170
69- //make usre it exists
171+ //make sure it exists
70172 if ( ! chain_reg . getAssetProperty ( asset_data . source_asset . chain_name , asset_data . source_asset . base_denom , "base" ) ) {
71173 console . log ( `Asset does not exist! ${ asset_data . source_asset . chain_name } , ${ asset_data . source_asset . base_denom } ` ) ;
72174 return ;
@@ -86,6 +188,9 @@ const generateAssets = async (
86188
87189 } ) ;
88190
191+ //get assets from chain registry
192+ await getAssetsFromChainRegistry ( chainName , asset_datas ) ;
193+
89194 assetlist . setCanonicalAssets ( asset_datas ) ;
90195 assetlist . setIdentityAssets ( asset_datas ) ;
91196
@@ -185,9 +290,9 @@ async function generateAssetlist(chainName) {
185290 chainName ,
186291 zoneConfig ,
187292 zoneAssetlist ,
188- frontend_assets ,
189- chain_reg_assets ,
190- asset_detail_assets
293+ frontend_assets , //saves to generated/frontend/assetlist.json
294+ chain_reg_assets , //saves to generated/chain_registry/assetlist.json
295+ asset_detail_assets //saves to generated/asset_detail/assetlist.json
191296 ) ;
192297
193298 let frontend_assetlist = {
0 commit comments