Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
5780245
Complete AssignAddressHandler implementation
ebrahimmfadae Aug 28, 2021
408f560
Merge branch 'feature/1-MVP' into complete-assign-address-service
ebrahimmfadae Aug 29, 2021
65ed42d
Rename cached address to reserved address
ebrahimmfadae Aug 29, 2021
0d9ab13
Add unique constraint to reserved_addresses table
ebrahimmfadae Aug 29, 2021
0d454fb
Fix unique constraint in assigned addresses
ebrahimmfadae Aug 29, 2021
ff24577
Improve sql initiate script
ebrahimmfadae Aug 29, 2021
b5002b4
Fix persist method
ebrahimmfadae Aug 29, 2021
d3fc81e
Fix uuid unique constraint in assigned addresses
ebrahimmfadae Aug 29, 2021
4aa2a60
Add currency models
ebrahimmfadae Aug 29, 2021
281ce00
Add currency repositories
ebrahimmfadae Aug 29, 2021
9008781
Fix currency implementation
ebrahimmfadae Aug 30, 2021
330c529
Implement currency loader
ebrahimmfadae Aug 31, 2021
e401244
Change currency table primary key to symbol
ebrahimmfadae Aug 31, 2021
e43219f
Add currency tables
ebrahimmfadae Aug 31, 2021
13bd57b
Format Chain.kt
ebrahimmfadae Aug 31, 2021
dd5dbe6
Fix symbol nullability in WalletSyncServiceImpl.kt
ebrahimmfadae Aug 31, 2021
f0c4ee5
Add blockchain module to docker-compose
ebrahimmfadae Aug 31, 2021
857e938
Fix blockchain module port configs
ebrahimmfadae Aug 31, 2021
9918d4f
Fix bc-gateway docker config
ebrahimmfadae Aug 31, 2021
b897369
Fix bc-gateway database name in docker config
ebrahimmfadae Aug 31, 2021
f0e8cd4
Add missing @Repository attributes
ebrahimmfadae Aug 31, 2021
c37bd9c
Add bc-gateway-postgres dependency to bc-gateway-app
ebrahimmfadae Aug 31, 2021
110f394
Update docker-compose config
ebrahimmfadae Aug 31, 2021
b11ffe6
Fix sql scripts
ebrahimmfadae Aug 31, 2021
29d98dc
Fix blockchain gateway port
ebrahimmfadae Sep 1, 2021
df4a9ab
Pluralize db names
ebrahimmfadae Sep 1, 2021
cb576eb
Fix chain model table names
ebrahimmfadae Sep 1, 2021
03a7ea5
Fix numeric types in database
ebrahimmfadae Sep 5, 2021
ec476e5
Fix currency loader
ebrahimmfadae Sep 5, 2021
060d838
Update chain repository
ebrahimmfadae Sep 5, 2021
92d8897
Add some sub entity queries to chain repository
ebrahimmfadae Sep 5, 2021
26e7478
Add id to chain repository fetch method
ebrahimmfadae Sep 5, 2021
6924956
Add chain model data to currency loader
ebrahimmfadae Sep 5, 2021
01271dd
Merge branch 'feature/1-MVP' into complete-assign-address-service
ebrahimmfadae Sep 5, 2021
6e3118e
Refactor currency loader
ebrahimmfadae Sep 11, 2021
ac757f2
Apply DRY to currency loader
ebrahimmfadae Sep 11, 2021
23e8d29
Fix null currency issue in currency loader
ebrahimmfadae Sep 11, 2021
feb1399
Revert fetchCurrencyInfo() return type changing
ebrahimmfadae Sep 11, 2021
d5a663b
Handle not found currency
ebrahimmfadae Sep 11, 2021
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
441 changes: 223 additions & 218 deletions BlockchainGateway/bc-gateway-app/pom.xml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ class AppConfig {
fun assignAddressService(
currencyLoader: CurrencyLoader,
assignedAddressHandler: AssignedAddressHandler,
cachedAddressHandler: CachedAddressHandler
reservedAddressHandler: ReservedAddressHandler
): AssignAddressService {
return AssignAddressServiceImpl(currencyLoader, assignedAddressHandler, cachedAddressHandler)
return AssignAddressServiceImpl(currencyLoader, assignedAddressHandler, reservedAddressHandler)
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
server.port: 8091
server.port: 8095
spring:
application:
name: opex-bc-gateway
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
server.port: 8091
server.port: 8095
spring:
application:
name: opex-bc-gateway
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ package co.nilin.opex.bcgateway.core.api
import co.nilin.opex.bcgateway.core.model.CurrencyInfo

interface InfoService {
suspend fun countCachedAddresses(): Long
suspend fun countReservedAddresses(): Long
suspend fun getCurrencyInfo(): CurrencyInfo
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package co.nilin.opex.bcgateway.core.model

data class AddressType(val id: Long, val type: String, val addressRegex: String, val memoRegex: String)
data class CachedAddress(val address: String, val memo: String?, val type: AddressType)
data class ReservedAddress(val address: String, val memo: String?, val type: AddressType)
data class AssignedAddress(val uuid: String, val address: String, val memo: String?, val type: AddressType, val chains: MutableList<Chain> ){
override fun equals(other: Any?): Boolean {
if (this === other) return true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ import java.time.LocalDateTime
data class Endpoint(val url: String)
data class Chain(val name: String, val addressTypes: List<AddressType>, val endpoints: List<Endpoint>)
data class ChainSyncSchedule(val chainName: String, val retryTime: LocalDateTime, val delay: Long)
data class ChainSyncRecord(val chainName: String
, val time: LocalDateTime
, val endpoint: Endpoint
, val latestBlock: Long?
, val success: Boolean
, val error: String?
, val records: List<Deposit>
data class ChainSyncRecord(
val chainName: String,
val time: LocalDateTime,
val endpoint: Endpoint,
val latestBlock: Long?,
val success: Boolean,
val error: String?,
val records: List<Deposit>
)

Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ import co.nilin.opex.bcgateway.core.model.AssignedAddress
import co.nilin.opex.bcgateway.core.model.Chain
import co.nilin.opex.bcgateway.core.model.Currency
import co.nilin.opex.bcgateway.core.spi.AssignedAddressHandler
import co.nilin.opex.bcgateway.core.spi.CachedAddressHandler
import co.nilin.opex.bcgateway.core.spi.ReservedAddressHandler
import co.nilin.opex.bcgateway.core.spi.CurrencyLoader
import java.lang.RuntimeException

class AssignAddressServiceImpl(
val currencyLoader: CurrencyLoader,
val assignedAddressHandler: AssignedAddressHandler,
val cachedAddressHandler: CachedAddressHandler
val reservedAddressHandler: ReservedAddressHandler
) : AssignAddressService {

override suspend fun assignAddress(user: String, currency: Currency): List<AssignedAddress> {
Expand Down Expand Up @@ -42,19 +42,19 @@ class AssignAddressServiceImpl(
}
result.add(assigned)
} else {
val cachedAddress = cachedAddressHandler.peekCachedAddress(addressType)
if (cachedAddress != null) {
val reservedAddress = reservedAddressHandler.peekReservedAddress(addressType)
if (reservedAddress != null) {
val newAssigned = AssignedAddress(
user,
cachedAddress.address,
cachedAddress.memo,
reservedAddress.address,
reservedAddress.memo,
addressType,
chainAddressTypeMap.get(addressType)!!
)
cachedAddressHandler.remove(cachedAddress)
reservedAddressHandler.remove(reservedAddress)
result.add(newAssigned)
} else
throw RuntimeException("No cached address available for $addressType")
throw RuntimeException("No reserved address available for $addressType")

}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import co.nilin.opex.bcgateway.core.api.InfoService
import co.nilin.opex.bcgateway.core.model.CurrencyInfo

class InfoServiceImpl: InfoService {
override suspend fun countCachedAddresses(): Long {
override suspend fun countReservedAddresses(): Long {
TODO()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ class WalletSyncServiceImpl(
deposits.map { deposit ->
async(dispatcher) {
val uuid = assignedAddressHandler.findUuid(deposit.depositor, deposit.depositorMemo)
if ( uuid != null ) {
if (uuid != null) {
val symbol = currencyLoader.findSymbol(deposit.chain!!, deposit.tokenAddress)
walletProxy.transfer(uuid, symbol, deposit.amount)
if (symbol != null) walletProxy.transfer(uuid, symbol, deposit.amount)
}
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ import co.nilin.opex.bcgateway.core.model.CurrencyInfo

interface CurrencyLoader {
suspend fun fetchCurrencyInfo(symbol: String): CurrencyInfo
suspend fun findSymbol(chain: String, address: String?): String
suspend fun findSymbol(chain: String, address: String?): String?
suspend fun findImplementationsWithTokenOnChain(chain: String): List<CurrencyImplementation>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package co.nilin.opex.bcgateway.core.spi

import co.nilin.opex.bcgateway.core.model.AddressType
import co.nilin.opex.bcgateway.core.model.ReservedAddress

interface ReservedAddressHandler {
suspend fun peekReservedAddress(addressType: AddressType): ReservedAddress?
suspend fun remove(reservedAddress: ReservedAddress)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,20 @@ package co.nilin.opex.bcgateway.core.service

import co.nilin.opex.bcgateway.core.model.AddressType
import co.nilin.opex.bcgateway.core.model.AssignedAddress
import co.nilin.opex.bcgateway.core.model.CachedAddress
import co.nilin.opex.bcgateway.core.model.ReservedAddress
import co.nilin.opex.bcgateway.core.model.Chain
import co.nilin.opex.bcgateway.core.model.Currency
import co.nilin.opex.bcgateway.core.model.CurrencyImplementation
import co.nilin.opex.bcgateway.core.model.CurrencyInfo
import co.nilin.opex.bcgateway.core.spi.AssignedAddressHandler
import co.nilin.opex.bcgateway.core.spi.CachedAddressHandler
import co.nilin.opex.bcgateway.core.spi.ReservedAddressHandler
import co.nilin.opex.bcgateway.core.spi.CurrencyLoader
import java.lang.RuntimeException
import java.math.BigDecimal
import java.util.UUID
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.function.Executable
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
Expand All @@ -29,7 +28,7 @@ class AssignAddressServiceImplUnitTest {
lateinit var assignedAddressHandler: AssignedAddressHandler

@Mock
lateinit var cachedAddressHandler: CachedAddressHandler
lateinit var reservedAddressHandler: ReservedAddressHandler

val assignAddressServiceImpl: AssignAddressServiceImpl

Expand All @@ -43,7 +42,7 @@ class AssignAddressServiceImplUnitTest {
init {
MockitoAnnotations.openMocks(this)
assignAddressServiceImpl = AssignAddressServiceImpl(
currencyLoader, assignedAddressHandler, cachedAddressHandler
currencyLoader, assignedAddressHandler, reservedAddressHandler
)
runBlocking {
val eth =
Expand All @@ -67,17 +66,17 @@ class AssignAddressServiceImplUnitTest {
}

@Test
fun givenCachedAddressAndUserWithNoAssignedAddress_whenAssignAddress_thenCachedAddressAssigned() {
fun givenReservedAddressAndUserWithNoAssignedAddress_whenAssignAddress_thenReservedAddressAssigned() {
runBlocking {
val user = UUID.randomUUID().toString()
Mockito.`when`(assignedAddressHandler.fetchAssignedAddresses(user, listOf(ethAddressType, ethMemoAddressType))).thenReturn(
emptyList()
)
Mockito.`when`(cachedAddressHandler.peekCachedAddress(ethAddressType)).thenReturn(
CachedAddress("0x1", null, ethAddressType)
Mockito.`when`(reservedAddressHandler.peekReservedAddress(ethAddressType)).thenReturn(
ReservedAddress("0x1", null, ethAddressType)
)
Mockito.`when`(cachedAddressHandler.peekCachedAddress(ethMemoAddressType)).thenReturn(
CachedAddress("0x2", "Memo", ethMemoAddressType)
Mockito.`when`(reservedAddressHandler.peekReservedAddress(ethMemoAddressType)).thenReturn(
ReservedAddress("0x2", "Memo", ethMemoAddressType)
)
val assignedAddress = assignAddressServiceImpl.assignAddress(user, currency)
Assertions.assertEquals(
Expand All @@ -102,13 +101,13 @@ class AssignAddressServiceImplUnitTest {
}

@Test
fun givenNoCachedAddressAndUserWithNoAssignedAddress_whenAssignAddress_thenExcpetion() {
fun givenNoReservedAddressAndUserWithNoAssignedAddress_whenAssignAddress_thenExcpetion() {
runBlocking {
val user = UUID.randomUUID().toString()
Mockito.`when`(assignedAddressHandler.fetchAssignedAddresses(user, listOf(ethAddressType, ethMemoAddressType))).thenReturn(
emptyList()
)
Mockito.`when`(cachedAddressHandler.peekCachedAddress(ethAddressType)).thenReturn(null)
Mockito.`when`(reservedAddressHandler.peekReservedAddress(ethAddressType)).thenReturn(null)

Assertions.assertThrows(RuntimeException::class.java) {
runBlocking {
Expand All @@ -119,7 +118,7 @@ class AssignAddressServiceImplUnitTest {
}

@Test
fun givenCachedAddressAndUserOneAssignedAddress_whenAssignAddress_thenCachedAddressAssigned() {
fun givenReservedAddressAndUserOneAssignedAddress_whenAssignAddress_thenReservedAddressAssigned() {
runBlocking {
val user = UUID.randomUUID().toString()
Mockito.`when`(assignedAddressHandler.fetchAssignedAddresses(user, listOf(ethAddressType, ethMemoAddressType))).thenReturn(
Expand All @@ -132,11 +131,11 @@ class AssignAddressServiceImplUnitTest {
)
)
)
Mockito.`when`(cachedAddressHandler.peekCachedAddress(ethAddressType)).thenReturn(
CachedAddress("0x1", null, ethAddressType)
Mockito.`when`(reservedAddressHandler.peekReservedAddress(ethAddressType)).thenReturn(
ReservedAddress("0x1", null, ethAddressType)
)
Mockito.`when`(cachedAddressHandler.peekCachedAddress(ethMemoAddressType)).thenReturn(
CachedAddress("0x2", "Memo", ethMemoAddressType)
Mockito.`when`(reservedAddressHandler.peekReservedAddress(ethMemoAddressType)).thenReturn(
ReservedAddress("0x2", "Memo", ethMemoAddressType)
)
val assignedAddress = assignAddressServiceImpl.assignAddress(user, currency)
Assertions.assertEquals(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,57 +13,72 @@ class PostgresConfig(db: DatabaseClient) {
"""
CREATE TABLE IF NOT EXISTS address_types (
id SERIAL PRIMARY KEY,
address_type VARCHAR(72),
address_regex VARCHAR(72),
memo_regex VARCHAR(72)
address_type VARCHAR(72) NOT NULL,
address_regex VARCHAR(72) NOT NULL,
memo_regex VARCHAR(72) NOT NULL
);
CREATE TABLE IF NOT EXISTS assigned_addresses (
id SERIAL PRIMARY KEY,
uuid VARCHAR(72) UNIQUE,
address VARCHAR(72),
uuid VARCHAR(72) NOT NULL,
address VARCHAR(72) NOT NULL,
memo VARCHAR(72),
addr_type_id numeric,
addr_type_id INTEGER NOT NULL,
UNIQUE (address, memo)
);
CREATE TABLE IF NOT EXISTS assigned_address_chains (
id SERIAL PRIMARY KEY,
assigned_address_id numeric,
chain VARCHAR(72)
assigned_address_id INTEGER NOT NULL,
chain VARCHAR(72) NOT NULL
);
CREATE TABLE IF NOT EXISTS cached_addresses (
CREATE TABLE IF NOT EXISTS reserved_addresses (
id SERIAL PRIMARY KEY,
address VARCHAR(72),
address VARCHAR(72) NOT NULL,
memo VARCHAR(72),
address_type VARCHAR(72)
address_type VARCHAR(72) NOT NULL,
UNIQUE (address, memo)
);
CREATE TABLE IF NOT EXISTS chain (
CREATE TABLE IF NOT EXISTS chains (
name VARCHAR(72) PRIMARY KEY
);
CREATE TABLE IF NOT EXISTS chain_address_types (
id SERIAL PRIMARY KEY,
chain_name VARCHAR(72),
addr_type_id numeric
chain_name VARCHAR(72) NOT NULL REFERENCES chains (name),
addr_type_id INTEGER NOT NULL REFERENCES address_types (id)
);
CREATE TABLE IF NOT EXISTS chain_endpoints (
id SERIAL PRIMARY KEY,
chain_name VARCHAR(72),
endpoint_url VARCHAR(72),
chain_name VARCHAR(72) NOT NULL,
endpoint_url VARCHAR(72) NOT NULL,
endpoint_user VARCHAR(72),
endpoint_password VARCHAR(72)
);
CREATE TABLE IF NOT EXISTS chain_sync_schedule (
CREATE TABLE IF NOT EXISTS chain_sync_schedules (
chain VARCHAR(72) PRIMARY KEY,
retry_time TIMESTAMP,
delay numeric
delay NUMERIC
);
CREATE TABLE IF NOT EXISTS chain_sync_record (
CREATE TABLE IF NOT EXISTS chain_sync_records (
chain VARCHAR(72) PRIMARY KEY,
time TIMESTAMP,
endpoint_url VARCHAR(72),
latest_block numeric,
success BOOLEAN,
time TIMESTAMP NOT NULL,
endpoint_url VARCHAR(72) NOT NULL,
latest_block INTEGER NOT NULL,
success BOOLEAN NOT NULL,
error VARCHAR(100)
);
CREATE TABLE IF NOT EXISTS currency (
symbol VARCHAR(72) PRIMARY KEY,
name VARCHAR(72) NOT NULL
);
CREATE TABLE IF NOT EXISTS currency_implementations (
symbol VARCHAR(72) PRIMARY KEY,
chain VARCHAR(72) NOT NULL,
token BOOLEAN NOT NULL,
token_address VARCHAR(72),
token_name VARCHAR(72),
withdraw_enabled BOOLEAN NOT NULL,
withdraw_fee NUMERIC NOT NULL,
withdraw_min NUMERIC NOT NULL
);
"""
}
initDb // initialize the database
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@ import org.springframework.data.r2dbc.repository.Query
import org.springframework.data.repository.query.Param
import org.springframework.data.repository.reactive.ReactiveCrudRepository
import org.springframework.stereotype.Repository
import reactor.core.publisher.Mono

@Repository
interface AssignedAddressRepository : ReactiveCrudRepository<AssignedAddressModel, Long> {
@Query("select * from assigned_addresses where uuid = :uuid and addr_type_id in (:addressTypes)")
fun findByUuidAndAddressType(
@Param("uuid") uuid: String, @Param("addressTypes") types: List<Long>
): Flow<AssignedAddressModel>

@Query("select * from assigned_addresses where address = :address and (:memo is null or memo = :memo)")
fun findByAddressAndMemo(
@Param("address") address: String, @Param("memo") memo: String?
): Mono<AssignedAddressModel>
}

This file was deleted.

Loading