@safe-global/protocol-kit 7.1.0 → 7.2.0
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/src/index.cjs +90 -16
- package/dist/cjs/test-utils/index.cjs +7 -0
- package/dist/esm/src/index.mjs +109 -31
- package/dist/esm/test-utils/index.mjs +13 -2
- package/dist/src/utils/eip-3770/config.d.ts.map +1 -1
- package/dist/src/utils/transactions/gas.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/cjs/src/index.cjs
CHANGED
|
@@ -495,6 +495,7 @@ var networks = [
|
|
|
495
495
|
{ chainId: 4217n, shortName: "tempo" },
|
|
496
496
|
{ chainId: 4326n, shortName: "megaeth" },
|
|
497
497
|
{ chainId: 4337n, shortName: "beam" },
|
|
498
|
+
{ chainId: 4441n, shortName: "liteforge" },
|
|
498
499
|
{ chainId: 4460n, shortName: "orderlyl2" },
|
|
499
500
|
{ chainId: 4488n, shortName: "HYDRA" },
|
|
500
501
|
{ chainId: 4509n, shortName: "SC" },
|
|
@@ -647,6 +648,7 @@ var networks = [
|
|
|
647
648
|
{ chainId: 43419n, shortName: "gunz-mainnet" },
|
|
648
649
|
{ chainId: 44787n, shortName: "alfa" },
|
|
649
650
|
{ chainId: 45000n, shortName: "autobahnnetwork" },
|
|
651
|
+
{ chainId: 46630n, shortName: "robinhoodchaintestnet" },
|
|
650
652
|
{ chainId: 47763n, shortName: "neox-mainnet" },
|
|
651
653
|
{ chainId: 47805n, shortName: "rei" },
|
|
652
654
|
{ chainId: 48898n, shortName: "zircuit-garfield-testnet" },
|
|
@@ -696,6 +698,7 @@ var networks = [
|
|
|
696
698
|
{ chainId: 90001n, shortName: "dhobyghaut" },
|
|
697
699
|
{ chainId: 91342n, shortName: "giwasepolia" },
|
|
698
700
|
{ chainId: 97435n, shortName: "sling" },
|
|
701
|
+
{ chainId: 97476n, shortName: "doma-testnet" },
|
|
699
702
|
{ chainId: 98864n, shortName: "plume-devnet" },
|
|
700
703
|
{ chainId: 98865n, shortName: "plume" },
|
|
701
704
|
{ chainId: 98866n, shortName: "plume-mainnet" },
|
|
@@ -5449,11 +5452,23 @@ async function getExtensibleFallbackHandlerContract({
|
|
|
5449
5452
|
// src/utils/transactions/gas.ts
|
|
5450
5453
|
var CALL_DATA_ZERO_BYTE_GAS_COST = 4;
|
|
5451
5454
|
var CALL_DATA_BYTE_GAS_COST = 16;
|
|
5452
|
-
var
|
|
5455
|
+
var INITIALIZATION_GAS_COST = 22100;
|
|
5453
5456
|
var INCREMENT_NONCE_GAS_COST = 5e3;
|
|
5454
5457
|
var HASH_GENERATION_GAS_COST = 1500;
|
|
5455
5458
|
var ECRECOVER_GAS_COST = 6e3;
|
|
5456
|
-
var
|
|
5459
|
+
var INTRINSIC_TX_GAS_COST = 21e3;
|
|
5460
|
+
var PRE_EXEC_STORAGE_GAS_COST = 2 * 2100;
|
|
5461
|
+
var MISC_OVERHEAD_GAS_COST = 3e3;
|
|
5462
|
+
var EXTRA_BASE_GAS_COST = INTRINSIC_TX_GAS_COST + PRE_EXEC_STORAGE_GAS_COST + MISC_OVERHEAD_GAS_COST;
|
|
5463
|
+
var NEW_ACCOUNT_GAS_COST = 25e3;
|
|
5464
|
+
var COLD_ACCOUNT_ACCESS_GAS_COST = 2600;
|
|
5465
|
+
var CALL_VALUE_GAS_COST = 9e3;
|
|
5466
|
+
var ERC20_TRANSFER_GAS_COST = 21e3;
|
|
5467
|
+
var ERC20_NEW_HOLDER_TRANSFER_GAS_COST = 38e3;
|
|
5468
|
+
var LOG_BASE_GAS_COST = 375;
|
|
5469
|
+
var LOG_TOPIC_GAS_COST = 375;
|
|
5470
|
+
var LOG_DATA_GAS_COST_PER_BYTE = 8;
|
|
5471
|
+
var EXECUTION_RESULT_EVENT_GAS_COST = 1500;
|
|
5457
5472
|
var GAS_COST_PER_SIGNATURE = 1 * CALL_DATA_BYTE_GAS_COST + 2 * 32 * CALL_DATA_BYTE_GAS_COST + ECRECOVER_GAS_COST;
|
|
5458
5473
|
function estimateDataGasCosts(data) {
|
|
5459
5474
|
const bytes = data.match(/.{2}/g);
|
|
@@ -5467,6 +5482,58 @@ function estimateDataGasCosts(data) {
|
|
|
5467
5482
|
return gasCost + CALL_DATA_BYTE_GAS_COST;
|
|
5468
5483
|
}, 0);
|
|
5469
5484
|
}
|
|
5485
|
+
function calculateExecTransactionEventsGas(isL1SafeSingleton, data, threshold) {
|
|
5486
|
+
let gas = EXECUTION_RESULT_EVENT_GAS_COST;
|
|
5487
|
+
if (!isL1SafeSingleton) {
|
|
5488
|
+
const dataBytes = (data.length - 2) / 2;
|
|
5489
|
+
const signaturesBytes = threshold * 65;
|
|
5490
|
+
const headBytes = 11 * 32;
|
|
5491
|
+
const dataDynamicBytes = 32 + Math.ceil(dataBytes / 32) * 32;
|
|
5492
|
+
const signaturesDynamicBytes = 32 + Math.ceil(signaturesBytes / 32) * 32;
|
|
5493
|
+
const additionalInfoDynamicBytes = 32 + 3 * 32;
|
|
5494
|
+
const eventDataBytes = headBytes + dataDynamicBytes + signaturesDynamicBytes + additionalInfoDynamicBytes;
|
|
5495
|
+
gas += LOG_BASE_GAS_COST + LOG_TOPIC_GAS_COST + eventDataBytes * LOG_DATA_GAS_COST_PER_BYTE;
|
|
5496
|
+
}
|
|
5497
|
+
return gas;
|
|
5498
|
+
}
|
|
5499
|
+
async function isNewEthRefundReceiver(safeProvider, gasToken, refundReceiver) {
|
|
5500
|
+
if (gasToken.toLowerCase() !== ZERO_ADDRESS.toLowerCase() || refundReceiver.toLowerCase() === ZERO_ADDRESS.toLowerCase()) {
|
|
5501
|
+
return false;
|
|
5502
|
+
}
|
|
5503
|
+
const [contractCode, nonce, balance] = await Promise.all([
|
|
5504
|
+
safeProvider.getContractCode(refundReceiver),
|
|
5505
|
+
safeProvider.getNonce(refundReceiver),
|
|
5506
|
+
safeProvider.getBalance(refundReceiver)
|
|
5507
|
+
]);
|
|
5508
|
+
return contractCode === "0x" && nonce === 0 && balance === 0n;
|
|
5509
|
+
}
|
|
5510
|
+
async function hasExistingTokenBalance(safeProvider, gasToken, account) {
|
|
5511
|
+
const data = (0, import_viem8.encodeFunctionData)({
|
|
5512
|
+
abi: (0, import_viem8.parseAbi)(["function balanceOf(address account) view returns (uint256)"]),
|
|
5513
|
+
functionName: "balanceOf",
|
|
5514
|
+
args: [account]
|
|
5515
|
+
});
|
|
5516
|
+
try {
|
|
5517
|
+
const response = await safeProvider.call({ to: gasToken, from: gasToken, value: "0", data });
|
|
5518
|
+
return BigInt(response || "0x0") > 0n;
|
|
5519
|
+
} catch {
|
|
5520
|
+
return false;
|
|
5521
|
+
}
|
|
5522
|
+
}
|
|
5523
|
+
async function calculateRefundGas(safeProvider, gasPrice, gasToken, refundReceiver) {
|
|
5524
|
+
if (BigInt(gasPrice) === 0n) {
|
|
5525
|
+
return 0;
|
|
5526
|
+
}
|
|
5527
|
+
if (gasToken.toLowerCase() === ZERO_ADDRESS.toLowerCase()) {
|
|
5528
|
+
let gas = COLD_ACCOUNT_ACCESS_GAS_COST + CALL_VALUE_GAS_COST;
|
|
5529
|
+
if (await isNewEthRefundReceiver(safeProvider, gasToken, refundReceiver)) {
|
|
5530
|
+
gas += NEW_ACCOUNT_GAS_COST;
|
|
5531
|
+
}
|
|
5532
|
+
return gas;
|
|
5533
|
+
}
|
|
5534
|
+
const hasBalance = await hasExistingTokenBalance(safeProvider, gasToken, refundReceiver);
|
|
5535
|
+
return hasBalance ? ERC20_TRANSFER_GAS_COST : ERC20_NEW_HOLDER_TRANSFER_GAS_COST;
|
|
5536
|
+
}
|
|
5470
5537
|
async function estimateGas(safeVersion, safeContract, safeProvider, to, valueInWei, data, operation, customContracts) {
|
|
5471
5538
|
const chainId = await safeProvider.getChainId();
|
|
5472
5539
|
const simulateTxAccessorContract = await getSimulateTxAccessorContract({
|
|
@@ -5518,21 +5585,25 @@ async function estimateTxGas(safeContract, safeProvider, to, valueInWei, data, o
|
|
|
5518
5585
|
}
|
|
5519
5586
|
async function estimateTxBaseGas(safe, safeTransaction) {
|
|
5520
5587
|
const safeTransactionData = safeTransaction.data;
|
|
5521
|
-
const { to, value, data, operation, safeTxGas, gasToken, refundReceiver } = safeTransactionData;
|
|
5522
|
-
const safeThreshold = await safe.getThreshold();
|
|
5523
|
-
const safeNonce = await safe.getNonce();
|
|
5524
|
-
const signaturesGasCost = safeThreshold * GAS_COST_PER_SIGNATURE;
|
|
5588
|
+
const { to, value, data, operation, safeTxGas, gasPrice, gasToken, refundReceiver } = safeTransactionData;
|
|
5525
5589
|
const encodeSafeTxGas = safeTxGas || 0;
|
|
5526
5590
|
const encodeBaseGas = 0;
|
|
5527
|
-
const
|
|
5591
|
+
const encodeGasPrice = 1;
|
|
5528
5592
|
const encodeGasToken = gasToken || ZERO_ADDRESS;
|
|
5529
5593
|
const encodeRefundReceiver = refundReceiver || ZERO_ADDRESS;
|
|
5530
5594
|
const signatures = "0x";
|
|
5531
|
-
const safeVersion = safe.getContractVersion();
|
|
5532
5595
|
const safeProvider = safe.getSafeProvider();
|
|
5533
|
-
const
|
|
5534
|
-
const
|
|
5535
|
-
const
|
|
5596
|
+
const safeVersion = safe.getContractVersion();
|
|
5597
|
+
const contractManager = safe.getContractManager();
|
|
5598
|
+
const isL1SafeSingleton = contractManager.isL1SafeSingleton;
|
|
5599
|
+
const [safeThreshold, safeNonce, chainId, refundGas] = await Promise.all([
|
|
5600
|
+
safe.getThreshold(),
|
|
5601
|
+
safe.getNonce(),
|
|
5602
|
+
safe.getChainId(),
|
|
5603
|
+
calculateRefundGas(safeProvider, gasPrice, encodeGasToken, encodeRefundReceiver)
|
|
5604
|
+
]);
|
|
5605
|
+
const signaturesGasCost = safeThreshold * GAS_COST_PER_SIGNATURE;
|
|
5606
|
+
const customContracts = contractManager.contractNetworks?.[chainId.toString()];
|
|
5536
5607
|
const safeSingletonContract = await getSafeContract({
|
|
5537
5608
|
safeProvider,
|
|
5538
5609
|
safeVersion,
|
|
@@ -5546,16 +5617,19 @@ async function estimateTxBaseGas(safe, safeTransaction) {
|
|
|
5546
5617
|
operation,
|
|
5547
5618
|
encodeSafeTxGas,
|
|
5548
5619
|
encodeBaseGas,
|
|
5549
|
-
|
|
5620
|
+
encodeGasPrice,
|
|
5550
5621
|
encodeGasToken,
|
|
5551
5622
|
encodeRefundReceiver,
|
|
5552
5623
|
signatures
|
|
5553
5624
|
]);
|
|
5554
5625
|
const isSafeInitialized = safeNonce !== 0;
|
|
5555
|
-
const incrementNonceGasCost = isSafeInitialized ? INCREMENT_NONCE_GAS_COST :
|
|
5626
|
+
const incrementNonceGasCost = isSafeInitialized ? INCREMENT_NONCE_GAS_COST : INITIALIZATION_GAS_COST;
|
|
5556
5627
|
let baseGas = signaturesGasCost + estimateDataGasCosts(execTransactionData) + incrementNonceGasCost + HASH_GENERATION_GAS_COST;
|
|
5557
|
-
baseGas
|
|
5558
|
-
baseGas +=
|
|
5628
|
+
baseGas += refundGas;
|
|
5629
|
+
baseGas += calculateExecTransactionEventsGas(isL1SafeSingleton ?? false, data, safeThreshold);
|
|
5630
|
+
baseGas += EXTRA_BASE_GAS_COST;
|
|
5631
|
+
const baseGasUsedBytes = Math.ceil(baseGas.toString(16).length / 2);
|
|
5632
|
+
baseGas += baseGasUsedBytes * (CALL_DATA_BYTE_GAS_COST - CALL_DATA_ZERO_BYTE_GAS_COST);
|
|
5559
5633
|
return baseGas.toString();
|
|
5560
5634
|
}
|
|
5561
5635
|
async function estimateSafeTxGas(safe, safeTransaction) {
|
|
@@ -7335,7 +7409,7 @@ function generateOnChainIdentifier({
|
|
|
7335
7409
|
var generateOnChainIdentifier_default = generateOnChainIdentifier;
|
|
7336
7410
|
|
|
7337
7411
|
// src/utils/getProtocolKitVersion.ts
|
|
7338
|
-
var getProtocolKitVersion = () => "7.
|
|
7412
|
+
var getProtocolKitVersion = () => "7.2.0";
|
|
7339
7413
|
|
|
7340
7414
|
// src/Safe.ts
|
|
7341
7415
|
var EQ_OR_GT_1_5_0 = ">=1.5.0";
|
|
@@ -483,6 +483,7 @@ var networks = [
|
|
|
483
483
|
{ chainId: 4217n, shortName: "tempo" },
|
|
484
484
|
{ chainId: 4326n, shortName: "megaeth" },
|
|
485
485
|
{ chainId: 4337n, shortName: "beam" },
|
|
486
|
+
{ chainId: 4441n, shortName: "liteforge" },
|
|
486
487
|
{ chainId: 4460n, shortName: "orderlyl2" },
|
|
487
488
|
{ chainId: 4488n, shortName: "HYDRA" },
|
|
488
489
|
{ chainId: 4509n, shortName: "SC" },
|
|
@@ -635,6 +636,7 @@ var networks = [
|
|
|
635
636
|
{ chainId: 43419n, shortName: "gunz-mainnet" },
|
|
636
637
|
{ chainId: 44787n, shortName: "alfa" },
|
|
637
638
|
{ chainId: 45000n, shortName: "autobahnnetwork" },
|
|
639
|
+
{ chainId: 46630n, shortName: "robinhoodchaintestnet" },
|
|
638
640
|
{ chainId: 47763n, shortName: "neox-mainnet" },
|
|
639
641
|
{ chainId: 47805n, shortName: "rei" },
|
|
640
642
|
{ chainId: 48898n, shortName: "zircuit-garfield-testnet" },
|
|
@@ -684,6 +686,7 @@ var networks = [
|
|
|
684
686
|
{ chainId: 90001n, shortName: "dhobyghaut" },
|
|
685
687
|
{ chainId: 91342n, shortName: "giwasepolia" },
|
|
686
688
|
{ chainId: 97435n, shortName: "sling" },
|
|
689
|
+
{ chainId: 97476n, shortName: "doma-testnet" },
|
|
687
690
|
{ chainId: 98864n, shortName: "plume-devnet" },
|
|
688
691
|
{ chainId: 98865n, shortName: "plume" },
|
|
689
692
|
{ chainId: 98866n, shortName: "plume-mainnet" },
|
|
@@ -4646,6 +4649,10 @@ async function getSafeWebAuthnSharedSignerContract({
|
|
|
4646
4649
|
// src/utils/transactions/gas.ts
|
|
4647
4650
|
var CALL_DATA_BYTE_GAS_COST = 16;
|
|
4648
4651
|
var ECRECOVER_GAS_COST = 6e3;
|
|
4652
|
+
var INTRINSIC_TX_GAS_COST = 21e3;
|
|
4653
|
+
var PRE_EXEC_STORAGE_GAS_COST = 2 * 2100;
|
|
4654
|
+
var MISC_OVERHEAD_GAS_COST = 3e3;
|
|
4655
|
+
var EXTRA_BASE_GAS_COST = INTRINSIC_TX_GAS_COST + PRE_EXEC_STORAGE_GAS_COST + MISC_OVERHEAD_GAS_COST;
|
|
4649
4656
|
var GAS_COST_PER_SIGNATURE = 1 * CALL_DATA_BYTE_GAS_COST + 2 * 32 * CALL_DATA_BYTE_GAS_COST + ECRECOVER_GAS_COST;
|
|
4650
4657
|
|
|
4651
4658
|
// src/utils/transactions/utils.ts
|
package/dist/esm/src/index.mjs
CHANGED
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
isAddress as isAddress4,
|
|
23
23
|
keccak256 as keccak2562,
|
|
24
24
|
pad,
|
|
25
|
-
parseAbi as
|
|
25
|
+
parseAbi as parseAbi4,
|
|
26
26
|
toHex as toHex3,
|
|
27
27
|
toEventHash,
|
|
28
28
|
decodeEventLog
|
|
@@ -426,6 +426,7 @@ var networks = [
|
|
|
426
426
|
{ chainId: 4217n, shortName: "tempo" },
|
|
427
427
|
{ chainId: 4326n, shortName: "megaeth" },
|
|
428
428
|
{ chainId: 4337n, shortName: "beam" },
|
|
429
|
+
{ chainId: 4441n, shortName: "liteforge" },
|
|
429
430
|
{ chainId: 4460n, shortName: "orderlyl2" },
|
|
430
431
|
{ chainId: 4488n, shortName: "HYDRA" },
|
|
431
432
|
{ chainId: 4509n, shortName: "SC" },
|
|
@@ -578,6 +579,7 @@ var networks = [
|
|
|
578
579
|
{ chainId: 43419n, shortName: "gunz-mainnet" },
|
|
579
580
|
{ chainId: 44787n, shortName: "alfa" },
|
|
580
581
|
{ chainId: 45000n, shortName: "autobahnnetwork" },
|
|
582
|
+
{ chainId: 46630n, shortName: "robinhoodchaintestnet" },
|
|
581
583
|
{ chainId: 47763n, shortName: "neox-mainnet" },
|
|
582
584
|
{ chainId: 47805n, shortName: "rei" },
|
|
583
585
|
{ chainId: 48898n, shortName: "zircuit-garfield-testnet" },
|
|
@@ -627,6 +629,7 @@ var networks = [
|
|
|
627
629
|
{ chainId: 90001n, shortName: "dhobyghaut" },
|
|
628
630
|
{ chainId: 91342n, shortName: "giwasepolia" },
|
|
629
631
|
{ chainId: 97435n, shortName: "sling" },
|
|
632
|
+
{ chainId: 97476n, shortName: "doma-testnet" },
|
|
630
633
|
{ chainId: 98864n, shortName: "plume-devnet" },
|
|
631
634
|
{ chainId: 98865n, shortName: "plume" },
|
|
632
635
|
{ chainId: 98866n, shortName: "plume-mainnet" },
|
|
@@ -1317,7 +1320,11 @@ var calculateSafeMessageHash = (safeAddress, message, safeVersion, chainId) => {
|
|
|
1317
1320
|
};
|
|
1318
1321
|
|
|
1319
1322
|
// src/utils/transactions/gas.ts
|
|
1320
|
-
import {
|
|
1323
|
+
import {
|
|
1324
|
+
BaseError,
|
|
1325
|
+
encodeFunctionData as encodeFunctionData2,
|
|
1326
|
+
parseAbi
|
|
1327
|
+
} from "viem";
|
|
1321
1328
|
import { OperationType } from "@safe-global/types-kit";
|
|
1322
1329
|
import semverSatisfies4 from "semver/functions/satisfies.js";
|
|
1323
1330
|
|
|
@@ -5458,11 +5465,23 @@ async function getExtensibleFallbackHandlerContract({
|
|
|
5458
5465
|
// src/utils/transactions/gas.ts
|
|
5459
5466
|
var CALL_DATA_ZERO_BYTE_GAS_COST = 4;
|
|
5460
5467
|
var CALL_DATA_BYTE_GAS_COST = 16;
|
|
5461
|
-
var
|
|
5468
|
+
var INITIALIZATION_GAS_COST = 22100;
|
|
5462
5469
|
var INCREMENT_NONCE_GAS_COST = 5e3;
|
|
5463
5470
|
var HASH_GENERATION_GAS_COST = 1500;
|
|
5464
5471
|
var ECRECOVER_GAS_COST = 6e3;
|
|
5465
|
-
var
|
|
5472
|
+
var INTRINSIC_TX_GAS_COST = 21e3;
|
|
5473
|
+
var PRE_EXEC_STORAGE_GAS_COST = 2 * 2100;
|
|
5474
|
+
var MISC_OVERHEAD_GAS_COST = 3e3;
|
|
5475
|
+
var EXTRA_BASE_GAS_COST = INTRINSIC_TX_GAS_COST + PRE_EXEC_STORAGE_GAS_COST + MISC_OVERHEAD_GAS_COST;
|
|
5476
|
+
var NEW_ACCOUNT_GAS_COST = 25e3;
|
|
5477
|
+
var COLD_ACCOUNT_ACCESS_GAS_COST = 2600;
|
|
5478
|
+
var CALL_VALUE_GAS_COST = 9e3;
|
|
5479
|
+
var ERC20_TRANSFER_GAS_COST = 21e3;
|
|
5480
|
+
var ERC20_NEW_HOLDER_TRANSFER_GAS_COST = 38e3;
|
|
5481
|
+
var LOG_BASE_GAS_COST = 375;
|
|
5482
|
+
var LOG_TOPIC_GAS_COST = 375;
|
|
5483
|
+
var LOG_DATA_GAS_COST_PER_BYTE = 8;
|
|
5484
|
+
var EXECUTION_RESULT_EVENT_GAS_COST = 1500;
|
|
5466
5485
|
var GAS_COST_PER_SIGNATURE = 1 * CALL_DATA_BYTE_GAS_COST + 2 * 32 * CALL_DATA_BYTE_GAS_COST + ECRECOVER_GAS_COST;
|
|
5467
5486
|
function estimateDataGasCosts(data) {
|
|
5468
5487
|
const bytes = data.match(/.{2}/g);
|
|
@@ -5476,6 +5495,58 @@ function estimateDataGasCosts(data) {
|
|
|
5476
5495
|
return gasCost + CALL_DATA_BYTE_GAS_COST;
|
|
5477
5496
|
}, 0);
|
|
5478
5497
|
}
|
|
5498
|
+
function calculateExecTransactionEventsGas(isL1SafeSingleton, data, threshold) {
|
|
5499
|
+
let gas = EXECUTION_RESULT_EVENT_GAS_COST;
|
|
5500
|
+
if (!isL1SafeSingleton) {
|
|
5501
|
+
const dataBytes = (data.length - 2) / 2;
|
|
5502
|
+
const signaturesBytes = threshold * 65;
|
|
5503
|
+
const headBytes = 11 * 32;
|
|
5504
|
+
const dataDynamicBytes = 32 + Math.ceil(dataBytes / 32) * 32;
|
|
5505
|
+
const signaturesDynamicBytes = 32 + Math.ceil(signaturesBytes / 32) * 32;
|
|
5506
|
+
const additionalInfoDynamicBytes = 32 + 3 * 32;
|
|
5507
|
+
const eventDataBytes = headBytes + dataDynamicBytes + signaturesDynamicBytes + additionalInfoDynamicBytes;
|
|
5508
|
+
gas += LOG_BASE_GAS_COST + LOG_TOPIC_GAS_COST + eventDataBytes * LOG_DATA_GAS_COST_PER_BYTE;
|
|
5509
|
+
}
|
|
5510
|
+
return gas;
|
|
5511
|
+
}
|
|
5512
|
+
async function isNewEthRefundReceiver(safeProvider, gasToken, refundReceiver) {
|
|
5513
|
+
if (gasToken.toLowerCase() !== ZERO_ADDRESS.toLowerCase() || refundReceiver.toLowerCase() === ZERO_ADDRESS.toLowerCase()) {
|
|
5514
|
+
return false;
|
|
5515
|
+
}
|
|
5516
|
+
const [contractCode, nonce, balance] = await Promise.all([
|
|
5517
|
+
safeProvider.getContractCode(refundReceiver),
|
|
5518
|
+
safeProvider.getNonce(refundReceiver),
|
|
5519
|
+
safeProvider.getBalance(refundReceiver)
|
|
5520
|
+
]);
|
|
5521
|
+
return contractCode === "0x" && nonce === 0 && balance === 0n;
|
|
5522
|
+
}
|
|
5523
|
+
async function hasExistingTokenBalance(safeProvider, gasToken, account) {
|
|
5524
|
+
const data = encodeFunctionData2({
|
|
5525
|
+
abi: parseAbi(["function balanceOf(address account) view returns (uint256)"]),
|
|
5526
|
+
functionName: "balanceOf",
|
|
5527
|
+
args: [account]
|
|
5528
|
+
});
|
|
5529
|
+
try {
|
|
5530
|
+
const response = await safeProvider.call({ to: gasToken, from: gasToken, value: "0", data });
|
|
5531
|
+
return BigInt(response || "0x0") > 0n;
|
|
5532
|
+
} catch {
|
|
5533
|
+
return false;
|
|
5534
|
+
}
|
|
5535
|
+
}
|
|
5536
|
+
async function calculateRefundGas(safeProvider, gasPrice, gasToken, refundReceiver) {
|
|
5537
|
+
if (BigInt(gasPrice) === 0n) {
|
|
5538
|
+
return 0;
|
|
5539
|
+
}
|
|
5540
|
+
if (gasToken.toLowerCase() === ZERO_ADDRESS.toLowerCase()) {
|
|
5541
|
+
let gas = COLD_ACCOUNT_ACCESS_GAS_COST + CALL_VALUE_GAS_COST;
|
|
5542
|
+
if (await isNewEthRefundReceiver(safeProvider, gasToken, refundReceiver)) {
|
|
5543
|
+
gas += NEW_ACCOUNT_GAS_COST;
|
|
5544
|
+
}
|
|
5545
|
+
return gas;
|
|
5546
|
+
}
|
|
5547
|
+
const hasBalance = await hasExistingTokenBalance(safeProvider, gasToken, refundReceiver);
|
|
5548
|
+
return hasBalance ? ERC20_TRANSFER_GAS_COST : ERC20_NEW_HOLDER_TRANSFER_GAS_COST;
|
|
5549
|
+
}
|
|
5479
5550
|
async function estimateGas(safeVersion, safeContract, safeProvider, to, valueInWei, data, operation, customContracts) {
|
|
5480
5551
|
const chainId = await safeProvider.getChainId();
|
|
5481
5552
|
const simulateTxAccessorContract = await getSimulateTxAccessorContract({
|
|
@@ -5527,21 +5598,25 @@ async function estimateTxGas(safeContract, safeProvider, to, valueInWei, data, o
|
|
|
5527
5598
|
}
|
|
5528
5599
|
async function estimateTxBaseGas(safe, safeTransaction) {
|
|
5529
5600
|
const safeTransactionData = safeTransaction.data;
|
|
5530
|
-
const { to, value, data, operation, safeTxGas, gasToken, refundReceiver } = safeTransactionData;
|
|
5531
|
-
const safeThreshold = await safe.getThreshold();
|
|
5532
|
-
const safeNonce = await safe.getNonce();
|
|
5533
|
-
const signaturesGasCost = safeThreshold * GAS_COST_PER_SIGNATURE;
|
|
5601
|
+
const { to, value, data, operation, safeTxGas, gasPrice, gasToken, refundReceiver } = safeTransactionData;
|
|
5534
5602
|
const encodeSafeTxGas = safeTxGas || 0;
|
|
5535
5603
|
const encodeBaseGas = 0;
|
|
5536
|
-
const
|
|
5604
|
+
const encodeGasPrice = 1;
|
|
5537
5605
|
const encodeGasToken = gasToken || ZERO_ADDRESS;
|
|
5538
5606
|
const encodeRefundReceiver = refundReceiver || ZERO_ADDRESS;
|
|
5539
5607
|
const signatures = "0x";
|
|
5540
|
-
const safeVersion = safe.getContractVersion();
|
|
5541
5608
|
const safeProvider = safe.getSafeProvider();
|
|
5542
|
-
const
|
|
5543
|
-
const
|
|
5544
|
-
const
|
|
5609
|
+
const safeVersion = safe.getContractVersion();
|
|
5610
|
+
const contractManager = safe.getContractManager();
|
|
5611
|
+
const isL1SafeSingleton = contractManager.isL1SafeSingleton;
|
|
5612
|
+
const [safeThreshold, safeNonce, chainId, refundGas] = await Promise.all([
|
|
5613
|
+
safe.getThreshold(),
|
|
5614
|
+
safe.getNonce(),
|
|
5615
|
+
safe.getChainId(),
|
|
5616
|
+
calculateRefundGas(safeProvider, gasPrice, encodeGasToken, encodeRefundReceiver)
|
|
5617
|
+
]);
|
|
5618
|
+
const signaturesGasCost = safeThreshold * GAS_COST_PER_SIGNATURE;
|
|
5619
|
+
const customContracts = contractManager.contractNetworks?.[chainId.toString()];
|
|
5545
5620
|
const safeSingletonContract = await getSafeContract({
|
|
5546
5621
|
safeProvider,
|
|
5547
5622
|
safeVersion,
|
|
@@ -5555,16 +5630,19 @@ async function estimateTxBaseGas(safe, safeTransaction) {
|
|
|
5555
5630
|
operation,
|
|
5556
5631
|
encodeSafeTxGas,
|
|
5557
5632
|
encodeBaseGas,
|
|
5558
|
-
|
|
5633
|
+
encodeGasPrice,
|
|
5559
5634
|
encodeGasToken,
|
|
5560
5635
|
encodeRefundReceiver,
|
|
5561
5636
|
signatures
|
|
5562
5637
|
]);
|
|
5563
5638
|
const isSafeInitialized = safeNonce !== 0;
|
|
5564
|
-
const incrementNonceGasCost = isSafeInitialized ? INCREMENT_NONCE_GAS_COST :
|
|
5639
|
+
const incrementNonceGasCost = isSafeInitialized ? INCREMENT_NONCE_GAS_COST : INITIALIZATION_GAS_COST;
|
|
5565
5640
|
let baseGas = signaturesGasCost + estimateDataGasCosts(execTransactionData) + incrementNonceGasCost + HASH_GENERATION_GAS_COST;
|
|
5566
|
-
baseGas
|
|
5567
|
-
baseGas +=
|
|
5641
|
+
baseGas += refundGas;
|
|
5642
|
+
baseGas += calculateExecTransactionEventsGas(isL1SafeSingleton ?? false, data, safeThreshold);
|
|
5643
|
+
baseGas += EXTRA_BASE_GAS_COST;
|
|
5644
|
+
const baseGasUsedBytes = Math.ceil(baseGas.toString(16).length / 2);
|
|
5645
|
+
baseGas += baseGasUsedBytes * (CALL_DATA_BYTE_GAS_COST - CALL_DATA_ZERO_BYTE_GAS_COST);
|
|
5568
5646
|
return baseGas.toString();
|
|
5569
5647
|
}
|
|
5570
5648
|
async function estimateSafeTxGas(safe, safeTransaction) {
|
|
@@ -5753,7 +5831,7 @@ import {
|
|
|
5753
5831
|
encodePacked,
|
|
5754
5832
|
bytesToHex,
|
|
5755
5833
|
decodeFunctionData,
|
|
5756
|
-
parseAbi
|
|
5834
|
+
parseAbi as parseAbi2
|
|
5757
5835
|
} from "viem";
|
|
5758
5836
|
import { waitForTransactionReceipt as waitForTransactionReceiptViem } from "viem/actions";
|
|
5759
5837
|
function standardizeMetaTransactionData(tx) {
|
|
@@ -5853,7 +5931,7 @@ function encodeMultiSendData(txs) {
|
|
|
5853
5931
|
}
|
|
5854
5932
|
function decodeMultiSendData(encodedData) {
|
|
5855
5933
|
const decodedData = decodeFunctionData({
|
|
5856
|
-
abi:
|
|
5934
|
+
abi: parseAbi2(["function multiSend(bytes memory transactions) public payable"]),
|
|
5857
5935
|
data: asHex(encodedData)
|
|
5858
5936
|
});
|
|
5859
5937
|
const args = decodedData.args;
|
|
@@ -6102,8 +6180,8 @@ import {
|
|
|
6102
6180
|
fromBytes,
|
|
6103
6181
|
fromHex,
|
|
6104
6182
|
parseAbiParameters,
|
|
6105
|
-
encodeFunctionData as
|
|
6106
|
-
parseAbi as
|
|
6183
|
+
encodeFunctionData as encodeFunctionData3,
|
|
6184
|
+
parseAbi as parseAbi3
|
|
6107
6185
|
} from "viem";
|
|
6108
6186
|
|
|
6109
6187
|
// src/utils/passkeys/isSharedSigner.ts
|
|
@@ -6189,8 +6267,8 @@ var createPasskeyClient = async (passkey, safeWebAuthnSignerFactoryContract, saf
|
|
|
6189
6267
|
signTransaction,
|
|
6190
6268
|
signTypedData,
|
|
6191
6269
|
encodeConfigure() {
|
|
6192
|
-
return
|
|
6193
|
-
abi:
|
|
6270
|
+
return encodeFunctionData3({
|
|
6271
|
+
abi: parseAbi3(["function configure((uint256 x, uint256 y, uint176 verifiers) signer)"]),
|
|
6194
6272
|
functionName: "configure",
|
|
6195
6273
|
args: [
|
|
6196
6274
|
{
|
|
@@ -6721,7 +6799,7 @@ var memoizedGetSafeContract = createMemoizedFunction(
|
|
|
6721
6799
|
async function getSafeContractVersion(safeProvider, safeAddress) {
|
|
6722
6800
|
return await safeProvider.readContract({
|
|
6723
6801
|
address: safeAddress,
|
|
6724
|
-
abi:
|
|
6802
|
+
abi: parseAbi4(["function VERSION() view returns (string)"]),
|
|
6725
6803
|
functionName: "VERSION"
|
|
6726
6804
|
});
|
|
6727
6805
|
}
|
|
@@ -6875,7 +6953,7 @@ function getSafeAddressFromDeploymentTx(txReceipt, safeVersion) {
|
|
|
6875
6953
|
}
|
|
6876
6954
|
const { data, topics } = proxyCreationEvent;
|
|
6877
6955
|
const { args } = decodeEventLog({
|
|
6878
|
-
abi:
|
|
6956
|
+
abi: parseAbi4([getProxyCreationEvent(safeVersion)]),
|
|
6879
6957
|
eventName: "ProxyCreation",
|
|
6880
6958
|
data,
|
|
6881
6959
|
topics
|
|
@@ -7393,7 +7471,7 @@ function generateOnChainIdentifier({
|
|
|
7393
7471
|
var generateOnChainIdentifier_default = generateOnChainIdentifier;
|
|
7394
7472
|
|
|
7395
7473
|
// src/utils/getProtocolKitVersion.ts
|
|
7396
|
-
var getProtocolKitVersion = () => "7.
|
|
7474
|
+
var getProtocolKitVersion = () => "7.2.0";
|
|
7397
7475
|
|
|
7398
7476
|
// src/Safe.ts
|
|
7399
7477
|
var EQ_OR_GT_1_5_0 = ">=1.5.0";
|
|
@@ -9042,15 +9120,15 @@ var Safe = class _Safe {
|
|
|
9042
9120
|
var Safe_default = Safe;
|
|
9043
9121
|
|
|
9044
9122
|
// src/utils/erc-20/index.ts
|
|
9045
|
-
import { encodeFunctionData as
|
|
9123
|
+
import { encodeFunctionData as encodeFunctionData4, parseAbi as parseAbi5 } from "viem";
|
|
9046
9124
|
var ERC20_ABI = [
|
|
9047
9125
|
"function transfer(address recipient, uint256 amount) returns (bool)",
|
|
9048
9126
|
"function decimals() view returns (uint8)"
|
|
9049
9127
|
];
|
|
9050
9128
|
async function getERC20Decimals(tokenAddress, safe) {
|
|
9051
9129
|
const safeProvider = safe.getSafeProvider();
|
|
9052
|
-
const data =
|
|
9053
|
-
abi:
|
|
9130
|
+
const data = encodeFunctionData4({
|
|
9131
|
+
abi: parseAbi5(ERC20_ABI),
|
|
9054
9132
|
functionName: "decimals"
|
|
9055
9133
|
});
|
|
9056
9134
|
const getTokenDecimalsTransaction = {
|
|
@@ -9077,8 +9155,8 @@ async function isGasTokenCompatibleWithHandlePayment(gasToken, safe) {
|
|
|
9077
9155
|
return hasTokenStandardERC20Decimals;
|
|
9078
9156
|
}
|
|
9079
9157
|
function createERC20TokenTransferTransaction(tokenAddress, toAddress, amount) {
|
|
9080
|
-
const data =
|
|
9081
|
-
abi:
|
|
9158
|
+
const data = encodeFunctionData4({
|
|
9159
|
+
abi: parseAbi5(ERC20_ABI),
|
|
9082
9160
|
functionName: "transfer",
|
|
9083
9161
|
args: [toAddress, amount]
|
|
9084
9162
|
});
|
|
@@ -441,6 +441,7 @@ var networks = [
|
|
|
441
441
|
{ chainId: 4217n, shortName: "tempo" },
|
|
442
442
|
{ chainId: 4326n, shortName: "megaeth" },
|
|
443
443
|
{ chainId: 4337n, shortName: "beam" },
|
|
444
|
+
{ chainId: 4441n, shortName: "liteforge" },
|
|
444
445
|
{ chainId: 4460n, shortName: "orderlyl2" },
|
|
445
446
|
{ chainId: 4488n, shortName: "HYDRA" },
|
|
446
447
|
{ chainId: 4509n, shortName: "SC" },
|
|
@@ -593,6 +594,7 @@ var networks = [
|
|
|
593
594
|
{ chainId: 43419n, shortName: "gunz-mainnet" },
|
|
594
595
|
{ chainId: 44787n, shortName: "alfa" },
|
|
595
596
|
{ chainId: 45000n, shortName: "autobahnnetwork" },
|
|
597
|
+
{ chainId: 46630n, shortName: "robinhoodchaintestnet" },
|
|
596
598
|
{ chainId: 47763n, shortName: "neox-mainnet" },
|
|
597
599
|
{ chainId: 47805n, shortName: "rei" },
|
|
598
600
|
{ chainId: 48898n, shortName: "zircuit-garfield-testnet" },
|
|
@@ -642,6 +644,7 @@ var networks = [
|
|
|
642
644
|
{ chainId: 90001n, shortName: "dhobyghaut" },
|
|
643
645
|
{ chainId: 91342n, shortName: "giwasepolia" },
|
|
644
646
|
{ chainId: 97435n, shortName: "sling" },
|
|
647
|
+
{ chainId: 97476n, shortName: "doma-testnet" },
|
|
645
648
|
{ chainId: 98864n, shortName: "plume-devnet" },
|
|
646
649
|
{ chainId: 98865n, shortName: "plume" },
|
|
647
650
|
{ chainId: 98866n, shortName: "plume-mainnet" },
|
|
@@ -1095,7 +1098,11 @@ import {
|
|
|
1095
1098
|
import semverSatisfies3 from "semver/functions/satisfies.js";
|
|
1096
1099
|
|
|
1097
1100
|
// src/utils/transactions/gas.ts
|
|
1098
|
-
import {
|
|
1101
|
+
import {
|
|
1102
|
+
BaseError,
|
|
1103
|
+
encodeFunctionData as encodeFunctionData3,
|
|
1104
|
+
parseAbi as parseAbi3
|
|
1105
|
+
} from "viem";
|
|
1099
1106
|
import { OperationType } from "@safe-global/types-kit";
|
|
1100
1107
|
import semverSatisfies5 from "semver/functions/satisfies.js";
|
|
1101
1108
|
|
|
@@ -4746,6 +4753,10 @@ async function getSafeWebAuthnSharedSignerContract({
|
|
|
4746
4753
|
// src/utils/transactions/gas.ts
|
|
4747
4754
|
var CALL_DATA_BYTE_GAS_COST = 16;
|
|
4748
4755
|
var ECRECOVER_GAS_COST = 6e3;
|
|
4756
|
+
var INTRINSIC_TX_GAS_COST = 21e3;
|
|
4757
|
+
var PRE_EXEC_STORAGE_GAS_COST = 2 * 2100;
|
|
4758
|
+
var MISC_OVERHEAD_GAS_COST = 3e3;
|
|
4759
|
+
var EXTRA_BASE_GAS_COST = INTRINSIC_TX_GAS_COST + PRE_EXEC_STORAGE_GAS_COST + MISC_OVERHEAD_GAS_COST;
|
|
4749
4760
|
var GAS_COST_PER_SIGNATURE = 1 * CALL_DATA_BYTE_GAS_COST + 2 * 32 * CALL_DATA_BYTE_GAS_COST + ECRECOVER_GAS_COST;
|
|
4750
4761
|
|
|
4751
4762
|
// src/utils/transactions/utils.ts
|
|
@@ -4759,7 +4770,7 @@ import {
|
|
|
4759
4770
|
encodePacked,
|
|
4760
4771
|
bytesToHex,
|
|
4761
4772
|
decodeFunctionData,
|
|
4762
|
-
parseAbi as
|
|
4773
|
+
parseAbi as parseAbi4
|
|
4763
4774
|
} from "viem";
|
|
4764
4775
|
import { waitForTransactionReceipt as waitForTransactionReceiptViem } from "viem/actions";
|
|
4765
4776
|
function toEstimateGasParameters(tx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/utils/eip-3770/config.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAID,eAAO,MAAM,QAAQ,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/utils/eip-3770/config.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAID,eAAO,MAAM,QAAQ,EAAE,gBAAgB,EAqiBtC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.d.ts","sourceRoot":"","sources":["../../../../src/utils/transactions/gas.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gas.d.ts","sourceRoot":"","sources":["../../../../src/utils/transactions/gas.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAEpF,OAAO,IAAI,MAAM,gCAAgC,CAAA;AACjD,OAAO,YAAY,MAAM,wCAAwC,CAAA;AACjE,OAAO,EACL,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,iCAAiC,CAAA;AA+LxC,wBAAsB,WAAW,CAC/B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,8BAA8B,EAC5C,YAAY,EAAE,YAAY,EAC1B,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,aAAa,EACxB,eAAe,CAAC,EAAE,sBAAsB,mBAsCzC;AAED,wBAAsB,aAAa,CACjC,YAAY,EAAE,8BAA8B,EAC5C,YAAY,EAAE,YAAY,EAC1B,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,MAAM,CAAC,CA8EjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,MAAM,CAAC,CAajB;AAoPD;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@safe-global/protocol-kit",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.2.0",
|
|
4
4
|
"description": "SDK that facilitates the interaction with Safe Smart Accounts",
|
|
5
5
|
"types": "dist/src/index.d.ts",
|
|
6
6
|
"main": "dist/cjs/src/index.cjs",
|
|
@@ -81,8 +81,8 @@
|
|
|
81
81
|
"tsconfig-paths": "^4.2.0"
|
|
82
82
|
},
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"@safe-global/safe-deployments": "^1.37.
|
|
85
|
-
"@safe-global/safe-modules-deployments": "^3.0.
|
|
84
|
+
"@safe-global/safe-deployments": "^1.37.56",
|
|
85
|
+
"@safe-global/safe-modules-deployments": "^3.0.4",
|
|
86
86
|
"@safe-global/types-kit": "^3.1.0",
|
|
87
87
|
"abitype": "^1.0.2",
|
|
88
88
|
"semver": "^7.7.2",
|