@hyperlane-xyz/sdk 3.7.0 → 3.8.0-beta0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/dist/consts/chainMetadata.d.ts +1 -2
  2. package/dist/consts/chainMetadata.d.ts.map +1 -1
  3. package/dist/consts/chainMetadata.js +43 -64
  4. package/dist/consts/chainMetadata.js.map +1 -1
  5. package/dist/consts/chains.d.ts +1 -2
  6. package/dist/consts/chains.d.ts.map +1 -1
  7. package/dist/consts/chains.js +2 -4
  8. package/dist/consts/chains.js.map +1 -1
  9. package/dist/consts/environments/index.d.ts +121 -133
  10. package/dist/consts/environments/index.d.ts.map +1 -1
  11. package/dist/consts/environments/testnet.json +166 -178
  12. package/dist/consts/multisigIsm.d.ts.map +1 -1
  13. package/dist/consts/multisigIsm.js +6 -18
  14. package/dist/consts/multisigIsm.js.map +1 -1
  15. package/dist/core/CoreDeployer.hardhat-test.js +4 -2
  16. package/dist/core/CoreDeployer.hardhat-test.js.map +1 -1
  17. package/dist/core/HyperlaneCoreChecker.d.ts.map +1 -1
  18. package/dist/core/HyperlaneCoreChecker.js +3 -3
  19. package/dist/core/HyperlaneCoreChecker.js.map +1 -1
  20. package/dist/core/HyperlaneCoreDeployer.d.ts +6 -2
  21. package/dist/core/HyperlaneCoreDeployer.d.ts.map +1 -1
  22. package/dist/core/HyperlaneCoreDeployer.js +24 -11
  23. package/dist/core/HyperlaneCoreDeployer.js.map +1 -1
  24. package/dist/core/TestRecipientDeployer.d.ts +2 -1
  25. package/dist/core/TestRecipientDeployer.d.ts.map +1 -1
  26. package/dist/core/TestRecipientDeployer.js +2 -1
  27. package/dist/core/TestRecipientDeployer.js.map +1 -1
  28. package/dist/deploy/HyperlaneDeployer.d.ts +7 -6
  29. package/dist/deploy/HyperlaneDeployer.d.ts.map +1 -1
  30. package/dist/deploy/HyperlaneDeployer.js +34 -13
  31. package/dist/deploy/HyperlaneDeployer.js.map +1 -1
  32. package/dist/deploy/HyperlaneProxyFactoryDeployer.d.ts +2 -1
  33. package/dist/deploy/HyperlaneProxyFactoryDeployer.d.ts.map +1 -1
  34. package/dist/deploy/HyperlaneProxyFactoryDeployer.js +2 -1
  35. package/dist/deploy/HyperlaneProxyFactoryDeployer.js.map +1 -1
  36. package/dist/deploy/types.d.ts +1 -1
  37. package/dist/deploy/types.d.ts.map +1 -1
  38. package/dist/deploy/verify/ContractVerifier.d.ts +9 -12
  39. package/dist/deploy/verify/ContractVerifier.d.ts.map +1 -1
  40. package/dist/deploy/verify/ContractVerifier.js +147 -121
  41. package/dist/deploy/verify/ContractVerifier.js.map +1 -1
  42. package/dist/deploy/verify/PostDeploymentContractVerifier.d.ts +14 -0
  43. package/dist/deploy/verify/PostDeploymentContractVerifier.d.ts.map +1 -0
  44. package/dist/deploy/verify/PostDeploymentContractVerifier.js +31 -0
  45. package/dist/deploy/verify/PostDeploymentContractVerifier.js.map +1 -0
  46. package/dist/deploy/verify/types.d.ts +60 -3
  47. package/dist/deploy/verify/types.d.ts.map +1 -1
  48. package/dist/deploy/verify/types.js +42 -0
  49. package/dist/deploy/verify/types.js.map +1 -1
  50. package/dist/gas/HyperlaneIgpChecker.d.ts +0 -2
  51. package/dist/gas/HyperlaneIgpChecker.d.ts.map +1 -1
  52. package/dist/gas/HyperlaneIgpChecker.js +8 -29
  53. package/dist/gas/HyperlaneIgpChecker.js.map +1 -1
  54. package/dist/gas/HyperlaneIgpDeployer.d.ts +6 -7
  55. package/dist/gas/HyperlaneIgpDeployer.d.ts.map +1 -1
  56. package/dist/gas/HyperlaneIgpDeployer.js +40 -59
  57. package/dist/gas/HyperlaneIgpDeployer.js.map +1 -1
  58. package/dist/gas/oracle/configure-gas-oracles.hardhat-test.js +17 -22
  59. package/dist/gas/oracle/configure-gas-oracles.hardhat-test.js.map +1 -1
  60. package/dist/gas/oracle/types.d.ts +6 -9
  61. package/dist/gas/oracle/types.d.ts.map +1 -1
  62. package/dist/gas/oracle/types.js +23 -1
  63. package/dist/gas/oracle/types.js.map +1 -1
  64. package/dist/gas/types.d.ts +3 -4
  65. package/dist/gas/types.d.ts.map +1 -1
  66. package/dist/gas/types.js +1 -5
  67. package/dist/gas/types.js.map +1 -1
  68. package/dist/hook/HyperlaneHookDeployer.d.ts +2 -1
  69. package/dist/hook/HyperlaneHookDeployer.d.ts.map +1 -1
  70. package/dist/hook/HyperlaneHookDeployer.js +6 -4
  71. package/dist/hook/HyperlaneHookDeployer.js.map +1 -1
  72. package/dist/index.d.ts +16 -7
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +49 -22
  75. package/dist/index.js.map +1 -1
  76. package/dist/ism/HyperlaneIsmFactory.d.ts +11 -10
  77. package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
  78. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +14 -12
  79. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
  80. package/dist/ism/HyperlaneIsmFactory.js +39 -287
  81. package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
  82. package/dist/ism/utils.d.ts +11 -0
  83. package/dist/ism/utils.d.ts.map +1 -0
  84. package/dist/ism/utils.js +277 -0
  85. package/dist/ism/utils.js.map +1 -0
  86. package/dist/metadata/ChainMetadataManager.d.ts +43 -21
  87. package/dist/metadata/ChainMetadataManager.d.ts.map +1 -1
  88. package/dist/metadata/ChainMetadataManager.js +26 -0
  89. package/dist/metadata/ChainMetadataManager.js.map +1 -1
  90. package/dist/metadata/agentConfig.d.ts +97 -46
  91. package/dist/metadata/agentConfig.d.ts.map +1 -1
  92. package/dist/metadata/blockExplorer.d.ts +6 -1
  93. package/dist/metadata/blockExplorer.d.ts.map +1 -1
  94. package/dist/metadata/blockExplorer.js +15 -1
  95. package/dist/metadata/blockExplorer.js.map +1 -1
  96. package/dist/metadata/chainMetadataTypes.d.ts +188 -1
  97. package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
  98. package/dist/metadata/chainMetadataTypes.js +14 -4
  99. package/dist/metadata/chainMetadataTypes.js.map +1 -1
  100. package/dist/metadata/customZodTypes.d.ts +2 -0
  101. package/dist/metadata/customZodTypes.d.ts.map +1 -1
  102. package/dist/metadata/customZodTypes.js +3 -1
  103. package/dist/metadata/customZodTypes.js.map +1 -1
  104. package/dist/middleware/account/InterchainAccountDeployer.d.ts +2 -1
  105. package/dist/middleware/account/InterchainAccountDeployer.d.ts.map +1 -1
  106. package/dist/middleware/account/InterchainAccountDeployer.js +4 -2
  107. package/dist/middleware/account/InterchainAccountDeployer.js.map +1 -1
  108. package/dist/middleware/liquidity-layer/LiquidityLayerRouterDeployer.d.ts +2 -1
  109. package/dist/middleware/liquidity-layer/LiquidityLayerRouterDeployer.d.ts.map +1 -1
  110. package/dist/middleware/liquidity-layer/LiquidityLayerRouterDeployer.js +4 -2
  111. package/dist/middleware/liquidity-layer/LiquidityLayerRouterDeployer.js.map +1 -1
  112. package/dist/middleware/query/InterchainQueryDeployer.d.ts +2 -1
  113. package/dist/middleware/query/InterchainQueryDeployer.d.ts.map +1 -1
  114. package/dist/middleware/query/InterchainQueryDeployer.js +4 -2
  115. package/dist/middleware/query/InterchainQueryDeployer.js.map +1 -1
  116. package/dist/providers/MultiProtocolProvider.d.ts +10 -12
  117. package/dist/providers/MultiProtocolProvider.d.ts.map +1 -1
  118. package/dist/providers/MultiProtocolProvider.js +2 -7
  119. package/dist/providers/MultiProtocolProvider.js.map +1 -1
  120. package/dist/providers/MultiProvider.d.ts +17 -17
  121. package/dist/providers/MultiProvider.d.ts.map +1 -1
  122. package/dist/providers/MultiProvider.js +1 -0
  123. package/dist/providers/MultiProvider.js.map +1 -1
  124. package/dist/providers/ProviderType.d.ts +5 -2
  125. package/dist/providers/ProviderType.d.ts.map +1 -1
  126. package/dist/providers/ProviderType.js +10 -1
  127. package/dist/providers/ProviderType.js.map +1 -1
  128. package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -1
  129. package/dist/providers/SmartProvider/SmartProvider.js +2 -2
  130. package/dist/providers/SmartProvider/SmartProvider.js.map +1 -1
  131. package/dist/providers/providerBuilders.d.ts.map +1 -1
  132. package/dist/providers/providerBuilders.js +1 -0
  133. package/dist/providers/providerBuilders.js.map +1 -1
  134. package/dist/router/HyperlaneRouterChecker.d.ts.map +1 -1
  135. package/dist/router/HyperlaneRouterChecker.js +2 -2
  136. package/dist/router/HyperlaneRouterChecker.js.map +1 -1
  137. package/dist/router/HyperlaneRouterDeployer.d.ts.map +1 -1
  138. package/dist/router/HyperlaneRouterDeployer.js +2 -3
  139. package/dist/router/HyperlaneRouterDeployer.js.map +1 -1
  140. package/dist/test/testUtils.d.ts +1 -2
  141. package/dist/test/testUtils.d.ts.map +1 -1
  142. package/dist/test/testUtils.js +12 -28
  143. package/dist/test/testUtils.js.map +1 -1
  144. package/dist/token/IToken.d.ts +147 -0
  145. package/dist/token/IToken.d.ts.map +1 -0
  146. package/dist/token/IToken.js +37 -0
  147. package/dist/token/IToken.js.map +1 -0
  148. package/dist/token/Token.d.ts +58 -0
  149. package/dist/token/Token.d.ts.map +1 -0
  150. package/dist/token/Token.js +260 -0
  151. package/dist/token/Token.js.map +1 -0
  152. package/dist/token/Token.test.d.ts +2 -0
  153. package/dist/token/Token.test.d.ts.map +1 -0
  154. package/dist/token/Token.test.js +155 -0
  155. package/dist/token/Token.test.js.map +1 -0
  156. package/dist/token/TokenAmount.d.ts +12 -0
  157. package/dist/token/TokenAmount.d.ts.map +1 -0
  158. package/dist/token/TokenAmount.js +24 -0
  159. package/dist/token/TokenAmount.js.map +1 -0
  160. package/dist/token/TokenAmount.test.d.ts +2 -0
  161. package/dist/token/TokenAmount.test.d.ts.map +1 -0
  162. package/dist/token/TokenAmount.test.js +41 -0
  163. package/dist/token/TokenAmount.test.js.map +1 -0
  164. package/dist/token/TokenConnection.d.ts +81 -0
  165. package/dist/token/TokenConnection.d.ts.map +1 -0
  166. package/dist/token/TokenConnection.js +36 -0
  167. package/dist/token/TokenConnection.js.map +1 -0
  168. package/dist/token/TokenStandard.d.ts +36 -0
  169. package/dist/token/TokenStandard.d.ts.map +1 -0
  170. package/dist/token/TokenStandard.js +118 -0
  171. package/dist/token/TokenStandard.js.map +1 -0
  172. package/dist/token/adapters/CosmWasmTokenAdapter.d.ts +29 -30
  173. package/dist/token/adapters/CosmWasmTokenAdapter.d.ts.map +1 -1
  174. package/dist/token/adapters/CosmWasmTokenAdapter.js +65 -50
  175. package/dist/token/adapters/CosmWasmTokenAdapter.js.map +1 -1
  176. package/dist/token/adapters/CosmosTokenAdapter.d.ts +11 -9
  177. package/dist/token/adapters/CosmosTokenAdapter.d.ts.map +1 -1
  178. package/dist/token/adapters/CosmosTokenAdapter.js +25 -6
  179. package/dist/token/adapters/CosmosTokenAdapter.js.map +1 -1
  180. package/dist/token/adapters/EvmTokenAdapter.d.ts +27 -16
  181. package/dist/token/adapters/EvmTokenAdapter.d.ts.map +1 -1
  182. package/dist/token/adapters/EvmTokenAdapter.js +69 -23
  183. package/dist/token/adapters/EvmTokenAdapter.js.map +1 -1
  184. package/dist/token/adapters/ITokenAdapter.d.ts +16 -11
  185. package/dist/token/adapters/ITokenAdapter.d.ts.map +1 -1
  186. package/dist/token/adapters/SealevelTokenAdapter.d.ts +15 -13
  187. package/dist/token/adapters/SealevelTokenAdapter.d.ts.map +1 -1
  188. package/dist/token/adapters/SealevelTokenAdapter.js +17 -15
  189. package/dist/token/adapters/SealevelTokenAdapter.js.map +1 -1
  190. package/dist/token/deploy.d.ts +3 -2
  191. package/dist/token/deploy.d.ts.map +1 -1
  192. package/dist/token/deploy.js +4 -2
  193. package/dist/token/deploy.js.map +1 -1
  194. package/dist/types.d.ts +2 -1
  195. package/dist/types.d.ts.map +1 -1
  196. package/dist/warp/WarpCore.d.ts +76 -0
  197. package/dist/warp/WarpCore.d.ts.map +1 -0
  198. package/dist/warp/WarpCore.js +288 -0
  199. package/dist/warp/WarpCore.js.map +1 -0
  200. package/dist/warp/WarpCore.test.d.ts +2 -0
  201. package/dist/warp/WarpCore.test.d.ts.map +1 -0
  202. package/dist/warp/WarpCore.test.js +143 -0
  203. package/dist/warp/WarpCore.test.js.map +1 -0
  204. package/dist/warp/types.d.ts +274 -0
  205. package/dist/warp/types.d.ts.map +1 -0
  206. package/dist/warp/types.js +38 -0
  207. package/dist/warp/types.js.map +1 -0
  208. package/logos/black/cosmwasm.svg +1 -1
  209. package/logos/black/plume.svg +29 -0
  210. package/logos/color/cosmos.svg +1 -1
  211. package/logos/color/cosmwasm.svg +1 -1
  212. package/logos/color/manta.svg +1 -1
  213. package/logos/color/plume.svg +24 -0
  214. package/package.json +5 -4
  215. package/dist/gas/oracle/logging.d.ts +0 -7
  216. package/dist/gas/oracle/logging.d.ts.map +0 -1
  217. package/dist/gas/oracle/logging.js +0 -18
  218. package/dist/gas/oracle/logging.js.map +0 -1
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WarpCore = void 0;
7
+ const debug_1 = __importDefault(require("debug"));
8
+ const utils_1 = require("@hyperlane-xyz/utils");
9
+ const Token_1 = require("../token/Token");
10
+ const TokenAmount_1 = require("../token/TokenAmount");
11
+ const TokenStandard_1 = require("../token/TokenStandard");
12
+ const types_1 = require("./types");
13
+ class WarpCore {
14
+ constructor(multiProvider, tokens, options) {
15
+ this.multiProvider = multiProvider;
16
+ this.tokens = tokens;
17
+ this.igpQuoteConstants = options?.igpQuoteConstants || [];
18
+ this.routeBlacklist = options?.routeBlacklist || [];
19
+ this.logger = (0, debug_1.default)(options?.loggerName || 'hyperlane:WarpCore');
20
+ }
21
+ // Takes the serialized representation of a complete warp config and returns a WarpCore instance
22
+ static FromConfig(multiProvider, config) {
23
+ // Validate and parse config data
24
+ const parsedConfig = types_1.WarpCoreConfigSchema.parse(config);
25
+ // Instantiate all tokens
26
+ const tokens = parsedConfig.tokens.map((t) => new Token_1.Token({
27
+ ...t,
28
+ addressOrDenom: t.addressOrDenom || '',
29
+ connections: undefined,
30
+ }));
31
+ // Connect tokens together
32
+ parsedConfig.tokens.forEach((config, i) => {
33
+ for (const connection of config.connections || []) {
34
+ const token1 = tokens[i];
35
+ // TODO see https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/3298
36
+ const [_protocol, chainName, addrOrDenom] = connection.token.split('|');
37
+ const token2 = tokens.find((t) => t.chainName === chainName && t.addressOrDenom === addrOrDenom);
38
+ (0, utils_1.assert)(token2, `Connected token not found: ${chainName} ${addrOrDenom}`);
39
+ token1.addConnection({
40
+ ...connection,
41
+ token: token2,
42
+ });
43
+ }
44
+ });
45
+ // Create new Warp
46
+ return new WarpCore(multiProvider, tokens, {
47
+ igpQuoteConstants: parsedConfig.options?.igpQuoteConstants,
48
+ routeBlacklist: parsedConfig.options?.routeBlacklist,
49
+ });
50
+ }
51
+ async getTransferGasQuote(originToken, destination) {
52
+ const { chainName: originName } = originToken;
53
+ const destinationName = this.multiProvider.getChainName(destination);
54
+ let gasAmount;
55
+ let gasAddressOrDenom;
56
+ // Check constant quotes first
57
+ const defaultQuote = this.igpQuoteConstants.find((q) => q.origin === originName && q.destination === destinationName);
58
+ if (defaultQuote) {
59
+ gasAmount = BigInt(defaultQuote.amount.toString());
60
+ gasAddressOrDenom = defaultQuote.addressOrDenom;
61
+ }
62
+ else {
63
+ // Otherwise, compute IGP quote via the adapter
64
+ const hypAdapter = originToken.getHypAdapter(this.multiProvider, destinationName);
65
+ const destinationDomainId = this.multiProvider.getDomainId(destination);
66
+ const quote = await hypAdapter.quoteGasPayment(destinationDomainId);
67
+ gasAmount = BigInt(quote.amount);
68
+ gasAddressOrDenom = quote.addressOrDenom;
69
+ }
70
+ let igpToken;
71
+ if (!gasAddressOrDenom) {
72
+ // An empty/undefined addressOrDenom indicates the native token
73
+ igpToken = Token_1.Token.FromChainMetadataNativeToken(this.multiProvider.getChainMetadata(originName));
74
+ }
75
+ else {
76
+ const searchResult = this.findToken(originName, gasAddressOrDenom);
77
+ (0, utils_1.assert)(searchResult, `IGP token ${gasAddressOrDenom} is unknown`);
78
+ igpToken = searchResult;
79
+ }
80
+ this.logger(`Quoted igp gas payment: ${gasAmount} ${igpToken.symbol}`);
81
+ return new TokenAmount_1.TokenAmount(gasAmount, igpToken);
82
+ }
83
+ async getTransferRemoteTxs(originTokenAmount, destination, sender, recipient) {
84
+ const transactions = [];
85
+ const { token, amount } = originTokenAmount;
86
+ const destinationName = this.multiProvider.getChainName(destination);
87
+ const destinationDomainId = this.multiProvider.getDomainId(destination);
88
+ const providerType = TokenStandard_1.TOKEN_STANDARD_TO_PROVIDER_TYPE[token.standard];
89
+ const hypAdapter = token.getHypAdapter(this.multiProvider, destinationName);
90
+ if (await this.isApproveRequired(originTokenAmount, sender)) {
91
+ this.logger(`Approval required for transfer of ${token.symbol}`);
92
+ const approveTxReq = await hypAdapter.populateApproveTx({
93
+ weiAmountOrId: amount.toString(),
94
+ recipient: token.addressOrDenom,
95
+ });
96
+ this.logger(`Approval tx for ${token.symbol} populated`);
97
+ const approveTx = {
98
+ category: types_1.WarpTxCategory.Approval,
99
+ type: providerType,
100
+ transaction: approveTxReq,
101
+ };
102
+ transactions.push(approveTx);
103
+ }
104
+ const interchainGasAmount = await this.getTransferGasQuote(token, destination);
105
+ const transferTxReq = await hypAdapter.populateTransferRemoteTx({
106
+ weiAmountOrId: amount.toString(),
107
+ destination: destinationDomainId,
108
+ fromAccountOwner: sender,
109
+ recipient,
110
+ interchainGas: {
111
+ amount: interchainGasAmount.amount,
112
+ addressOrDenom: interchainGasAmount.token.addressOrDenom,
113
+ },
114
+ });
115
+ this.logger(`Remote transfer tx for ${token.symbol} populated`);
116
+ const transferTx = {
117
+ category: types_1.WarpTxCategory.Transfer,
118
+ type: providerType,
119
+ transaction: transferTxReq,
120
+ };
121
+ transactions.push(transferTx);
122
+ return transactions;
123
+ }
124
+ /**
125
+ * Checks if destination chain's collateral is sufficient to cover the transfer
126
+ */
127
+ async isDestinationCollateralSufficient(originTokenAmount, destination) {
128
+ const { token: originToken, amount } = originTokenAmount;
129
+ const destinationName = this.multiProvider.getChainName(destination);
130
+ this.logger(`Checking collateral for ${originToken.symbol} to ${destination}`);
131
+ const destinationToken = originToken.getConnectionForChain(destinationName)?.token;
132
+ (0, utils_1.assert)(destinationToken, `No connection found for ${destinationName}`);
133
+ if (!TokenStandard_1.TOKEN_COLLATERALIZED_STANDARDS.includes(destinationToken.standard)) {
134
+ this.logger(`${destinationToken.symbol} is not collateralized, skipping`);
135
+ return true;
136
+ }
137
+ const adapter = destinationToken.getAdapter(this.multiProvider);
138
+ const destinationBalance = await adapter.getBalance(destinationToken.addressOrDenom);
139
+ const destinationBalanceInOriginDecimals = (0, utils_1.convertDecimals)(destinationToken.decimals, originToken.decimals, destinationBalance.toString());
140
+ const isSufficient = BigInt(destinationBalanceInOriginDecimals) >= amount;
141
+ this.logger(`${originTokenAmount.token.symbol} to ${destination} has ${isSufficient ? 'sufficient' : 'INSUFFICIENT'} collateral`);
142
+ return isSufficient;
143
+ }
144
+ /**
145
+ * Checks if a token transfer requires an approval tx first
146
+ */
147
+ async isApproveRequired(originTokenAmount, owner) {
148
+ const { token, amount } = originTokenAmount;
149
+ const adapter = token.getAdapter(this.multiProvider);
150
+ const isRequired = await adapter.isApproveRequired(owner, token.addressOrDenom, amount);
151
+ this.logger(`Approval is${isRequired ? '' : ' not'} required for transfer of ${token.symbol}`);
152
+ return isRequired;
153
+ }
154
+ /**
155
+ * Ensure the remote token transfer would be valid for the given chains, amount, sender, and recipient
156
+ */
157
+ async validateTransfer(originTokenAmount, destination, sender, recipient) {
158
+ const chainError = this.validateChains(originTokenAmount.token.chainName, destination);
159
+ if (chainError)
160
+ return chainError;
161
+ const recipientError = this.validateRecipient(recipient, destination);
162
+ if (recipientError)
163
+ return recipientError;
164
+ const amountError = this.validateAmount(originTokenAmount);
165
+ if (amountError)
166
+ return amountError;
167
+ const balancesError = await this.validateTokenBalances(originTokenAmount, destination, sender);
168
+ if (balancesError)
169
+ return balancesError;
170
+ return null;
171
+ }
172
+ /**
173
+ * Ensure the origin and destination chains are valid and known by this WarpCore
174
+ */
175
+ validateChains(origin, destination) {
176
+ if (!origin)
177
+ return { origin: 'Origin chain required' };
178
+ if (!destination)
179
+ return { destination: 'Destination chain required' };
180
+ const originMetadata = this.multiProvider.tryGetChainMetadata(origin);
181
+ const destinationMetadata = this.multiProvider.tryGetChainMetadata(destination);
182
+ if (!originMetadata)
183
+ return { origin: 'Origin chain metadata missing' };
184
+ if (!destinationMetadata)
185
+ return { destination: 'Destination chain metadata missing' };
186
+ if (this.routeBlacklist.some((bl) => bl.origin === originMetadata.name &&
187
+ bl.destination === destinationMetadata.name)) {
188
+ return { destination: 'Route is not currently allowed' };
189
+ }
190
+ return null;
191
+ }
192
+ /**
193
+ * Ensure recipient address is valid for the destination chain
194
+ */
195
+ validateRecipient(recipient, destination) {
196
+ const destinationMetadata = this.multiProvider.getChainMetadata(destination);
197
+ const { protocol, bech32Prefix } = destinationMetadata;
198
+ // Ensure recip address is valid for the destination chain's protocol
199
+ if (!(0, utils_1.isValidAddress)(recipient, protocol))
200
+ return { recipient: 'Invalid recipient' };
201
+ // Also ensure the address denom is correct if the dest protocol is Cosmos
202
+ if (protocol === utils_1.ProtocolType.Cosmos) {
203
+ if (!bech32Prefix) {
204
+ this.logger(`No bech32 prefix found for chain ${destination}`);
205
+ return { destination: 'Invalid chain data' };
206
+ }
207
+ else if (!recipient.startsWith(bech32Prefix)) {
208
+ this.logger(`Recipient prefix should be ${bech32Prefix}`);
209
+ return { recipient: `Invalid recipient prefix` };
210
+ }
211
+ }
212
+ return null;
213
+ }
214
+ /**
215
+ * Ensure token amount is valid
216
+ */
217
+ validateAmount(originTokenAmount) {
218
+ if (!originTokenAmount.amount || originTokenAmount.amount < 0n) {
219
+ const isNft = originTokenAmount.token.isNft();
220
+ return { amount: isNft ? 'Invalid Token Id' : 'Invalid amount' };
221
+ }
222
+ return null;
223
+ }
224
+ /**
225
+ * Ensure the sender has sufficient balances for transfer and interchain gas
226
+ */
227
+ async validateTokenBalances(originTokenAmount, destination, sender) {
228
+ const { token, amount } = originTokenAmount;
229
+ const { amount: senderBalance } = await token.getBalance(this.multiProvider, sender);
230
+ // First check basic token balance
231
+ if (amount > senderBalance)
232
+ return { amount: 'Insufficient balance' };
233
+ // Next, ensure balances can cover IGP fees
234
+ const igpQuote = await this.getTransferGasQuote(token, destination);
235
+ if (token.equals(igpQuote.token) || token.collateralizes(igpQuote.token)) {
236
+ const total = amount + igpQuote.amount;
237
+ if (senderBalance < total)
238
+ return { amount: 'Insufficient balance for gas and transfer' };
239
+ }
240
+ else {
241
+ const igpTokenBalance = await igpQuote.token.getBalance(this.multiProvider, sender);
242
+ if (igpTokenBalance.amount < igpQuote.amount)
243
+ return { amount: `Insufficient ${igpQuote.token.symbol} for gas` };
244
+ }
245
+ return null;
246
+ }
247
+ /**
248
+ * Search through token list to find token with matching chain and address
249
+ */
250
+ findToken(chainName, addressOrDenom) {
251
+ if (!addressOrDenom)
252
+ return null;
253
+ const results = this.tokens.filter((token) => token.chainName === chainName &&
254
+ token.addressOrDenom.toLowerCase() === addressOrDenom.toLowerCase());
255
+ if (results.length === 1)
256
+ return results[0];
257
+ if (results.length > 1)
258
+ throw new Error(`Ambiguous token search results for ${addressOrDenom}`);
259
+ // If the token is not found, check to see if it matches the denom of chain's native token
260
+ // This is a convenience so WarpConfigs don't need to include definitions for native tokens
261
+ const chainMetadata = this.multiProvider.getChainMetadata(chainName);
262
+ if (chainMetadata.nativeToken?.denom === addressOrDenom) {
263
+ return Token_1.Token.FromChainMetadataNativeToken(chainMetadata);
264
+ }
265
+ return null;
266
+ }
267
+ /**
268
+ * Get the list of chains referenced by the tokens in this WarpCore
269
+ */
270
+ getTokenChains() {
271
+ return [...new Set(this.tokens.map((t) => t.chainName)).values()];
272
+ }
273
+ /**
274
+ * Get the subset of tokens whose chain matches the given chainName
275
+ */
276
+ getTokensForChain(chainName) {
277
+ return this.tokens.filter((t) => t.chainName === chainName);
278
+ }
279
+ /**
280
+ * Get the subset of tokens whose chain matches the given chainName
281
+ * and which are connected to a token on the given destination chain
282
+ */
283
+ getTokensForRoute(origin, destination) {
284
+ return this.tokens.filter((t) => t.chainName === origin && t.getConnectionForChain(destination));
285
+ }
286
+ }
287
+ exports.WarpCore = WarpCore;
288
+ //# sourceMappingURL=WarpCore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarpCore.js","sourceRoot":"","sources":["../../src/warp/WarpCore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=WarpCore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarpCore.test.d.ts","sourceRoot":"","sources":["../../src/warp/WarpCore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chai_1 = require("chai");
7
+ const ethers_1 = require("ethers");
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const sinon_1 = __importDefault(require("sinon"));
11
+ const yaml_1 = require("yaml");
12
+ const chainMetadata_1 = require("../consts/chainMetadata");
13
+ const chains_1 = require("../consts/chains");
14
+ const MultiProtocolProvider_1 = require("../providers/MultiProtocolProvider");
15
+ const ProviderType_1 = require("../providers/ProviderType");
16
+ const Token_1 = require("../token/Token");
17
+ const TokenStandard_1 = require("../token/TokenStandard");
18
+ const WarpCore_1 = require("./WarpCore");
19
+ const types_1 = require("./types");
20
+ const MOCK_QUOTE = { amount: 20000n };
21
+ const TRANSFER_AMOUNT = BigInt('1000000000000000000'); // 1 units @ 18 decimals
22
+ const BIG_TRANSFER_AMOUNT = BigInt('100000000000000000000'); // 100 units @ 18 decimals
23
+ const MOCK_BALANCE = BigInt('10000000000000000000'); // 10 units @ 18 decimals
24
+ describe('WarpCore', () => {
25
+ const multiProvider = new MultiProtocolProvider_1.MultiProtocolProvider();
26
+ let warpCore;
27
+ let evmHypNative;
28
+ let evmHypSynthetic;
29
+ let sealevelHypSynthetic;
30
+ let cwHypCollateral;
31
+ let cw20;
32
+ let cosmosIbc;
33
+ it('Constructs', () => {
34
+ const fromArgs = new WarpCore_1.WarpCore(multiProvider, [
35
+ Token_1.Token.FromChainMetadataNativeToken(chainMetadata_1.chainMetadata[chains_1.Chains.ethereum]),
36
+ ]);
37
+ const exampleConfig = (0, yaml_1.parse)(fs_1.default.readFileSync(path_1.default.join(__dirname, './example-warp-core-config.yaml'), 'utf-8'));
38
+ const fromConfig = WarpCore_1.WarpCore.FromConfig(multiProvider, exampleConfig);
39
+ (0, chai_1.expect)(fromArgs).to.be.instanceOf(WarpCore_1.WarpCore);
40
+ (0, chai_1.expect)(fromConfig).to.be.instanceOf(WarpCore_1.WarpCore);
41
+ (0, chai_1.expect)(fromConfig.tokens.length).to.equal(exampleConfig.tokens.length);
42
+ warpCore = fromConfig;
43
+ [
44
+ evmHypNative,
45
+ evmHypSynthetic,
46
+ sealevelHypSynthetic,
47
+ cwHypCollateral,
48
+ cw20,
49
+ cosmosIbc,
50
+ ] = warpCore.tokens;
51
+ });
52
+ it('Finds tokens', () => {
53
+ (0, chai_1.expect)(warpCore.findToken(chains_1.Chains.ethereum, evmHypNative.addressOrDenom)).to.be.instanceOf(Token_1.Token);
54
+ (0, chai_1.expect)(warpCore.findToken(chains_1.Chains.ethereum, sealevelHypSynthetic.addressOrDenom)).to.be.null;
55
+ (0, chai_1.expect)(warpCore.findToken(chains_1.Chains.neutron, cw20.addressOrDenom)).to.be.instanceOf(Token_1.Token);
56
+ });
57
+ it('Gets transfer gas quote', async () => {
58
+ const stubs = warpCore.tokens.map((t) => sinon_1.default.stub(t, 'getHypAdapter').returns({
59
+ quoteGasPayment: () => Promise.resolve(MOCK_QUOTE),
60
+ }));
61
+ const testQuote = async (token, chain, standard, quote = MOCK_QUOTE) => {
62
+ const result = await warpCore.getTransferGasQuote(token, chain);
63
+ (0, chai_1.expect)(result.token.standard, `token standard check for ${token.chainName} to ${chain}`).equals(standard);
64
+ (0, chai_1.expect)(result.amount, `token amount check for ${token.chainName} to ${chain}`).to.equal(quote.amount);
65
+ };
66
+ await testQuote(evmHypNative, chains_1.Chains.arbitrum, TokenStandard_1.TokenStandard.EvmNative);
67
+ await testQuote(evmHypNative, chains_1.Chains.neutron, TokenStandard_1.TokenStandard.EvmNative);
68
+ await testQuote(evmHypNative, chains_1.Chains.solana, TokenStandard_1.TokenStandard.EvmNative);
69
+ await testQuote(evmHypSynthetic, chains_1.Chains.ethereum, TokenStandard_1.TokenStandard.EvmNative);
70
+ await testQuote(sealevelHypSynthetic, chains_1.Chains.ethereum, TokenStandard_1.TokenStandard.SealevelNative);
71
+ await testQuote(cosmosIbc, chains_1.Chains.arbitrum, TokenStandard_1.TokenStandard.CosmosNative);
72
+ // Note, this route uses an igp quote const config
73
+ await testQuote(cwHypCollateral, chains_1.Chains.arbitrum, TokenStandard_1.TokenStandard.CosmosNative, {
74
+ amount: 1n,
75
+ addressOrDenom: 'untrn',
76
+ });
77
+ stubs.forEach((s) => s.restore());
78
+ });
79
+ it('Checks for destination collateral', async () => {
80
+ const stubs = warpCore.tokens.map((t) => sinon_1.default.stub(t, 'getHypAdapter').returns({
81
+ getBalance: () => Promise.resolve(MOCK_BALANCE),
82
+ }));
83
+ const testCollateral = async (token, chain, expectedBigResult = true) => {
84
+ const smallResult = await warpCore.isDestinationCollateralSufficient(token.amount(TRANSFER_AMOUNT), chain);
85
+ (0, chai_1.expect)(smallResult, `small collateral check for ${token.chainName} to ${chain}`).to.be.true;
86
+ const bigResult = await warpCore.isDestinationCollateralSufficient(token.amount(BIG_TRANSFER_AMOUNT), chain);
87
+ (0, chai_1.expect)(bigResult, `big collateral check for ${token.chainName} to ${chain}`).to.equal(expectedBigResult);
88
+ };
89
+ await testCollateral(evmHypNative, chains_1.Chains.arbitrum);
90
+ await testCollateral(evmHypNative, chains_1.Chains.neutron, false);
91
+ await testCollateral(evmHypNative, chains_1.Chains.solana);
92
+ await testCollateral(cwHypCollateral, chains_1.Chains.arbitrum);
93
+ stubs.forEach((s) => s.restore());
94
+ });
95
+ it('Validates transfers', async () => {
96
+ const balanceStubs = warpCore.tokens.map((t) => sinon_1.default
97
+ .stub(t, 'getBalance')
98
+ .returns(Promise.resolve({ amount: MOCK_BALANCE })));
99
+ const quoteStubs = warpCore.tokens.map((t) => sinon_1.default.stub(t, 'getHypAdapter').returns({
100
+ quoteGasPayment: () => Promise.resolve(MOCK_QUOTE),
101
+ }));
102
+ const validResult = await warpCore.validateTransfer(evmHypNative.amount(TRANSFER_AMOUNT), chains_1.Chains.arbitrum, ethers_1.ethers.constants.AddressZero, ethers_1.ethers.constants.AddressZero);
103
+ (0, chai_1.expect)(validResult).to.be.null;
104
+ const invalidChain = await warpCore.validateTransfer(evmHypNative.amount(TRANSFER_AMOUNT), 'fakechain', ethers_1.ethers.constants.AddressZero, ethers_1.ethers.constants.AddressZero);
105
+ (0, chai_1.expect)(Object.keys(invalidChain || {})[0]).to.equal('destination');
106
+ const invalidRecipient = await warpCore.validateTransfer(evmHypNative.amount(TRANSFER_AMOUNT), chains_1.Chains.neutron, ethers_1.ethers.constants.AddressZero, ethers_1.ethers.constants.AddressZero);
107
+ (0, chai_1.expect)(Object.keys(invalidRecipient || {})[0]).to.equal('recipient');
108
+ const invalidAmount = await warpCore.validateTransfer(evmHypNative.amount(-10), chains_1.Chains.arbitrum, ethers_1.ethers.constants.AddressZero, ethers_1.ethers.constants.AddressZero);
109
+ (0, chai_1.expect)(Object.keys(invalidAmount || {})[0]).to.equal('amount');
110
+ const insufficientBalance = await warpCore.validateTransfer(evmHypNative.amount(BIG_TRANSFER_AMOUNT), chains_1.Chains.arbitrum, ethers_1.ethers.constants.AddressZero, ethers_1.ethers.constants.AddressZero);
111
+ (0, chai_1.expect)(Object.keys(insufficientBalance || {})[0]).to.equal('amount');
112
+ balanceStubs.forEach((s) => s.restore());
113
+ quoteStubs.forEach((s) => s.restore());
114
+ });
115
+ it('Gets transfer remote txs', async () => {
116
+ const coreStub = sinon_1.default
117
+ .stub(warpCore, 'isApproveRequired')
118
+ .returns(Promise.resolve(false));
119
+ const adapterStubs = warpCore.tokens.map((t) => sinon_1.default.stub(t, 'getHypAdapter').returns({
120
+ quoteGasPayment: () => Promise.resolve(MOCK_QUOTE),
121
+ populateTransferRemoteTx: () => Promise.resolve({}),
122
+ }));
123
+ const testGetTxs = async (token, chain, providerType = ProviderType_1.ProviderType.EthersV5) => {
124
+ const result = await warpCore.getTransferRemoteTxs(token.amount(TRANSFER_AMOUNT), chain, ethers_1.ethers.constants.AddressZero, ethers_1.ethers.constants.AddressZero);
125
+ (0, chai_1.expect)(result.length).to.equal(1);
126
+ (0, chai_1.expect)(result[0], `transfer tx for ${token.chainName} to ${chain}`).to.eql({
127
+ category: types_1.WarpTxCategory.Transfer,
128
+ transaction: {},
129
+ type: providerType,
130
+ });
131
+ };
132
+ await testGetTxs(evmHypNative, chains_1.Chains.arbitrum);
133
+ await testGetTxs(evmHypNative, chains_1.Chains.neutron);
134
+ await testGetTxs(evmHypNative, chains_1.Chains.solana);
135
+ await testGetTxs(evmHypSynthetic, chains_1.Chains.ethereum);
136
+ await testGetTxs(sealevelHypSynthetic, chains_1.Chains.ethereum, ProviderType_1.ProviderType.SolanaWeb3);
137
+ await testGetTxs(cwHypCollateral, chains_1.Chains.arbitrum, ProviderType_1.ProviderType.CosmJsWasm);
138
+ await testGetTxs(cosmosIbc, chains_1.Chains.arbitrum, ProviderType_1.ProviderType.CosmJs);
139
+ coreStub.restore();
140
+ adapterStubs.forEach((s) => s.restore());
141
+ });
142
+ });
143
+ //# sourceMappingURL=WarpCore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarpCore.test.js","sourceRoot":"","sources":["../../src/warp/WarpCore.test.ts"],"names":[],"mappings":"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"}