parent
22fb63714b
commit
080ecfd080
@ -0,0 +1,172 @@ |
|||||||
|
|
||||||
|
type HyperlaneChainId = ChainName | ChainId | DomainId; |
||||||
|
|
||||||
|
export enum TokenStandard { |
||||||
|
// EVM
|
||||||
|
ERC20, |
||||||
|
ERC721, |
||||||
|
EvmNative, |
||||||
|
EvmHypNative, |
||||||
|
EvmHypCollateral, |
||||||
|
EvmHypSynthetic, |
||||||
|
|
||||||
|
// Sealevel (Solana)
|
||||||
|
SealevelSpl, |
||||||
|
SealevelSpl2022, |
||||||
|
SealevelNative, |
||||||
|
SealevelHypNative, |
||||||
|
SealevelHypCollateral, |
||||||
|
SealevelHypSynthetic, |
||||||
|
|
||||||
|
// Cosmos
|
||||||
|
CosmosIcs20, |
||||||
|
CosmosIcs721, |
||||||
|
CosmosNative, |
||||||
|
CosmosIbc, |
||||||
|
CosmosFactory, |
||||||
|
|
||||||
|
// CosmWasm
|
||||||
|
CW20, |
||||||
|
CW721, |
||||||
|
CwHypNative, |
||||||
|
CwHypCollateral, |
||||||
|
CwHypSynthetic, |
||||||
|
} |
||||||
|
|
||||||
|
export class Token { |
||||||
|
constructor({ protocol, chainName, standard, addressOrDenom, collateralizedAddressOrDenom, symbol, decimals, name, logoUri }) {} |
||||||
|
|
||||||
|
getAdapter(multiProvider): ITokenAdapter
|
||||||
|
getHypAdapter(multiProvider): IHypTokenAdapter // throws if not supported by standard
|
||||||
|
|
||||||
|
isNft(): boolean
|
||||||
|
|
||||||
|
amount(amountWei): TokenAmount |
||||||
|
} |
||||||
|
|
||||||
|
export class TokenAmount { |
||||||
|
constructor({ amountWei, token }) |
||||||
|
getWei(): bigint
|
||||||
|
getUnits(): number |
||||||
|
plus(amountWei): TokenAmount
|
||||||
|
minus(amountWei): TokenAmount
|
||||||
|
} |
||||||
|
|
||||||
|
export class TokenManager() { |
||||||
|
constructor({ multiProvider, tokens }) |
||||||
|
getToken(chain: HyperlaneChainId, addressOrDenom): Token |
||||||
|
getTokensByAddress(addressOrDenom): Token[]
|
||||||
|
} |
||||||
|
|
||||||
|
export class WarpRoute { |
||||||
|
constructor({ originChainName, originToken, destinationChainName, destinationToken }) |
||||||
|
|
||||||
|
getOriginAdapter(): ITokenAdapter
|
||||||
|
getDestinationAdapter(): ITokenAdapter
|
||||||
|
|
||||||
|
getOriginHypAdapter(): IHypTokenAdapter
|
||||||
|
getDestinationHypAdapter(): IHypTokenAdapter
|
||||||
|
|
||||||
|
getOriginProtocol(): ProtocolType
|
||||||
|
} |
||||||
|
|
||||||
|
export class WarpRouteManager { |
||||||
|
constructor({ multiProvider, routes })
|
||||||
|
|
||||||
|
getRoutesFrom(origin: HyperlaneChainId): WarpRoute[] |
||||||
|
getRoutesTo(destination: HyperlaneChainId): WarpRoute[]
|
||||||
|
|
||||||
|
getRoute(origin, destination, originToken, destinationToken): WarpRoute |
||||||
|
hasRoute(origin, destination, originToken, destinationToken): boolean
|
||||||
|
} |
||||||
|
|
||||||
|
export class WarpCore { |
||||||
|
constructor({ |
||||||
|
// Note, there's no ChainManager here because MultiProvider extends ChainMetadataManager and serves that function
|
||||||
|
multiProvider: MultiProtocolProvider<{ mailbox?: Address }>, |
||||||
|
tokens: ITokenManager, |
||||||
|
routes: IRouteManager, |
||||||
|
})
|
||||||
|
|
||||||
|
static FromConfig(config:string): WarpCore |
||||||
|
|
||||||
|
async getTransferGasQuote(route: Route, tokenAmount: TokenAmount): Promise<TokenAmount>
|
||||||
|
|
||||||
|
async validateTransfer(route: Route, tokenAmount: TokenAmount,
|
||||||
|
recipient:Address): Promise<FormErrors | null> |
||||||
|
|
||||||
|
async getTransferRemoteTxs(route: Route, tokenAmount: TokenAmount, recipient:Address |
||||||
|
): Promise{approveTx, transferTx}> |
||||||
|
|
||||||
|
async getMessageId(route: Route, txReceipt): Promise<string>
|
||||||
|
|
||||||
|
async getTransferStatus(route: Route, messageId: string): Promise<MessageStatus>
|
||||||
|
|
||||||
|
async isDestinationCollateralSufficient( |
||||||
|
route: Route, |
||||||
|
tokenAmount: TokenAmount, |
||||||
|
): Promise<boolean> |
||||||
|
} |
||||||
|
|
||||||
|
// Converts the user-provided token, chain, and route configs into a fully
|
||||||
|
// specified warp config. It auto-maps routes and fills in missing token data.
|
||||||
|
// This keeps the user-facing configs succinct.
|
||||||
|
// ALTERNATIVELY: Maybe we should use a single, verbose config layer since configs often
|
||||||
|
// comes from the CLI anyway. Downside: can't respond easily to router enrollments.
|
||||||
|
export class WarpConfigBuilder { |
||||||
|
constructor(chainConfig, tokenConfig) |
||||||
|
async build(): WarpConfig
|
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
NOTES BELOW, FEEL FREE TO IGNORE |
||||||
|
|
||||||
|
Improvements: |
||||||
|
============== |
||||||
|
Improve modularity & testability |
||||||
|
Make IBC vs Hyp routes substitutable |
||||||
|
Handle IGP business logic in single place |
||||||
|
Kill concept of 'base tokens' |
||||||
|
Kill cluster of utils functions for routes & tokens |
||||||
|
Kill CAIP IDs and related utils |
||||||
|
Reduce protocol-specific tx crafting special casing |
||||||
|
Improve NFT vs non-NFT substitutability |
||||||
|
|
||||||
|
Non-goals: |
||||||
|
========== |
||||||
|
Improve wallet hooks + integrations |
||||||
|
Improve UX |
||||||
|
|
||||||
|
Ideas: |
||||||
|
====== |
||||||
|
Smarter Token class (and a child WarpToken?) |
||||||
|
TokenManager |
||||||
|
Smart Chain class (and a child WarpChain?) |
||||||
|
-> these help avoid CAIP ids |
||||||
|
Smarter Route class |
||||||
|
-> replace route utils with methods |
||||||
|
Replace routes dictionary with graph |
||||||
|
-> routes are nodes, tokens are edges |
||||||
|
ToCAIP method on smart classes |
||||||
|
-> or some other serialization method |
||||||
|
GasQuote method |
||||||
|
-> avoid direct-to-adapter igq quoting, as engine instead |
||||||
|
-> copy over logic form current hook |
||||||
|
-> Params: fromChain, toChain, fromToken, toToken, amount |
||||||
|
-> Returns IGP quote and maybe also native gas quote |
||||||
|
Maybe a toRoutes() method for backwards compat |
||||||
|
Migrate useTokenTransfer logic into engine |
||||||
|
Leverage HypCore classes to extract message IDs |
||||||
|
Delivery checking logic |
||||||
|
Break into smaller classes, use dependency injection |
||||||
|
-> TokenManager, IGP, Transferer, Delivery checker |
||||||
|
Validation |
||||||
|
-> takes input and returns errors based on warp context |
||||||
|
-> would need balances + gas quote + igp quote |
||||||
|
|
||||||
|
Questions: |
||||||
|
========== |
||||||
|
How to replace Adapter Factory methods? |
||||||
|
-> prefer to avoid route-based fetching |
||||||
|
-> instead ask for adapter for given Chain and Token |
||||||
|
*/ |
Loading…
Reference in new issue