diff --git a/src/main/java/irita/sdk/model/BaseTx.java b/src/main/java/irita/sdk/model/BaseTx.java index 0116b88..46824b3 100644 --- a/src/main/java/irita/sdk/model/BaseTx.java +++ b/src/main/java/irita/sdk/model/BaseTx.java @@ -11,6 +11,8 @@ public class BaseTx { private Fee fee; private String memo; private BroadcastMode mode; + private long accountNumber; + private long sequence; public BaseTx() { } @@ -21,6 +23,14 @@ public BaseTx(int gas, Fee fee, BroadcastMode mode) { this.mode = mode; } + public BaseTx(int gas, Fee fee, BroadcastMode mode, long accountNumber, long sequence) { + this.gas = gas; + this.fee = fee; + this.mode = mode; + this.accountNumber = accountNumber; + this.sequence = sequence; + } + public BaseTx(String from, String password, int gas, Fee fee, String memo, BroadcastMode mode) { this.from = from; this.password = password; @@ -30,6 +40,17 @@ public BaseTx(String from, String password, int gas, Fee fee, String memo, Broad this.mode = mode; } + public BaseTx(String from, String password, int gas, Fee fee, String memo, BroadcastMode mode, long accountNumber, long sequence) { + this.from = from; + this.password = password; + this.gas = gas; + this.fee = fee; + this.memo = memo; + this.mode = mode; + this.accountNumber = accountNumber; + this.sequence = sequence; + } + public String getFrom() { return StringUtils.isNotEmpty(from) ? from : Constant.DEFAULT_USER_NAME; } @@ -81,4 +102,22 @@ public BaseTx setMode(BroadcastMode mode) { this.mode = mode; return this; } + + public long getAccountNumber() { + return accountNumber; + } + + public BaseTx setAccountNumber(long accountNumber) { + this.accountNumber = accountNumber; + return this; + } + + public long getSequence() { + return sequence; + } + + public BaseTx setSequence(long sequence) { + this.sequence = sequence; + return this; + } } diff --git a/src/main/java/irita/sdk/tx/Secp256k1TxEngine.java b/src/main/java/irita/sdk/tx/Secp256k1TxEngine.java index 950a9ea..f96d354 100644 --- a/src/main/java/irita/sdk/tx/Secp256k1TxEngine.java +++ b/src/main/java/irita/sdk/tx/Secp256k1TxEngine.java @@ -58,19 +58,22 @@ public TxOuterClass.Tx signTx(TxOuterClass.TxBody txBody, BaseTx baseTx, Account ECPoint publicKey = keyInfo.getPublicKey(); byte[] publicKeyEncoded = publicKey.getEncoded(true); + long sequence = baseTx.getSequence() != 0 ? baseTx.getSequence() : account.getSequence(); + long accountNumber = baseTx.getAccountNumber() != 0 ? baseTx.getAccountNumber() : account.getAccountNumber(); + TxOuterClass.AuthInfo ai = TxOuterClass.AuthInfo.newBuilder() .addSignerInfos( TxOuterClass.SignerInfo.newBuilder() .setPublicKey(Any.pack(Keys.PubKey.newBuilder().setKey(ByteString.copyFrom(publicKeyEncoded)).build(), "/")) .setModeInfo(TxOuterClass.ModeInfo.newBuilder().setSingle(TxOuterClass.ModeInfo.Single.newBuilder().setMode(Signing.SignMode.SIGN_MODE_DIRECT))) - .setSequence(account.getSequence())) + .setSequence(sequence)) .setFee(TxOuterClass.Fee.newBuilder().setGasLimit(baseTx.getGas()).addAmount(CoinOuterClass.Coin.newBuilder().setAmount(baseTx.getFee().getAmount()).setDenom(baseTx.getFee().getDenom()))).build(); TxOuterClass.SignDoc signDoc = TxOuterClass.SignDoc.newBuilder() .setBodyBytes(txBody.toByteString()) .setAuthInfoBytes(ai.toByteString()) - .setAccountNumber(account.getAccountNumber()) + .setAccountNumber(accountNumber) .setChainId(chainID) .build(); diff --git a/src/main/java/irita/sdk/tx/Sm2TxEngine.java b/src/main/java/irita/sdk/tx/Sm2TxEngine.java index ffb7306..895ba77 100644 --- a/src/main/java/irita/sdk/tx/Sm2TxEngine.java +++ b/src/main/java/irita/sdk/tx/Sm2TxEngine.java @@ -62,19 +62,22 @@ public TxOuterClass.Tx signTx(TxOuterClass.TxBody txBody, BaseTx baseTx, Account ECPoint publicKey = keyInfo.getPublicKey(); byte[] publicKeyEncoded = publicKey.getEncoded(true); + long sequence = baseTx.getSequence() != 0 ? baseTx.getSequence() : account.getSequence(); + long accountNumber = baseTx.getAccountNumber() != 0 ? baseTx.getAccountNumber() : account.getAccountNumber(); + TxOuterClass.AuthInfo ai = TxOuterClass.AuthInfo.newBuilder() .addSignerInfos( TxOuterClass.SignerInfo.newBuilder() .setPublicKey(Any.pack(Keys.PubKey.newBuilder().setKey(ByteString.copyFrom(publicKeyEncoded)).build(), "/")) .setModeInfo(TxOuterClass.ModeInfo.newBuilder().setSingle(TxOuterClass.ModeInfo.Single.newBuilder().setMode(Signing.SignMode.SIGN_MODE_DIRECT))) - .setSequence(account.getSequence())) + .setSequence(sequence)) .setFee(TxOuterClass.Fee.newBuilder().setGasLimit(baseTx.getGas()).addAmount(CoinOuterClass.Coin.newBuilder().setAmount(baseTx.getFee().getAmount()).setDenom(baseTx.getFee().getDenom()))).build(); TxOuterClass.SignDoc signDoc = TxOuterClass.SignDoc.newBuilder() .setBodyBytes(txBody.toByteString()) .setAuthInfoBytes(ai.toByteString()) - .setAccountNumber(account.getAccountNumber()) + .setAccountNumber(accountNumber) .setChainId(chainID) .build();