|
|
|
@@ -503,36 +503,35 @@ export const initAddressImpl = async (
|
|
|
|
address: string,
|
|
|
|
address: string,
|
|
|
|
): Promise<{ usdcHash: string, orderVaultHash: string, exchangeRouterHash: string, wethSyntheticsRouterHash: string }> => {
|
|
|
|
): Promise<{ usdcHash: string, orderVaultHash: string, exchangeRouterHash: string, wethSyntheticsRouterHash: string }> => {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const sdk = await getClientForAddress(address);
|
|
|
|
console.log('🚀 Starting GMX V2 wallet initialization for address:', address);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const sdk = await getClientForAddress(address);
|
|
|
|
const {tokensData} = await sdk.tokens.getTokensData();
|
|
|
|
const {tokensData} = await sdk.tokens.getTokensData();
|
|
|
|
const usdcTokenData = getTokenDataFromTicker(Ticker.USDC, tokensData);
|
|
|
|
const usdcTokenData = getTokenDataFromTicker(Ticker.USDC, tokensData);
|
|
|
|
const wrapperEtherData = getTokenDataFromTicker("WETH", tokensData);
|
|
|
|
const wrapperEtherData = getTokenDataFromTicker("WETH", tokensData);
|
|
|
|
let approveAmount = usdcTokenData.prices.maxPrice; // Large enough amount for trading
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Use maximum uint256 value for unlimited approval to ensure sufficient allowance for all trading scenarios
|
|
|
|
|
|
|
|
const approveAmount = ethers.MaxUint256;
|
|
|
|
|
|
|
|
console.log('📊 Approval amount set to:', approveAmount.toString());
|
|
|
|
|
|
|
|
|
|
|
|
// Check approval for USDC (this first check is for general token approval, keeping original logic)
|
|
|
|
// Get USDC token data for contract interactions
|
|
|
|
const usdcToken = GetToken('USDC');
|
|
|
|
const usdcToken = GetToken('USDC');
|
|
|
|
const usdcAllowance = await getTokenAllowance(address, usdcToken.address, address);
|
|
|
|
console.log('💱 USDC Token Address:', usdcToken.address);
|
|
|
|
|
|
|
|
console.log('💱 WETH Token Address:', wrapperEtherData.address);
|
|
|
|
|
|
|
|
|
|
|
|
let usdcHash = "";
|
|
|
|
// ============================================================================
|
|
|
|
if (usdcAllowance < approveAmount) {
|
|
|
|
// CRITICAL: OrderVault Approvals (Required for order creation)
|
|
|
|
// First approve USDC token for GMX trading
|
|
|
|
// According to GMX V2 docs: "collateral needs to first be transferred to the OrderVault"
|
|
|
|
usdcHash = await approveTokenImpl(
|
|
|
|
// ============================================================================
|
|
|
|
address,
|
|
|
|
console.log('\n🔐 Step 1: Approving OrderVault contracts...');
|
|
|
|
usdcToken.symbol,
|
|
|
|
|
|
|
|
ARBITRUM,
|
|
|
|
|
|
|
|
usdcTokenData.prices.maxPrice
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
usdcHash = "Already allowed :" + usdcAllowance;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const orderVaultAllowance = await getTokenAllowance(address, usdcToken.address, CONTRACTS[ARBITRUM].OrderVault);
|
|
|
|
// USDC approval for OrderVault
|
|
|
|
|
|
|
|
const orderVaultUsdcAllowance = await getTokenAllowance(address, usdcToken.address, CONTRACTS[ARBITRUM].OrderVault);
|
|
|
|
|
|
|
|
console.log(' USDC -> OrderVault allowance:', orderVaultUsdcAllowance.toString());
|
|
|
|
|
|
|
|
|
|
|
|
// Then approve GMX OrderVault with the correct amount
|
|
|
|
|
|
|
|
let orderVaultHash = "";
|
|
|
|
let orderVaultHash = "";
|
|
|
|
if (orderVaultAllowance < approveAmount) {
|
|
|
|
if (orderVaultUsdcAllowance < approveAmount) {
|
|
|
|
|
|
|
|
console.log(' ⚠️ USDC allowance insufficient, approving OrderVault...');
|
|
|
|
orderVaultHash = await approveContractImpl(
|
|
|
|
orderVaultHash = await approveContractImpl(
|
|
|
|
address,
|
|
|
|
address,
|
|
|
|
usdcToken.address,
|
|
|
|
usdcToken.address,
|
|
|
|
@@ -540,34 +539,45 @@ export const initAddressImpl = async (
|
|
|
|
ARBITRUM,
|
|
|
|
ARBITRUM,
|
|
|
|
approveAmount
|
|
|
|
approveAmount
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}else{
|
|
|
|
console.log(' ✅ USDC OrderVault approval hash:', orderVaultHash);
|
|
|
|
orderVaultHash = "Already allowed :" + orderVaultAllowance;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
orderVaultHash = `Already approved: ${orderVaultUsdcAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ USDC already approved for OrderVault');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const wrapperEtherAllowance = await getTokenAllowance(address, wrapperEtherData.address, CONTRACTS[ARBITRUM].OrderVault);
|
|
|
|
// WETH approval for OrderVault
|
|
|
|
|
|
|
|
const orderVaultWethAllowance = await getTokenAllowance(address, wrapperEtherData.address, CONTRACTS[ARBITRUM].OrderVault);
|
|
|
|
|
|
|
|
console.log(' WETH -> OrderVault allowance:', orderVaultWethAllowance.toString());
|
|
|
|
|
|
|
|
|
|
|
|
let wrapperEtherHash = "";
|
|
|
|
let orderVaultWethHash = "";
|
|
|
|
if (wrapperEtherAllowance < approveAmount) {
|
|
|
|
if (orderVaultWethAllowance < approveAmount) {
|
|
|
|
wrapperEtherHash = await approveContractImpl(
|
|
|
|
console.log(' ⚠️ WETH allowance insufficient, approving OrderVault...');
|
|
|
|
|
|
|
|
orderVaultWethHash = await approveContractImpl(
|
|
|
|
address,
|
|
|
|
address,
|
|
|
|
wrapperEtherData.address,
|
|
|
|
wrapperEtherData.address,
|
|
|
|
CONTRACTS[ARBITRUM].OrderVault,
|
|
|
|
CONTRACTS[ARBITRUM].OrderVault,
|
|
|
|
ARBITRUM,
|
|
|
|
ARBITRUM,
|
|
|
|
approveAmount
|
|
|
|
approveAmount
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}else{
|
|
|
|
console.log(' ✅ WETH OrderVault approval hash:', orderVaultWethHash);
|
|
|
|
wrapperEtherHash = "Already allowed :" + wrapperEtherAllowance;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
orderVaultWethHash = `Already approved: ${orderVaultWethAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ WETH already approved for OrderVault');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
console.log('wrapperEtherAllowance', wrapperEtherAllowance)
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
// CRITICAL: ExchangeRouter Approvals (Required for createOrder calls)
|
|
|
|
|
|
|
|
// According to GMX V2 docs: "ExchangeRouter.createOrder can then be called after"
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
console.log('\n🔐 Step 2: Approving ExchangeRouter contracts...');
|
|
|
|
|
|
|
|
|
|
|
|
const exchangeRouterAllowance = await getTokenAllowance(address, usdcToken.address, CONTRACTS[ARBITRUM].ExchangeRouter);
|
|
|
|
// USDC approval for ExchangeRouter
|
|
|
|
|
|
|
|
const exchangeRouterUsdcAllowance = await getTokenAllowance(address, usdcToken.address, CONTRACTS[ARBITRUM].ExchangeRouter);
|
|
|
|
console.log('exchangeRouterAllowance', exchangeRouterAllowance)
|
|
|
|
console.log(' USDC -> ExchangeRouter allowance:', exchangeRouterUsdcAllowance.toString());
|
|
|
|
|
|
|
|
|
|
|
|
let exchangeRouterHash = "";
|
|
|
|
let exchangeRouterHash = "";
|
|
|
|
console.log('approveAmount', approveAmount)
|
|
|
|
if (exchangeRouterUsdcAllowance < approveAmount) {
|
|
|
|
if (exchangeRouterAllowance < approveAmount) {
|
|
|
|
console.log(' ⚠️ USDC allowance insufficient, approving ExchangeRouter...');
|
|
|
|
exchangeRouterHash = await approveContractImpl(
|
|
|
|
exchangeRouterHash = await approveContractImpl(
|
|
|
|
address,
|
|
|
|
address,
|
|
|
|
usdcToken.address,
|
|
|
|
usdcToken.address,
|
|
|
|
@@ -575,49 +585,64 @@ export const initAddressImpl = async (
|
|
|
|
ARBITRUM,
|
|
|
|
ARBITRUM,
|
|
|
|
approveAmount
|
|
|
|
approveAmount
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}else{
|
|
|
|
console.log(' ✅ USDC ExchangeRouter approval hash:', exchangeRouterHash);
|
|
|
|
exchangeRouterHash = "Already allowed :" + exchangeRouterAllowance;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
exchangeRouterHash = `Already approved: ${exchangeRouterUsdcAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ USDC already approved for ExchangeRouter');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const wrapperEtherExchangeAllowance = await getTokenAllowance(address, wrapperEtherData.address, CONTRACTS[ARBITRUM].ExchangeRouter);
|
|
|
|
// WETH approval for ExchangeRouter
|
|
|
|
|
|
|
|
const exchangeRouterWethAllowance = await getTokenAllowance(address, wrapperEtherData.address, CONTRACTS[ARBITRUM].ExchangeRouter);
|
|
|
|
|
|
|
|
console.log(' WETH -> ExchangeRouter allowance:', exchangeRouterWethAllowance.toString());
|
|
|
|
|
|
|
|
|
|
|
|
let wrapperEtherExchangeHash = "";
|
|
|
|
let exchangeRouterWethHash = "";
|
|
|
|
if (wrapperEtherExchangeAllowance < approveAmount) {
|
|
|
|
if (exchangeRouterWethAllowance < approveAmount) {
|
|
|
|
wrapperEtherExchangeHash = await approveContractImpl(
|
|
|
|
console.log(' ⚠️ WETH allowance insufficient, approving ExchangeRouter...');
|
|
|
|
|
|
|
|
exchangeRouterWethHash = await approveContractImpl(
|
|
|
|
address,
|
|
|
|
address,
|
|
|
|
wrapperEtherData.address,
|
|
|
|
wrapperEtherData.address,
|
|
|
|
CONTRACTS[ARBITRUM].ExchangeRouter,
|
|
|
|
CONTRACTS[ARBITRUM].ExchangeRouter,
|
|
|
|
ARBITRUM,
|
|
|
|
ARBITRUM,
|
|
|
|
approveAmount
|
|
|
|
approveAmount
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}else{
|
|
|
|
console.log(' ✅ WETH ExchangeRouter approval hash:', exchangeRouterWethHash);
|
|
|
|
wrapperEtherExchangeHash = "Already allowed :" + wrapperEtherExchangeAllowance;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
exchangeRouterWethHash = `Already approved: ${exchangeRouterWethAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ WETH already approved for ExchangeRouter');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
console.log('wrapperEtherExchangeAllowance', wrapperEtherExchangeAllowance)
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
// OPTIONAL: SyntheticsRouter Approvals (For synthetic positions)
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
console.log('\n🔐 Step 3: Approving SyntheticsRouter contracts...');
|
|
|
|
|
|
|
|
|
|
|
|
const usdcSyntheticRouterAllowance = await getTokenAllowance(address, usdcToken.address, CONTRACTS[ARBITRUM].SyntheticsRouter);
|
|
|
|
// USDC approval for SyntheticsRouter
|
|
|
|
|
|
|
|
const syntheticsRouterUsdcAllowance = await getTokenAllowance(address, usdcToken.address, CONTRACTS[ARBITRUM].SyntheticsRouter);
|
|
|
|
|
|
|
|
console.log(' USDC -> SyntheticsRouter allowance:', syntheticsRouterUsdcAllowance.toString());
|
|
|
|
|
|
|
|
|
|
|
|
let usdcSyntheticRouterHash = "";
|
|
|
|
let syntheticsRouterUsdcHash = "";
|
|
|
|
if (usdcSyntheticRouterAllowance < approveAmount) {
|
|
|
|
if (syntheticsRouterUsdcAllowance < approveAmount) {
|
|
|
|
usdcSyntheticRouterHash = await approveContractImpl(
|
|
|
|
console.log(' ⚠️ USDC allowance insufficient, approving SyntheticsRouter...');
|
|
|
|
|
|
|
|
syntheticsRouterUsdcHash = await approveContractImpl(
|
|
|
|
address,
|
|
|
|
address,
|
|
|
|
usdcToken.address,
|
|
|
|
usdcToken.address,
|
|
|
|
CONTRACTS[ARBITRUM].SyntheticsRouter,
|
|
|
|
CONTRACTS[ARBITRUM].SyntheticsRouter,
|
|
|
|
ARBITRUM,
|
|
|
|
ARBITRUM,
|
|
|
|
approveAmount
|
|
|
|
approveAmount
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}else{
|
|
|
|
console.log(' ✅ USDC SyntheticsRouter approval hash:', syntheticsRouterUsdcHash);
|
|
|
|
usdcSyntheticRouterHash = "Already allowed :" + usdcSyntheticRouterAllowance;
|
|
|
|
} else {
|
|
|
|
|
|
|
|
syntheticsRouterUsdcHash = `Already approved: ${syntheticsRouterUsdcAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ USDC already approved for SyntheticsRouter');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
console.log('usdcSyntheticRouterAllowance', usdcSyntheticRouterAllowance)
|
|
|
|
// WETH approval for SyntheticsRouter
|
|
|
|
|
|
|
|
const syntheticsRouterWethAllowance = await getTokenAllowance(address, wrapperEtherData.address, CONTRACTS[ARBITRUM].SyntheticsRouter);
|
|
|
|
// Also approve WETH for SyntheticsRouter (required for ETH positions)
|
|
|
|
console.log(' WETH -> SyntheticsRouter allowance:', syntheticsRouterWethAllowance.toString());
|
|
|
|
const wethSyntheticsRouterAllowance = await getTokenAllowance(address, wrapperEtherData.address, CONTRACTS[ARBITRUM].SyntheticsRouter);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let wethSyntheticsRouterHash = "";
|
|
|
|
let wethSyntheticsRouterHash = "";
|
|
|
|
if (wethSyntheticsRouterAllowance < approveAmount) {
|
|
|
|
if (syntheticsRouterWethAllowance < approveAmount) {
|
|
|
|
|
|
|
|
console.log(' ⚠️ WETH allowance insufficient, approving SyntheticsRouter...');
|
|
|
|
wethSyntheticsRouterHash = await approveContractImpl(
|
|
|
|
wethSyntheticsRouterHash = await approveContractImpl(
|
|
|
|
address,
|
|
|
|
address,
|
|
|
|
wrapperEtherData.address,
|
|
|
|
wrapperEtherData.address,
|
|
|
|
@@ -625,26 +650,125 @@ export const initAddressImpl = async (
|
|
|
|
ARBITRUM,
|
|
|
|
ARBITRUM,
|
|
|
|
approveAmount
|
|
|
|
approveAmount
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
console.log(' ✅ WETH SyntheticsRouter approval hash:', wethSyntheticsRouterHash);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
wethSyntheticsRouterHash = "Already allowed :" + wethSyntheticsRouterAllowance;
|
|
|
|
wethSyntheticsRouterHash = `Already approved: ${syntheticsRouterWethAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ WETH already approved for SyntheticsRouter');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
console.log('wethSyntheticsRouterAllowance', wethSyntheticsRouterAllowance)
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
// CRITICAL: Additional GMX V2 Contract Approvals
|
|
|
|
|
|
|
|
// These contracts might be needed for order creation and execution
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
console.log('\n🔐 Step 4: Approving additional GMX V2 contracts...');
|
|
|
|
|
|
|
|
|
|
|
|
console.log('usdcHash', usdcHash)
|
|
|
|
// USDC approval for DataStore (required for order execution)
|
|
|
|
console.log('orderVaultHash', orderVaultHash)
|
|
|
|
const dataStoreUsdcAllowance = await getTokenAllowance(address, usdcToken.address, CONTRACTS[ARBITRUM].DataStore);
|
|
|
|
console.log('exchangeRouterHash', exchangeRouterHash)
|
|
|
|
console.log(' USDC -> DataStore allowance:', dataStoreUsdcAllowance.toString());
|
|
|
|
console.log('wethSyntheticsRouterHash', wethSyntheticsRouterHash)
|
|
|
|
|
|
|
|
|
|
|
|
let dataStoreUsdcHash = "";
|
|
|
|
|
|
|
|
if (dataStoreUsdcAllowance < approveAmount) {
|
|
|
|
|
|
|
|
console.log(' ⚠️ USDC allowance insufficient, approving DataStore...');
|
|
|
|
|
|
|
|
dataStoreUsdcHash = await approveContractImpl(
|
|
|
|
|
|
|
|
address,
|
|
|
|
|
|
|
|
usdcToken.address,
|
|
|
|
|
|
|
|
CONTRACTS[ARBITRUM].DataStore,
|
|
|
|
|
|
|
|
ARBITRUM,
|
|
|
|
|
|
|
|
approveAmount
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
console.log(' ✅ USDC DataStore approval hash:', dataStoreUsdcHash);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dataStoreUsdcHash = `Already approved: ${dataStoreUsdcAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ USDC already approved for DataStore');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// WETH approval for DataStore
|
|
|
|
|
|
|
|
const dataStoreWethAllowance = await getTokenAllowance(address, wrapperEtherData.address, CONTRACTS[ARBITRUM].DataStore);
|
|
|
|
|
|
|
|
console.log(' WETH -> DataStore allowance:', dataStoreWethAllowance.toString());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let dataStoreWethHash = "";
|
|
|
|
|
|
|
|
if (dataStoreWethAllowance < approveAmount) {
|
|
|
|
|
|
|
|
console.log(' ⚠️ WETH allowance insufficient, approving DataStore...');
|
|
|
|
|
|
|
|
dataStoreWethHash = await approveContractImpl(
|
|
|
|
|
|
|
|
address,
|
|
|
|
|
|
|
|
wrapperEtherData.address,
|
|
|
|
|
|
|
|
CONTRACTS[ARBITRUM].DataStore,
|
|
|
|
|
|
|
|
ARBITRUM,
|
|
|
|
|
|
|
|
approveAmount
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
console.log(' ✅ WETH DataStore approval hash:', dataStoreWethHash);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dataStoreWethHash = `Already approved: ${dataStoreWethAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ WETH already approved for DataStore');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// USDC approval for DepositVault (for deposits)
|
|
|
|
|
|
|
|
const depositVaultUsdcAllowance = await getTokenAllowance(address, usdcToken.address, CONTRACTS[ARBITRUM].DepositVault);
|
|
|
|
|
|
|
|
console.log(' USDC -> DepositVault allowance:', depositVaultUsdcAllowance.toString());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let depositVaultUsdcHash = "";
|
|
|
|
|
|
|
|
if (depositVaultUsdcAllowance < approveAmount) {
|
|
|
|
|
|
|
|
console.log(' ⚠️ USDC allowance insufficient, approving DepositVault...');
|
|
|
|
|
|
|
|
depositVaultUsdcHash = await approveContractImpl(
|
|
|
|
|
|
|
|
address,
|
|
|
|
|
|
|
|
usdcToken.address,
|
|
|
|
|
|
|
|
CONTRACTS[ARBITRUM].DepositVault,
|
|
|
|
|
|
|
|
ARBITRUM,
|
|
|
|
|
|
|
|
approveAmount
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
console.log(' ✅ USDC DepositVault approval hash:', depositVaultUsdcHash);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
depositVaultUsdcHash = `Already approved: ${depositVaultUsdcAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ USDC already approved for DepositVault');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// WETH approval for DepositVault
|
|
|
|
|
|
|
|
const depositVaultWethAllowance = await getTokenAllowance(address, wrapperEtherData.address, CONTRACTS[ARBITRUM].DepositVault);
|
|
|
|
|
|
|
|
console.log(' WETH -> DepositVault allowance:', depositVaultWethAllowance.toString());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let depositVaultWethHash = "";
|
|
|
|
|
|
|
|
if (depositVaultWethAllowance < approveAmount) {
|
|
|
|
|
|
|
|
console.log(' ⚠️ WETH allowance insufficient, approving DepositVault...');
|
|
|
|
|
|
|
|
depositVaultWethHash = await approveContractImpl(
|
|
|
|
|
|
|
|
address,
|
|
|
|
|
|
|
|
wrapperEtherData.address,
|
|
|
|
|
|
|
|
CONTRACTS[ARBITRUM].DepositVault,
|
|
|
|
|
|
|
|
ARBITRUM,
|
|
|
|
|
|
|
|
approveAmount
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
console.log(' ✅ WETH DepositVault approval hash:', depositVaultWethHash);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
depositVaultWethHash = `Already approved: ${depositVaultWethAllowance.toString()}`;
|
|
|
|
|
|
|
|
console.log(' ✅ WETH already approved for DepositVault');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
// SUMMARY: Final approval status
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
console.log('\n📋 Final Approval Summary:');
|
|
|
|
|
|
|
|
console.log(' OrderVault USDC:', orderVaultHash);
|
|
|
|
|
|
|
|
console.log(' OrderVault WETH:', orderVaultWethHash);
|
|
|
|
|
|
|
|
console.log(' ExchangeRouter USDC:', exchangeRouterHash);
|
|
|
|
|
|
|
|
console.log(' ExchangeRouter WETH:', exchangeRouterWethHash);
|
|
|
|
|
|
|
|
console.log(' SyntheticsRouter USDC:', syntheticsRouterUsdcHash);
|
|
|
|
|
|
|
|
console.log(' SyntheticsRouter WETH:', wethSyntheticsRouterHash);
|
|
|
|
|
|
|
|
console.log(' DataStore USDC:', dataStoreUsdcHash);
|
|
|
|
|
|
|
|
console.log(' DataStore WETH:', dataStoreWethHash);
|
|
|
|
|
|
|
|
console.log(' DepositVault USDC:', depositVaultUsdcHash);
|
|
|
|
|
|
|
|
console.log(' DepositVault WETH:', depositVaultWethHash);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log('\n✅ GMX V2 wallet initialization completed successfully!');
|
|
|
|
|
|
|
|
console.log(' All necessary contracts are now approved for trading.');
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
usdcHash,
|
|
|
|
usdcHash: `OrderVault: ${orderVaultHash}, ExchangeRouter: ${exchangeRouterHash}, SyntheticsRouter: ${syntheticsRouterUsdcHash}, DataStore: ${dataStoreUsdcHash}, DepositVault: ${depositVaultUsdcHash}`,
|
|
|
|
orderVaultHash,
|
|
|
|
orderVaultHash: `USDC: ${orderVaultHash}, WETH: ${orderVaultWethHash}`,
|
|
|
|
exchangeRouterHash,
|
|
|
|
exchangeRouterHash: `USDC: ${exchangeRouterHash}, WETH: ${exchangeRouterWethHash}`,
|
|
|
|
wethSyntheticsRouterHash
|
|
|
|
wethSyntheticsRouterHash: `SyntheticsRouter: ${wethSyntheticsRouterHash}, DataStore: ${dataStoreWethHash}, DepositVault: ${depositVaultWethHash}`
|
|
|
|
};
|
|
|
|
};
|
|
|
|
} catch (error) {
|
|
|
|
} catch (error) {
|
|
|
|
console.error('Error initializing address:', error);
|
|
|
|
console.error('❌ Error initializing GMX V2 wallet:', error);
|
|
|
|
throw new Error(`Failed to initialize address: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
|
|
throw new Error(`Failed to initialize GMX V2 wallet: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|