Skip to content

Commit

Permalink
Add support for detecting multi-asset minting in transactions
Browse files Browse the repository at this point in the history
Introduced a new method to check for multi-asset minting in transactions. Updated the transaction builder to account for multi-asset minting when removing duplicate script witnesses. Made adjustments in the `DuplicateScriptWitnessChecker` to handle native scripts.
  • Loading branch information
satran004 committed Oct 11, 2024
1 parent 5cab0bf commit 24e4287
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.bloxbean.cardano.client.function.helper;

import com.bloxbean.cardano.client.function.TxBuilder;
import com.bloxbean.cardano.client.plutus.spec.PlutusScript;
import com.bloxbean.cardano.client.spec.Script;
import com.bloxbean.cardano.client.util.HexUtil;
import com.bloxbean.cardano.client.util.Try;

Expand Down Expand Up @@ -29,6 +29,7 @@ public static TxBuilder removeDuplicateScriptWitnesses() {

//Remove duplicate script from witness set
if (refScriptHashes != null && !refScriptHashes.isEmpty()) {
removeDuplicateScripts(txn.getWitnessSet().getNativeScripts(), refScriptHashes);
removeDuplicateScripts(txn.getWitnessSet().getPlutusV1Scripts(), refScriptHashes);
removeDuplicateScripts(txn.getWitnessSet().getPlutusV2Scripts(), refScriptHashes);
removeDuplicateScripts(txn.getWitnessSet().getPlutusV3Scripts(), refScriptHashes);
Expand All @@ -37,7 +38,7 @@ public static TxBuilder removeDuplicateScriptWitnesses() {
};
}

private static void removeDuplicateScripts(List<? extends PlutusScript> scripts, Set<String> refScriptHashes) {
private static void removeDuplicateScripts(List<? extends Script> scripts, Set<String> refScriptHashes) {
if (scripts == null || scripts.isEmpty())
return;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,9 +189,8 @@ void minting_withScriptRef() throws CborSerializationException {
Result<String> result = quickTxBuilder.compose(tx)
.withSigner(SignerProviders.signerFrom(sender1))
.withSigner(SignerProviders.signerFrom(policy))
.postBalanceTx((context, txn) -> {
txn.getWitnessSet().getNativeScripts().clear();
}).completeAndWait();
.removeDuplicateScriptWitnesses(true)
.completeAndWait();

System.out.println(result);
assertTrue(result.isSuccessful());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,15 @@ public T attachMetadata(Metadata metadata) {
return (T) this;
}

/**
* Checks if the transaction has any multi-asset minting or burning.
*
* @return true if there are multi-assets to be minted; false otherwise
*/
boolean hasMultiAssetMinting() {
return multiAssets != null && !multiAssets.isEmpty();
}

TxBuilder complete() {
TxOutputBuilder txOutputBuilder = null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,7 @@ public Transaction build() {
TxBuilder txBuilder = (context, txn) -> {
};
boolean containsScriptTx = false;
boolean hasMultiAssetMint = false;

Set<String> fromAddresses = new HashSet<>();
for (AbstractTx tx : txList) {
Expand All @@ -253,6 +254,8 @@ public Transaction build() {

if (tx instanceof ScriptTx)
containsScriptTx = true;

hasMultiAssetMint = hasMultiAssetMint || tx.hasMultiAssetMinting();
}

int totalSigners = getTotalSigners();
Expand Down Expand Up @@ -358,7 +361,7 @@ public Transaction build() {
//Balance outputs
txBuilder = txBuilder.andThen(ScriptBalanceTxProviders.balanceTx(feePayer, totalSigners, containsScriptTx));

if (containsScriptTx && removeDuplicateScriptWitnesses) {
if ((containsScriptTx || hasMultiAssetMint) && removeDuplicateScriptWitnesses) {
txBuilder = txBuilder.andThen(DuplicateScriptWitnessChecker.removeDuplicateScriptWitnesses());
}

Expand Down

0 comments on commit 24e4287

Please sign in to comment.