diff --git a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt index 4757b2737..ba408faa8 100644 --- a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt +++ b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt @@ -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) @PostMapping("/assign") @@ -36,7 +36,7 @@ class AddressController( val assignedAddress = assignAddressService.assignAddress( assignAddressRequest.uuid, assignAddressRequest.currency, - assignAddressRequest.chain + assignAddressRequest.gatewayUuid ) return AssignAddressResponse(assignedAddress); diff --git a/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/api/AssignAddressService.kt b/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/api/AssignAddressService.kt index a154cfc0b..28864bad0 100644 --- a/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/api/AssignAddressService.kt +++ b/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/api/AssignAddressService.kt @@ -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 + suspend fun assignAddress(user: String, currency: String, gatewayUuid: String): List } \ No newline at end of file diff --git a/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/service/AssignAddressServiceImpl.kt b/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/service/AssignAddressServiceImpl.kt index da6bc54b2..72492bdce 100644 --- a/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/service/AssignAddressServiceImpl.kt +++ b/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/service/AssignAddressServiceImpl.kt @@ -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 @@ -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 { - logger.info("address life time: " + addressLifeTime.toString()) + override suspend fun assignAddress(user: String, currency: String, gatewayUuid: String): List { + 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>() - 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() + 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) @@ -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(), diff --git a/bc-gateway/bc-gateway-core/src/test/kotlin/co/nilin/opex/bcgateway/core/service/AssignAddressServiceImplUnitTest.kt b/bc-gateway/bc-gateway-core/src/test/kotlin/co/nilin/opex/bcgateway/core/service/AssignAddressServiceImplUnitTest.kt index c4460698e..404845d6c 100644 --- a/bc-gateway/bc-gateway-core/src/test/kotlin/co/nilin/opex/bcgateway/core/service/AssignAddressServiceImplUnitTest.kt +++ b/bc-gateway/bc-gateway-core/src/test/kotlin/co/nilin/opex/bcgateway/core/service/AssignAddressServiceImplUnitTest.kt @@ -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", "+*", "+*") @@ -81,6 +82,16 @@ class AssignAddressServiceImplUnitTest { ) + coEvery { + currencyHandler.fetchCurrencyOnChainGateways( + FetchGateways( + currencySymbol = currency, + gatewayUuid = gatewayUuid + ) + ) + } returns + listOf(eth, wrappedEth) + coEvery { currencyHandler.fetchCurrencyOnChainGateways(FetchGateways(currencySymbol = currency)) } returns listOf(eth, wrappedEth) @@ -88,9 +99,14 @@ class AssignAddressServiceImplUnitTest { 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 @@ -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( @@ -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 @@ -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(