Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class AddressController(
private val reservedAddressHandler: ReservedAddressHandler,
private val addressTypeHandler: AddressTypeHandler
) {
data class AssignAddressRequest(val uuid: String, val currency: String, val chain: String)
data class AssignAddressRequest(val uuid: String, val currency: String, val gatewayUuid: String)
data class AssignAddressResponse(val addresses: List<AssignedAddress>)

@PostMapping("/assign")
Expand All @@ -36,7 +36,7 @@ class AddressController(
val assignedAddress = assignAddressService.assignAddress(
assignAddressRequest.uuid,
assignAddressRequest.currency,
assignAddressRequest.chain
assignAddressRequest.gatewayUuid
)

return AssignAddressResponse(assignedAddress);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ import co.nilin.opex.bcgateway.core.model.AssignedAddress
//import co.nilin.opex.bcgateway.core.model.Currency

interface AssignAddressService {
suspend fun assignAddress(user: String, currency: String, chain: String): List<AssignedAddress>
suspend fun assignAddress(user: String, currency: String, gatewayUuid: String): List<AssignedAddress>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ package co.nilin.opex.bcgateway.core.service

import co.nilin.opex.bcgateway.core.api.AssignAddressService
import co.nilin.opex.bcgateway.core.model.*
import co.nilin.opex.bcgateway.core.spi.AssignedAddressHandler
import co.nilin.opex.bcgateway.core.spi.ChainLoader
import co.nilin.opex.bcgateway.core.spi.CryptoCurrencyHandlerV2
import co.nilin.opex.bcgateway.core.spi.ReservedAddressHandler
import co.nilin.opex.bcgateway.core.spi.*
import co.nilin.opex.bcgateway.core.utils.LoggerDelegate
import co.nilin.opex.common.OpexError
import org.slf4j.Logger
Expand All @@ -25,35 +22,24 @@ open class AssignAddressServiceImpl(
private val logger: Logger by LoggerDelegate()

@Transactional
override suspend fun assignAddress(user: String, currency: String, chain: String): List<AssignedAddress> {
logger.info("address life time: " + addressLifeTime.toString())
override suspend fun assignAddress(user: String, currency: String, gatewayUuid: String): List<AssignedAddress> {

addressLifeTime = 7200
val currencyInfo = currencyHandler.fetchCurrencyOnChainGateways(FetchGateways(currencySymbol = currency))

val requestedGateway = currencyHandler.fetchOnChainGateway(currency = currency, gatewayUuid = gatewayUuid)
?: throw OpexError.CurrencyNotFound.exception()
val chains = currencyInfo
?.map { imp -> chainLoader.fetchChainInfo(imp.chain) }
?.filter { it?.name.equals(chain, true) }
val addressTypes = chains
?.flatMap { chain -> chain?.addressTypes!! }
?.distinct()
val chainAddressTypeMap = HashMap<AddressType, MutableList<Chain>>()
chains?.forEach { chain ->
chain?.addressTypes?.forEach { addressType ->
chainAddressTypeMap.putIfAbsent(addressType, mutableListOf())
chainAddressTypeMap.getValue(addressType).add(chain!!)
}
}

val requestedChain = chainLoader.fetchChainInfo(requestedGateway.chain)
val addressTypes = requestedChain?.addressTypes

val userAssignedAddresses =
(assignedAddressHandler.fetchAssignedAddresses(user, addressTypes!!)).toMutableList()

val result = mutableSetOf<AssignedAddress>()

addressTypes.forEach { addressType ->
val assigned = userAssignedAddresses.firstOrNull { assignAddress -> assignAddress.type == addressType }
if (assigned != null) {
chainAddressTypeMap[addressType]?.forEach { chain ->
if (!assigned.chains.contains(chain)) {
assigned.chains.add(chain)
}
}
result.add(assigned)
} else {
val reservedAddress = reservedAddressHandler.peekReservedAddress(addressType)
Expand All @@ -63,7 +49,7 @@ open class AssignAddressServiceImpl(
reservedAddress.address,
reservedAddress.memo,
addressType,
chainAddressTypeMap[addressType]!!,
listOf(requestedChain).toMutableList(),
addressLifeTime?.let { LocalDateTime.now().plusSeconds(addressLifeTime!!) }
?: null,
LocalDateTime.now(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class AssignAddressServiceImplUnitTest {

// private val currency = Currency("ETH", "Ethereum")
private val chain = "ETH_MAINNET"
private val gatewayUuid = "1"
private val currency = "ETH"
private val ethAddressType = AddressType(1, "ETH", "+*", ".*")
private val ethMemoAddressType = AddressType(2, "ETH", "+*", "+*")
Expand Down Expand Up @@ -81,16 +82,31 @@ class AssignAddressServiceImplUnitTest {

)

coEvery {
currencyHandler.fetchCurrencyOnChainGateways(
FetchGateways(
currencySymbol = currency,
gatewayUuid = gatewayUuid
)
)
} returns
listOf(eth, wrappedEth)

coEvery { currencyHandler.fetchCurrencyOnChainGateways(FetchGateways(currencySymbol = currency)) } returns
listOf(eth, wrappedEth)

coEvery { chainLoader.fetchChainInfo(chain = ethChain.name) } returns ethChain

coEvery { chainLoader.fetchChainInfo(chain = bscChain.name) } returns bscChain

coEvery { currencyHandler.fetchOnChainGateway(currency = currency, gatewayUuid = gatewayUuid) } returns eth



coEvery { assignedAddressHandler.persist(any()) } returns Unit
coEvery { reservedAddressHandler.remove(any()) } returns Unit


}

@Test
Expand All @@ -116,7 +132,7 @@ class AssignAddressServiceImplUnitTest {
ethMemoAddressType
)

val assignedAddress = assignAddressServiceImpl.assignAddress(user, currency, chain)
val assignedAddress = assignAddressServiceImpl.assignAddress(user, currency, gatewayUuid)
assertThat(assignedAddress).isEqualTo(
listOf(
AssignedAddress(
Expand All @@ -141,7 +157,7 @@ class AssignAddressServiceImplUnitTest {
)
} returns emptyList()
coEvery { reservedAddressHandler.peekReservedAddress(ethAddressType) } returns null
coEvery { assignAddressServiceImpl.assignAddress(user, currency, chain) } throws RuntimeException()
coEvery { assignAddressServiceImpl.assignAddress(user, currency, gatewayUuid) } throws RuntimeException()
}

@Test
Expand Down Expand Up @@ -173,7 +189,7 @@ class AssignAddressServiceImplUnitTest {
ethMemoAddressType
)

val assignedAddress = assignAddressServiceImpl.assignAddress(user, currency, chain)
val assignedAddress = assignAddressServiceImpl.assignAddress(user, currency, gatewayUuid)
assertThat(assignedAddress).isEqualTo(
listOf(
AssignedAddress(
Expand Down
Loading