diff --git a/app/src/main/scala/org/alephium/explorer/api/EndpointExamples.scala b/app/src/main/scala/org/alephium/explorer/api/EndpointExamples.scala index 835ca611..294d68d5 100644 --- a/app/src/main/scala/org/alephium/explorer/api/EndpointExamples.scala +++ b/app/src/main/scala/org/alephium/explorer/api/EndpointExamples.scala @@ -504,7 +504,7 @@ object EndpointExamples extends EndpointsExamples { simpleExample( ArraySeq( TransactionInfoPerAddress( - address = address1, + address = grouplessAddress, transactionInfo = TransactionInfo( hash = txId, blockHash = blockHash, diff --git a/app/src/main/scala/org/alephium/explorer/api/model/TransactionInfoPerAddress.scala b/app/src/main/scala/org/alephium/explorer/api/model/TransactionInfoPerAddress.scala index ea703549..bee74ed9 100644 --- a/app/src/main/scala/org/alephium/explorer/api/model/TransactionInfoPerAddress.scala +++ b/app/src/main/scala/org/alephium/explorer/api/model/TransactionInfoPerAddress.scala @@ -3,12 +3,12 @@ package org.alephium.explorer.api.model +import org.alephium.api.model.{Address => ApiAddress} import org.alephium.explorer.api.Json._ import org.alephium.json.Json._ -import org.alephium.protocol.model.Address final case class TransactionInfoPerAddress( - address: Address, + address: ApiAddress, transactionInfo: TransactionInfo ) diff --git a/app/src/main/scala/org/alephium/explorer/persistence/dao/TransactionDao.scala b/app/src/main/scala/org/alephium/explorer/persistence/dao/TransactionDao.scala index 8ded18a1..e562633f 100644 --- a/app/src/main/scala/org/alephium/explorer/persistence/dao/TransactionDao.scala +++ b/app/src/main/scala/org/alephium/explorer/persistence/dao/TransactionDao.scala @@ -76,7 +76,7 @@ object TransactionDao { addresses.flatMap { address => infosByAddress.get(address.toBase58).map { row => TransactionInfoPerAddress( - row.address, + address, TransactionInfo( row.tx.txHash, row.tx.blockHash, diff --git a/app/src/test/scala/org/alephium/explorer/persistence/queries/TransactionQueriesSpec.scala b/app/src/test/scala/org/alephium/explorer/persistence/queries/TransactionQueriesSpec.scala index 4d49a4fe..02b2c2c1 100644 --- a/app/src/test/scala/org/alephium/explorer/persistence/queries/TransactionQueriesSpec.scala +++ b/app/src/test/scala/org/alephium/explorer/persistence/queries/TransactionQueriesSpec.scala @@ -1,6 +1,7 @@ // Copyright (c) Alephium // SPDX-License-Identifier: LGPL-3.0-only +//scalastyle:off file.size.limit package org.alephium.explorer.persistence.queries import scala.collection.immutable.ArraySeq @@ -20,6 +21,7 @@ import org.alephium.explorer.Generators._ import org.alephium.explorer.api.model._ import org.alephium.explorer.config.Default.groupConfig import org.alephium.explorer.persistence.{DatabaseFixtureForEach, TestDBRunner} +import org.alephium.explorer.persistence.dao.TransactionDao import org.alephium.explorer.persistence.model._ import org.alephium.explorer.persistence.queries.result._ import org.alephium.explorer.persistence.schema._ @@ -260,6 +262,32 @@ class TransactionQueriesSpec actual should contain theSameElementsAs expected } + "latest tx info by addresses should keep groupless inputs groupless" in new Fixture { + val lockup = p2pkLockupGen(chainFrom).sample.get + val protocolAddress = Address.Asset(lockup) + val lookupAddress = ApiAddress.fromProtocol(protocolAddress) + + val txEntity = TransactionPerAddressEntity( + address = protocolAddress, + grouplessAddress = AddressUtil.convertToGrouplessAddress(protocolAddress), + hash = transactionHashGen.sample.get, + blockHash = blockHashGen.sample.get, + timestamp = TimeStamp.unsafe(1), + txOrder = 0, + mainChain = true, + conflicted = None, + coinbase = false + ) + + exec(TransactionPerAddressSchema.table.delete) + exec(TransactionPerAddressSchema.table += txEntity) + + val actual = + TransactionDao.getLatestTransactionInfoByAddresses(ArraySeq(lookupAddress)).futureValue + + actual.map(_.address.toBase58) is ArraySeq(lookupAddress.toBase58) + } + "address with no txs is omitted from result" in new Fixture { val lockup = p2pkLockupGen(chainFrom).sample.get val protocolAddress = Address.Asset(lockup) diff --git a/app/src/test/scala/org/alephium/explorer/web/AddressServerSpec.scala b/app/src/test/scala/org/alephium/explorer/web/AddressServerSpec.scala index 53bb69e7..63ced223 100644 --- a/app/src/test/scala/org/alephium/explorer/web/AddressServerSpec.scala +++ b/app/src/test/scala/org/alephium/explorer/web/AddressServerSpec.scala @@ -147,9 +147,7 @@ class AddressServerSpec() dc: DatabaseConfig[PostgresProfile] ): Future[ArraySeq[TransactionInfoPerAddress]] = Future.successful( - ArraySeq.fill(addresses.size)( - TransactionInfoPerAddress(publicKeyAddresses.head._1, transactionInfo.get) - ) + addresses.map(address => TransactionInfoPerAddress(address, transactionInfo.get)) ) override def getAmountHistory( @@ -250,18 +248,21 @@ class AddressServerSpec() "get latest transaction info for multiple addresses" should { "return all different addresses info" in { val addresses = LazyList.continually(addressGen.sample.get).distinct.take(3).to(ArraySeq) - val entity = addresses.map(address => s""""$address"""").mkString("[", ",", "]") + val apiAddresses = + addresses.map(address => ApiAddress.fromBase58(address.toBase58).rightValue) + val entity = addresses.map(address => s""""$address"""").mkString("[", ",", "]") Post("/addresses/latest-transactions", Some(entity)) check { response => // We take only distinct addresses - response.as[ArraySeq[TransactionInfoPerAddress]] is ArraySeq.fill(addresses.size)( - TransactionInfoPerAddress(publicKeyAddresses.head._1, transactionInfo.get) + response.as[ArraySeq[TransactionInfoPerAddress]] is apiAddresses.map(address => + TransactionInfoPerAddress(address, transactionInfo.get) ) } } "return only 1 info for when using multiple time the same address" in { val address = addressGen.sample.get + val apiAddress = ApiAddress.fromBase58(address.toBase58).rightValue val sameAddresses = ArraySeq.fill(3)(address) val sameAddresseEntity = sameAddresses.map(address => s""""$address"""").mkString("[", ",", "]") @@ -269,7 +270,7 @@ class AddressServerSpec() Post("/addresses/latest-transactions", Some(sameAddresseEntity)) check { response => // We take only distinct addresses response.as[ArraySeq[TransactionInfoPerAddress]] is ArraySeq( - TransactionInfoPerAddress(publicKeyAddresses.head._1, transactionInfo.get) + TransactionInfoPerAddress(apiAddress, transactionInfo.get) ) } }