src/main/kotlin/io/api/bloxy/core/impl/AddressApiProvider.kt
package io.api.bloxy.core.impl
import io.api.bloxy.executor.IHttpClient
import io.api.bloxy.model.dto.address.*
import org.jetbrains.annotations.NotNull
import java.time.LocalDate
/**
* API for Analysis of addresses, their activities and statistics
* More information - https://bloxy.info/api_methods#address
*
* @see io.api.bloxy.core.IAddressApi
* @see io.api.bloxy.core.impl.BasicProvider
*
* @author GoodforGod
* @since 16.11.2018
*/
class AddressApiProvider internal constructor(client: IHttpClient, key: String) : BasicProvider(client, "address", key) {
/**
* @see io.api.bloxy.core.IAddressApi.details
*/
@NotNull
fun details(
addresses: List<String>
): List<AddrDetails> {
return validOnly(get("address_diagnostics?${asAddressRequired(addresses)}"))
}
/**
* @see io.api.bloxy.core.IAddressApi.statistics
*/
@NotNull
fun statistics(
addresses: List<String>
): List<AddrStatistic> {
return validOnly(get("address_stat?${asAddressRequired(addresses)}"))
}
/**
* @see io.api.bloxy.core.IAddressApi.correlated
*/
@NotNull
fun correlated(
address: String
): List<AddrCorrelation> {
return get("correlated_address_tokens?address=${checkAddrRequired(address)}")
}
/**
* @see io.api.bloxy.core.IAddressApi.balance
*/
@NotNull
fun balance(
address: String
): Balance {
return Balance(get("balance?address=${checkAddrRequired(address)}"))
}
/**
* @see io.api.bloxy.core.IAddressApi.annotationStatistic
*/
@NotNull
@JvmOverloads
fun annotationStatistic(
limit: Int = 1000,
offset: Int = 0
): Map<String, Int> {
val wordsList: List<WordCounter> = getOffset("annotation_words?", limit, offset)
return wordsList.map { it.word to it.count }.toMap()
}
/**
* @see io.api.bloxy.core.IAddressApi.annotations
*/
@NotNull
@JvmOverloads
fun annotations(
words: List<String>,
limit: Int = 1000,
offset: Int = 0
): Map<String, List<String>> {
val params = "annotated_addresses?${asParam(checkNonBlank(words), "word[]=", "&word[]=")}"
val wordsList: List<WordCounter> = getOffset(params, limit, offset)
return wordsList.groupBy({ it.word }, { it.address })
}
/**
* @see io.api.bloxy.core.IAddressApi.all
*/
@NotNull
@JvmOverloads
fun all(
limit: Long = 1000,
offset: Long = 0
) : List<AddrInfo> {
return getOffset("list_all?", limit, offset, 100000, 100000000000)
}
/**
* @see io.api.bloxy.core.IAddressApi.daily
*/
@NotNull
@JvmOverloads
fun daily(
address: String,
currency: Currency = Currency.USD,
worthless: Boolean = false,
since: LocalDate = MIN_DATE,
till: LocalDate = MAX_DATE
) : List<AddrDaily> {
val dateParams = "${asDate("from_date", since)}${asDate("till_date", till)}"
val additionalParam = "&valueless=$worthless&price_currency=${currency.name}"
val params = "daily_value?${asAddressRequired(address)}$dateParams$additionalParam"
return get(params)
}
}