Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Discuss] Should we add the resourceFee in sorobanData to the fee? #761

Open
overcat opened this issue Jul 17, 2024 · 0 comments
Open

[Discuss] Should we add the resourceFee in sorobanData to the fee? #761

overcat opened this issue Jul 17, 2024 · 0 comments
Labels

Comments

@overcat
Copy link
Contributor

overcat commented Jul 17, 2024

Describe the bug
Currently, when we call TransactionBuilder.builder, regardless of whether sorobanData exists or not, the way we calculate the fee is op_count * baseFee. However, the meaning of the fee is the maximum stroops willing to be paid for this transaction. So I wonder if we should add the resourceFee in sorobanData to the fee?

What version are you on?

c4f9989

To Reproduce
See

/**
* This will build the transaction.
* It will also increment the source account's sequence number by 1.
* @returns {Transaction} This method will return the built {@link Transaction}.
*/
build() {
const sequenceNumber = new BigNumber(this.source.sequenceNumber()).plus(1);
const fee = new BigNumber(this.baseFee)
.times(this.operations.length)
.toNumber();
const attrs = {
fee,
seqNum: xdr.SequenceNumber.fromString(sequenceNumber.toString()),
memo: this.memo ? this.memo.toXDRObject() : null
};
if (
this.timebounds === null ||
typeof this.timebounds.minTime === 'undefined' ||
typeof this.timebounds.maxTime === 'undefined'
) {
throw new Error(
'TimeBounds has to be set or you must call setTimeout(TimeoutInfinite).'
);
}
if (isValidDate(this.timebounds.minTime)) {
this.timebounds.minTime = this.timebounds.minTime.getTime() / 1000;
}
if (isValidDate(this.timebounds.maxTime)) {
this.timebounds.maxTime = this.timebounds.maxTime.getTime() / 1000;
}
this.timebounds.minTime = UnsignedHyper.fromString(
this.timebounds.minTime.toString()
);
this.timebounds.maxTime = UnsignedHyper.fromString(
this.timebounds.maxTime.toString()
);
const timeBounds = new xdr.TimeBounds(this.timebounds);
if (this.hasV2Preconditions()) {
let ledgerBounds = null;
if (this.ledgerbounds !== null) {
ledgerBounds = new xdr.LedgerBounds(this.ledgerbounds);
}
let minSeqNum = this.minAccountSequence || '0';
minSeqNum = xdr.SequenceNumber.fromString(minSeqNum);
const minSeqAge = UnsignedHyper.fromString(
this.minAccountSequenceAge !== null
? this.minAccountSequenceAge.toString()
: '0'
);
const minSeqLedgerGap = this.minAccountSequenceLedgerGap || 0;
const extraSigners =
this.extraSigners !== null
? this.extraSigners.map(SignerKey.decodeAddress)
: [];
attrs.cond = xdr.Preconditions.precondV2(
new xdr.PreconditionsV2({
timeBounds,
ledgerBounds,
minSeqNum,
minSeqAge,
minSeqLedgerGap,
extraSigners
})
);
} else {
attrs.cond = xdr.Preconditions.precondTime(timeBounds);
}
attrs.sourceAccount = decodeAddressToMuxedAccount(this.source.accountId());
// TODO - remove this workaround for TransactionExt ts constructor
// and use the typescript generated static factory method once fixed
// https://github.com/stellar/dts-xdr/issues/5
if (this.sorobanData) {
// @ts-ignore
attrs.ext = new xdr.TransactionExt(1, this.sorobanData);
} else {
// @ts-ignore
attrs.ext = new xdr.TransactionExt(0, xdr.Void);
}
const xtx = new xdr.Transaction(attrs);
xtx.operations(this.operations);
const txEnvelope = new xdr.TransactionEnvelope.envelopeTypeTx(
new xdr.TransactionV1Envelope({ tx: xtx })
);
const tx = new Transaction(txEnvelope, this.networkPassphrase);
this.source.incrementSequenceNumber();
return tx;
}

Expected behavior
See above.
Additional context
N/A

@overcat overcat added the bug label Jul 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant