@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.
@@ -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 INITIZATION_GAS_COST = 2e4;
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 TRANSAFER_GAS_COST = 32e3;
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 gasPrice = 1;
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 isL1SafeSingleton = safe.getContractManager().isL1SafeSingleton;
5534
- const chainId = await safe.getChainId();
5535
- const customContracts = safe.getContractManager().contractNetworks?.[chainId.toString()];
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
- gasPrice,
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 : INITIZATION_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 > 65536 ? baseGas += 64 : baseGas += 128;
5558
- baseGas += TRANSAFER_GAS_COST;
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.1.0";
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
@@ -22,7 +22,7 @@ import {
22
22
  isAddress as isAddress4,
23
23
  keccak256 as keccak2562,
24
24
  pad,
25
- parseAbi as parseAbi3,
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 { BaseError } from "viem";
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 INITIZATION_GAS_COST = 2e4;
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 TRANSAFER_GAS_COST = 32e3;
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 gasPrice = 1;
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 isL1SafeSingleton = safe.getContractManager().isL1SafeSingleton;
5543
- const chainId = await safe.getChainId();
5544
- const customContracts = safe.getContractManager().contractNetworks?.[chainId.toString()];
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
- gasPrice,
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 : INITIZATION_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 > 65536 ? baseGas += 64 : baseGas += 128;
5567
- baseGas += TRANSAFER_GAS_COST;
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: parseAbi(["function multiSend(bytes memory transactions) public payable"]),
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 encodeFunctionData2,
6106
- parseAbi as parseAbi2
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 encodeFunctionData2({
6193
- abi: parseAbi2(["function configure((uint256 x, uint256 y, uint176 verifiers) signer)"]),
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: parseAbi3(["function VERSION() view returns (string)"]),
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: parseAbi3([getProxyCreationEvent(safeVersion)]),
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.1.0";
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 encodeFunctionData3, parseAbi as parseAbi4 } from "viem";
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 = encodeFunctionData3({
9053
- abi: parseAbi4(ERC20_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 = encodeFunctionData3({
9081
- abi: parseAbi4(ERC20_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 { BaseError } from "viem";
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 parseAbi3
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,EAkiBtC,CAAA"}
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":"AACA,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;AAwDxC,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,CA6DjB;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"}
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.1.0",
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.54",
85
- "@safe-global/safe-modules-deployments": "^3.0.2",
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",