Skip to content

Commit 4567898

Browse files
committed
chore: resolve circular dependency
1 parent 8128eaf commit 4567898

File tree

3 files changed

+46
-43
lines changed

3 files changed

+46
-43
lines changed

packages/transactions/src/builders.ts

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
createSpendingCondition,
66
createSponsoredAuth,
77
createStandardAuth,
8-
MultiSigSpendingCondition,
98
} from './authorization';
109
import { ClarityValue, PrincipalCV } from './clarity';
1110
import {
@@ -18,9 +17,7 @@ import {
1817
NonFungibleConditionCode,
1918
PayloadType,
2019
PostConditionMode,
21-
RECOVERABLE_ECDSA_SIG_LENGTH_BYTES,
2220
SingleSigHashMode,
23-
StacksMessageType,
2421
} from './constants';
2522
import { ClarityAbi, validateContractCall } from './contract-abi';
2623
import { estimateFee, getAbi, getNonce } from './fetch';
@@ -797,41 +794,3 @@ export async function sponsorTransaction(
797794

798795
return signer.transaction;
799796
}
800-
801-
/**
802-
* Estimates transaction byte length
803-
* Context:
804-
* 1) Multi-sig transaction byte length increases by adding signatures
805-
* which causes the incorrect fee estimation because the fee value is set while creating unsigned transaction
806-
* 2) Single-sig transaction byte length remain same due to empty message signature which allocates the space for signature
807-
* @param {transaction} - StacksTransaction object to be estimated
808-
* @return {number} Estimated transaction byte length
809-
*/
810-
export function estimateTransactionByteLength(transaction: StacksTransaction): number {
811-
const hashMode = transaction.auth.spendingCondition.hashMode;
812-
// List of Multi-sig transaction hash modes
813-
const multiSigHashModes = [AddressHashMode.SerializeP2SH, AddressHashMode.SerializeP2WSH];
814-
815-
// Check if its a Multi-sig transaction
816-
if (multiSigHashModes.includes(hashMode)) {
817-
const multiSigSpendingCondition: MultiSigSpendingCondition = transaction.auth
818-
.spendingCondition as MultiSigSpendingCondition;
819-
820-
// Find number of existing signatures if the transaction is signed or partially signed
821-
const existingSignatures = multiSigSpendingCondition.fields.filter(
822-
field => field.contents.type === StacksMessageType.MessageSignature
823-
).length; // existingSignatures will be 0 if its a unsigned transaction
824-
825-
// Estimate total signature bytes size required for this multi-sig transaction
826-
// Formula: totalSignatureLength = (signaturesRequired - existingSignatures) * (SIG_LEN_BYTES + 1 byte of type of signature)
827-
const totalSignatureLength =
828-
(multiSigSpendingCondition.signaturesRequired - existingSignatures) *
829-
(RECOVERABLE_ECDSA_SIG_LENGTH_BYTES + 1);
830-
831-
return transaction.serialize().byteLength + totalSignatureLength;
832-
} else {
833-
// Single-sig transaction
834-
// Signature space already allocated by empty message signature
835-
return transaction.serialize().byteLength;
836-
}
837-
}

packages/transactions/src/fetch.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import {
66
validateHash256,
77
with0x,
88
} from '@stacks/common';
9-
import { estimateTransactionByteLength } from './builders';
109
import { ClarityValue, NoneCV, deserializeCV, serializeCV } from './clarity';
1110
import { NoEstimateAvailableError } from './errors';
1211
import { serializePayload } from './payload';
13-
import { StacksTransaction, deriveNetworkFromTx } from './transaction';
12+
import {
13+
StacksTransaction,
14+
deriveNetworkFromTx,
15+
estimateTransactionByteLength,
16+
} from './transaction';
1417
import { cvToHex, defaultApiFromNetwork, parseReadOnlyResponse } from './utils';
1518
import {
1619
FeeEstimateResponse,

packages/transactions/src/transaction.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import {
77
writeUInt32BE,
88
} from '@stacks/common';
99
import {
10+
AddressHashMode,
1011
AnchorMode,
1112
anchorModeFrom,
1213
AnchorModeName,
1314
AuthType,
1415
PayloadType,
1516
PostConditionMode,
1617
PubKeyEncoding,
18+
RECOVERABLE_ECDSA_SIG_LENGTH_BYTES,
1719
StacksMessageType,
1820
} from './constants';
1921

@@ -22,6 +24,7 @@ import {
2224
deserializeAuthorization,
2325
intoInitialSighashAuth,
2426
isSingleSig,
27+
MultiSigSpendingCondition,
2528
nextSignature,
2629
serializeAuthorization,
2730
setFee,
@@ -313,3 +316,41 @@ export function deriveNetworkFromTx(transaction: StacksTransaction) {
313316
[TransactionVersion.Testnet]: STACKS_TESTNET,
314317
});
315318
}
319+
320+
/**
321+
* Estimates transaction byte length
322+
* Context:
323+
* 1) Multi-sig transaction byte length increases by adding signatures
324+
* which causes the incorrect fee estimation because the fee value is set while creating unsigned transaction
325+
* 2) Single-sig transaction byte length remain same due to empty message signature which allocates the space for signature
326+
* @param {transaction} - StacksTransaction object to be estimated
327+
* @return {number} Estimated transaction byte length
328+
*/
329+
export function estimateTransactionByteLength(transaction: StacksTransaction): number {
330+
const hashMode = transaction.auth.spendingCondition.hashMode;
331+
// List of Multi-sig transaction hash modes
332+
const multiSigHashModes = [AddressHashMode.SerializeP2SH, AddressHashMode.SerializeP2WSH];
333+
334+
// Check if its a Multi-sig transaction
335+
if (multiSigHashModes.includes(hashMode)) {
336+
const multiSigSpendingCondition: MultiSigSpendingCondition = transaction.auth
337+
.spendingCondition as MultiSigSpendingCondition;
338+
339+
// Find number of existing signatures if the transaction is signed or partially signed
340+
const existingSignatures = multiSigSpendingCondition.fields.filter(
341+
field => field.contents.type === StacksMessageType.MessageSignature
342+
).length; // existingSignatures will be 0 if its a unsigned transaction
343+
344+
// Estimate total signature bytes size required for this multi-sig transaction
345+
// Formula: totalSignatureLength = (signaturesRequired - existingSignatures) * (SIG_LEN_BYTES + 1 byte for type of signature)
346+
const totalSignatureLength =
347+
(multiSigSpendingCondition.signaturesRequired - existingSignatures) *
348+
(RECOVERABLE_ECDSA_SIG_LENGTH_BYTES + 1);
349+
350+
return transaction.serialize().byteLength + totalSignatureLength;
351+
} else {
352+
// Single-sig transaction
353+
// Signature space already allocated by empty message signature
354+
return transaction.serialize().byteLength;
355+
}
356+
}

0 commit comments

Comments
 (0)