@axelar-network/axelarjs-sdk 0.6.0-alpha.2 → 0.6.0-alpha.20
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/src/assets/testnet.assets.d.ts +224 -42
- package/dist/src/assets/testnet.assets.d.ts.map +1 -1
- package/dist/src/assets/testnet.assets.js +363 -181
- package/dist/src/assets/testnet.assets.js.map +1 -1
- package/dist/src/chains/Binance/index.d.ts +7 -0
- package/dist/src/chains/Binance/index.d.ts.map +1 -0
- package/dist/src/chains/Binance/index.js +25 -0
- package/dist/src/chains/Binance/index.js.map +1 -0
- package/dist/src/chains/Ethereum/index.js +1 -1
- package/dist/src/chains/Kujira/index.d.ts +8 -0
- package/dist/src/chains/Kujira/index.d.ts.map +1 -0
- package/dist/src/chains/Kujira/index.js +39 -0
- package/dist/src/chains/Kujira/index.js.map +1 -0
- package/dist/src/chains/Osmosis/index.js +1 -1
- package/dist/src/chains/Sei/index.d.ts +8 -0
- package/dist/src/chains/Sei/index.d.ts.map +1 -0
- package/dist/src/chains/Sei/index.js +39 -0
- package/dist/src/chains/Sei/index.js.map +1 -0
- package/dist/src/chains/index.d.ts.map +1 -1
- package/dist/src/chains/index.js +6 -0
- package/dist/src/chains/index.js.map +1 -1
- package/dist/src/constants/index.js +4 -4
- package/dist/src/constants/index.js.map +1 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/libs/AxelarGateway.d.ts +1 -0
- package/dist/src/libs/AxelarGateway.d.ts.map +1 -1
- package/dist/src/libs/AxelarGateway.js +3 -3
- package/dist/src/libs/AxelarGateway.js.map +1 -1
- package/dist/src/libs/AxelarQueryAPI.d.ts +13 -3
- package/dist/src/libs/AxelarQueryAPI.d.ts.map +1 -1
- package/dist/src/libs/AxelarQueryAPI.js +29 -21
- package/dist/src/libs/AxelarQueryAPI.js.map +1 -1
- package/dist/src/libs/AxelarQueryClient/index.d.ts +8 -0
- package/dist/src/libs/AxelarQueryClient/index.d.ts.map +1 -0
- package/dist/src/libs/AxelarQueryClient/index.js +32 -0
- package/dist/src/libs/AxelarQueryClient/index.js.map +1 -0
- package/dist/src/libs/AxelarQueryClient/types/index.d.ts +13 -0
- package/dist/src/libs/AxelarQueryClient/types/index.d.ts.map +1 -0
- package/dist/src/libs/AxelarQueryClient/types/index.js +19 -0
- package/dist/src/libs/AxelarQueryClient/types/index.js.map +1 -0
- package/dist/src/libs/AxelarSigningClient/index.d.ts.map +1 -1
- package/dist/src/libs/AxelarSigningClient/index.js +7 -3
- package/dist/src/libs/AxelarSigningClient/index.js.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/AxelarDepositRecoveryAPI.d.ts.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/AxelarDepositRecoveryAPI.js +5 -7
- package/dist/src/libs/TransactionRecoveryApi/AxelarDepositRecoveryAPI.js.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/AxelarGMPRecoveryAPI.d.ts +66 -1
- package/dist/src/libs/TransactionRecoveryApi/AxelarGMPRecoveryAPI.d.ts.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/AxelarGMPRecoveryAPI.js +255 -1
- package/dist/src/libs/TransactionRecoveryApi/AxelarGMPRecoveryAPI.js.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/AxelarRecoveryApi.d.ts +50 -3
- package/dist/src/libs/TransactionRecoveryApi/AxelarRecoveryApi.d.ts.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/AxelarRecoveryApi.js +179 -9
- package/dist/src/libs/TransactionRecoveryApi/AxelarRecoveryApi.js.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/client/EVMClient/index.d.ts +13 -0
- package/dist/src/libs/TransactionRecoveryApi/client/EVMClient/index.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/client/EVMClient/index.js +55 -0
- package/dist/src/libs/TransactionRecoveryApi/client/EVMClient/index.js.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/chain.d.ts +5 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/chain.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/chain.js +34 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/chain.js.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/contract.d.ts +33 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/contract.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/contract.js +36 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/contract.js.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/error.d.ts +42 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/error.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/error.js +54 -0
- package/dist/src/libs/TransactionRecoveryApi/constants/error.js.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/axelarHelper.d.ts +13 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/axelarHelper.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/{parseConfirmDepositEvent.js → axelarHelper.js} +90 -12
- package/dist/src/libs/TransactionRecoveryApi/helpers/axelarHelper.js.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/contractCallHelper.d.ts +4 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/contractCallHelper.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/contractCallHelper.js +18 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/contractCallHelper.js.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/contractEventHelper.d.ts +9 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/contractEventHelper.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/contractEventHelper.js +53 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/contractEventHelper.js.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/index.d.ts +4 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/index.d.ts.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/index.js +19 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/index.js.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/providerHelper.d.ts +4 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/providerHelper.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/providerHelper.js +10 -0
- package/dist/src/libs/TransactionRecoveryApi/helpers/providerHelper.js.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/index.d.ts +1 -0
- package/dist/src/libs/TransactionRecoveryApi/index.d.ts.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/index.js +6 -1
- package/dist/src/libs/TransactionRecoveryApi/index.js.map +1 -1
- package/dist/src/libs/TransactionRecoveryApi/processors/index.d.ts +13 -0
- package/dist/src/libs/TransactionRecoveryApi/processors/index.d.ts.map +1 -0
- package/dist/src/libs/TransactionRecoveryApi/processors/index.js +56 -0
- package/dist/src/libs/TransactionRecoveryApi/processors/index.js.map +1 -0
- package/dist/src/libs/abi/IAxelarExecutable.d.ts +38 -0
- package/dist/src/libs/abi/IAxelarExecutable.d.ts.map +1 -0
- package/dist/src/libs/abi/IAxelarExecutable.js +100 -0
- package/dist/src/libs/abi/IAxelarExecutable.js.map +1 -0
- package/dist/src/libs/abi/IAxelarGasService.json +661 -0
- package/dist/src/libs/index.js +5 -1
- package/dist/src/libs/index.js.map +1 -1
- package/dist/src/libs/test/AxelarGateway.spec.d.ts +2 -0
- package/dist/src/libs/test/AxelarGateway.spec.d.ts.map +1 -0
- package/dist/src/libs/test/{axelarGateway.test.js → AxelarGateway.spec.js} +6 -2
- package/dist/src/libs/test/AxelarGateway.spec.js.map +1 -0
- package/dist/src/libs/test/AxelarQueryAPI.spec.js +12 -7
- package/dist/src/libs/test/AxelarQueryAPI.spec.js.map +1 -1
- package/dist/src/libs/test/AxelarQueryClient.spec.d.ts +2 -0
- package/dist/src/libs/test/AxelarQueryClient.spec.d.ts.map +1 -0
- package/dist/src/libs/test/AxelarQueryClient.spec.js +57 -0
- package/dist/src/libs/test/AxelarQueryClient.spec.js.map +1 -0
- package/dist/src/libs/test/AxelarSigningClient.spec.js +1 -1
- package/dist/src/libs/test/AxelarSigningClient.spec.js.map +1 -1
- package/dist/src/libs/test/TransactionRecoveryAPI/AxelarGMPRecoveryAPI.spec.js +509 -2
- package/dist/src/libs/test/TransactionRecoveryAPI/AxelarGMPRecoveryAPI.spec.js.map +1 -1
- package/dist/src/libs/test/TransactionRecoveryAPI/AxelarRecoveryAPI.spec.js +142 -0
- package/dist/src/libs/test/TransactionRecoveryAPI/AxelarRecoveryAPI.spec.js.map +1 -1
- package/dist/src/libs/test/TransactionRecoveryAPI/helper/contractCallHelper.spec.d.ts +2 -0
- package/dist/src/libs/test/TransactionRecoveryAPI/helper/contractCallHelper.spec.d.ts.map +1 -0
- package/dist/src/libs/test/TransactionRecoveryAPI/helper/contractCallHelper.spec.js +42 -0
- package/dist/src/libs/test/TransactionRecoveryAPI/helper/contractCallHelper.spec.js.map +1 -0
- package/dist/src/libs/test/abi/DistributionExecutable.json +10675 -0
- package/dist/src/libs/test/abi/DistributionExecutableGasToken.json +11080 -0
- package/dist/src/libs/test/abi/TestToken.json +5647 -0
- package/dist/src/libs/test/stubs/index.d.ts +30 -0
- package/dist/src/libs/test/stubs/index.d.ts.map +1 -1
- package/dist/src/libs/test/stubs/index.js +33 -1
- package/dist/src/libs/test/stubs/index.js.map +1 -1
- package/dist/src/libs/types/index.d.ts +48 -5
- package/dist/src/libs/types/index.d.ts.map +1 -1
- package/dist/src/libs/types/index.js +12 -1
- package/dist/src/libs/types/index.js.map +1 -1
- package/dist/src/services/index.js +5 -1
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/utils/asyncRetry.d.ts +2 -0
- package/dist/src/utils/asyncRetry.d.ts.map +1 -0
- package/dist/src/utils/asyncRetry.js +35 -0
- package/dist/src/utils/asyncRetry.js.map +1 -0
- package/dist/src/utils/index.d.ts +2 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +7 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/sleep.d.ts +2 -0
- package/dist/src/utils/sleep.d.ts.map +1 -0
- package/dist/src/utils/sleep.js +8 -0
- package/dist/src/utils/sleep.js.map +1 -0
- package/package.json +2 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/getAmountFromAmountSymbol.d.ts +0 -2
- package/dist/src/libs/TransactionRecoveryApi/helpers/getAmountFromAmountSymbol.d.ts.map +0 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/getAmountFromAmountSymbol.js +0 -13
- package/dist/src/libs/TransactionRecoveryApi/helpers/getAmountFromAmountSymbol.js.map +0 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/getConfirmedTx.d.ts +0 -6
- package/dist/src/libs/TransactionRecoveryApi/helpers/getConfirmedTx.d.ts.map +0 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/getConfirmedTx.js +0 -63
- package/dist/src/libs/TransactionRecoveryApi/helpers/getConfirmedTx.js.map +0 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/getSymbolFromAmountSymbol.d.ts +0 -2
- package/dist/src/libs/TransactionRecoveryApi/helpers/getSymbolFromAmountSymbol.d.ts.map +0 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/getSymbolFromAmountSymbol.js +0 -13
- package/dist/src/libs/TransactionRecoveryApi/helpers/getSymbolFromAmountSymbol.js.map +0 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/parseConfirmDepositEvent.d.ts +0 -5
- package/dist/src/libs/TransactionRecoveryApi/helpers/parseConfirmDepositEvent.d.ts.map +0 -1
- package/dist/src/libs/TransactionRecoveryApi/helpers/parseConfirmDepositEvent.js.map +0 -1
- package/dist/src/libs/test/axelarGateway.test.d.ts +0 -2
- package/dist/src/libs/test/axelarGateway.test.d.ts.map +0 -1
- package/dist/src/libs/test/axelarGateway.test.js.map +0 -1
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
26
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
27
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -8,24 +31,508 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
31
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
32
|
});
|
|
10
33
|
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
11
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
38
|
const AxelarGMPRecoveryAPI_1 = require("../../TransactionRecoveryApi/AxelarGMPRecoveryAPI");
|
|
13
39
|
const types_1 = require("../../types");
|
|
40
|
+
const axelar_local_dev_1 = require("@axelar-network/axelar-local-dev");
|
|
41
|
+
const ethers_1 = require("ethers");
|
|
42
|
+
const utils_1 = require("@axelar-network/axelar-local-dev/dist/utils");
|
|
43
|
+
const DistributionExecutable_json_1 = __importDefault(require("../abi/DistributionExecutable.json"));
|
|
44
|
+
const DistributionExecutableGasToken_json_1 = __importDefault(require("../abi/DistributionExecutableGasToken.json"));
|
|
45
|
+
const IAxelarGasService_json_1 = __importDefault(require("../../abi/IAxelarGasService.json"));
|
|
46
|
+
const TestToken_json_1 = __importDefault(require("../abi/TestToken.json"));
|
|
47
|
+
const AxelarQueryAPI_1 = require("../../AxelarQueryAPI");
|
|
48
|
+
const helpers_1 = require("../../TransactionRecoveryApi/helpers");
|
|
49
|
+
const utils_2 = require("ethers/lib/utils");
|
|
50
|
+
const contract_1 = require("../../TransactionRecoveryApi/constants/contract");
|
|
51
|
+
const error_1 = require("../../TransactionRecoveryApi/constants/error");
|
|
52
|
+
const AxelarGateway_1 = require("../../AxelarGateway");
|
|
53
|
+
const AxelarRecoveryApi_1 = require("../../TransactionRecoveryApi/AxelarRecoveryApi");
|
|
54
|
+
const ContractCallHelper = __importStar(require("../../TransactionRecoveryApi/helpers/contractCallHelper"));
|
|
55
|
+
const stubs_1 = require("../stubs");
|
|
14
56
|
describe("AxelarDepositRecoveryAPI", () => {
|
|
15
|
-
const
|
|
57
|
+
const { setLogger } = axelar_local_dev_1.utils;
|
|
58
|
+
setLogger(() => null);
|
|
16
59
|
beforeEach(() => {
|
|
17
60
|
jest.clearAllMocks();
|
|
18
61
|
});
|
|
19
62
|
describe("confirmGatewayTx", () => {
|
|
63
|
+
const api = new AxelarGMPRecoveryAPI_1.AxelarGMPRecoveryAPI({ environment: types_1.Environment.TESTNET });
|
|
20
64
|
test("It should confirm a gateway tx", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
65
|
const testParamsAxelarnet = {
|
|
22
66
|
txHash: "0xf452bc47fff8962190e114d0e1f7f3775327f6a5d643ca4fd5d39e9415e54503",
|
|
23
|
-
chain: "Avalanche"
|
|
67
|
+
chain: "Avalanche",
|
|
24
68
|
};
|
|
25
69
|
const confirmation = yield api.confirmGatewayTx(testParamsAxelarnet);
|
|
26
70
|
console.log("confirmation", confirmation);
|
|
27
71
|
expect(confirmation).toBeTruthy();
|
|
28
72
|
}), 60000);
|
|
29
73
|
});
|
|
74
|
+
describe("calculateWantedGasFee", () => {
|
|
75
|
+
const api = new AxelarGMPRecoveryAPI_1.AxelarGMPRecoveryAPI({ environment: types_1.Environment.TESTNET });
|
|
76
|
+
let contract;
|
|
77
|
+
let userWallet;
|
|
78
|
+
let provider;
|
|
79
|
+
const tokenSymbol = "aUSDC";
|
|
80
|
+
const queryApi = new AxelarQueryAPI_1.AxelarQueryAPI({ environment: types_1.Environment.TESTNET });
|
|
81
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
82
|
+
// Create a source chain network
|
|
83
|
+
const srcChain = yield (0, axelar_local_dev_1.createNetwork)({ name: types_1.EvmChain.AVALANCHE });
|
|
84
|
+
userWallet = srcChain.adminWallets[0];
|
|
85
|
+
provider = srcChain.provider;
|
|
86
|
+
const args = [srcChain.gateway.address, srcChain.gasReceiver.address];
|
|
87
|
+
// Deploy test contract
|
|
88
|
+
contract = yield (0, utils_1.deployContract)(userWallet, DistributionExecutable_json_1.default, args);
|
|
89
|
+
// Send USDC to the user wallet for testing
|
|
90
|
+
yield srcChain.giveToken(userWallet.address, tokenSymbol, BigInt("10000000"));
|
|
91
|
+
// Approve token before running any test
|
|
92
|
+
yield srcChain.usdc
|
|
93
|
+
.connect(userWallet)
|
|
94
|
+
.approve(contract.address, ethers_1.ethers.constants.MaxUint256)
|
|
95
|
+
.then((tx) => tx.wait(1));
|
|
96
|
+
}));
|
|
97
|
+
test("it should return 'gas required' - 'gas paid' given 'gas required' > 'gas paid'", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
98
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.000001");
|
|
99
|
+
// Send transaction at the source chain with some gas.
|
|
100
|
+
const tx = yield contract
|
|
101
|
+
.connect(userWallet)
|
|
102
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", {
|
|
103
|
+
value: gasPaid,
|
|
104
|
+
})
|
|
105
|
+
.then((tx) => tx.wait());
|
|
106
|
+
// Calculate how many gas we need to add more.
|
|
107
|
+
const wantedGasFee = yield api.calculateNativeGasFee(tx.transactionHash, types_1.EvmChain.AVALANCHE, types_1.EvmChain.MOONBEAM, types_1.GasToken.AVAX, { provider });
|
|
108
|
+
// Get gas required
|
|
109
|
+
const gasRequired = yield queryApi.estimateGasFee(types_1.EvmChain.AVALANCHE, types_1.EvmChain.MOONBEAM, types_1.GasToken.AVAX);
|
|
110
|
+
return expect(wantedGasFee).toBe(ethers_1.ethers.BigNumber.from(gasRequired).sub(gasPaid).toString());
|
|
111
|
+
}));
|
|
112
|
+
test("it should return 0 given 'gas paid' >= 'gas required'", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
113
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("10");
|
|
114
|
+
// Send transaction at the source chain with overpaid gas.
|
|
115
|
+
const tx = yield contract
|
|
116
|
+
.connect(userWallet)
|
|
117
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", {
|
|
118
|
+
value: gasPaid,
|
|
119
|
+
})
|
|
120
|
+
.then((tx) => tx.wait());
|
|
121
|
+
// Calculate how many gas we need to add more.
|
|
122
|
+
const wantedGasFee = yield api.calculateNativeGasFee(tx.transactionHash, types_1.EvmChain.AVALANCHE, types_1.EvmChain.MOONBEAM, types_1.GasToken.AVAX, { provider });
|
|
123
|
+
return expect(wantedGasFee).toBe("0");
|
|
124
|
+
}));
|
|
125
|
+
});
|
|
126
|
+
describe("addNativeGas", () => {
|
|
127
|
+
let api;
|
|
128
|
+
let contract;
|
|
129
|
+
let userWallet;
|
|
130
|
+
let provider;
|
|
131
|
+
let gasReceiverContract;
|
|
132
|
+
let usdc;
|
|
133
|
+
let addNativeGasOptions;
|
|
134
|
+
const chain = types_1.EvmChain.AVALANCHE;
|
|
135
|
+
const tokenSymbol = "aUSDC";
|
|
136
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
137
|
+
jest.clearAllMocks();
|
|
138
|
+
api = new AxelarGMPRecoveryAPI_1.AxelarGMPRecoveryAPI({ environment: types_1.Environment.TESTNET });
|
|
139
|
+
// Create a source chain network
|
|
140
|
+
const srcChain = yield (0, axelar_local_dev_1.createNetwork)({ name: chain });
|
|
141
|
+
gasReceiverContract = srcChain.gasReceiver;
|
|
142
|
+
userWallet = srcChain.adminWallets[0];
|
|
143
|
+
provider = srcChain.provider;
|
|
144
|
+
usdc = srcChain.usdc.connect(userWallet);
|
|
145
|
+
// Override the provider and wallet to use data from the local network
|
|
146
|
+
addNativeGasOptions = {
|
|
147
|
+
evmWalletDetails: {
|
|
148
|
+
useWindowEthereum: false,
|
|
149
|
+
privateKey: userWallet.privateKey,
|
|
150
|
+
provider,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
const args = [srcChain.gateway.address, srcChain.gasReceiver.address];
|
|
154
|
+
// Deploy test contract
|
|
155
|
+
contract = yield (0, utils_1.deployContract)(userWallet, DistributionExecutable_json_1.default, args).then((contract) => contract.connect(userWallet));
|
|
156
|
+
// Send USDC to the user wallet for testing
|
|
157
|
+
yield srcChain.giveToken(userWallet.address, tokenSymbol, BigInt("10000000"));
|
|
158
|
+
// Approve token before running any test
|
|
159
|
+
yield srcChain.usdc
|
|
160
|
+
.connect(userWallet)
|
|
161
|
+
.approve(contract.address, ethers_1.ethers.constants.MaxUint256)
|
|
162
|
+
.then((tx) => tx.wait(1));
|
|
163
|
+
// This is a hacky way to set the gas receiver constant object to local gas receiver contract address
|
|
164
|
+
contract_1.GAS_RECEIVER[types_1.Environment.TESTNET][chain] = gasReceiverContract.address;
|
|
165
|
+
}));
|
|
166
|
+
test("it shouldn't call 'addNativeGas' given tx is already executed", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
167
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.000001");
|
|
168
|
+
// Send transaction at the source chain with some gas.
|
|
169
|
+
const tx = yield contract
|
|
170
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", {
|
|
171
|
+
value: gasPaid,
|
|
172
|
+
})
|
|
173
|
+
.then((tx) => tx.wait());
|
|
174
|
+
// Mock that this transaction is already executed.
|
|
175
|
+
jest.spyOn(api, "isExecuted").mockReturnValueOnce(Promise.resolve(true));
|
|
176
|
+
// Call addNativeGas function
|
|
177
|
+
const response = yield api.addNativeGas(types_1.EvmChain.AVALANCHE, tx.transactionHash, addNativeGasOptions);
|
|
178
|
+
expect(response).toEqual((0, error_1.AlreadyExecutedError)());
|
|
179
|
+
}));
|
|
180
|
+
test("it shouldn't call 'addNativeGas' given tx doesn't exist", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
181
|
+
// Override the provider and wallet to use data from the local network
|
|
182
|
+
const addNativeGasOptions = {
|
|
183
|
+
evmWalletDetails: {
|
|
184
|
+
useWindowEthereum: false,
|
|
185
|
+
privateKey: userWallet.privateKey,
|
|
186
|
+
provider,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
// Call addNativeGas function by passing non-existing tx hash
|
|
190
|
+
const response = yield api.addNativeGas(chain, "0xcd1edb36c37caadf852c4614e3bed1082528d7c6a8d2de3fff3c596f8e675b90", // random tx hash
|
|
191
|
+
addNativeGasOptions);
|
|
192
|
+
// Validate response
|
|
193
|
+
expect(response).toEqual((0, error_1.InvalidTransactionError)(chain));
|
|
194
|
+
}));
|
|
195
|
+
test("it shouldn't call 'addNativeGas' given tx is not gmp call", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
196
|
+
// Sending non-gmp transaction
|
|
197
|
+
const notGmpTx = yield usdc
|
|
198
|
+
.transfer("0x0000000000000000000000000000000000000001", "1")
|
|
199
|
+
.then((tx) => tx.wait());
|
|
200
|
+
// Call addNativeGas function and passing non-gmp tx hash
|
|
201
|
+
const response = yield api.addNativeGas(chain, notGmpTx.transactionHash, // random tx hash
|
|
202
|
+
addNativeGasOptions);
|
|
203
|
+
// Validate response
|
|
204
|
+
expect(response).toEqual((0, error_1.NotGMPTransactionError)());
|
|
205
|
+
}));
|
|
206
|
+
test("it shouldn't call 'addNativeGas' given gas is already overpaid", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
207
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("10");
|
|
208
|
+
// Send transaction at the source chain with overpaid gas
|
|
209
|
+
const tx = yield contract
|
|
210
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", {
|
|
211
|
+
value: gasPaid,
|
|
212
|
+
})
|
|
213
|
+
.then((tx) => tx.wait());
|
|
214
|
+
// Call addNativeGas function
|
|
215
|
+
const response = yield api.addNativeGas(chain, tx.transactionHash, addNativeGasOptions);
|
|
216
|
+
expect(response).toEqual((0, error_1.AlreadyPaidGasFeeError)());
|
|
217
|
+
}));
|
|
218
|
+
test("it shouldn't call 'addNativeGas' given gasPrice api is not available and gas amount is not specified", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
219
|
+
// Override the provider and wallet to use data from the local network
|
|
220
|
+
const addNativeGasOptions = {
|
|
221
|
+
evmWalletDetails: {
|
|
222
|
+
useWindowEthereum: false,
|
|
223
|
+
privateKey: userWallet.privateKey,
|
|
224
|
+
provider,
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("10");
|
|
228
|
+
// Send transaction at the source chain with overpaid gas
|
|
229
|
+
const tx = yield contract
|
|
230
|
+
.connect(userWallet)
|
|
231
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", {
|
|
232
|
+
value: gasPaid,
|
|
233
|
+
})
|
|
234
|
+
.then((tx) => tx.wait());
|
|
235
|
+
// Simulate gasPrice api error
|
|
236
|
+
jest
|
|
237
|
+
.spyOn(api.axelarQueryApi, "estimateGasFee")
|
|
238
|
+
.mockRejectedValueOnce(() => Promise.reject());
|
|
239
|
+
// Call addNativeGas function
|
|
240
|
+
const response = yield api.addNativeGas(chain, // Passing wrong value here will cause the gas price api to return error
|
|
241
|
+
tx.transactionHash, addNativeGasOptions);
|
|
242
|
+
expect(response.success).toBe(false);
|
|
243
|
+
expect(response.error).toBe("Couldn't query the gas price");
|
|
244
|
+
}));
|
|
245
|
+
test("it should call 'addNativeGas' given gasPrice api is not available but gas amount is specified", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
246
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.00001");
|
|
247
|
+
// Send transaction at the source chain with overpaid gas
|
|
248
|
+
addNativeGasOptions.amount = gasPaid.toString();
|
|
249
|
+
const tx = yield contract
|
|
250
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", {
|
|
251
|
+
value: gasPaid,
|
|
252
|
+
})
|
|
253
|
+
.then((tx) => tx.wait());
|
|
254
|
+
// Simulate gasPrice api error
|
|
255
|
+
jest
|
|
256
|
+
.spyOn(api.axelarQueryApi, "estimateGasFee")
|
|
257
|
+
.mockRejectedValueOnce(() => Promise.reject());
|
|
258
|
+
// Call addNativeGas function
|
|
259
|
+
const response = yield api.addNativeGas(chain, tx.transactionHash, addNativeGasOptions);
|
|
260
|
+
expect(response.success).toBe(true);
|
|
261
|
+
}));
|
|
262
|
+
test("it should call 'addNativeGas' successfully", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
263
|
+
var _a;
|
|
264
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.000001");
|
|
265
|
+
// Send transaction at the source chain with some gas.
|
|
266
|
+
const tx = yield contract
|
|
267
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", {
|
|
268
|
+
value: gasPaid,
|
|
269
|
+
})
|
|
270
|
+
.then((tx) => tx.wait());
|
|
271
|
+
// Call addNativeGas function
|
|
272
|
+
const response = yield api.addNativeGas(chain, tx.transactionHash, addNativeGasOptions);
|
|
273
|
+
// Validate response structure
|
|
274
|
+
expect(response.success).toBe(true);
|
|
275
|
+
expect(response.transaction).toBeDefined();
|
|
276
|
+
const signatureNativeGasAdded = ethers_1.ethers.utils.id("NativeGasAdded(bytes32,uint256,uint256,address)");
|
|
277
|
+
const nativeGasAddedEvent = (0, helpers_1.findContractEvent)(response.transaction, [signatureNativeGasAdded], new utils_2.Interface(IAxelarGasService_json_1.default));
|
|
278
|
+
// Calculate how many gas we need to add more.
|
|
279
|
+
const _expectedGasFee = yield api.calculateNativeGasFee(tx.transactionHash, chain, types_1.EvmChain.MOONBEAM, types_1.GasToken.AVAX, { provider });
|
|
280
|
+
const expectedLogIndex = (0, helpers_1.getLogIndexFromTxReceipt)(tx);
|
|
281
|
+
// Validate event data
|
|
282
|
+
const args = nativeGasAddedEvent === null || nativeGasAddedEvent === void 0 ? void 0 : nativeGasAddedEvent.eventLog.args;
|
|
283
|
+
const eventGasFeeAmount = parseFloat(ethers_1.ethers.utils.formatEther(args === null || args === void 0 ? void 0 : args.gasFeeAmount)).toFixed(2);
|
|
284
|
+
const expectedGasFee = parseFloat(ethers_1.ethers.utils.formatEther(_expectedGasFee)).toFixed(2);
|
|
285
|
+
expect((_a = args === null || args === void 0 ? void 0 : args.logIndex) === null || _a === void 0 ? void 0 : _a.toNumber()).toBe(expectedLogIndex);
|
|
286
|
+
expect(eventGasFeeAmount).toBe(expectedGasFee);
|
|
287
|
+
expect(args === null || args === void 0 ? void 0 : args.refundAddress).toBe(userWallet.address);
|
|
288
|
+
}));
|
|
289
|
+
});
|
|
290
|
+
describe("addGas", () => {
|
|
291
|
+
let api;
|
|
292
|
+
let contract;
|
|
293
|
+
let userWallet;
|
|
294
|
+
let provider;
|
|
295
|
+
let gasReceiverContract;
|
|
296
|
+
let usdc;
|
|
297
|
+
const chain = types_1.EvmChain.AVALANCHE;
|
|
298
|
+
const tokenSymbol = "aUSDC";
|
|
299
|
+
// Override the provider and wallet to use data from the local network
|
|
300
|
+
let addGasOptions;
|
|
301
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
302
|
+
jest.clearAllMocks();
|
|
303
|
+
api = new AxelarGMPRecoveryAPI_1.AxelarGMPRecoveryAPI({ environment: types_1.Environment.TESTNET });
|
|
304
|
+
// Create a source chain network
|
|
305
|
+
const srcChain = yield (0, axelar_local_dev_1.createNetwork)({ name: chain });
|
|
306
|
+
gasReceiverContract = srcChain.gasReceiver;
|
|
307
|
+
userWallet = srcChain.adminWallets[0];
|
|
308
|
+
provider = srcChain.provider;
|
|
309
|
+
usdc = srcChain.usdc.connect(userWallet);
|
|
310
|
+
addGasOptions = {
|
|
311
|
+
evmWalletDetails: {
|
|
312
|
+
useWindowEthereum: false,
|
|
313
|
+
privateKey: userWallet.privateKey,
|
|
314
|
+
provider,
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
const args = [srcChain.gateway.address, srcChain.gasReceiver.address];
|
|
318
|
+
// Deploy test contract
|
|
319
|
+
contract = yield (0, utils_1.deployContract)(userWallet, DistributionExecutableGasToken_json_1.default, args).then((contract) => contract.connect(userWallet));
|
|
320
|
+
// Send USDC to the user wallet for testing
|
|
321
|
+
yield srcChain.giveToken(userWallet.address, tokenSymbol, BigInt(ethers_1.ethers.utils.parseEther("1000000").toString()));
|
|
322
|
+
// Approve token before running any test
|
|
323
|
+
yield usdc
|
|
324
|
+
.approve(contract.address, ethers_1.ethers.constants.MaxUint256)
|
|
325
|
+
.then((tx) => tx.wait(1));
|
|
326
|
+
yield usdc
|
|
327
|
+
.approve(gasReceiverContract.address, ethers_1.ethers.constants.MaxUint256)
|
|
328
|
+
.then((tx) => tx.wait(1));
|
|
329
|
+
// This is a hacky way to set the gas receiver constant object to local gas receiver contract address
|
|
330
|
+
contract_1.GAS_RECEIVER[types_1.Environment.TESTNET][chain] = gasReceiverContract.address;
|
|
331
|
+
AxelarGateway_1.AXELAR_GATEWAY[types_1.Environment.TESTNET][chain] = srcChain.gateway.address;
|
|
332
|
+
}));
|
|
333
|
+
test("it shouldn't call 'addGas' given tx is already executed", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
334
|
+
const amount = ethers_1.ethers.utils.parseEther("0.0001");
|
|
335
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.000001");
|
|
336
|
+
// Send transaction at the source chain with some gas.
|
|
337
|
+
const tx = yield contract
|
|
338
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, amount, usdc.address, gasPaid)
|
|
339
|
+
.then((tx) => tx.wait());
|
|
340
|
+
// Mock that this transaction is already executed.
|
|
341
|
+
jest.spyOn(api, "isExecuted").mockReturnValueOnce(Promise.resolve(true));
|
|
342
|
+
// Call addGas function
|
|
343
|
+
const response = yield api.addGas(types_1.EvmChain.AVALANCHE, tx.transactionHash, usdc.address, addGasOptions);
|
|
344
|
+
expect(response).toEqual((0, error_1.AlreadyExecutedError)());
|
|
345
|
+
}));
|
|
346
|
+
test("it shouldn't call 'addGas' given tx doesn't exist", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
347
|
+
// Call addNativeGas function by passing non-existing tx hash
|
|
348
|
+
const response = yield api.addGas(chain, "0xcd1edb36c37caadf852c4614e3bed1082528d7c6a8d2de3fff3c596f8e675b90", // random tx hash
|
|
349
|
+
usdc.address, addGasOptions);
|
|
350
|
+
// Validate response
|
|
351
|
+
expect(response).toEqual((0, error_1.InvalidTransactionError)(chain));
|
|
352
|
+
}));
|
|
353
|
+
test("it shouldn't call 'addGas' given tx is not gmp call", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
354
|
+
// Sending non-gmp transaction
|
|
355
|
+
const notGmpTx = yield usdc
|
|
356
|
+
.transfer("0x0000000000000000000000000000000000000001", "1")
|
|
357
|
+
.then((tx) => tx.wait());
|
|
358
|
+
// Call addNativeGas function and passing non-gmp tx hash
|
|
359
|
+
const response = yield api.addGas(chain, notGmpTx.transactionHash, // random tx hash
|
|
360
|
+
usdc.address, addGasOptions);
|
|
361
|
+
// Validate response
|
|
362
|
+
expect(response).toEqual((0, error_1.NotGMPTransactionError)());
|
|
363
|
+
}));
|
|
364
|
+
test("it shouldn't call 'addGas' given gas is already overpaid", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
365
|
+
const decimals = yield usdc.decimals();
|
|
366
|
+
const gasPaid = ethers_1.ethers.utils.parseUnits("100", decimals);
|
|
367
|
+
// Send transaction at the source chain with overpaid gas
|
|
368
|
+
const tx = yield contract
|
|
369
|
+
.connect(userWallet)
|
|
370
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", usdc.address, gasPaid)
|
|
371
|
+
.then((tx) => tx.wait());
|
|
372
|
+
// Mock total gas fee is 0.1 USDC
|
|
373
|
+
jest
|
|
374
|
+
.spyOn(api.axelarQueryApi, "estimateGasFee")
|
|
375
|
+
.mockResolvedValue(ethers_1.ethers.utils.parseUnits("0.1", decimals).toString());
|
|
376
|
+
// Call addGas function
|
|
377
|
+
const response = yield api.addGas(chain, tx.transactionHash, usdc.address, addGasOptions);
|
|
378
|
+
expect(response).toEqual((0, error_1.AlreadyPaidGasFeeError)());
|
|
379
|
+
}));
|
|
380
|
+
test("it shouldn't call 'addGas' given gasPrice api is not available and gas amount is not specified", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
381
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("10");
|
|
382
|
+
// Send transaction at the source chain with overpaid gas
|
|
383
|
+
const tx = yield contract
|
|
384
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", usdc.address, gasPaid)
|
|
385
|
+
.then((tx) => tx.wait());
|
|
386
|
+
// Simulate gasPrice api error
|
|
387
|
+
jest
|
|
388
|
+
.spyOn(api.axelarQueryApi, "estimateGasFee")
|
|
389
|
+
.mockRejectedValueOnce(() => Promise.reject());
|
|
390
|
+
// Call addNativeGas function
|
|
391
|
+
const response = yield api.addGas(chain, // Passing wrong value here will cause the gas price api to return error
|
|
392
|
+
tx.transactionHash, usdc.address, addGasOptions);
|
|
393
|
+
expect(response).toEqual((0, error_1.GasPriceAPIError)());
|
|
394
|
+
}));
|
|
395
|
+
test("it should call 'addGas' given gasPrice api is not available but gas amount is specified", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
396
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.00001");
|
|
397
|
+
// Send transaction at the source chain with overpaid gas
|
|
398
|
+
const tx = yield contract
|
|
399
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", usdc.address, gasPaid)
|
|
400
|
+
.then((tx) => tx.wait());
|
|
401
|
+
// Simulate gasPrice api error
|
|
402
|
+
jest
|
|
403
|
+
.spyOn(api.axelarQueryApi, "estimateGasFee")
|
|
404
|
+
.mockRejectedValueOnce(() => Promise.reject());
|
|
405
|
+
// Override the amount, so it should call contract's addGas even the gas price api returns error
|
|
406
|
+
addGasOptions.amount = ethers_1.ethers.utils.parseEther("10").toString();
|
|
407
|
+
// Call addGas function
|
|
408
|
+
const response = yield api.addGas(chain, tx.transactionHash, usdc.address, addGasOptions);
|
|
409
|
+
expect(response.success).toBe(true);
|
|
410
|
+
}));
|
|
411
|
+
test("it shouldn't call 'addGas' given 'gasTokenAddress' does not exist", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
412
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.00001");
|
|
413
|
+
// Send transaction at the source chain with overpaid gas
|
|
414
|
+
const tx = yield contract
|
|
415
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", usdc.address, gasPaid)
|
|
416
|
+
.then((tx) => tx.wait());
|
|
417
|
+
// Simulate gasPrice api error
|
|
418
|
+
jest
|
|
419
|
+
.spyOn(api.axelarQueryApi, "estimateGasFee")
|
|
420
|
+
.mockRejectedValueOnce(() => Promise.reject());
|
|
421
|
+
// Call addGas function
|
|
422
|
+
const response = yield api.addGas(chain, tx.transactionHash, ethers_1.ethers.constants.AddressZero, addGasOptions);
|
|
423
|
+
expect(response).toEqual((0, error_1.InvalidGasTokenError)());
|
|
424
|
+
}));
|
|
425
|
+
test("it shouldn't call 'addGas' given `gasTokenAddress` is not supported by Axelar", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
426
|
+
const testToken = yield (0, utils_1.deployContract)(userWallet, TestToken_json_1.default, ["100000000000"]).then((contract) => contract.connect(userWallet));
|
|
427
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.00001");
|
|
428
|
+
// Send transaction at the source chain with overpaid gas
|
|
429
|
+
const tx = yield contract
|
|
430
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", usdc.address, gasPaid)
|
|
431
|
+
.then((tx) => tx.wait());
|
|
432
|
+
// Simulate gasPrice api error
|
|
433
|
+
jest
|
|
434
|
+
.spyOn(api.axelarQueryApi, "estimateGasFee")
|
|
435
|
+
.mockRejectedValueOnce(() => Promise.reject());
|
|
436
|
+
// Call addGas function
|
|
437
|
+
const response = yield api.addGas(chain, tx.transactionHash, testToken.address, addGasOptions);
|
|
438
|
+
expect(response).toEqual((0, error_1.UnsupportedGasTokenError)(testToken.address));
|
|
439
|
+
}));
|
|
440
|
+
test("it should call 'addGas' successfully", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
441
|
+
var _a;
|
|
442
|
+
const gasPaid = ethers_1.ethers.utils.parseEther("0.000001");
|
|
443
|
+
// Send transaction at the source chain with some gas.
|
|
444
|
+
const tx = yield contract
|
|
445
|
+
.sendToMany(types_1.EvmChain.MOONBEAM, ethers_1.ethers.constants.AddressZero, [ethers_1.ethers.constants.AddressZero], tokenSymbol, "10000", usdc.address, gasPaid)
|
|
446
|
+
.then((tx) => tx.wait());
|
|
447
|
+
// Mock total gas fee is 0.1 USDC
|
|
448
|
+
jest
|
|
449
|
+
.spyOn(api.axelarQueryApi, "estimateGasFee")
|
|
450
|
+
.mockResolvedValue(ethers_1.ethers.utils.parseEther("0.1").toString());
|
|
451
|
+
// Call addGas function
|
|
452
|
+
const response = yield api.addGas(chain, tx.transactionHash, usdc.address, addGasOptions);
|
|
453
|
+
// Validate response structure
|
|
454
|
+
expect(response.success).toBe(true);
|
|
455
|
+
expect(response.transaction).toBeDefined();
|
|
456
|
+
const signatureGasAdded = ethers_1.ethers.utils.id("GasAdded(bytes32,uint256,address,uint256,address)");
|
|
457
|
+
const gasAddedEvent = (0, helpers_1.findContractEvent)(response.transaction, [signatureGasAdded], new utils_2.Interface(IAxelarGasService_json_1.default));
|
|
458
|
+
// Calculate how many gas we need to add more.
|
|
459
|
+
const _expectedGasFee = yield api.calculateGasFee(tx.transactionHash, chain, types_1.EvmChain.MOONBEAM, types_1.GasToken.USDC, { provider });
|
|
460
|
+
const expectedLogIndex = (0, helpers_1.getLogIndexFromTxReceipt)(tx);
|
|
461
|
+
// Validate event data
|
|
462
|
+
const args = gasAddedEvent === null || gasAddedEvent === void 0 ? void 0 : gasAddedEvent.eventLog.args;
|
|
463
|
+
const eventGasFeeAmount = parseFloat(ethers_1.ethers.utils.formatEther(args === null || args === void 0 ? void 0 : args.gasFeeAmount)).toFixed(2);
|
|
464
|
+
const expectedGasFee = parseFloat(ethers_1.ethers.utils.formatEther(_expectedGasFee)).toFixed(2);
|
|
465
|
+
expect((_a = args === null || args === void 0 ? void 0 : args.logIndex) === null || _a === void 0 ? void 0 : _a.toNumber()).toBe(expectedLogIndex);
|
|
466
|
+
expect(eventGasFeeAmount).toBe(expectedGasFee);
|
|
467
|
+
expect(args === null || args === void 0 ? void 0 : args.refundAddress).toBe(userWallet.address);
|
|
468
|
+
}));
|
|
469
|
+
});
|
|
470
|
+
describe("execute", () => {
|
|
471
|
+
let api;
|
|
472
|
+
const wallet = ethers_1.Wallet.createRandom();
|
|
473
|
+
const evmWalletDetails = {
|
|
474
|
+
privateKey: wallet.privateKey,
|
|
475
|
+
};
|
|
476
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
477
|
+
jest.clearAllMocks();
|
|
478
|
+
api = new AxelarGMPRecoveryAPI_1.AxelarGMPRecoveryAPI({ environment: types_1.Environment.TESTNET });
|
|
479
|
+
}));
|
|
480
|
+
test("it shouldn't call 'execute' given tx is already executed", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
481
|
+
const mockApi = jest.spyOn(api, "queryExecuteParams");
|
|
482
|
+
mockApi.mockResolvedValueOnce({ status: AxelarRecoveryApi_1.GMPStatus.EXECUTED });
|
|
483
|
+
const response = yield api.execute("0x86e5f91eff5a8a815e90449ca32e02781508f3b94620bbdf521f2ba07c41d9ae", evmWalletDetails);
|
|
484
|
+
expect(response).toEqual((0, error_1.AlreadyExecutedError)());
|
|
485
|
+
}));
|
|
486
|
+
test("it shouldn't call 'execute' given tx has not approved yet", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
487
|
+
const mockApi = jest.spyOn(api, "queryExecuteParams");
|
|
488
|
+
mockApi.mockResolvedValueOnce({ status: AxelarRecoveryApi_1.GMPStatus.CALL });
|
|
489
|
+
const response = yield api.execute("0x86e5f91eff5a8a815e90449ca32e02781508f3b94620bbdf521f2ba07c41d9ae", evmWalletDetails);
|
|
490
|
+
expect(response).toEqual((0, error_1.NotApprovedError)());
|
|
491
|
+
}));
|
|
492
|
+
test("it shouldn't call 'execute' given gmp api error", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
493
|
+
const mockApi = jest.spyOn(api, "queryExecuteParams");
|
|
494
|
+
mockApi.mockResolvedValueOnce(undefined);
|
|
495
|
+
const response = yield api.execute("0x86e5f91eff5a8a815e90449ca32e02781508f3b94620bbdf521f2ba07c41d9ae", evmWalletDetails);
|
|
496
|
+
expect(response).toEqual((0, error_1.GMPQueryError)());
|
|
497
|
+
}));
|
|
498
|
+
test("it shouldn't call 'saveGMP' given contract call failed", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
499
|
+
// mock query api
|
|
500
|
+
const mockApi = jest.spyOn(api, "queryExecuteParams");
|
|
501
|
+
mockApi.mockResolvedValueOnce({
|
|
502
|
+
status: AxelarRecoveryApi_1.GMPStatus.APPROVED,
|
|
503
|
+
data: (0, stubs_1.executeParamsStub)(),
|
|
504
|
+
});
|
|
505
|
+
// Mock contract call is failed
|
|
506
|
+
const error = new Error("reverted");
|
|
507
|
+
jest.spyOn(ContractCallHelper, "callExecute").mockRejectedValueOnce(error);
|
|
508
|
+
// Mock private saveGMP
|
|
509
|
+
const mockGMPApi = jest.spyOn(AxelarGMPRecoveryAPI_1.AxelarGMPRecoveryAPI.prototype, "saveGMP");
|
|
510
|
+
mockGMPApi.mockImplementation(() => Promise.resolve(undefined));
|
|
511
|
+
const response = yield api.execute("0x86e5f91eff5a8a815e90449ca32e02781508f3b94620bbdf521f2ba07c41d9ae", evmWalletDetails);
|
|
512
|
+
// Expect returns error
|
|
513
|
+
expect(response).toEqual((0, error_1.ContractCallError)(error));
|
|
514
|
+
// Expect we don't call saveGMP api
|
|
515
|
+
expect(mockGMPApi).not.toHaveBeenCalled();
|
|
516
|
+
}));
|
|
517
|
+
test("it should call 'execute' and return success = true", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
518
|
+
// mock query api
|
|
519
|
+
const mockApi = jest.spyOn(api, "queryExecuteParams");
|
|
520
|
+
mockApi.mockResolvedValueOnce({
|
|
521
|
+
status: AxelarRecoveryApi_1.GMPStatus.APPROVED,
|
|
522
|
+
data: (0, stubs_1.executeParamsStub)(),
|
|
523
|
+
});
|
|
524
|
+
// Mock contract call is successful
|
|
525
|
+
jest.spyOn(ContractCallHelper, "callExecute").mockResolvedValueOnce((0, stubs_1.contractReceiptStub)());
|
|
526
|
+
// Mock private saveGMP
|
|
527
|
+
const mockGMPApi = jest.spyOn(AxelarGMPRecoveryAPI_1.AxelarGMPRecoveryAPI.prototype, "saveGMP");
|
|
528
|
+
mockGMPApi.mockImplementation(() => Promise.resolve(undefined));
|
|
529
|
+
const response = yield api.execute("0x86e5f91eff5a8a815e90449ca32e02781508f3b94620bbdf521f2ba07c41d9ae", evmWalletDetails);
|
|
530
|
+
expect(response).toEqual({
|
|
531
|
+
success: true,
|
|
532
|
+
transaction: (0, stubs_1.contractReceiptStub)(),
|
|
533
|
+
});
|
|
534
|
+
expect(mockGMPApi).toHaveBeenCalledTimes(1);
|
|
535
|
+
}));
|
|
536
|
+
});
|
|
30
537
|
});
|
|
31
538
|
//# sourceMappingURL=AxelarGMPRecoveryAPI.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AxelarGMPRecoveryAPI.spec.js","sourceRoot":"","sources":["../../../../../src/libs/test/TransactionRecoveryAPI/AxelarGMPRecoveryAPI.spec.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4FAAyF;AACzF,uCAA0C;AAE1C,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,MAAM,GAAG,GAAG,IAAI,2CAAoB,CAAC,EAAE,WAAW,EAAE,mBAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAE3E,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,IAAI,CAAC,gCAAgC,EAAE,GAAS,EAAE;YAC9C,MAAM,mBAAmB,GAAG;gBACxB,MAAM,EAAE,oEAAoE;gBAC5E,KAAK,EAAE,WAAW;aACrB,CAAA;YACD,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAC,YAAY,CAAC,CAAA;YACxC,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC;QACtC,CAAC,CAAA,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"AxelarGMPRecoveryAPI.spec.js","sourceRoot":"","sources":["../../../../../src/libs/test/TransactionRecoveryAPI/AxelarGMPRecoveryAPI.spec.ts"],"names":[],"mappings":"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"}
|