3
0
mirror of https://github.com/Qortal/qortal.git synced 2025-02-12 02:05:50 +00:00

Fix PresenceTransaction to work with any ACCT, not only BitcoinACCTv1

This commit is contained in:
catbref 2020-12-01 15:06:07 +00:00
parent 500690be49
commit c10a5db280

View File

@ -6,12 +6,15 @@ import static java.util.stream.Collectors.toMap;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.qortal.account.Account;
import org.qortal.controller.Controller;
import org.qortal.crosschain.BitcoinACCTv1;
import org.qortal.crosschain.ACCT;
import org.qortal.crosschain.SupportedBlockchain;
import org.qortal.crypto.Crypto;
import org.qortal.crypto.MemoryPoW;
import org.qortal.data.at.ATData;
@ -25,6 +28,7 @@ import org.qortal.transform.TransformationException;
import org.qortal.transform.transaction.PresenceTransactionTransformer;
import org.qortal.transform.transaction.TransactionTransformer;
import org.qortal.utils.Base58;
import org.qortal.utils.ByteArray;
import com.google.common.primitives.Longs;
@ -158,13 +162,19 @@ public class PresenceTransaction extends Transaction {
// Check signer is known trade address
String signerAddress = Crypto.toAddress(this.transactionData.getCreatorPublicKey());
byte[] codeHash = BitcoinACCTv1.CODE_BYTES_HASH;
Map<ByteArray, Supplier<ACCT>> acctSuppliersByCodeHash = SupportedBlockchain.getAcctMap();
Set<ByteArray> codeHashes = acctSuppliersByCodeHash.keySet();
boolean isExecutable = true;
List<ATData> atsData = repository.getATRepository().getATsByFunctionality(codeHash, isExecutable, null, null, null);
List<ATData> atsData = repository.getATRepository().getAllATsByFunctionality(codeHashes, isExecutable);
for (ATData atData : atsData) {
CrossChainTradeData crossChainTradeData = BitcoinACCTv1.getInstance().populateTradeData(repository, atData);
ByteArray atCodeHash = new ByteArray(atData.getCodeHash());
Supplier<ACCT> acctSupplier = acctSuppliersByCodeHash.get(atCodeHash);
if (acctSupplier == null)
continue;
CrossChainTradeData crossChainTradeData = acctSupplier.get().populateTradeData(repository, atData);
if (crossChainTradeData.qortalCreatorTradeAddress.equals(signerAddress))
return ValidationResult.OK;