-
Notifications
You must be signed in to change notification settings - Fork 214
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refs: #10445 ## Description IBC Denoms are unique to a chain but not all not all chains. e.g., if `channel-0` points to `osmosis` for two chains, the `uosmo` denom will be `ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518` for both. This change requires callers to specify the `holdingChainName` for the denom they wish to retrieve information about. ### Security Considerations None ### Scaling Considerations None ### Documentation Considerations None ### Testing Considerations Updates existing tests. Motivated from work in #10571 which surfaced this issue. ### Upgrade Considerations Breaking change, but for library code that will be part on NPM or FUSDC release.
- Loading branch information
Showing
24 changed files
with
393 additions
and
123 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
import test from '@endo/ses-ava/prepare-endo.js'; | ||
import type { Denom, DenomDetail } from '@agoric/orchestration'; | ||
import { makeAssetInfo } from '../../tools/asset-info.js'; | ||
|
||
const minChainInfo = { | ||
agoric: { | ||
chainId: 'agoriclocal', | ||
connections: { | ||
gaialocal: { | ||
transferChannel: { | ||
channelId: 'channel-1', | ||
}, | ||
}, | ||
osmosislocal: { | ||
transferChannel: { | ||
channelId: 'channel-0', | ||
}, | ||
}, | ||
}, | ||
}, | ||
cosmoshub: { | ||
chainId: 'gaialocal', | ||
connections: { | ||
agoriclocal: { | ||
transferChannel: { | ||
channelId: 'channel-1', | ||
}, | ||
}, | ||
osmosislocal: { | ||
transferChannel: { | ||
channelId: 'channel-0', | ||
}, | ||
}, | ||
}, | ||
}, | ||
osmosis: { | ||
chainId: 'osmosislocal', | ||
connections: { | ||
agoriclocal: { | ||
transferChannel: { | ||
channelId: 'channel-1', | ||
}, | ||
}, | ||
gaialocal: { | ||
transferChannel: { | ||
channelId: 'channel-0', | ||
}, | ||
}, | ||
}, | ||
}, | ||
}; | ||
|
||
const minTokenMap = { | ||
agoric: ['ubld', 'uist'], | ||
cosmoshub: ['uatom'], | ||
osmosis: ['uosmo'], | ||
}; | ||
|
||
test('makeAssetInfo', async t => { | ||
const byDenom = (assetInfo: [Denom, DenomDetail][]) => | ||
assetInfo.sort(([a], [b]) => a.localeCompare(b) * -1); | ||
|
||
const assetInfo = makeAssetInfo( | ||
/** @ts-expect-error minified mock */ | ||
minChainInfo, | ||
minTokenMap, | ||
); | ||
|
||
t.deepEqual(byDenom([...assetInfo]), [ | ||
[ | ||
'uosmo', | ||
{ | ||
baseDenom: 'uosmo', | ||
baseName: 'osmosis', | ||
chainName: 'osmosis', | ||
}, | ||
], | ||
[ | ||
'uist', | ||
{ | ||
baseDenom: 'uist', | ||
baseName: 'agoric', | ||
chainName: 'agoric', | ||
}, | ||
], | ||
[ | ||
'ubld', | ||
{ | ||
baseDenom: 'ubld', | ||
baseName: 'agoric', | ||
chainName: 'agoric', | ||
}, | ||
], | ||
[ | ||
'uatom', | ||
{ | ||
baseDenom: 'uatom', | ||
baseName: 'cosmoshub', | ||
chainName: 'cosmoshub', | ||
}, | ||
], | ||
[ | ||
'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', | ||
{ | ||
baseDenom: 'uosmo', | ||
baseName: 'osmosis', | ||
chainName: 'agoric', | ||
}, | ||
], | ||
[ | ||
'ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518', | ||
{ | ||
baseDenom: 'uosmo', | ||
baseName: 'osmosis', | ||
chainName: 'cosmoshub', | ||
}, | ||
], | ||
[ | ||
'ibc/E7827844CB818EE9C4DB2C159F1543FF62B26213B44CE8029D5CEFE52F0EE596', | ||
{ | ||
baseDenom: 'ubld', | ||
baseName: 'agoric', | ||
chainName: 'cosmoshub', | ||
}, | ||
], | ||
[ | ||
'ibc/E7827844CB818EE9C4DB2C159F1543FF62B26213B44CE8029D5CEFE52F0EE596', | ||
{ | ||
baseDenom: 'ubld', | ||
baseName: 'agoric', | ||
chainName: 'osmosis', | ||
}, | ||
], | ||
[ | ||
'ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9', | ||
{ | ||
baseDenom: 'uatom', | ||
baseName: 'cosmoshub', | ||
chainName: 'agoric', | ||
}, | ||
], | ||
[ | ||
'ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2', | ||
{ | ||
baseDenom: 'uatom', | ||
baseName: 'cosmoshub', | ||
chainName: 'osmosis', | ||
}, | ||
], | ||
[ | ||
'ibc/16CD81E12F05F5397CA2D580B4BA786A12A8F48B6FB3823D82EBE95D80B5287B', | ||
{ | ||
baseDenom: 'uist', | ||
baseName: 'agoric', | ||
chainName: 'cosmoshub', | ||
}, | ||
], | ||
[ | ||
'ibc/16CD81E12F05F5397CA2D580B4BA786A12A8F48B6FB3823D82EBE95D80B5287B', | ||
{ | ||
baseDenom: 'uist', | ||
baseName: 'agoric', | ||
chainName: 'osmosis', | ||
}, | ||
], | ||
]); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
import { | ||
denomHash, | ||
type CosmosChainInfo, | ||
type Denom, | ||
type DenomDetail, | ||
} from '@agoric/orchestration'; | ||
import type { IBCChannelID } from '@agoric/vats'; | ||
|
||
/** make asset info for current env */ | ||
export const makeAssetInfo = ( | ||
chainInfo: Record<string, CosmosChainInfo>, | ||
tokenMap: Record<string, Denom[]> = { | ||
agoric: ['ubld', 'uist'], | ||
cosmoshub: ['uatom'], | ||
noble: ['uusdc'], | ||
osmosis: ['uosmo', 'uion'], | ||
}, | ||
): [Denom, DenomDetail][] => { | ||
const getChannelId = ( | ||
issuingChainId: string, | ||
holdingChainName: string, | ||
): IBCChannelID | undefined => | ||
chainInfo[holdingChainName]?.connections?.[issuingChainId]?.transferChannel | ||
.channelId; | ||
|
||
const toDenomHash = ( | ||
denom: Denom, | ||
issuingChainId: string, | ||
holdingChainName: string, | ||
): Denom => { | ||
const channelId = getChannelId(issuingChainId, holdingChainName); | ||
if (!channelId) { | ||
throw new Error( | ||
`No channel found for ${issuingChainId} -> ${holdingChainName}`, | ||
); | ||
} | ||
return `ibc/${denomHash({ denom, channelId })}`; | ||
}; | ||
|
||
// only include chains present in `chainInfo` | ||
const tokens = Object.entries(tokenMap) | ||
.filter(([chain]) => chain in chainInfo) | ||
.flatMap(([chain, denoms]) => denoms.map(denom => ({ denom, chain }))); | ||
|
||
const assetInfo: [Denom, DenomDetail][] = []; | ||
for (const { denom, chain } of tokens) { | ||
const baseDetails = { | ||
baseName: chain, | ||
baseDenom: denom, | ||
}; | ||
|
||
// Add native token entry | ||
assetInfo.push([ | ||
denom, | ||
{ | ||
...baseDetails, | ||
chainName: chain, | ||
}, | ||
]); | ||
|
||
// Add IBC entries for non-issuing chains | ||
const issuingChainId = chainInfo[chain].chainId; | ||
for (const holdingChain of Object.keys(chainInfo)) { | ||
if (holdingChain === chain) continue; | ||
assetInfo.push([ | ||
toDenomHash(denom, issuingChainId, holdingChain), | ||
{ | ||
...baseDetails, | ||
chainName: holdingChain, | ||
}, | ||
]); | ||
} | ||
} | ||
|
||
return harden(assetInfo); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.