@veridex/sdk 1.0.0-beta.21 → 1.0.0-beta.23
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.
- package/dist/EVMClient-CoOR_ywD.d.mts +332 -0
- package/dist/auth/prepareAuth.d.mts +1 -1
- package/dist/auth/prepareAuth.js +749 -3
- package/dist/auth/prepareAuth.js.map +1 -1
- package/dist/auth/prepareAuth.mjs +25 -1404
- package/dist/auth/prepareAuth.mjs.map +1 -1
- package/dist/chains/aptos/index.d.mts +1 -1
- package/dist/chains/aptos/index.mjs +5 -574
- package/dist/chains/aptos/index.mjs.map +1 -1
- package/dist/chains/avalanche/index.d.mts +137 -0
- package/dist/chains/avalanche/index.js +1407 -0
- package/dist/chains/avalanche/index.js.map +1 -0
- package/dist/chains/avalanche/index.mjs +10 -0
- package/dist/chains/avalanche/index.mjs.map +1 -0
- package/dist/chains/evm/index.d.mts +4 -2
- package/dist/chains/evm/index.mjs +8 -1200
- package/dist/chains/evm/index.mjs.map +1 -1
- package/dist/chains/solana/index.d.mts +1 -1
- package/dist/chains/solana/index.mjs +4 -486
- package/dist/chains/solana/index.mjs.map +1 -1
- package/dist/chains/stacks/index.d.mts +1 -1
- package/dist/chains/stacks/index.mjs +36 -1114
- package/dist/chains/stacks/index.mjs.map +1 -1
- package/dist/chains/starknet/index.d.mts +1 -1
- package/dist/chains/starknet/index.mjs +5 -503
- package/dist/chains/starknet/index.mjs.map +1 -1
- package/dist/chains/sui/index.d.mts +1 -1
- package/dist/chains/sui/index.mjs +5 -529
- package/dist/chains/sui/index.mjs.map +1 -1
- package/dist/chunk-3Q34PMHU.mjs +840 -0
- package/dist/chunk-3Q34PMHU.mjs.map +1 -0
- package/dist/chunk-72ZA3OYQ.mjs +20 -0
- package/dist/chunk-72ZA3OYQ.mjs.map +1 -0
- package/dist/chunk-7IEUU6LD.mjs +549 -0
- package/dist/chunk-7IEUU6LD.mjs.map +1 -0
- package/dist/chunk-ABLEEC5N.mjs +38 -0
- package/dist/chunk-ABLEEC5N.mjs.map +1 -0
- package/dist/chunk-AORSW75A.mjs +1101 -0
- package/dist/chunk-AORSW75A.mjs.map +1 -0
- package/dist/chunk-BKTCPT7P.mjs +269 -0
- package/dist/chunk-BKTCPT7P.mjs.map +1 -0
- package/dist/chunk-CCHASDAI.mjs +330 -0
- package/dist/chunk-CCHASDAI.mjs.map +1 -0
- package/dist/chunk-FQ2WU7PX.mjs +509 -0
- package/dist/chunk-FQ2WU7PX.mjs.map +1 -0
- package/dist/chunk-JO74ENTF.mjs +417 -0
- package/dist/chunk-JO74ENTF.mjs.map +1 -0
- package/dist/chunk-K73Y36KS.mjs +407 -0
- package/dist/chunk-K73Y36KS.mjs.map +1 -0
- package/dist/chunk-KHV3EP3I.mjs +179 -0
- package/dist/chunk-KHV3EP3I.mjs.map +1 -0
- package/dist/chunk-MMSTOW4F.mjs +722 -0
- package/dist/chunk-MMSTOW4F.mjs.map +1 -0
- package/dist/chunk-MWZ5UHCF.mjs +1082 -0
- package/dist/chunk-MWZ5UHCF.mjs.map +1 -0
- package/dist/chunk-NU6JGI7L.mjs +565 -0
- package/dist/chunk-NU6JGI7L.mjs.map +1 -0
- package/dist/chunk-PIC2Y5DF.mjs +422 -0
- package/dist/chunk-PIC2Y5DF.mjs.map +1 -0
- package/dist/chunk-PPN7BG3A.mjs +464 -0
- package/dist/chunk-PPN7BG3A.mjs.map +1 -0
- package/dist/chunk-RSV7J43V.mjs +438 -0
- package/dist/chunk-RSV7J43V.mjs.map +1 -0
- package/dist/chunk-UTT6KI7N.mjs +216 -0
- package/dist/chunk-UTT6KI7N.mjs.map +1 -0
- package/dist/constants.mjs +16 -389
- package/dist/constants.mjs.map +1 -1
- package/dist/index-Du1PoZqu.d.mts +216 -0
- package/dist/index.d.mts +131 -9
- package/dist/index.js +12064 -11594
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4407 -12273
- package/dist/index.mjs.map +1 -1
- package/dist/passkey.d.mts +142 -0
- package/dist/passkey.js +807 -0
- package/dist/passkey.js.map +1 -0
- package/dist/passkey.mjs +15 -0
- package/dist/passkey.mjs.map +1 -0
- package/dist/payload.mjs +25 -244
- package/dist/payload.mjs.map +1 -1
- package/dist/portfolio-UV3LLWKI.mjs +13 -0
- package/dist/portfolio-UV3LLWKI.mjs.map +1 -0
- package/dist/queries/index.js +39 -1
- package/dist/queries/index.js.map +1 -1
- package/dist/queries/index.mjs +14 -1591
- package/dist/queries/index.mjs.map +1 -1
- package/dist/{types-DakHNZIP.d.ts → types-Bmk689Lw.d.mts} +1 -1
- package/dist/types.d.mts +10 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.mjs +19 -385
- package/dist/utils.mjs.map +1 -1
- package/dist/wormhole.mjs +25 -397
- package/dist/wormhole.mjs.map +1 -1
- package/package.json +17 -3
- package/scripts/patch-noble-curves.js +78 -0
- package/dist/auth/prepareAuth.d.ts +0 -25
- package/dist/chains/aptos/index.d.ts +0 -146
- package/dist/chains/evm/index.d.ts +0 -5
- package/dist/chains/solana/index.d.ts +0 -116
- package/dist/chains/stacks/index.d.ts +0 -559
- package/dist/chains/starknet/index.d.ts +0 -172
- package/dist/chains/sui/index.d.ts +0 -182
- package/dist/constants.d.ts +0 -150
- package/dist/index-Dy29mvBf.d.mts +0 -683
- package/dist/index-eXXqodd0.d.ts +0 -683
- package/dist/index.d.ts +0 -3442
- package/dist/payload.d.ts +0 -125
- package/dist/queries/index.d.ts +0 -148
- package/dist/types-DakHNZIP.d.mts +0 -571
- package/dist/types-DvFRnIBd.d.ts +0 -172
- package/dist/types.d.ts +0 -413
- package/dist/utils.d.ts +0 -81
- package/dist/wormhole.d.ts +0 -167
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EVMClient
|
|
3
|
+
} from "./chunk-AORSW75A.mjs";
|
|
4
|
+
|
|
5
|
+
// src/chains/avalanche/AvalancheClient.ts
|
|
6
|
+
import { ethers } from "ethers";
|
|
7
|
+
var ACP204_PRECOMPILE = "0x0000000000000000000000000000000000000100";
|
|
8
|
+
var CHAINLINK_AGGREGATOR_ABI = [
|
|
9
|
+
"function latestRoundData() view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)",
|
|
10
|
+
"function decimals() view returns (uint8)"
|
|
11
|
+
];
|
|
12
|
+
var ICM_SPOKE_ABI = [
|
|
13
|
+
"function verifySession(bytes32 sessionKeyHash, uint256 amount) view returns (bool valid, uint256 remainingBudget)",
|
|
14
|
+
"function getSession(bytes32 sessionKeyHash) view returns (bytes32 userKeyHash, uint256 expiry, uint256 maxValue, uint256 totalBudget, uint256 spent, bool active)",
|
|
15
|
+
"function getStatus() view returns (bool paused, uint256 totalMessages, uint256 totalSessions, uint256 totalPayments)",
|
|
16
|
+
"function isKeyAuthorized(bytes32 identityKeyHash, bytes32 keyHash) view returns (bool)"
|
|
17
|
+
];
|
|
18
|
+
var P256_VERIFIER_ABI = [
|
|
19
|
+
"function isPrecompileAvailable() view returns (bool available)",
|
|
20
|
+
"function computeKeyHash(uint256 x, uint256 y) view returns (bytes32)"
|
|
21
|
+
];
|
|
22
|
+
var AvalancheClient = class extends EVMClient {
|
|
23
|
+
avaxProvider;
|
|
24
|
+
p256VerifierAddress;
|
|
25
|
+
icmSpokeAddress;
|
|
26
|
+
chainlinkAvaxUsdFeed;
|
|
27
|
+
chainlinkUsdcUsdFeed;
|
|
28
|
+
chainlinkUsdtUsdFeed;
|
|
29
|
+
// Price cache (avoid excessive RPC calls)
|
|
30
|
+
priceCache = /* @__PURE__ */ new Map();
|
|
31
|
+
CACHE_TTL_MS = 3e4;
|
|
32
|
+
// 30 seconds
|
|
33
|
+
constructor(config) {
|
|
34
|
+
super(config);
|
|
35
|
+
this.avaxProvider = new ethers.JsonRpcProvider(config.rpcUrl);
|
|
36
|
+
this.p256VerifierAddress = config.p256VerifierAddress || "";
|
|
37
|
+
this.icmSpokeAddress = config.icmSpokeAddress || "";
|
|
38
|
+
this.chainlinkAvaxUsdFeed = config.chainlinkAvaxUsdFeed || "";
|
|
39
|
+
this.chainlinkUsdcUsdFeed = config.chainlinkUsdcUsdFeed || "";
|
|
40
|
+
this.chainlinkUsdtUsdFeed = config.chainlinkUsdtUsdFeed || "";
|
|
41
|
+
}
|
|
42
|
+
// ========================================================================
|
|
43
|
+
// ACP-204 Precompile Utilities
|
|
44
|
+
// ========================================================================
|
|
45
|
+
/**
|
|
46
|
+
* Check if the ACP-204 secp256r1 precompile is live on this chain.
|
|
47
|
+
* Returns true on Avalanche C-Chain (mainnet + Fuji), false elsewhere.
|
|
48
|
+
*/
|
|
49
|
+
async isACP204Available() {
|
|
50
|
+
if (this.p256VerifierAddress) {
|
|
51
|
+
try {
|
|
52
|
+
const verifier = new ethers.Contract(
|
|
53
|
+
this.p256VerifierAddress,
|
|
54
|
+
P256_VERIFIER_ABI,
|
|
55
|
+
this.avaxProvider
|
|
56
|
+
);
|
|
57
|
+
return await verifier.isPrecompileAvailable();
|
|
58
|
+
} catch {
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const zeroInput = new Uint8Array(160);
|
|
63
|
+
const result = await this.avaxProvider.call({
|
|
64
|
+
to: ACP204_PRECOMPILE,
|
|
65
|
+
data: ethers.hexlify(zeroInput)
|
|
66
|
+
});
|
|
67
|
+
return result.length === 66;
|
|
68
|
+
} catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the estimated gas cost (in wei) for a single P-256 verification.
|
|
74
|
+
* Deterministic on Avalanche: 6,900 gas for precompile + ~300 staticcall overhead.
|
|
75
|
+
*/
|
|
76
|
+
async estimatePasskeyVerificationGas() {
|
|
77
|
+
const feeData = await this.avaxProvider.getFeeData();
|
|
78
|
+
const gasPrice = feeData.gasPrice || ethers.parseUnits("25", "gwei");
|
|
79
|
+
return 7200n * gasPrice;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get estimated USD cost for a passkey verification.
|
|
83
|
+
*/
|
|
84
|
+
async estimatePasskeyVerificationCostUSD() {
|
|
85
|
+
const gasCostWei = await this.estimatePasskeyVerificationGas();
|
|
86
|
+
return this.convertAvaxToUsd(gasCostWei);
|
|
87
|
+
}
|
|
88
|
+
// ========================================================================
|
|
89
|
+
// Chainlink Price Feeds
|
|
90
|
+
// ========================================================================
|
|
91
|
+
/**
|
|
92
|
+
* Get current AVAX/USD price from Chainlink.
|
|
93
|
+
* Cached for 30 seconds to avoid excessive RPC calls.
|
|
94
|
+
*/
|
|
95
|
+
async getAvaxPriceUSD() {
|
|
96
|
+
return this._getChainlinkPrice(this.chainlinkAvaxUsdFeed, "avax-usd");
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get USDC/USD price (for stablecoin verification).
|
|
100
|
+
*/
|
|
101
|
+
async getUsdcPriceUSD() {
|
|
102
|
+
if (!this.chainlinkUsdcUsdFeed) return 1;
|
|
103
|
+
return this._getChainlinkPrice(this.chainlinkUsdcUsdFeed, "usdc-usd");
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get USDT/USD price.
|
|
107
|
+
*/
|
|
108
|
+
async getUsdtPriceUSD() {
|
|
109
|
+
if (!this.chainlinkUsdtUsdFeed) return 1;
|
|
110
|
+
return this._getChainlinkPrice(this.chainlinkUsdtUsdFeed, "usdt-usd");
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Convert a USD amount to AVAX wei using live Chainlink prices.
|
|
114
|
+
*/
|
|
115
|
+
async convertUsdToAvax(usdAmount) {
|
|
116
|
+
const avaxPrice = await this.getAvaxPriceUSD();
|
|
117
|
+
if (avaxPrice <= 0) throw new Error("Invalid AVAX price from Chainlink");
|
|
118
|
+
const avaxAmount = usdAmount / avaxPrice;
|
|
119
|
+
return ethers.parseEther(avaxAmount.toFixed(18));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Convert AVAX wei to USD using live Chainlink prices.
|
|
123
|
+
*/
|
|
124
|
+
async convertAvaxToUsd(avaxWei) {
|
|
125
|
+
const avaxPrice = await this.getAvaxPriceUSD();
|
|
126
|
+
return Number(ethers.formatEther(avaxWei)) * avaxPrice;
|
|
127
|
+
}
|
|
128
|
+
// ========================================================================
|
|
129
|
+
// ICM Spoke Queries
|
|
130
|
+
// ========================================================================
|
|
131
|
+
/**
|
|
132
|
+
* Verify a session is valid on the ICM Spoke (cross-L1 verification).
|
|
133
|
+
*/
|
|
134
|
+
async verifyICMSession(sessionKeyHash, amount) {
|
|
135
|
+
if (!this.icmSpokeAddress) {
|
|
136
|
+
throw new Error("ICM Spoke address not configured");
|
|
137
|
+
}
|
|
138
|
+
const spoke = new ethers.Contract(this.icmSpokeAddress, ICM_SPOKE_ABI, this.avaxProvider);
|
|
139
|
+
const [valid, remainingBudget] = await spoke.verifySession(sessionKeyHash, amount);
|
|
140
|
+
return { valid, remainingBudget: BigInt(remainingBudget) };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get status of the ICM Spoke (paused, message count, session count).
|
|
144
|
+
*/
|
|
145
|
+
async getICMSpokeStatus() {
|
|
146
|
+
if (!this.icmSpokeAddress) {
|
|
147
|
+
throw new Error("ICM Spoke address not configured");
|
|
148
|
+
}
|
|
149
|
+
const spoke = new ethers.Contract(this.icmSpokeAddress, ICM_SPOKE_ABI, this.avaxProvider);
|
|
150
|
+
const [paused, totalMessages, totalSessions, totalPayments] = await spoke.getStatus();
|
|
151
|
+
return {
|
|
152
|
+
paused,
|
|
153
|
+
totalMessages: BigInt(totalMessages),
|
|
154
|
+
totalSessions: BigInt(totalSessions),
|
|
155
|
+
totalPayments: BigInt(totalPayments)
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if a key is authorized for an identity on the ICM Spoke.
|
|
160
|
+
*/
|
|
161
|
+
async isKeyAuthorizedOnSpoke(identityKeyHash, keyHash) {
|
|
162
|
+
if (!this.icmSpokeAddress) return false;
|
|
163
|
+
const spoke = new ethers.Contract(this.icmSpokeAddress, ICM_SPOKE_ABI, this.avaxProvider);
|
|
164
|
+
return spoke.isKeyAuthorized(identityKeyHash, keyHash);
|
|
165
|
+
}
|
|
166
|
+
// ========================================================================
|
|
167
|
+
// ICM-Aware Routing
|
|
168
|
+
// ========================================================================
|
|
169
|
+
/**
|
|
170
|
+
* Determine whether a cross-chain message should use Teleporter (ICM) or Wormhole.
|
|
171
|
+
*
|
|
172
|
+
* Rule: If the target chain is within the Avalanche ecosystem (C-Chain ID or
|
|
173
|
+
* an Avalanche L1), use ICM/Teleporter for lower latency and no guardian overhead.
|
|
174
|
+
* Otherwise, fall back to Wormhole VAAs for cross-ecosystem messaging.
|
|
175
|
+
*
|
|
176
|
+
* @param targetWormholeChainId Wormhole chain ID of the destination
|
|
177
|
+
* @returns 'icm' | 'wormhole'
|
|
178
|
+
*/
|
|
179
|
+
getRoutingStrategy(targetWormholeChainId) {
|
|
180
|
+
const avalancheEcosystemChainIds = /* @__PURE__ */ new Set([6]);
|
|
181
|
+
return avalancheEcosystemChainIds.has(targetWormholeChainId) ? "icm" : "wormhole";
|
|
182
|
+
}
|
|
183
|
+
// ========================================================================
|
|
184
|
+
// Accessors
|
|
185
|
+
// ========================================================================
|
|
186
|
+
getP256VerifierAddress() {
|
|
187
|
+
return this.p256VerifierAddress;
|
|
188
|
+
}
|
|
189
|
+
getICMSpokeAddress() {
|
|
190
|
+
return this.icmSpokeAddress;
|
|
191
|
+
}
|
|
192
|
+
getChainlinkAvaxUsdFeed() {
|
|
193
|
+
return this.chainlinkAvaxUsdFeed;
|
|
194
|
+
}
|
|
195
|
+
// ========================================================================
|
|
196
|
+
// Private Helpers
|
|
197
|
+
// ========================================================================
|
|
198
|
+
async _getChainlinkPrice(feedAddress, cacheKey) {
|
|
199
|
+
if (!feedAddress) throw new Error(`Chainlink feed not configured for ${cacheKey}`);
|
|
200
|
+
const cached = this.priceCache.get(cacheKey);
|
|
201
|
+
if (cached && Date.now() - cached.timestamp < this.CACHE_TTL_MS) {
|
|
202
|
+
return cached.price;
|
|
203
|
+
}
|
|
204
|
+
const aggregator = new ethers.Contract(feedAddress, CHAINLINK_AGGREGATOR_ABI, this.avaxProvider);
|
|
205
|
+
const [, answer] = await aggregator.latestRoundData();
|
|
206
|
+
const decimals = await aggregator.decimals();
|
|
207
|
+
const price = Number(answer) / 10 ** Number(decimals);
|
|
208
|
+
this.priceCache.set(cacheKey, { price, timestamp: Date.now() });
|
|
209
|
+
return price;
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
export {
|
|
214
|
+
AvalancheClient
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=chunk-UTT6KI7N.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/chains/avalanche/AvalancheClient.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK — Avalanche Chain Client\n *\n * Extends the standard EVMClient with Avalanche-native capabilities:\n * - ACP-204 precompile detection (native secp256r1 at 0x0100, 6,900 gas)\n * - ICM / Teleporter routing awareness for intra-Avalanche L1 messaging\n * - Chainlink AVAX/USD price feeds for USD-denominated session limits\n *\n * @example\n * ```typescript\n * import { AvalancheClient } from '@veridex/sdk/chains/avalanche';\n *\n * const client = new AvalancheClient({\n * chainId: 43113,\n * wormholeChainId: 6,\n * rpcUrl: 'https://api.avax-test.network/ext/bc/C/rpc',\n * hubContractAddress: '0x...',\n * wormholeCoreBridge: '0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C',\n * });\n *\n * // Check ACP-204 precompile\n * const available = await client.isACP204Available();\n *\n * // Get AVAX price for budget calculations\n * const price = await client.getAvaxPriceUSD();\n * ```\n */\n\nimport { ethers } from 'ethers';\nimport { EVMClient, type EVMClientConfig } from '../evm/EVMClient.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AvalancheClientConfig extends EVMClientConfig {\n /** ACP-204 P256 verifier wrapper contract address */\n p256VerifierAddress?: string;\n /** ICM Spoke contract address for cross-L1 session bridging */\n icmSpokeAddress?: string;\n /** Chainlink AVAX/USD price feed address */\n chainlinkAvaxUsdFeed?: string;\n /** Chainlink USDC/USD price feed address */\n chainlinkUsdcUsdFeed?: string;\n /** Chainlink USDT/USD price feed address */\n chainlinkUsdtUsdFeed?: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** ACP-204 precompile address on Avalanche C-Chain */\nconst ACP204_PRECOMPILE = '0x0000000000000000000000000000000000000100';\n\n/** Minimal Chainlink AggregatorV3 ABI */\nconst CHAINLINK_AGGREGATOR_ABI = [\n 'function latestRoundData() view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)',\n 'function decimals() view returns (uint8)',\n];\n\n/** Minimal ICM Spoke ABI for session/identity queries */\nconst ICM_SPOKE_ABI = [\n 'function verifySession(bytes32 sessionKeyHash, uint256 amount) view returns (bool valid, uint256 remainingBudget)',\n 'function getSession(bytes32 sessionKeyHash) view returns (bytes32 userKeyHash, uint256 expiry, uint256 maxValue, uint256 totalBudget, uint256 spent, bool active)',\n 'function getStatus() view returns (bool paused, uint256 totalMessages, uint256 totalSessions, uint256 totalPayments)',\n 'function isKeyAuthorized(bytes32 identityKeyHash, bytes32 keyHash) view returns (bool)',\n];\n\n/** Minimal AvalancheP256Verifier ABI */\nconst P256_VERIFIER_ABI = [\n 'function isPrecompileAvailable() view returns (bool available)',\n 'function computeKeyHash(uint256 x, uint256 y) view returns (bytes32)',\n];\n\n// ============================================================================\n// AvalancheClient\n// ============================================================================\n\n/**\n * Avalanche-specific SDK chain client.\n *\n * Wraps the standard EVMClient and adds:\n * - ACP-204 precompile availability checks\n * - Chainlink AVAX/USD price queries (for USD-denominated budgets)\n * - ICM Spoke queries (cross-L1 session verification)\n * - ICM-aware message routing (Teleporter for intra-Avalanche, Wormhole for cross-ecosystem)\n */\nexport class AvalancheClient extends EVMClient {\n private avaxProvider: ethers.JsonRpcProvider;\n private p256VerifierAddress: string;\n private icmSpokeAddress: string;\n private chainlinkAvaxUsdFeed: string;\n private chainlinkUsdcUsdFeed: string;\n private chainlinkUsdtUsdFeed: string;\n\n // Price cache (avoid excessive RPC calls)\n private priceCache: Map<string, { price: number; timestamp: number }> = new Map();\n private readonly CACHE_TTL_MS = 30_000; // 30 seconds\n\n constructor(config: AvalancheClientConfig) {\n super(config);\n this.avaxProvider = new ethers.JsonRpcProvider(config.rpcUrl);\n this.p256VerifierAddress = config.p256VerifierAddress || '';\n this.icmSpokeAddress = config.icmSpokeAddress || '';\n this.chainlinkAvaxUsdFeed = config.chainlinkAvaxUsdFeed || '';\n this.chainlinkUsdcUsdFeed = config.chainlinkUsdcUsdFeed || '';\n this.chainlinkUsdtUsdFeed = config.chainlinkUsdtUsdFeed || '';\n }\n\n // ========================================================================\n // ACP-204 Precompile Utilities\n // ========================================================================\n\n /**\n * Check if the ACP-204 secp256r1 precompile is live on this chain.\n * Returns true on Avalanche C-Chain (mainnet + Fuji), false elsewhere.\n */\n async isACP204Available(): Promise<boolean> {\n // Try via wrapper contract first (more reliable answer)\n if (this.p256VerifierAddress) {\n try {\n const verifier = new ethers.Contract(\n this.p256VerifierAddress,\n P256_VERIFIER_ABI,\n this.avaxProvider,\n );\n return await verifier.isPrecompileAvailable();\n } catch {\n // Fall through to raw check\n }\n }\n\n // Direct precompile probe\n try {\n const zeroInput = new Uint8Array(160);\n const result = await this.avaxProvider.call({\n to: ACP204_PRECOMPILE,\n data: ethers.hexlify(zeroInput),\n });\n return result.length === 66; // 32 bytes = 0x + 64 hex chars\n } catch {\n return false;\n }\n }\n\n /**\n * Get the estimated gas cost (in wei) for a single P-256 verification.\n * Deterministic on Avalanche: 6,900 gas for precompile + ~300 staticcall overhead.\n */\n async estimatePasskeyVerificationGas(): Promise<bigint> {\n const feeData = await this.avaxProvider.getFeeData();\n const gasPrice = feeData.gasPrice || ethers.parseUnits('25', 'gwei');\n return 7_200n * gasPrice;\n }\n\n /**\n * Get estimated USD cost for a passkey verification.\n */\n async estimatePasskeyVerificationCostUSD(): Promise<number> {\n const gasCostWei = await this.estimatePasskeyVerificationGas();\n return this.convertAvaxToUsd(gasCostWei);\n }\n\n // ========================================================================\n // Chainlink Price Feeds\n // ========================================================================\n\n /**\n * Get current AVAX/USD price from Chainlink.\n * Cached for 30 seconds to avoid excessive RPC calls.\n */\n async getAvaxPriceUSD(): Promise<number> {\n return this._getChainlinkPrice(this.chainlinkAvaxUsdFeed, 'avax-usd');\n }\n\n /**\n * Get USDC/USD price (for stablecoin verification).\n */\n async getUsdcPriceUSD(): Promise<number> {\n if (!this.chainlinkUsdcUsdFeed) return 1.0;\n return this._getChainlinkPrice(this.chainlinkUsdcUsdFeed, 'usdc-usd');\n }\n\n /**\n * Get USDT/USD price.\n */\n async getUsdtPriceUSD(): Promise<number> {\n if (!this.chainlinkUsdtUsdFeed) return 1.0;\n return this._getChainlinkPrice(this.chainlinkUsdtUsdFeed, 'usdt-usd');\n }\n\n /**\n * Convert a USD amount to AVAX wei using live Chainlink prices.\n */\n async convertUsdToAvax(usdAmount: number): Promise<bigint> {\n const avaxPrice = await this.getAvaxPriceUSD();\n if (avaxPrice <= 0) throw new Error('Invalid AVAX price from Chainlink');\n const avaxAmount = usdAmount / avaxPrice;\n return ethers.parseEther(avaxAmount.toFixed(18));\n }\n\n /**\n * Convert AVAX wei to USD using live Chainlink prices.\n */\n async convertAvaxToUsd(avaxWei: bigint): Promise<number> {\n const avaxPrice = await this.getAvaxPriceUSD();\n return Number(ethers.formatEther(avaxWei)) * avaxPrice;\n }\n\n // ========================================================================\n // ICM Spoke Queries\n // ========================================================================\n\n /**\n * Verify a session is valid on the ICM Spoke (cross-L1 verification).\n */\n async verifyICMSession(\n sessionKeyHash: string,\n amount: bigint,\n ): Promise<{ valid: boolean; remainingBudget: bigint }> {\n if (!this.icmSpokeAddress) {\n throw new Error('ICM Spoke address not configured');\n }\n const spoke = new ethers.Contract(this.icmSpokeAddress, ICM_SPOKE_ABI, this.avaxProvider);\n const [valid, remainingBudget] = await spoke.verifySession(sessionKeyHash, amount);\n return { valid, remainingBudget: BigInt(remainingBudget) };\n }\n\n /**\n * Get status of the ICM Spoke (paused, message count, session count).\n */\n async getICMSpokeStatus(): Promise<{\n paused: boolean;\n totalMessages: bigint;\n totalSessions: bigint;\n totalPayments: bigint;\n }> {\n if (!this.icmSpokeAddress) {\n throw new Error('ICM Spoke address not configured');\n }\n const spoke = new ethers.Contract(this.icmSpokeAddress, ICM_SPOKE_ABI, this.avaxProvider);\n const [paused, totalMessages, totalSessions, totalPayments] = await spoke.getStatus();\n return {\n paused,\n totalMessages: BigInt(totalMessages),\n totalSessions: BigInt(totalSessions),\n totalPayments: BigInt(totalPayments),\n };\n }\n\n /**\n * Check if a key is authorized for an identity on the ICM Spoke.\n */\n async isKeyAuthorizedOnSpoke(identityKeyHash: string, keyHash: string): Promise<boolean> {\n if (!this.icmSpokeAddress) return false;\n const spoke = new ethers.Contract(this.icmSpokeAddress, ICM_SPOKE_ABI, this.avaxProvider);\n return spoke.isKeyAuthorized(identityKeyHash, keyHash);\n }\n\n // ========================================================================\n // ICM-Aware Routing\n // ========================================================================\n\n /**\n * Determine whether a cross-chain message should use Teleporter (ICM) or Wormhole.\n *\n * Rule: If the target chain is within the Avalanche ecosystem (C-Chain ID or\n * an Avalanche L1), use ICM/Teleporter for lower latency and no guardian overhead.\n * Otherwise, fall back to Wormhole VAAs for cross-ecosystem messaging.\n *\n * @param targetWormholeChainId Wormhole chain ID of the destination\n * @returns 'icm' | 'wormhole'\n */\n getRoutingStrategy(targetWormholeChainId: number): 'icm' | 'wormhole' {\n // Avalanche C-Chain Wormhole chain ID is 6 on both mainnet and testnet.\n // For Avalanche L1s routed over Teleporter, they share the same ecosystem.\n // Currently only the C-Chain (6) is a known ICM target.\n const avalancheEcosystemChainIds = new Set([6]);\n return avalancheEcosystemChainIds.has(targetWormholeChainId) ? 'icm' : 'wormhole';\n }\n\n // ========================================================================\n // Accessors\n // ========================================================================\n\n getP256VerifierAddress(): string {\n return this.p256VerifierAddress;\n }\n\n getICMSpokeAddress(): string {\n return this.icmSpokeAddress;\n }\n\n getChainlinkAvaxUsdFeed(): string {\n return this.chainlinkAvaxUsdFeed;\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n private async _getChainlinkPrice(feedAddress: string, cacheKey: string): Promise<number> {\n if (!feedAddress) throw new Error(`Chainlink feed not configured for ${cacheKey}`);\n\n const cached = this.priceCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < this.CACHE_TTL_MS) {\n return cached.price;\n }\n\n const aggregator = new ethers.Contract(feedAddress, CHAINLINK_AGGREGATOR_ABI, this.avaxProvider);\n const [, answer] = await aggregator.latestRoundData();\n const decimals = await aggregator.decimals();\n const price = Number(answer) / 10 ** Number(decimals);\n\n this.priceCache.set(cacheKey, { price, timestamp: Date.now() });\n return price;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/constants.mjs
CHANGED
|
@@ -1,392 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
TERRA: 3,
|
|
18
|
-
BSC: 4,
|
|
19
|
-
POLYGON: 5,
|
|
20
|
-
AVALANCHE: 6,
|
|
21
|
-
OASIS: 7,
|
|
22
|
-
ALGORAND: 8,
|
|
23
|
-
AURORA: 9,
|
|
24
|
-
FANTOM: 10,
|
|
25
|
-
KARURA: 11,
|
|
26
|
-
ACALA: 12,
|
|
27
|
-
KLAYTN: 13,
|
|
28
|
-
CELO: 14,
|
|
29
|
-
NEAR: 15,
|
|
30
|
-
MOONBEAM: 16,
|
|
31
|
-
NEON: 17,
|
|
32
|
-
TERRA2: 18,
|
|
33
|
-
INJECTIVE: 19,
|
|
34
|
-
OSMOSIS: 20,
|
|
35
|
-
SUI: 21,
|
|
36
|
-
APTOS: 22,
|
|
37
|
-
ARBITRUM: 23,
|
|
38
|
-
OPTIMISM: 24,
|
|
39
|
-
GNOSIS: 25,
|
|
40
|
-
PYTHNET: 26,
|
|
41
|
-
XPLA: 28,
|
|
42
|
-
BASE: 30,
|
|
43
|
-
SEI: 32,
|
|
44
|
-
ROOTSTOCK: 33,
|
|
45
|
-
SCROLL: 34,
|
|
46
|
-
MANTLE: 35,
|
|
47
|
-
BLAST: 36,
|
|
48
|
-
XLAYER: 37,
|
|
49
|
-
LINEA: 38,
|
|
50
|
-
BERACHAIN: 39,
|
|
51
|
-
SEIEVM: 40
|
|
52
|
-
},
|
|
53
|
-
TESTNET: {
|
|
54
|
-
SOLANA_DEVNET: 1,
|
|
55
|
-
GOERLI: 2,
|
|
56
|
-
BSC_TESTNET: 4,
|
|
57
|
-
POLYGON_MUMBAI: 5,
|
|
58
|
-
AVALANCHE_FUJI: 6,
|
|
59
|
-
FANTOM_TESTNET: 10,
|
|
60
|
-
CELO_ALFAJORES: 14,
|
|
61
|
-
MOONBASE_ALPHA: 16,
|
|
62
|
-
SUI_TESTNET: 21,
|
|
63
|
-
APTOS_TESTNET: 22,
|
|
64
|
-
SEPOLIA: 10002,
|
|
65
|
-
ARBITRUM_SEPOLIA: 10003,
|
|
66
|
-
BASE_SEPOLIA: 10004,
|
|
67
|
-
OPTIMISM_SEPOLIA: 10005,
|
|
68
|
-
HOLESKY: 10006,
|
|
69
|
-
POLYGON_SEPOLIA: 10007,
|
|
70
|
-
SEI_ATLANTIC_2: 10066,
|
|
71
|
-
// Sei Arctic-1 testnet (EVM)
|
|
72
|
-
STARKNET_SEPOLIA: 50001
|
|
73
|
-
// Custom bridge (non-Wormhole, relayer-attested)
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
var WORMHOLE_CHAIN_IDS_FLAT = {
|
|
77
|
-
// Mainnets
|
|
78
|
-
SOLANA: 1,
|
|
79
|
-
ETHEREUM: 2,
|
|
80
|
-
TERRA: 3,
|
|
81
|
-
BSC: 4,
|
|
82
|
-
POLYGON: 5,
|
|
83
|
-
AVALANCHE: 6,
|
|
84
|
-
OASIS: 7,
|
|
85
|
-
ALGORAND: 8,
|
|
86
|
-
AURORA: 9,
|
|
87
|
-
FANTOM: 10,
|
|
88
|
-
KARURA: 11,
|
|
89
|
-
ACALA: 12,
|
|
90
|
-
KLAYTN: 13,
|
|
91
|
-
CELO: 14,
|
|
92
|
-
NEAR: 15,
|
|
93
|
-
MOONBEAM: 16,
|
|
94
|
-
NEON: 17,
|
|
95
|
-
TERRA2: 18,
|
|
96
|
-
INJECTIVE: 19,
|
|
97
|
-
OSMOSIS: 20,
|
|
98
|
-
SUI: 21,
|
|
99
|
-
APTOS: 22,
|
|
100
|
-
ARBITRUM: 23,
|
|
101
|
-
OPTIMISM: 24,
|
|
102
|
-
GNOSIS: 25,
|
|
103
|
-
PYTHNET: 26,
|
|
104
|
-
XPLA: 28,
|
|
105
|
-
BASE: 30,
|
|
106
|
-
SEI: 32,
|
|
107
|
-
ROOTSTOCK: 33,
|
|
108
|
-
SCROLL: 34,
|
|
109
|
-
MANTLE: 35,
|
|
110
|
-
BLAST: 36,
|
|
111
|
-
XLAYER: 37,
|
|
112
|
-
LINEA: 38,
|
|
113
|
-
BERACHAIN: 39,
|
|
114
|
-
SEIEVM: 40,
|
|
115
|
-
// Testnets
|
|
116
|
-
SOLANA_DEVNET: 1,
|
|
117
|
-
GOERLI: 2,
|
|
118
|
-
BSC_TESTNET: 4,
|
|
119
|
-
POLYGON_MUMBAI: 5,
|
|
120
|
-
AVALANCHE_FUJI: 6,
|
|
121
|
-
FANTOM_TESTNET: 10,
|
|
122
|
-
CELO_ALFAJORES: 14,
|
|
123
|
-
MOONBASE_ALPHA: 16,
|
|
124
|
-
SUI_TESTNET: 21,
|
|
125
|
-
APTOS_TESTNET: 22,
|
|
126
|
-
ARBITRUM_SEPOLIA: 10003,
|
|
127
|
-
BASE_SEPOLIA: 10004,
|
|
128
|
-
OPTIMISM_SEPOLIA: 10005,
|
|
129
|
-
POLYGON_SEPOLIA: 10007,
|
|
130
|
-
HOLESKY: 10006,
|
|
131
|
-
STARKNET_SEPOLIA: 50001
|
|
132
|
-
// Custom bridge (non-Wormhole)
|
|
133
|
-
};
|
|
134
|
-
var TESTNET_CHAINS = {
|
|
135
|
-
baseSepolia: {
|
|
136
|
-
name: "Base Sepolia",
|
|
137
|
-
chainId: 84532,
|
|
138
|
-
wormholeChainId: 10004,
|
|
139
|
-
rpcUrl: "https://sepolia.base.org",
|
|
140
|
-
// Public CORS-friendly RPC
|
|
141
|
-
explorerUrl: "https://sepolia.basescan.org",
|
|
142
|
-
isEvm: true,
|
|
143
|
-
contracts: {
|
|
144
|
-
hub: "0x66D87dE68327f48A099c5B9bE97020Feab9a7c82",
|
|
145
|
-
vaultFactory: "0xCFaEb5652aa2Ee60b2229dC8895B4159749C7e53",
|
|
146
|
-
vaultImplementation: "0x0d13367C16c6f0B24eD275CC67C7D9f42878285c",
|
|
147
|
-
wormholeCoreBridge: "0x79A1027a6A159502049F10906D333EC57E95F083",
|
|
148
|
-
tokenBridge: "0x86F55A04690fd7815A3D802bD587e83eA888B239"
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
ethereumSepolia: {
|
|
152
|
-
name: "Ethereum Sepolia",
|
|
153
|
-
chainId: 11155111,
|
|
154
|
-
wormholeChainId: 10002,
|
|
155
|
-
rpcUrl: "https://ethereum-sepolia-rpc.publicnode.com",
|
|
156
|
-
explorerUrl: "https://sepolia.etherscan.io",
|
|
157
|
-
isEvm: true,
|
|
158
|
-
contracts: {
|
|
159
|
-
vaultFactory: "0x07F608AFf6d63b68029488b726d895c4Bb593038",
|
|
160
|
-
vaultImplementation: "0xD66153fccFB6731fB6c4944FbD607ba86A76a1f6",
|
|
161
|
-
wormholeCoreBridge: "0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78",
|
|
162
|
-
tokenBridge: "0xDB5492265f6038831E89f495670FF909aDe94bd9"
|
|
163
|
-
}
|
|
164
|
-
},
|
|
165
|
-
optimismSepolia: {
|
|
166
|
-
name: "Optimism Sepolia",
|
|
167
|
-
chainId: 11155420,
|
|
168
|
-
wormholeChainId: 10005,
|
|
169
|
-
rpcUrl: "https://sepolia.optimism.io",
|
|
170
|
-
explorerUrl: "https://sepolia-optimism.etherscan.io",
|
|
171
|
-
isEvm: true,
|
|
172
|
-
contracts: {
|
|
173
|
-
vaultFactory: "0xA5653d54079ABeCe780F8d9597B2bc4B09fe464A",
|
|
174
|
-
vaultImplementation: "0x8099b1406485d2255ff89Ce5Ea18520802AFC150",
|
|
175
|
-
wormholeCoreBridge: "0x31377888146f3253211EFEf5c676D41ECe7D58Fe",
|
|
176
|
-
tokenBridge: "0x99737Ec4B815d816c49A385943baf0380e75c0Ac"
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
arbitrumSepolia: {
|
|
180
|
-
name: "Arbitrum Sepolia",
|
|
181
|
-
chainId: 421614,
|
|
182
|
-
wormholeChainId: 10003,
|
|
183
|
-
rpcUrl: "https://sepolia-rollup.arbitrum.io/rpc",
|
|
184
|
-
explorerUrl: "https://sepolia.arbiscan.io",
|
|
185
|
-
isEvm: true,
|
|
186
|
-
contracts: {
|
|
187
|
-
vaultFactory: "0xd36D3D5DB59d78f1E33813490F72DABC15C9B07c",
|
|
188
|
-
vaultImplementation: "0xB10ACf39eBF17fc33F722cBD955b7aeCB0611bc4",
|
|
189
|
-
wormholeCoreBridge: "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35",
|
|
190
|
-
tokenBridge: "0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e"
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
seiTestnet: {
|
|
194
|
-
name: "Sei Atlantic-2",
|
|
195
|
-
chainId: 1328,
|
|
196
|
-
wormholeChainId: 40,
|
|
197
|
-
rpcUrl: "https://evm-rpc-testnet.sei-apis.com",
|
|
198
|
-
explorerUrl: "https://seitrace.com/?chain=atlantic-2",
|
|
199
|
-
isEvm: true,
|
|
200
|
-
contracts: {
|
|
201
|
-
vaultFactory: "0x07F608AFf6d63b68029488b726d895c4Bb593038",
|
|
202
|
-
vaultImplementation: "0xD66153fccFB6731fB6c4944FbD607ba86A76a1f6",
|
|
203
|
-
wormholeCoreBridge: "0x0000000000000000000000000000000000000000"
|
|
204
|
-
// Mock - not yet deployed
|
|
205
|
-
}
|
|
206
|
-
},
|
|
207
|
-
solanaDevnet: {
|
|
208
|
-
name: "Solana Devnet",
|
|
209
|
-
chainId: 0,
|
|
210
|
-
wormholeChainId: 1,
|
|
211
|
-
rpcUrl: "https://api.devnet.solana.com",
|
|
212
|
-
explorerUrl: "https://explorer.solana.com",
|
|
213
|
-
isEvm: false,
|
|
214
|
-
contracts: {
|
|
215
|
-
hub: "AnyXHsqq9c2BiW4WgBcj6Aye7Ua7a7L7iSuwpfJxECJM",
|
|
216
|
-
wormholeCoreBridge: "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5",
|
|
217
|
-
tokenBridge: "DZnkkTmCiFWfYTfT41X3Rd1kDgozqzxWaHqsw6W4x2oe"
|
|
218
|
-
}
|
|
219
|
-
},
|
|
220
|
-
aptosTestnet: {
|
|
221
|
-
name: "Aptos Testnet",
|
|
222
|
-
chainId: 0,
|
|
223
|
-
wormholeChainId: 22,
|
|
224
|
-
rpcUrl: "https://fullnode.testnet.aptoslabs.com/v1",
|
|
225
|
-
explorerUrl: "https://explorer.aptoslabs.com",
|
|
226
|
-
isEvm: false,
|
|
227
|
-
contracts: {
|
|
228
|
-
hub: "0x0237e04f74b991b5b6030a793779663033f4ff4a1682a9e66c1f41fc1ec3e2a4",
|
|
229
|
-
wormholeCoreBridge: "0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625",
|
|
230
|
-
tokenBridge: "0x576410486a2da45eee6c949c995670112ddf2fbeedab20350d506328eefc9d4f"
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
suiTestnet: {
|
|
234
|
-
name: "Sui Testnet",
|
|
235
|
-
chainId: 0,
|
|
236
|
-
wormholeChainId: 21,
|
|
237
|
-
rpcUrl: "https://fullnode.testnet.sui.io:443",
|
|
238
|
-
explorerUrl: "https://suiscan.xyz/testnet",
|
|
239
|
-
isEvm: false,
|
|
240
|
-
contracts: {
|
|
241
|
-
hub: "0x35e99fdbbc1cde7e093da6f9e758ba2c4a077904bd64caee2fa6db5e6c4e9e37",
|
|
242
|
-
wormholeCoreBridge: "0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790"
|
|
243
|
-
}
|
|
244
|
-
},
|
|
245
|
-
starknetSepolia: {
|
|
246
|
-
name: "Starknet Sepolia",
|
|
247
|
-
chainId: 0,
|
|
248
|
-
// Native Starknet chain ID (SN_SEPOLIA = 0x534e5f5345504f4c4941)
|
|
249
|
-
wormholeChainId: 50001,
|
|
250
|
-
// Custom chain ID (50000+ reserved for non-Wormhole chains)
|
|
251
|
-
rpcUrl: "https://starknet-sepolia.g.alchemy.com/starknet/version/rpc/v0_7/tsOnfTBZDKMXcUA26OED-",
|
|
252
|
-
explorerUrl: "https://sepolia.starkscan.co",
|
|
253
|
-
isEvm: false,
|
|
254
|
-
contracts: {
|
|
255
|
-
// Starknet spoke contract
|
|
256
|
-
hub: "0x68adcc730ed6c355200d00f763825448497b9cdf7936ca121711e078c88e811",
|
|
257
|
-
// Custom bridge contract (NOT Wormhole)
|
|
258
|
-
wormholeCoreBridge: "0x2c458c1ae64556482b05cc2d3ee5b032ed114d68429dda2062c9849a5a725f8"
|
|
259
|
-
},
|
|
260
|
-
// Hub chain ID that Starknet bridge validates (Base Sepolia = 10004)
|
|
261
|
-
hubChainId: 10004
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
var MAINNET_CHAINS = {
|
|
265
|
-
ethereum: {
|
|
266
|
-
name: "Ethereum",
|
|
267
|
-
chainId: 1,
|
|
268
|
-
wormholeChainId: 2,
|
|
269
|
-
rpcUrl: "https://eth.llamarpc.com",
|
|
270
|
-
explorerUrl: "https://etherscan.io",
|
|
271
|
-
isEvm: true,
|
|
272
|
-
contracts: {
|
|
273
|
-
wormholeCoreBridge: "0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B",
|
|
274
|
-
tokenBridge: "0x3ee18B2214AFF97000D974cf647E7C347E8fa585"
|
|
275
|
-
}
|
|
276
|
-
},
|
|
277
|
-
base: {
|
|
278
|
-
name: "Base",
|
|
279
|
-
chainId: 8453,
|
|
280
|
-
wormholeChainId: 30,
|
|
281
|
-
rpcUrl: "https://mainnet.base.org",
|
|
282
|
-
explorerUrl: "https://basescan.org",
|
|
283
|
-
isEvm: true,
|
|
284
|
-
contracts: {
|
|
285
|
-
wormholeCoreBridge: "0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6",
|
|
286
|
-
tokenBridge: "0x8d2de8d2f73F1F4cAB472AC9A881C9b123C79627"
|
|
287
|
-
}
|
|
288
|
-
},
|
|
289
|
-
optimism: {
|
|
290
|
-
name: "Optimism",
|
|
291
|
-
chainId: 10,
|
|
292
|
-
wormholeChainId: 24,
|
|
293
|
-
rpcUrl: "https://mainnet.optimism.io",
|
|
294
|
-
explorerUrl: "https://optimistic.etherscan.io",
|
|
295
|
-
isEvm: true,
|
|
296
|
-
contracts: {
|
|
297
|
-
wormholeCoreBridge: "0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722",
|
|
298
|
-
tokenBridge: "0x1D68124e65faFC907325e3EDbF8c4d84499DAa8b"
|
|
299
|
-
}
|
|
300
|
-
},
|
|
301
|
-
arbitrum: {
|
|
302
|
-
name: "Arbitrum",
|
|
303
|
-
chainId: 42161,
|
|
304
|
-
wormholeChainId: 23,
|
|
305
|
-
rpcUrl: "https://arb1.arbitrum.io/rpc",
|
|
306
|
-
explorerUrl: "https://arbiscan.io",
|
|
307
|
-
isEvm: true,
|
|
308
|
-
contracts: {
|
|
309
|
-
wormholeCoreBridge: "0xa5f208e072434bC67592E4C49C1B991BA79BCA46",
|
|
310
|
-
tokenBridge: "0x0b2402144Bb366A632D14B83F244D2e0e21bD39c"
|
|
311
|
-
}
|
|
312
|
-
},
|
|
313
|
-
polygon: {
|
|
314
|
-
name: "Polygon",
|
|
315
|
-
chainId: 137,
|
|
316
|
-
wormholeChainId: 5,
|
|
317
|
-
rpcUrl: "https://polygon-rpc.com",
|
|
318
|
-
explorerUrl: "https://polygonscan.com",
|
|
319
|
-
isEvm: true,
|
|
320
|
-
contracts: {
|
|
321
|
-
wormholeCoreBridge: "0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7",
|
|
322
|
-
tokenBridge: "0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE"
|
|
323
|
-
}
|
|
324
|
-
},
|
|
325
|
-
solana: {
|
|
326
|
-
name: "Solana",
|
|
327
|
-
chainId: 0,
|
|
328
|
-
wormholeChainId: 1,
|
|
329
|
-
rpcUrl: "https://api.mainnet-beta.solana.com",
|
|
330
|
-
explorerUrl: "https://explorer.solana.com",
|
|
331
|
-
isEvm: false,
|
|
332
|
-
contracts: {
|
|
333
|
-
wormholeCoreBridge: "worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth",
|
|
334
|
-
tokenBridge: "wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb"
|
|
335
|
-
}
|
|
336
|
-
},
|
|
337
|
-
aptos: {
|
|
338
|
-
name: "Aptos",
|
|
339
|
-
chainId: 0,
|
|
340
|
-
wormholeChainId: 22,
|
|
341
|
-
rpcUrl: "https://fullnode.mainnet.aptoslabs.com/v1",
|
|
342
|
-
explorerUrl: "https://explorer.aptoslabs.com",
|
|
343
|
-
isEvm: false,
|
|
344
|
-
contracts: {
|
|
345
|
-
wormholeCoreBridge: "0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625",
|
|
346
|
-
tokenBridge: "0x576410486a2da45eee6c949c995670112ddf2fbeedab20350d506328eefc9d4f"
|
|
347
|
-
}
|
|
348
|
-
},
|
|
349
|
-
sui: {
|
|
350
|
-
name: "Sui",
|
|
351
|
-
chainId: 0,
|
|
352
|
-
wormholeChainId: 21,
|
|
353
|
-
rpcUrl: "https://fullnode.mainnet.sui.io:443",
|
|
354
|
-
explorerUrl: "https://suiscan.xyz/mainnet",
|
|
355
|
-
isEvm: false,
|
|
356
|
-
contracts: {
|
|
357
|
-
wormholeCoreBridge: "0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c"
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
};
|
|
361
|
-
var WORMHOLE_API = {
|
|
362
|
-
MAINNET: "https://api.wormholescan.io",
|
|
363
|
-
TESTNET: "https://api.testnet.wormholescan.io",
|
|
364
|
-
GUARDIAN_RPC_MAINNET: "https://wormhole-v2-mainnet-api.certus.one",
|
|
365
|
-
GUARDIAN_RPC_TESTNET: "https://wormhole-v2-testnet-api.certus.one"
|
|
366
|
-
};
|
|
367
|
-
var HUB_ABI = [
|
|
368
|
-
"function authenticateAndDispatch((bytes authenticatorData, string clientDataJSON, uint256 challengeIndex, uint256 typeIndex, uint256 r, uint256 s) auth, uint256 publicKeyX, uint256 publicKeyY, uint16 targetChain, bytes actionPayload) external payable returns (uint64 sequence)",
|
|
369
|
-
"function authenticateRawAndDispatch(uint256 r, uint256 s, bytes32 messageHash, uint256 publicKeyX, uint256 publicKeyY, uint16 targetChain, bytes actionPayload, uint256 nonce) external payable returns (uint64 sequence)",
|
|
370
|
-
"function userNonces(bytes32 userKeyHash) external view returns (uint256)",
|
|
371
|
-
"function encodeTransferAction(address token, address recipient, uint256 amount) external pure returns (bytes)",
|
|
372
|
-
"function encodeExecuteAction(address target, uint256 value, bytes data) external pure returns (bytes)",
|
|
373
|
-
"function encodeBridgeAction(bytes32 token, uint256 amount, uint16 targetChain, bytes32 recipient) external pure returns (bytes)",
|
|
374
|
-
"function messageFee() external view returns (uint256)",
|
|
375
|
-
"event Dispatched(bytes32 indexed userKeyHash, uint16 targetChain, uint256 nonce, uint64 sequence, bytes actionPayload)"
|
|
376
|
-
];
|
|
377
|
-
var VAULT_FACTORY_ABI = [
|
|
378
|
-
"function createVault(bytes32 userKeyHash) external returns (address)",
|
|
379
|
-
"function getVault(bytes32 userKeyHash) external view returns (address)",
|
|
380
|
-
"function vaultExists(bytes32 userKeyHash) external view returns (bool)",
|
|
381
|
-
"event VaultCreated(bytes32 indexed userKeyHash, address vault)"
|
|
382
|
-
];
|
|
383
|
-
var VAULT_ABI = [
|
|
384
|
-
"function execute(address target, uint256 value, bytes data) external returns (bytes)",
|
|
385
|
-
"function executeFromHub(bytes32 vaaHash, uint16 emitterChain, bytes32 emitterAddress, bytes payload) external",
|
|
386
|
-
"function owner() external view returns (bytes32)",
|
|
387
|
-
"function hub() external view returns (address)",
|
|
388
|
-
"receive() external payable"
|
|
389
|
-
];
|
|
1
|
+
import {
|
|
2
|
+
ACTION_BRIDGE,
|
|
3
|
+
ACTION_CONFIG,
|
|
4
|
+
ACTION_EXECUTE,
|
|
5
|
+
ACTION_TRANSFER,
|
|
6
|
+
ACTION_TYPES,
|
|
7
|
+
HUB_ABI,
|
|
8
|
+
MAINNET_CHAINS,
|
|
9
|
+
PROTOCOL_VERSION,
|
|
10
|
+
TESTNET_CHAINS,
|
|
11
|
+
VAULT_ABI,
|
|
12
|
+
VAULT_FACTORY_ABI,
|
|
13
|
+
WORMHOLE_API,
|
|
14
|
+
WORMHOLE_CHAIN_IDS,
|
|
15
|
+
WORMHOLE_CHAIN_IDS_FLAT
|
|
16
|
+
} from "./chunk-K73Y36KS.mjs";
|
|
390
17
|
export {
|
|
391
18
|
ACTION_BRIDGE,
|
|
392
19
|
ACTION_CONFIG,
|