@across-protocol/sdk 4.3.42 → 4.3.43
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/cjs/relayFeeCalculator/chain-queries/svmQuery.js +35 -8
- package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js +37 -10
- package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -1
- package/dist/types/relayFeeCalculator/chain-queries/svmQuery.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/relayFeeCalculator/chain-queries/svmQuery.ts +36 -4
|
@@ -10,6 +10,8 @@ var constants_1 = require("../../constants");
|
|
|
10
10
|
var gasPriceOracle_1 = require("../../gasPriceOracle");
|
|
11
11
|
var utils_1 = require("../../utils");
|
|
12
12
|
var relayFeeCalculator_1 = require("../relayFeeCalculator");
|
|
13
|
+
var token_1 = require("@solana-program/token");
|
|
14
|
+
var token_2022_1 = require("@solana-program/token-2022");
|
|
13
15
|
var SvmQuery = (function () {
|
|
14
16
|
function SvmQuery(provider, symbolMapping, spokePool, simulatedRelayerAddress, logger, coingeckoProApiKey, fixedGasPrice, coingeckoBaseCurrency) {
|
|
15
17
|
if (coingeckoBaseCurrency === void 0) { coingeckoBaseCurrency = "eth"; }
|
|
@@ -29,7 +31,7 @@ var SvmQuery = (function () {
|
|
|
29
31
|
if (relayer === void 0) { relayer = (0, relayFeeCalculator_1.getDefaultRelayer)(relayData.destinationChainId); }
|
|
30
32
|
if (options === void 0) { options = {}; }
|
|
31
33
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
32
|
-
var destinationChainId, recipient, outputToken, exclusiveRelayer, _a, repaymentChainId, repaymentAddress, fillRelayTx, _b, computeUnitsConsumed, gasPriceEstimate, _c, _d, _e, gasPrice;
|
|
34
|
+
var destinationChainId, recipient, outputToken, exclusiveRelayer, _a, repaymentChainId, repaymentAddress, fillRelayTx, _b, computeUnitsConsumed, gasPriceEstimate, tokenAccountInfo, _c, _d, _e, tokenOwner, recipientAta, encodedAta, gasPrice, tokenGasCost, extensions, mint, tokenAccountSize, rentCostInLamports;
|
|
33
35
|
return tslib_1.__generator(this, function (_f) {
|
|
34
36
|
switch (_f.label) {
|
|
35
37
|
case 0:
|
|
@@ -51,16 +53,41 @@ var SvmQuery = (function () {
|
|
|
51
53
|
unsignedTx: fillRelayTx,
|
|
52
54
|
baseFeeMultiplier: options.baseFeeMultiplier,
|
|
53
55
|
priorityFeeMultiplier: options.priorityFeeMultiplier,
|
|
54
|
-
})
|
|
56
|
+
}),
|
|
57
|
+
this.provider.getAccountInfo((0, svm_1.toAddress)(outputToken), { encoding: "base58" }).send()
|
|
55
58
|
]])];
|
|
56
59
|
case 3:
|
|
57
|
-
_b = _f.sent(), computeUnitsConsumed = _b[0], gasPriceEstimate = _b[1];
|
|
60
|
+
_b = _f.sent(), computeUnitsConsumed = _b[0], gasPriceEstimate = _b[1], tokenAccountInfo = _b[2];
|
|
61
|
+
tokenOwner = tokenAccountInfo.value.owner;
|
|
62
|
+
(0, assert_1.default)(tokenOwner === token_2022_1.TOKEN_2022_PROGRAM_ADDRESS || tokenOwner === token_1.TOKEN_PROGRAM_ADDRESS, "".concat(outputToken, " has invalid token account owner ").concat(tokenOwner, "."));
|
|
63
|
+
return [4, (0, svm_1.getAssociatedTokenAddress)(recipient, outputToken, tokenOwner)];
|
|
64
|
+
case 4:
|
|
65
|
+
recipientAta = _f.sent();
|
|
66
|
+
return [4, (0, kit_1.fetchEncodedAccount)(this.provider, recipientAta)];
|
|
67
|
+
case 5:
|
|
68
|
+
encodedAta = _f.sent();
|
|
58
69
|
gasPrice = gasPriceEstimate.baseFee.add(gasPriceEstimate.microLamportsPerComputeUnit.mul(computeUnitsConsumed).div((0, utils_1.toBN)(1000000)));
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
tokenGasCost = gasPrice;
|
|
71
|
+
if (!!encodedAta.exists) return [3, 9];
|
|
72
|
+
extensions = undefined;
|
|
73
|
+
if (!(tokenOwner === token_2022_1.TOKEN_2022_PROGRAM_ADDRESS)) return [3, 7];
|
|
74
|
+
return [4, (0, token_2022_1.fetchMint)(this.provider, (0, svm_1.toAddress)(outputToken))];
|
|
75
|
+
case 6:
|
|
76
|
+
mint = _f.sent();
|
|
77
|
+
extensions = (0, kit_1.isSome)(mint.data.extensions) ? mint.data.extensions.value : undefined;
|
|
78
|
+
_f.label = 7;
|
|
79
|
+
case 7:
|
|
80
|
+
tokenAccountSize = (0, token_2022_1.getTokenSize)(extensions);
|
|
81
|
+
return [4, this.provider.getMinimumBalanceForRentExemption(BigInt(tokenAccountSize)).send()];
|
|
82
|
+
case 8:
|
|
83
|
+
rentCostInLamports = _f.sent();
|
|
84
|
+
tokenGasCost = tokenGasCost.add((0, utils_1.toBN)(Number(rentCostInLamports)));
|
|
85
|
+
_f.label = 9;
|
|
86
|
+
case 9: return [2, {
|
|
87
|
+
nativeGasCost: computeUnitsConsumed,
|
|
88
|
+
tokenGasCost: tokenGasCost,
|
|
89
|
+
gasPrice: gasPrice,
|
|
90
|
+
}];
|
|
64
91
|
}
|
|
65
92
|
});
|
|
66
93
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svmQuery.js","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/svmQuery.ts"],"names":[],"mappings":";;;;AAAA,0DAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"svmQuery.js","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/svmQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { __assign, __awaiter, __generator } from "tslib";
|
|
2
2
|
import assert from "assert";
|
|
3
|
-
import { getComputeUnitEstimateForTransactionMessageFactory } from "@solana/kit";
|
|
4
|
-
import { SolanaVoidSigner, getFillRelayTx } from "../../arch/svm";
|
|
3
|
+
import { getComputeUnitEstimateForTransactionMessageFactory, fetchEncodedAccount, isSome, } from "@solana/kit";
|
|
4
|
+
import { SolanaVoidSigner, getFillRelayTx, toAddress, getAssociatedTokenAddress } from "../../arch/svm";
|
|
5
5
|
import { Coingecko } from "../../coingecko";
|
|
6
6
|
import { CHAIN_IDs } from "../../constants";
|
|
7
7
|
import { getGasPriceEstimate } from "../../gasPriceOracle";
|
|
8
8
|
import { toBN } from "../../utils";
|
|
9
9
|
import { getDefaultRelayer } from "../relayFeeCalculator";
|
|
10
|
+
import { TOKEN_PROGRAM_ADDRESS } from "@solana-program/token";
|
|
11
|
+
import { TOKEN_2022_PROGRAM_ADDRESS, getTokenSize, fetchMint } from "@solana-program/token-2022";
|
|
10
12
|
/**
|
|
11
13
|
* A special QueryBase implementation for SVM used for querying gas costs, token prices, and decimals of various tokens
|
|
12
14
|
* on Solana.
|
|
@@ -51,7 +53,7 @@ var SvmQuery = /** @class */ (function () {
|
|
|
51
53
|
if (relayer === void 0) { relayer = getDefaultRelayer(relayData.destinationChainId); }
|
|
52
54
|
if (options === void 0) { options = {}; }
|
|
53
55
|
return __awaiter(this, void 0, void 0, function () {
|
|
54
|
-
var destinationChainId, recipient, outputToken, exclusiveRelayer, _a, repaymentChainId, repaymentAddress, fillRelayTx, _b, computeUnitsConsumed, gasPriceEstimate, _c, _d, _e, gasPrice;
|
|
56
|
+
var destinationChainId, recipient, outputToken, exclusiveRelayer, _a, repaymentChainId, repaymentAddress, fillRelayTx, _b, computeUnitsConsumed, gasPriceEstimate, tokenAccountInfo, _c, _d, _e, tokenOwner, recipientAta, encodedAta, gasPrice, tokenGasCost, extensions, mint, tokenAccountSize, rentCostInLamports;
|
|
55
57
|
return __generator(this, function (_f) {
|
|
56
58
|
switch (_f.label) {
|
|
57
59
|
case 0:
|
|
@@ -73,17 +75,42 @@ var SvmQuery = /** @class */ (function () {
|
|
|
73
75
|
unsignedTx: fillRelayTx,
|
|
74
76
|
baseFeeMultiplier: options.baseFeeMultiplier,
|
|
75
77
|
priorityFeeMultiplier: options.priorityFeeMultiplier,
|
|
76
|
-
})
|
|
78
|
+
}),
|
|
79
|
+
this.provider.getAccountInfo(toAddress(outputToken), { encoding: "base58" }).send()
|
|
77
80
|
]])];
|
|
78
81
|
case 3:
|
|
79
|
-
_b = _f.sent(), computeUnitsConsumed = _b[0], gasPriceEstimate = _b[1];
|
|
82
|
+
_b = _f.sent(), computeUnitsConsumed = _b[0], gasPriceEstimate = _b[1], tokenAccountInfo = _b[2];
|
|
83
|
+
tokenOwner = tokenAccountInfo.value.owner;
|
|
84
|
+
assert(tokenOwner === TOKEN_2022_PROGRAM_ADDRESS || tokenOwner === TOKEN_PROGRAM_ADDRESS, "".concat(outputToken, " has invalid token account owner ").concat(tokenOwner, "."));
|
|
85
|
+
return [4 /*yield*/, getAssociatedTokenAddress(recipient, outputToken, tokenOwner)];
|
|
86
|
+
case 4:
|
|
87
|
+
recipientAta = _f.sent();
|
|
88
|
+
return [4 /*yield*/, fetchEncodedAccount(this.provider, recipientAta)];
|
|
89
|
+
case 5:
|
|
90
|
+
encodedAta = _f.sent();
|
|
80
91
|
gasPrice = gasPriceEstimate.baseFee.add(gasPriceEstimate.microLamportsPerComputeUnit.mul(computeUnitsConsumed).div(toBN(1000000)) // 1_000_000 microLamports/lamport.
|
|
81
92
|
);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
93
|
+
tokenGasCost = gasPrice;
|
|
94
|
+
if (!!encodedAta.exists) return [3 /*break*/, 9];
|
|
95
|
+
extensions = undefined;
|
|
96
|
+
if (!(tokenOwner === TOKEN_2022_PROGRAM_ADDRESS)) return [3 /*break*/, 7];
|
|
97
|
+
return [4 /*yield*/, fetchMint(this.provider, toAddress(outputToken))];
|
|
98
|
+
case 6:
|
|
99
|
+
mint = _f.sent();
|
|
100
|
+
extensions = isSome(mint.data.extensions) ? mint.data.extensions.value : undefined;
|
|
101
|
+
_f.label = 7;
|
|
102
|
+
case 7:
|
|
103
|
+
tokenAccountSize = getTokenSize(extensions);
|
|
104
|
+
return [4 /*yield*/, this.provider.getMinimumBalanceForRentExemption(BigInt(tokenAccountSize)).send()];
|
|
105
|
+
case 8:
|
|
106
|
+
rentCostInLamports = _f.sent();
|
|
107
|
+
tokenGasCost = tokenGasCost.add(toBN(Number(rentCostInLamports)));
|
|
108
|
+
_f.label = 9;
|
|
109
|
+
case 9: return [2 /*return*/, {
|
|
110
|
+
nativeGasCost: computeUnitsConsumed,
|
|
111
|
+
tokenGasCost: tokenGasCost,
|
|
112
|
+
gasPrice: gasPrice,
|
|
113
|
+
}];
|
|
87
114
|
}
|
|
88
115
|
});
|
|
89
116
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svmQuery.js","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/svmQuery.ts"],"names":[],"mappings":";AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"svmQuery.js","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/svmQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svmQuery.d.ts","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/svmQuery.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"svmQuery.d.ts","sourceRoot":"","sources":["../../../../src/relayFeeCalculator/chain-queries/svmQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAA0E,MAAM,gBAAgB,CAAC;AAIrH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,uBAAuB,EAAQ,MAAM,aAAa,CAAC;AAC1G,OAAO,EAAE,MAAM,EAAE,cAAc,EAAqB,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AAIvC;;;GAGG;AACH,qBAAa,QAAS,YAAW,cAAc;IAe3C,QAAQ,CAAC,QAAQ,EAAE,WAAW;IAC9B,QAAQ,CAAC,aAAa,EAAE,iBAAiB;IACzC,QAAQ,CAAC,SAAS,EAAE,UAAU;IAC9B,QAAQ,CAAC,uBAAuB,EAAE,UAAU;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,kBAAkB,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC;IACvB,QAAQ,CAAC,qBAAqB,EAAE,MAAM;IArBxC,SAAS,CAAC,oBAAoB;;;;;;sEAAC;IAE/B;;;;;;;;;;OAUG;gBAEQ,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,EAChC,SAAS,EAAE,UAAU,EACrB,uBAAuB,EAAE,UAAU,EACnC,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,oBAAQ,EAC3B,aAAa,CAAC,0BAAc,EAC5B,qBAAqB,GAAE,MAAc;IAOhD;;;;;;;;;OASG;IACG,WAAW,CACf,SAAS,EAAE,SAAS,GAAG;QAAE,kBAAkB,EAAE,MAAM,CAAA;KAAE,EACrD,OAAO,UAAkD,EACzD,OAAO,GAAE,OAAO,CAAC;QACf,QAAQ,EAAE,YAAY,CAAC;QACvB,QAAQ,EAAE,YAAY,CAAC;QACvB,iBAAiB,EAAE,SAAS,CAAC;QAC7B,qBAAqB,EAAE,SAAS,CAAC;KAClC,CAAM,GACN,OAAO,CAAC,uBAAuB,CAAC;IA8DnC;;;;;OAKG;IACG,gBAAgB,CACpB,OAAO,EAAE,SAAS,GAAG;QAAE,kBAAkB,EAAE,MAAM,CAAA;KAAE,EACnD,OAAO,UAAgD,GACtD,OAAO,CAAC,SAAS,CAAC;IAiBrB;;;;;OAKG;cACa,cAAc,CAC5B,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,aAAa,CAAC,GAAG;QACxD,kBAAkB,EAAE,MAAM,CAAC;QAC3B,SAAS,EAAE,UAAU,CAAC;QACtB,WAAW,EAAE,UAAU,CAAC;KACzB,EACD,MAAM,EAAE,iBAAiB,EACzB,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,OAAO;;;;IAK3B;;;;OAIG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUzD;;;;OAIG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAI9C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import assert from "assert";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
getComputeUnitEstimateForTransactionMessageFactory,
|
|
4
|
+
TransactionSigner,
|
|
5
|
+
fetchEncodedAccount,
|
|
6
|
+
isSome,
|
|
7
|
+
} from "@solana/kit";
|
|
8
|
+
import { SVMProvider, SolanaVoidSigner, getFillRelayTx, toAddress, getAssociatedTokenAddress } from "../../arch/svm";
|
|
4
9
|
import { Coingecko } from "../../coingecko";
|
|
5
10
|
import { CHAIN_IDs } from "../../constants";
|
|
6
11
|
import { getGasPriceEstimate } from "../../gasPriceOracle";
|
|
@@ -8,6 +13,8 @@ import { RelayData } from "../../interfaces";
|
|
|
8
13
|
import { Address, BigNumber, BigNumberish, SvmAddress, TransactionCostEstimate, toBN } from "../../utils";
|
|
9
14
|
import { Logger, QueryInterface, getDefaultRelayer } from "../relayFeeCalculator";
|
|
10
15
|
import { SymbolMappingType } from "./";
|
|
16
|
+
import { TOKEN_PROGRAM_ADDRESS } from "@solana-program/token";
|
|
17
|
+
import { TOKEN_2022_PROGRAM_ADDRESS, getTokenSize, fetchMint, Extension } from "@solana-program/token-2022";
|
|
11
18
|
|
|
12
19
|
/**
|
|
13
20
|
* A special QueryBase implementation for SVM used for querying gas costs, token prices, and decimals of various tokens
|
|
@@ -76,24 +83,49 @@ export class SvmQuery implements QueryInterface {
|
|
|
76
83
|
repaymentAddress
|
|
77
84
|
);
|
|
78
85
|
|
|
79
|
-
const [computeUnitsConsumed, gasPriceEstimate] = await Promise.all([
|
|
86
|
+
const [computeUnitsConsumed, gasPriceEstimate, tokenAccountInfo] = await Promise.all([
|
|
80
87
|
toBN(await this.computeUnitEstimator(fillRelayTx)),
|
|
81
88
|
getGasPriceEstimate(this.provider, {
|
|
82
89
|
unsignedTx: fillRelayTx,
|
|
83
90
|
baseFeeMultiplier: options.baseFeeMultiplier,
|
|
84
91
|
priorityFeeMultiplier: options.priorityFeeMultiplier,
|
|
85
92
|
}),
|
|
93
|
+
this.provider.getAccountInfo(toAddress(outputToken), { encoding: "base58" }).send(),
|
|
86
94
|
]);
|
|
87
95
|
|
|
96
|
+
// If the owner of the token account is not the token program, then we can assume that it is the 2022 token program address, in which
|
|
97
|
+
// case we need to determine the extensions the token has to properly calculate rent exemption.
|
|
98
|
+
const tokenOwner = tokenAccountInfo!.value!.owner;
|
|
99
|
+
assert(
|
|
100
|
+
tokenOwner === TOKEN_2022_PROGRAM_ADDRESS || tokenOwner === TOKEN_PROGRAM_ADDRESS,
|
|
101
|
+
`${outputToken} has invalid token account owner ${tokenOwner}.`
|
|
102
|
+
);
|
|
103
|
+
const recipientAta = await getAssociatedTokenAddress(recipient, outputToken, tokenOwner);
|
|
104
|
+
const encodedAta = await fetchEncodedAccount(this.provider, recipientAta);
|
|
105
|
+
|
|
88
106
|
// We can cast the gas price estimate to an SvmGasPriceEstimate here since the oracle should always
|
|
89
107
|
// query the Solana adapter.
|
|
90
108
|
const gasPrice = gasPriceEstimate.baseFee.add(
|
|
91
109
|
gasPriceEstimate.microLamportsPerComputeUnit.mul(computeUnitsConsumed).div(toBN(1_000_000)) // 1_000_000 microLamports/lamport.
|
|
92
110
|
);
|
|
111
|
+
let tokenGasCost = gasPrice;
|
|
112
|
+
|
|
113
|
+
// If the ATA does not exist, we need to factor the rent amount into the token gas cost.
|
|
114
|
+
if (!encodedAta.exists) {
|
|
115
|
+
// If the ATA is a non-2022 token, then it will always have a fixed size of 165.
|
|
116
|
+
let extensions: Extension[] | undefined = undefined;
|
|
117
|
+
if (tokenOwner === TOKEN_2022_PROGRAM_ADDRESS) {
|
|
118
|
+
const mint = await fetchMint(this.provider, toAddress(outputToken));
|
|
119
|
+
extensions = isSome(mint.data.extensions) ? mint.data.extensions.value : undefined;
|
|
120
|
+
}
|
|
121
|
+
const tokenAccountSize = getTokenSize(extensions);
|
|
122
|
+
const rentCostInLamports = await this.provider.getMinimumBalanceForRentExemption(BigInt(tokenAccountSize)).send();
|
|
123
|
+
tokenGasCost = tokenGasCost.add(toBN(Number(rentCostInLamports)));
|
|
124
|
+
}
|
|
93
125
|
|
|
94
126
|
return {
|
|
95
127
|
nativeGasCost: computeUnitsConsumed,
|
|
96
|
-
tokenGasCost
|
|
128
|
+
tokenGasCost,
|
|
97
129
|
gasPrice,
|
|
98
130
|
};
|
|
99
131
|
}
|