From 39e4623d63b58bc9f048cc6a2592e657cf1706b8 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 3 Aug 2026 18:16:26 +0000
Subject: [PATCH 01/14] chore(internal): codegen related update
---
scripts/upload-artifacts | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/upload-artifacts b/scripts/upload-artifacts
index 10f3c7055..5c1fbefc4 100755
--- a/scripts/upload-artifacts
+++ b/scripts/upload-artifacts
@@ -91,6 +91,7 @@ generate_instructions() {
Maven Repo
+
Stainless SDK Maven Repository
From 9507834f2c34614684d100e960b40a1dca2ce9c5 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 3 Aug 2026 21:54:11 +0000
Subject: [PATCH 02/14] feat(api): add limitCashAmount/limitCashCount fields to
VelocityLimitParams
---
.stats.yml | 4 +-
.../lithic/api/models/VelocityLimitParams.kt | 148 +++++++++++++++++-
.../api/models/VelocityLimitParamsTest.kt | 6 +
3 files changed, 153 insertions(+), 5 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index a57158191..51c96b22b 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-59c09c7355b21b663e001d2ee1086ebd0a70d9b5433823282bca296eedff9eb0.yml
-openapi_spec_hash: d9c3b932c810809abc6e973d662ad376
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-1d6c7b672aa49dfe0fe5175965307f63a0ed42c13697b2f9f3b9275f32331937.yml
+openapi_spec_hash: 06e73960c7506484c589d718fa1ddad8
config_hash: 337a99d8cc30006358b7bc2531401669
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/VelocityLimitParams.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/VelocityLimitParams.kt
index 58113d288..b5c0d3e10 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/VelocityLimitParams.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/VelocityLimitParams.kt
@@ -25,6 +25,8 @@ private constructor(
private val scope: JsonField,
private val filters: JsonField,
private val limitAmount: JsonField,
+ private val limitCashAmount: JsonField,
+ private val limitCashCount: JsonField,
private val limitCount: JsonField,
private val additionalProperties: MutableMap,
) {
@@ -41,8 +43,23 @@ private constructor(
@JsonProperty("limit_amount")
@ExcludeMissing
limitAmount: JsonField = JsonMissing.of(),
+ @JsonProperty("limit_cash_amount")
+ @ExcludeMissing
+ limitCashAmount: JsonField = JsonMissing.of(),
+ @JsonProperty("limit_cash_count")
+ @ExcludeMissing
+ limitCashCount: JsonField = JsonMissing.of(),
@JsonProperty("limit_count") @ExcludeMissing limitCount: JsonField = JsonMissing.of(),
- ) : this(period, scope, filters, limitAmount, limitCount, mutableMapOf())
+ ) : this(
+ period,
+ scope,
+ filters,
+ limitAmount,
+ limitCashAmount,
+ limitCashCount,
+ limitCount,
+ mutableMapOf(),
+ )
/**
* Velocity over the current day since 00:00 / 12 AM in Eastern Time
@@ -75,6 +92,29 @@ private constructor(
*/
fun limitAmount(): Optional = limitAmount.getOptional("limit_amount")
+ /**
+ * The maximum amount of cash spend velocity allowed in the period in minor units (the smallest
+ * unit of a currency, e.g. cents for USD). Cash spend covers ATM withdrawals, cash
+ * disbursements, and purchases with cashback. Transactions exceeding this limit will be
+ * declined.
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun limitCashAmount(): Optional = limitCashAmount.getOptional("limit_cash_amount")
+
+ /**
+ * The number of cash spend velocity impacting transactions may not exceed this limit in the
+ * period. Transactions exceeding this limit will be declined. A cash velocity impacting
+ * transaction is an ATM withdrawal, cash disbursement, or purchase with cashback that has been
+ * authorized, and optionally settled, or a force post (a transaction that settled without prior
+ * authorization).
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun limitCashCount(): Optional = limitCashCount.getOptional("limit_cash_count")
+
/**
* The number of spend velocity impacting transactions may not exceed this limit in the period.
* Transactions exceeding this limit will be declined. A spend velocity impacting transaction is
@@ -116,6 +156,24 @@ private constructor(
*/
@JsonProperty("limit_amount") @ExcludeMissing fun _limitAmount(): JsonField = limitAmount
+ /**
+ * Returns the raw JSON value of [limitCashAmount].
+ *
+ * Unlike [limitCashAmount], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("limit_cash_amount")
+ @ExcludeMissing
+ fun _limitCashAmount(): JsonField = limitCashAmount
+
+ /**
+ * Returns the raw JSON value of [limitCashCount].
+ *
+ * Unlike [limitCashCount], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("limit_cash_count")
+ @ExcludeMissing
+ fun _limitCashCount(): JsonField = limitCashCount
+
/**
* Returns the raw JSON value of [limitCount].
*
@@ -156,6 +214,8 @@ private constructor(
private var scope: JsonField? = null
private var filters: JsonField = JsonMissing.of()
private var limitAmount: JsonField = JsonMissing.of()
+ private var limitCashAmount: JsonField = JsonMissing.of()
+ private var limitCashCount: JsonField = JsonMissing.of()
private var limitCount: JsonField = JsonMissing.of()
private var additionalProperties: MutableMap = mutableMapOf()
@@ -165,6 +225,8 @@ private constructor(
scope = velocityLimitParams.scope
filters = velocityLimitParams.filters
limitAmount = velocityLimitParams.limitAmount
+ limitCashAmount = velocityLimitParams.limitCashAmount
+ limitCashCount = velocityLimitParams.limitCashCount
limitCount = velocityLimitParams.limitCount
additionalProperties = velocityLimitParams.additionalProperties.toMutableMap()
}
@@ -262,6 +324,69 @@ private constructor(
*/
fun limitAmount(limitAmount: JsonField) = apply { this.limitAmount = limitAmount }
+ /**
+ * The maximum amount of cash spend velocity allowed in the period in minor units (the
+ * smallest unit of a currency, e.g. cents for USD). Cash spend covers ATM withdrawals, cash
+ * disbursements, and purchases with cashback. Transactions exceeding this limit will be
+ * declined.
+ */
+ fun limitCashAmount(limitCashAmount: Long?) =
+ limitCashAmount(JsonField.ofNullable(limitCashAmount))
+
+ /**
+ * Alias for [Builder.limitCashAmount].
+ *
+ * This unboxed primitive overload exists for backwards compatibility.
+ */
+ fun limitCashAmount(limitCashAmount: Long) = limitCashAmount(limitCashAmount as Long?)
+
+ /** Alias for calling [Builder.limitCashAmount] with `limitCashAmount.orElse(null)`. */
+ fun limitCashAmount(limitCashAmount: Optional) =
+ limitCashAmount(limitCashAmount.getOrNull())
+
+ /**
+ * Sets [Builder.limitCashAmount] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.limitCashAmount] with a well-typed [Long] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun limitCashAmount(limitCashAmount: JsonField) = apply {
+ this.limitCashAmount = limitCashAmount
+ }
+
+ /**
+ * The number of cash spend velocity impacting transactions may not exceed this limit in the
+ * period. Transactions exceeding this limit will be declined. A cash velocity impacting
+ * transaction is an ATM withdrawal, cash disbursement, or purchase with cashback that has
+ * been authorized, and optionally settled, or a force post (a transaction that settled
+ * without prior authorization).
+ */
+ fun limitCashCount(limitCashCount: Long?) =
+ limitCashCount(JsonField.ofNullable(limitCashCount))
+
+ /**
+ * Alias for [Builder.limitCashCount].
+ *
+ * This unboxed primitive overload exists for backwards compatibility.
+ */
+ fun limitCashCount(limitCashCount: Long) = limitCashCount(limitCashCount as Long?)
+
+ /** Alias for calling [Builder.limitCashCount] with `limitCashCount.orElse(null)`. */
+ fun limitCashCount(limitCashCount: Optional) =
+ limitCashCount(limitCashCount.getOrNull())
+
+ /**
+ * Sets [Builder.limitCashCount] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.limitCashCount] with a well-typed [Long] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun limitCashCount(limitCashCount: JsonField) = apply {
+ this.limitCashCount = limitCashCount
+ }
+
/**
* The number of spend velocity impacting transactions may not exceed this limit in the
* period. Transactions exceeding this limit will be declined. A spend velocity impacting
@@ -326,6 +451,8 @@ private constructor(
checkRequired("scope", scope),
filters,
limitAmount,
+ limitCashAmount,
+ limitCashCount,
limitCount,
additionalProperties.toMutableMap(),
)
@@ -350,6 +477,8 @@ private constructor(
scope().validate()
filters().ifPresent { it.validate() }
limitAmount()
+ limitCashAmount()
+ limitCashCount()
limitCount()
validated = true
}
@@ -373,6 +502,8 @@ private constructor(
(scope.asKnown().getOrNull()?.validity() ?: 0) +
(filters.asKnown().getOrNull()?.validity() ?: 0) +
(if (limitAmount.asKnown().isPresent) 1 else 0) +
+ (if (limitCashAmount.asKnown().isPresent) 1 else 0) +
+ (if (limitCashCount.asKnown().isPresent) 1 else 0) +
(if (limitCount.asKnown().isPresent) 1 else 0)
/** The scope the velocity is calculated for */
@@ -524,16 +655,27 @@ private constructor(
scope == other.scope &&
filters == other.filters &&
limitAmount == other.limitAmount &&
+ limitCashAmount == other.limitCashAmount &&
+ limitCashCount == other.limitCashCount &&
limitCount == other.limitCount &&
additionalProperties == other.additionalProperties
}
private val hashCode: Int by lazy {
- Objects.hash(period, scope, filters, limitAmount, limitCount, additionalProperties)
+ Objects.hash(
+ period,
+ scope,
+ filters,
+ limitAmount,
+ limitCashAmount,
+ limitCashCount,
+ limitCount,
+ additionalProperties,
+ )
}
override fun hashCode(): Int = hashCode
override fun toString() =
- "VelocityLimitParams{period=$period, scope=$scope, filters=$filters, limitAmount=$limitAmount, limitCount=$limitCount, additionalProperties=$additionalProperties}"
+ "VelocityLimitParams{period=$period, scope=$scope, filters=$filters, limitAmount=$limitAmount, limitCashAmount=$limitCashAmount, limitCashCount=$limitCashCount, limitCount=$limitCount, additionalProperties=$additionalProperties}"
}
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/VelocityLimitParamsTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/VelocityLimitParamsTest.kt
index 91d3b1462..41610a04a 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/VelocityLimitParamsTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/VelocityLimitParamsTest.kt
@@ -30,6 +30,8 @@ internal class VelocityLimitParamsTest {
.build()
)
.limitAmount(10000L)
+ .limitCashAmount(5000L)
+ .limitCashCount(0L)
.limitCount(0L)
.build()
@@ -54,6 +56,8 @@ internal class VelocityLimitParamsTest {
.build()
)
assertThat(velocityLimitParams.limitAmount()).contains(10000L)
+ assertThat(velocityLimitParams.limitCashAmount()).contains(5000L)
+ assertThat(velocityLimitParams.limitCashCount()).contains(0L)
assertThat(velocityLimitParams.limitCount()).contains(0L)
}
@@ -79,6 +83,8 @@ internal class VelocityLimitParamsTest {
.build()
)
.limitAmount(10000L)
+ .limitCashAmount(5000L)
+ .limitCashCount(0L)
.limitCount(0L)
.build()
From 3ac18071466c0d8e43570f4cdf878ec1a506a40c Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 4 Aug 2026 14:24:28 +0000
Subject: [PATCH 03/14] feat(api): add blockchain_addresses field to
FinancialAccount and webhook events
---
.stats.yml | 4 +-
.../com/lithic/api/models/FinancialAccount.kt | 173 +++++++++++++++++-
.../FinancialAccountCreatedWebhookEvent.kt | 62 ++++++-
.../FinancialAccountUpdatedWebhookEvent.kt | 62 ++++++-
...FinancialAccountCreatedWebhookEventTest.kt | 26 +++
.../FinancialAccountListPageResponseTest.kt | 25 +++
.../lithic/api/models/FinancialAccountTest.kt | 26 +++
...FinancialAccountUpdatedWebhookEventTest.kt | 26 +++
.../api/models/ParsedWebhookEventTest.kt | 32 ++++
9 files changed, 431 insertions(+), 5 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 51c96b22b..12c884dec 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-1d6c7b672aa49dfe0fe5175965307f63a0ed42c13697b2f9f3b9275f32331937.yml
-openapi_spec_hash: 06e73960c7506484c589d718fa1ddad8
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-81febc26f7987ef8f74f2038dddd4799a1e77b2c64d2fe36c2c9f2eb5079476b.yml
+openapi_spec_hash: 91e4b19977ca68b988862e967be57d26
config_hash: 337a99d8cc30006358b7bc2531401669
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccount.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccount.kt
index 74626780e..91d86a59a 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccount.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccount.kt
@@ -12,6 +12,7 @@ import com.lithic.api.core.JsonField
import com.lithic.api.core.JsonMissing
import com.lithic.api.core.JsonValue
import com.lithic.api.core.checkRequired
+import com.lithic.api.core.toImmutable
import com.lithic.api.errors.LithicInvalidDataException
import java.time.OffsetDateTime
import java.util.Collections
@@ -34,6 +35,7 @@ private constructor(
private val updated: JsonField,
private val userDefinedStatus: JsonField,
private val accountNumber: JsonField,
+ private val blockchainAddresses: JsonField,
private val routingNumber: JsonField,
private val additionalProperties: MutableMap,
) {
@@ -70,6 +72,9 @@ private constructor(
@JsonProperty("account_number")
@ExcludeMissing
accountNumber: JsonField = JsonMissing.of(),
+ @JsonProperty("blockchain_addresses")
+ @ExcludeMissing
+ blockchainAddresses: JsonField = JsonMissing.of(),
@JsonProperty("routing_number")
@ExcludeMissing
routingNumber: JsonField = JsonMissing.of(),
@@ -86,6 +91,7 @@ private constructor(
updated,
userDefinedStatus,
accountNumber,
+ blockchainAddresses,
routingNumber,
mutableMapOf(),
)
@@ -173,6 +179,16 @@ private constructor(
*/
fun accountNumber(): Optional = accountNumber.getOptional("account_number")
+ /**
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the blockchain
+ * network that each address belongs to
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun blockchainAddresses(): Optional =
+ blockchainAddresses.getOptional("blockchain_addresses")
+
/**
* @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
@@ -279,6 +295,16 @@ private constructor(
@ExcludeMissing
fun _accountNumber(): JsonField = accountNumber
+ /**
+ * Returns the raw JSON value of [blockchainAddresses].
+ *
+ * Unlike [blockchainAddresses], this method doesn't throw if the JSON field has an unexpected
+ * type.
+ */
+ @JsonProperty("blockchain_addresses")
+ @ExcludeMissing
+ fun _blockchainAddresses(): JsonField = blockchainAddresses
+
/**
* Returns the raw JSON value of [routingNumber].
*
@@ -338,6 +364,7 @@ private constructor(
private var updated: JsonField? = null
private var userDefinedStatus: JsonField? = null
private var accountNumber: JsonField = JsonMissing.of()
+ private var blockchainAddresses: JsonField = JsonMissing.of()
private var routingNumber: JsonField = JsonMissing.of()
private var additionalProperties: MutableMap = mutableMapOf()
@@ -355,6 +382,7 @@ private constructor(
updated = financialAccount.updated
userDefinedStatus = financialAccount.userDefinedStatus
accountNumber = financialAccount.accountNumber
+ blockchainAddresses = financialAccount.blockchainAddresses
routingNumber = financialAccount.routingNumber
additionalProperties = financialAccount.additionalProperties.toMutableMap()
}
@@ -534,6 +562,30 @@ private constructor(
this.accountNumber = accountNumber
}
+ /**
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the
+ * blockchain network that each address belongs to
+ */
+ fun blockchainAddresses(blockchainAddresses: BlockchainAddresses?) =
+ blockchainAddresses(JsonField.ofNullable(blockchainAddresses))
+
+ /**
+ * Alias for calling [Builder.blockchainAddresses] with `blockchainAddresses.orElse(null)`.
+ */
+ fun blockchainAddresses(blockchainAddresses: Optional) =
+ blockchainAddresses(blockchainAddresses.getOrNull())
+
+ /**
+ * Sets [Builder.blockchainAddresses] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.blockchainAddresses] with a well-typed
+ * [BlockchainAddresses] value instead. This method is primarily for setting the field to an
+ * undocumented or not yet supported value.
+ */
+ fun blockchainAddresses(blockchainAddresses: JsonField) = apply {
+ this.blockchainAddresses = blockchainAddresses
+ }
+
fun routingNumber(routingNumber: String?) =
routingNumber(JsonField.ofNullable(routingNumber))
@@ -607,6 +659,7 @@ private constructor(
checkRequired("updated", updated),
checkRequired("userDefinedStatus", userDefinedStatus),
accountNumber,
+ blockchainAddresses,
routingNumber,
additionalProperties.toMutableMap(),
)
@@ -639,6 +692,7 @@ private constructor(
updated()
userDefinedStatus()
accountNumber()
+ blockchainAddresses().ifPresent { it.validate() }
routingNumber()
validated = true
}
@@ -670,6 +724,7 @@ private constructor(
(if (updated.asKnown().isPresent) 1 else 0) +
(if (userDefinedStatus.asKnown().isPresent) 1 else 0) +
(if (accountNumber.asKnown().isPresent) 1 else 0) +
+ (blockchainAddresses.asKnown().getOrNull()?.validity() ?: 0) +
(if (routingNumber.asKnown().isPresent) 1 else 0)
class FinancialAccountCreditConfig
@@ -1776,6 +1831,120 @@ private constructor(
override fun toString() = value.toString()
}
+ /**
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the blockchain
+ * network that each address belongs to
+ */
+ class BlockchainAddresses
+ @JsonCreator
+ private constructor(
+ @com.fasterxml.jackson.annotation.JsonValue
+ private val additionalProperties: Map
+ ) {
+
+ @JsonAnyGetter
+ @ExcludeMissing
+ fun _additionalProperties(): Map = additionalProperties
+
+ fun toBuilder() = Builder().from(this)
+
+ companion object {
+
+ /** Returns a mutable builder for constructing an instance of [BlockchainAddresses]. */
+ @JvmStatic fun builder() = Builder()
+ }
+
+ /** A builder for [BlockchainAddresses]. */
+ class Builder internal constructor() {
+
+ private var additionalProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(blockchainAddresses: BlockchainAddresses) = apply {
+ additionalProperties = blockchainAddresses.additionalProperties.toMutableMap()
+ }
+
+ fun additionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.clear()
+ putAllAdditionalProperties(additionalProperties)
+ }
+
+ fun putAdditionalProperty(key: String, value: JsonValue) = apply {
+ additionalProperties.put(key, value)
+ }
+
+ fun putAllAdditionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.putAll(additionalProperties)
+ }
+
+ fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) }
+
+ fun removeAllAdditionalProperties(keys: Set) = apply {
+ keys.forEach(::removeAdditionalProperty)
+ }
+
+ /**
+ * Returns an immutable instance of [BlockchainAddresses].
+ *
+ * Further updates to this [Builder] will not mutate the returned instance.
+ */
+ fun build(): BlockchainAddresses =
+ BlockchainAddresses(additionalProperties.toImmutable())
+ }
+
+ private var validated: Boolean = false
+
+ /**
+ * Validates that the types of all values in this object match their expected types
+ * recursively.
+ *
+ * This method is _not_ forwards compatible with new types from the API for existing fields.
+ *
+ * @throws LithicInvalidDataException if any value type in this object doesn't match its
+ * expected type.
+ */
+ fun validate(): BlockchainAddresses = apply {
+ if (validated) {
+ return@apply
+ }
+
+ validated = true
+ }
+
+ fun isValid(): Boolean =
+ try {
+ validate()
+ true
+ } catch (e: LithicInvalidDataException) {
+ false
+ }
+
+ /**
+ * Returns a score indicating how many valid values are contained in this object
+ * recursively.
+ *
+ * Used for best match union deserialization.
+ */
+ @JvmSynthetic
+ internal fun validity(): Int =
+ additionalProperties.count { (_, value) -> !value.isNull() && !value.isMissing() }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is BlockchainAddresses &&
+ additionalProperties == other.additionalProperties
+ }
+
+ private val hashCode: Int by lazy { Objects.hash(additionalProperties) }
+
+ override fun hashCode(): Int = hashCode
+
+ override fun toString() = "BlockchainAddresses{additionalProperties=$additionalProperties}"
+ }
+
override fun equals(other: Any?): Boolean {
if (this === other) {
return true
@@ -1794,6 +1963,7 @@ private constructor(
updated == other.updated &&
userDefinedStatus == other.userDefinedStatus &&
accountNumber == other.accountNumber &&
+ blockchainAddresses == other.blockchainAddresses &&
routingNumber == other.routingNumber &&
additionalProperties == other.additionalProperties
}
@@ -1812,6 +1982,7 @@ private constructor(
updated,
userDefinedStatus,
accountNumber,
+ blockchainAddresses,
routingNumber,
additionalProperties,
)
@@ -1820,5 +1991,5 @@ private constructor(
override fun hashCode(): Int = hashCode
override fun toString() =
- "FinancialAccount{token=$token, accountToken=$accountToken, created=$created, creditConfiguration=$creditConfiguration, isForBenefitOf=$isForBenefitOf, nickname=$nickname, status=$status, substatus=$substatus, type=$type, updated=$updated, userDefinedStatus=$userDefinedStatus, accountNumber=$accountNumber, routingNumber=$routingNumber, additionalProperties=$additionalProperties}"
+ "FinancialAccount{token=$token, accountToken=$accountToken, created=$created, creditConfiguration=$creditConfiguration, isForBenefitOf=$isForBenefitOf, nickname=$nickname, status=$status, substatus=$substatus, type=$type, updated=$updated, userDefinedStatus=$userDefinedStatus, accountNumber=$accountNumber, blockchainAddresses=$blockchainAddresses, routingNumber=$routingNumber, additionalProperties=$additionalProperties}"
}
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEvent.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEvent.kt
index 1e252bc70..7955d55a2 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEvent.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEvent.kt
@@ -34,6 +34,7 @@ private constructor(
private val updated: JsonField,
private val userDefinedStatus: JsonField,
private val accountNumber: JsonField,
+ private val blockchainAddresses: JsonField,
private val routingNumber: JsonField,
private val eventType: JsonField,
private val additionalProperties: MutableMap,
@@ -74,6 +75,9 @@ private constructor(
@JsonProperty("account_number")
@ExcludeMissing
accountNumber: JsonField = JsonMissing.of(),
+ @JsonProperty("blockchain_addresses")
+ @ExcludeMissing
+ blockchainAddresses: JsonField = JsonMissing.of(),
@JsonProperty("routing_number")
@ExcludeMissing
routingNumber: JsonField = JsonMissing.of(),
@@ -93,6 +97,7 @@ private constructor(
updated,
userDefinedStatus,
accountNumber,
+ blockchainAddresses,
routingNumber,
eventType,
mutableMapOf(),
@@ -112,6 +117,7 @@ private constructor(
.updated(updated)
.userDefinedStatus(userDefinedStatus)
.accountNumber(accountNumber)
+ .blockchainAddresses(blockchainAddresses)
.routingNumber(routingNumber)
.build()
@@ -199,6 +205,16 @@ private constructor(
*/
fun accountNumber(): Optional = accountNumber.getOptional("account_number")
+ /**
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the blockchain
+ * network that each address belongs to
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun blockchainAddresses(): Optional =
+ blockchainAddresses.getOptional("blockchain_addresses")
+
/**
* @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
@@ -314,6 +330,17 @@ private constructor(
@ExcludeMissing
fun _accountNumber(): JsonField = accountNumber
+ /**
+ * Returns the raw JSON value of [blockchainAddresses].
+ *
+ * Unlike [blockchainAddresses], this method doesn't throw if the JSON field has an unexpected
+ * type.
+ */
+ @JsonProperty("blockchain_addresses")
+ @ExcludeMissing
+ fun _blockchainAddresses(): JsonField =
+ blockchainAddresses
+
/**
* Returns the raw JSON value of [routingNumber].
*
@@ -383,6 +410,8 @@ private constructor(
private var updated: JsonField? = null
private var userDefinedStatus: JsonField? = null
private var accountNumber: JsonField = JsonMissing.of()
+ private var blockchainAddresses: JsonField =
+ JsonMissing.of()
private var routingNumber: JsonField = JsonMissing.of()
private var eventType: JsonField? = null
private var additionalProperties: MutableMap = mutableMapOf()
@@ -403,6 +432,7 @@ private constructor(
updated = financialAccountCreatedWebhookEvent.updated
userDefinedStatus = financialAccountCreatedWebhookEvent.userDefinedStatus
accountNumber = financialAccountCreatedWebhookEvent.accountNumber
+ blockchainAddresses = financialAccountCreatedWebhookEvent.blockchainAddresses
routingNumber = financialAccountCreatedWebhookEvent.routingNumber
eventType = financialAccountCreatedWebhookEvent.eventType
additionalProperties =
@@ -588,6 +618,31 @@ private constructor(
this.accountNumber = accountNumber
}
+ /**
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the
+ * blockchain network that each address belongs to
+ */
+ fun blockchainAddresses(blockchainAddresses: FinancialAccount.BlockchainAddresses?) =
+ blockchainAddresses(JsonField.ofNullable(blockchainAddresses))
+
+ /**
+ * Alias for calling [Builder.blockchainAddresses] with `blockchainAddresses.orElse(null)`.
+ */
+ fun blockchainAddresses(
+ blockchainAddresses: Optional
+ ) = blockchainAddresses(blockchainAddresses.getOrNull())
+
+ /**
+ * Sets [Builder.blockchainAddresses] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.blockchainAddresses] with a well-typed
+ * [FinancialAccount.BlockchainAddresses] value instead. This method is primarily for
+ * setting the field to an undocumented or not yet supported value.
+ */
+ fun blockchainAddresses(
+ blockchainAddresses: JsonField
+ ) = apply { this.blockchainAddresses = blockchainAddresses }
+
fun routingNumber(routingNumber: String?) =
routingNumber(JsonField.ofNullable(routingNumber))
@@ -674,6 +729,7 @@ private constructor(
checkRequired("updated", updated),
checkRequired("userDefinedStatus", userDefinedStatus),
accountNumber,
+ blockchainAddresses,
routingNumber,
checkRequired("eventType", eventType),
additionalProperties.toMutableMap(),
@@ -707,6 +763,7 @@ private constructor(
updated()
userDefinedStatus()
accountNumber()
+ blockchainAddresses().ifPresent { it.validate() }
routingNumber()
eventType().validate()
validated = true
@@ -739,6 +796,7 @@ private constructor(
(if (updated.asKnown().isPresent) 1 else 0) +
(if (userDefinedStatus.asKnown().isPresent) 1 else 0) +
(if (accountNumber.asKnown().isPresent) 1 else 0) +
+ (blockchainAddresses.asKnown().getOrNull()?.validity() ?: 0) +
(if (routingNumber.asKnown().isPresent) 1 else 0) +
(eventType.asKnown().getOrNull()?.validity() ?: 0)
@@ -891,6 +949,7 @@ private constructor(
updated == other.updated &&
userDefinedStatus == other.userDefinedStatus &&
accountNumber == other.accountNumber &&
+ blockchainAddresses == other.blockchainAddresses &&
routingNumber == other.routingNumber &&
eventType == other.eventType &&
additionalProperties == other.additionalProperties
@@ -910,6 +969,7 @@ private constructor(
updated,
userDefinedStatus,
accountNumber,
+ blockchainAddresses,
routingNumber,
eventType,
additionalProperties,
@@ -919,5 +979,5 @@ private constructor(
override fun hashCode(): Int = hashCode
override fun toString() =
- "FinancialAccountCreatedWebhookEvent{token=$token, accountToken=$accountToken, created=$created, creditConfiguration=$creditConfiguration, isForBenefitOf=$isForBenefitOf, nickname=$nickname, status=$status, substatus=$substatus, type=$type, updated=$updated, userDefinedStatus=$userDefinedStatus, accountNumber=$accountNumber, routingNumber=$routingNumber, eventType=$eventType, additionalProperties=$additionalProperties}"
+ "FinancialAccountCreatedWebhookEvent{token=$token, accountToken=$accountToken, created=$created, creditConfiguration=$creditConfiguration, isForBenefitOf=$isForBenefitOf, nickname=$nickname, status=$status, substatus=$substatus, type=$type, updated=$updated, userDefinedStatus=$userDefinedStatus, accountNumber=$accountNumber, blockchainAddresses=$blockchainAddresses, routingNumber=$routingNumber, eventType=$eventType, additionalProperties=$additionalProperties}"
}
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEvent.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEvent.kt
index 48d29c4ca..0285afdf5 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEvent.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEvent.kt
@@ -34,6 +34,7 @@ private constructor(
private val updated: JsonField,
private val userDefinedStatus: JsonField,
private val accountNumber: JsonField,
+ private val blockchainAddresses: JsonField,
private val routingNumber: JsonField,
private val eventType: JsonField,
private val additionalProperties: MutableMap,
@@ -74,6 +75,9 @@ private constructor(
@JsonProperty("account_number")
@ExcludeMissing
accountNumber: JsonField = JsonMissing.of(),
+ @JsonProperty("blockchain_addresses")
+ @ExcludeMissing
+ blockchainAddresses: JsonField = JsonMissing.of(),
@JsonProperty("routing_number")
@ExcludeMissing
routingNumber: JsonField = JsonMissing.of(),
@@ -93,6 +97,7 @@ private constructor(
updated,
userDefinedStatus,
accountNumber,
+ blockchainAddresses,
routingNumber,
eventType,
mutableMapOf(),
@@ -112,6 +117,7 @@ private constructor(
.updated(updated)
.userDefinedStatus(userDefinedStatus)
.accountNumber(accountNumber)
+ .blockchainAddresses(blockchainAddresses)
.routingNumber(routingNumber)
.build()
@@ -199,6 +205,16 @@ private constructor(
*/
fun accountNumber(): Optional = accountNumber.getOptional("account_number")
+ /**
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the blockchain
+ * network that each address belongs to
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun blockchainAddresses(): Optional =
+ blockchainAddresses.getOptional("blockchain_addresses")
+
/**
* @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
@@ -314,6 +330,17 @@ private constructor(
@ExcludeMissing
fun _accountNumber(): JsonField = accountNumber
+ /**
+ * Returns the raw JSON value of [blockchainAddresses].
+ *
+ * Unlike [blockchainAddresses], this method doesn't throw if the JSON field has an unexpected
+ * type.
+ */
+ @JsonProperty("blockchain_addresses")
+ @ExcludeMissing
+ fun _blockchainAddresses(): JsonField =
+ blockchainAddresses
+
/**
* Returns the raw JSON value of [routingNumber].
*
@@ -383,6 +410,8 @@ private constructor(
private var updated: JsonField? = null
private var userDefinedStatus: JsonField? = null
private var accountNumber: JsonField = JsonMissing.of()
+ private var blockchainAddresses: JsonField =
+ JsonMissing.of()
private var routingNumber: JsonField = JsonMissing.of()
private var eventType: JsonField? = null
private var additionalProperties: MutableMap = mutableMapOf()
@@ -403,6 +432,7 @@ private constructor(
updated = financialAccountUpdatedWebhookEvent.updated
userDefinedStatus = financialAccountUpdatedWebhookEvent.userDefinedStatus
accountNumber = financialAccountUpdatedWebhookEvent.accountNumber
+ blockchainAddresses = financialAccountUpdatedWebhookEvent.blockchainAddresses
routingNumber = financialAccountUpdatedWebhookEvent.routingNumber
eventType = financialAccountUpdatedWebhookEvent.eventType
additionalProperties =
@@ -588,6 +618,31 @@ private constructor(
this.accountNumber = accountNumber
}
+ /**
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the
+ * blockchain network that each address belongs to
+ */
+ fun blockchainAddresses(blockchainAddresses: FinancialAccount.BlockchainAddresses?) =
+ blockchainAddresses(JsonField.ofNullable(blockchainAddresses))
+
+ /**
+ * Alias for calling [Builder.blockchainAddresses] with `blockchainAddresses.orElse(null)`.
+ */
+ fun blockchainAddresses(
+ blockchainAddresses: Optional
+ ) = blockchainAddresses(blockchainAddresses.getOrNull())
+
+ /**
+ * Sets [Builder.blockchainAddresses] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.blockchainAddresses] with a well-typed
+ * [FinancialAccount.BlockchainAddresses] value instead. This method is primarily for
+ * setting the field to an undocumented or not yet supported value.
+ */
+ fun blockchainAddresses(
+ blockchainAddresses: JsonField
+ ) = apply { this.blockchainAddresses = blockchainAddresses }
+
fun routingNumber(routingNumber: String?) =
routingNumber(JsonField.ofNullable(routingNumber))
@@ -674,6 +729,7 @@ private constructor(
checkRequired("updated", updated),
checkRequired("userDefinedStatus", userDefinedStatus),
accountNumber,
+ blockchainAddresses,
routingNumber,
checkRequired("eventType", eventType),
additionalProperties.toMutableMap(),
@@ -707,6 +763,7 @@ private constructor(
updated()
userDefinedStatus()
accountNumber()
+ blockchainAddresses().ifPresent { it.validate() }
routingNumber()
eventType().validate()
validated = true
@@ -739,6 +796,7 @@ private constructor(
(if (updated.asKnown().isPresent) 1 else 0) +
(if (userDefinedStatus.asKnown().isPresent) 1 else 0) +
(if (accountNumber.asKnown().isPresent) 1 else 0) +
+ (blockchainAddresses.asKnown().getOrNull()?.validity() ?: 0) +
(if (routingNumber.asKnown().isPresent) 1 else 0) +
(eventType.asKnown().getOrNull()?.validity() ?: 0)
@@ -891,6 +949,7 @@ private constructor(
updated == other.updated &&
userDefinedStatus == other.userDefinedStatus &&
accountNumber == other.accountNumber &&
+ blockchainAddresses == other.blockchainAddresses &&
routingNumber == other.routingNumber &&
eventType == other.eventType &&
additionalProperties == other.additionalProperties
@@ -910,6 +969,7 @@ private constructor(
updated,
userDefinedStatus,
accountNumber,
+ blockchainAddresses,
routingNumber,
eventType,
additionalProperties,
@@ -919,5 +979,5 @@ private constructor(
override fun hashCode(): Int = hashCode
override fun toString() =
- "FinancialAccountUpdatedWebhookEvent{token=$token, accountToken=$accountToken, created=$created, creditConfiguration=$creditConfiguration, isForBenefitOf=$isForBenefitOf, nickname=$nickname, status=$status, substatus=$substatus, type=$type, updated=$updated, userDefinedStatus=$userDefinedStatus, accountNumber=$accountNumber, routingNumber=$routingNumber, eventType=$eventType, additionalProperties=$additionalProperties}"
+ "FinancialAccountUpdatedWebhookEvent{token=$token, accountToken=$accountToken, created=$created, creditConfiguration=$creditConfiguration, isForBenefitOf=$isForBenefitOf, nickname=$nickname, status=$status, substatus=$substatus, type=$type, updated=$updated, userDefinedStatus=$userDefinedStatus, accountNumber=$accountNumber, blockchainAddresses=$blockchainAddresses, routingNumber=$routingNumber, eventType=$eventType, additionalProperties=$additionalProperties}"
}
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEventTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEventTest.kt
index 4b0ee89a9..be975bc13 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEventTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEventTest.kt
@@ -3,6 +3,7 @@
package com.lithic.api.models
import com.fasterxml.jackson.module.kotlin.jacksonTypeRef
+import com.lithic.api.core.JsonValue
import com.lithic.api.core.jsonMapper
import java.time.OffsetDateTime
import org.assertj.core.api.Assertions.assertThat
@@ -40,6 +41,14 @@ internal class FinancialAccountCreatedWebhookEventTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.eventType(FinancialAccountCreatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_CREATED)
.build()
@@ -79,6 +88,15 @@ internal class FinancialAccountCreatedWebhookEventTest {
assertThat(financialAccountCreatedWebhookEvent.userDefinedStatus())
.contains("user_defined_status")
assertThat(financialAccountCreatedWebhookEvent.accountNumber()).contains("account_number")
+ assertThat(financialAccountCreatedWebhookEvent.blockchainAddresses())
+ .contains(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
assertThat(financialAccountCreatedWebhookEvent.routingNumber()).contains("routing_number")
assertThat(financialAccountCreatedWebhookEvent.eventType())
.isEqualTo(FinancialAccountCreatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_CREATED)
@@ -115,6 +133,14 @@ internal class FinancialAccountCreatedWebhookEventTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.eventType(FinancialAccountCreatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_CREATED)
.build()
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountListPageResponseTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountListPageResponseTest.kt
index d145b6c5c..fe20ef1ab 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountListPageResponseTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountListPageResponseTest.kt
@@ -3,6 +3,7 @@
package com.lithic.api.models
import com.fasterxml.jackson.module.kotlin.jacksonTypeRef
+import com.lithic.api.core.JsonValue
import com.lithic.api.core.jsonMapper
import java.time.OffsetDateTime
import org.assertj.core.api.Assertions.assertThat
@@ -44,6 +45,14 @@ internal class FinancialAccountListPageResponseTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.build()
)
@@ -79,6 +88,14 @@ internal class FinancialAccountListPageResponseTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.build()
)
@@ -120,6 +137,14 @@ internal class FinancialAccountListPageResponseTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.build()
)
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountTest.kt
index 98eb1f5ac..c2b6a0fc6 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountTest.kt
@@ -3,6 +3,7 @@
package com.lithic.api.models
import com.fasterxml.jackson.module.kotlin.jacksonTypeRef
+import com.lithic.api.core.JsonValue
import com.lithic.api.core.jsonMapper
import java.time.OffsetDateTime
import org.assertj.core.api.Assertions.assertThat
@@ -40,6 +41,14 @@ internal class FinancialAccountTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.build()
@@ -74,6 +83,15 @@ internal class FinancialAccountTest {
.isEqualTo(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
assertThat(financialAccount.userDefinedStatus()).contains("user_defined_status")
assertThat(financialAccount.accountNumber()).contains("account_number")
+ assertThat(financialAccount.blockchainAddresses())
+ .contains(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
assertThat(financialAccount.routingNumber()).contains("routing_number")
}
@@ -108,6 +126,14 @@ internal class FinancialAccountTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.build()
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEventTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEventTest.kt
index 79e2cac6d..155ce8fe0 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEventTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEventTest.kt
@@ -3,6 +3,7 @@
package com.lithic.api.models
import com.fasterxml.jackson.module.kotlin.jacksonTypeRef
+import com.lithic.api.core.JsonValue
import com.lithic.api.core.jsonMapper
import java.time.OffsetDateTime
import org.assertj.core.api.Assertions.assertThat
@@ -40,6 +41,14 @@ internal class FinancialAccountUpdatedWebhookEventTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.eventType(FinancialAccountUpdatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_UPDATED)
.build()
@@ -79,6 +88,15 @@ internal class FinancialAccountUpdatedWebhookEventTest {
assertThat(financialAccountUpdatedWebhookEvent.userDefinedStatus())
.contains("user_defined_status")
assertThat(financialAccountUpdatedWebhookEvent.accountNumber()).contains("account_number")
+ assertThat(financialAccountUpdatedWebhookEvent.blockchainAddresses())
+ .contains(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
assertThat(financialAccountUpdatedWebhookEvent.routingNumber()).contains("routing_number")
assertThat(financialAccountUpdatedWebhookEvent.eventType())
.isEqualTo(FinancialAccountUpdatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_UPDATED)
@@ -115,6 +133,14 @@ internal class FinancialAccountUpdatedWebhookEventTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.eventType(FinancialAccountUpdatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_UPDATED)
.build()
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/ParsedWebhookEventTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/ParsedWebhookEventTest.kt
index de53b7467..313ef7d2a 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/ParsedWebhookEventTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/ParsedWebhookEventTest.kt
@@ -7239,6 +7239,14 @@ internal class ParsedWebhookEventTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.eventType(FinancialAccountCreatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_CREATED)
.build()
@@ -7348,6 +7356,14 @@ internal class ParsedWebhookEventTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.eventType(
FinancialAccountCreatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_CREATED
@@ -7394,6 +7410,14 @@ internal class ParsedWebhookEventTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.eventType(FinancialAccountUpdatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_UPDATED)
.build()
@@ -7503,6 +7527,14 @@ internal class ParsedWebhookEventTest {
.updated(OffsetDateTime.parse("2019-12-27T18:11:19.117Z"))
.userDefinedStatus("user_defined_status")
.accountNumber("account_number")
+ .blockchainAddresses(
+ FinancialAccount.BlockchainAddresses.builder()
+ .putAdditionalProperty(
+ "ETH",
+ JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
+ )
+ .build()
+ )
.routingNumber("routing_number")
.eventType(
FinancialAccountUpdatedWebhookEvent.EventType.FINANCIAL_ACCOUNT_UPDATED
From 28925154b2b09da8cfc8e8a01d38886698df0156 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 5 Aug 2026 18:52:07 +0000
Subject: [PATCH 04/14] docs(api): update CVV field descriptions to note AMEX
uses 4 digits
---
.stats.yml | 4 ++--
.../src/main/kotlin/com/lithic/api/models/Card.kt | 4 ++--
.../com/lithic/api/models/TokenizationSimulateParams.kt | 8 ++++----
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 12c884dec..fa0f5509e 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-81febc26f7987ef8f74f2038dddd4799a1e77b2c64d2fe36c2c9f2eb5079476b.yml
-openapi_spec_hash: 91e4b19977ca68b988862e967be57d26
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-c150a226e74fdd73925fcba89261022e91a6d4f57dbb305a54063499641427ae.yml
+openapi_spec_hash: 1df81bae378c3cbf265b0fb4cefa2969
config_hash: 337a99d8cc30006358b7bc2531401669
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/Card.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/Card.kt
index 3a5dc5710..86cb54599 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/Card.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/Card.kt
@@ -434,7 +434,7 @@ private constructor(
fun substatus(): Optional = substatus.getOptional("substatus")
/**
- * Three digit cvv printed on the back of the card.
+ * Three or four digit CVV printed on the card. Amex cards use four digit CVVs
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
@@ -1241,7 +1241,7 @@ private constructor(
this.substatus = substatus
}
- /** Three digit cvv printed on the back of the card. */
+ /** Three or four digit CVV printed on the card. Amex cards use four digit CVVs */
fun cvv(cvv: String) = cvv(JsonField.of(cvv))
/**
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/TokenizationSimulateParams.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/TokenizationSimulateParams.kt
index 5602cccc7..86b6c8987 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/TokenizationSimulateParams.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/TokenizationSimulateParams.kt
@@ -33,7 +33,7 @@ private constructor(
) : Params {
/**
- * The three digit cvv for the card.
+ * The three or four digit CVV for the card. AMEX cards use four digit CVVs.
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type or is
* unexpectedly missing or null (e.g. if the server responded with an unexpected value).
@@ -213,7 +213,7 @@ private constructor(
*/
fun body(body: Body) = apply { this.body = body.toBuilder() }
- /** The three digit cvv for the card. */
+ /** The three or four digit CVV for the card. AMEX cards use four digit CVVs. */
fun cvv(cvv: String) = apply { body.cvv(cvv) }
/**
@@ -519,7 +519,7 @@ private constructor(
)
/**
- * The three digit cvv for the card.
+ * The three or four digit CVV for the card. AMEX cards use four digit CVVs.
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type or is
* unexpectedly missing or null (e.g. if the server responded with an unexpected value).
@@ -713,7 +713,7 @@ private constructor(
additionalProperties = body.additionalProperties.toMutableMap()
}
- /** The three digit cvv for the card. */
+ /** The three or four digit CVV for the card. AMEX cards use four digit CVVs. */
fun cvv(cvv: String) = cvv(JsonField.of(cvv))
/**
From 46fa6f1495cab9c378cf03932090cb6710fff7ed Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 7 Aug 2026 23:24:25 +0000
Subject: [PATCH 05/14] feat(api): add stablecoin event types to
FinancialEvent/Payment/StatementLineItems
---
.stats.yml | 4 +-
.../com/lithic/api/models/FinancialAccount.kt | 12 ++--
.../FinancialAccountCreatedWebhookEvent.kt | 8 +--
.../FinancialAccountUpdatedWebhookEvent.kt | 8 +--
.../com/lithic/api/models/FinancialEvent.kt | 18 ++++++
.../kotlin/com/lithic/api/models/Payment.kt | 63 ++++++++++++++++---
.../lithic/api/models/StatementLineItems.kt | 18 ++++++
...FinancialAccountCreatedWebhookEventTest.kt | 6 +-
.../FinancialAccountListPageResponseTest.kt | 6 +-
.../lithic/api/models/FinancialAccountTest.kt | 6 +-
...FinancialAccountUpdatedWebhookEventTest.kt | 6 +-
.../api/models/ParsedWebhookEventTest.kt | 8 +--
12 files changed, 123 insertions(+), 40 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index fa0f5509e..7149eb0d1 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-c150a226e74fdd73925fcba89261022e91a6d4f57dbb305a54063499641427ae.yml
-openapi_spec_hash: 1df81bae378c3cbf265b0fb4cefa2969
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-4ea61aa22fa852629c506efa84f633535d32a7133bdf3ae2d09040d2fb6caeb2.yml
+openapi_spec_hash: 76c21b84082530356fe45eed27e84cfe
config_hash: 337a99d8cc30006358b7bc2531401669
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccount.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccount.kt
index 91d86a59a..adde279ae 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccount.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccount.kt
@@ -180,8 +180,8 @@ private constructor(
fun accountNumber(): Optional = accountNumber.getOptional("account_number")
/**
- * Provisioned blockchain deposit addresses for this financial account, keyed by the blockchain
- * network that each address belongs to
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the full name
+ * of the blockchain network that each address belongs to (e.g. `ETHEREUM`)
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
@@ -563,8 +563,8 @@ private constructor(
}
/**
- * Provisioned blockchain deposit addresses for this financial account, keyed by the
- * blockchain network that each address belongs to
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the full
+ * name of the blockchain network that each address belongs to (e.g. `ETHEREUM`)
*/
fun blockchainAddresses(blockchainAddresses: BlockchainAddresses?) =
blockchainAddresses(JsonField.ofNullable(blockchainAddresses))
@@ -1832,8 +1832,8 @@ private constructor(
}
/**
- * Provisioned blockchain deposit addresses for this financial account, keyed by the blockchain
- * network that each address belongs to
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the full name
+ * of the blockchain network that each address belongs to (e.g. `ETHEREUM`)
*/
class BlockchainAddresses
@JsonCreator
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEvent.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEvent.kt
index 7955d55a2..d6d9b5a6f 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEvent.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEvent.kt
@@ -206,8 +206,8 @@ private constructor(
fun accountNumber(): Optional = accountNumber.getOptional("account_number")
/**
- * Provisioned blockchain deposit addresses for this financial account, keyed by the blockchain
- * network that each address belongs to
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the full name
+ * of the blockchain network that each address belongs to (e.g. `ETHEREUM`)
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
@@ -619,8 +619,8 @@ private constructor(
}
/**
- * Provisioned blockchain deposit addresses for this financial account, keyed by the
- * blockchain network that each address belongs to
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the full
+ * name of the blockchain network that each address belongs to (e.g. `ETHEREUM`)
*/
fun blockchainAddresses(blockchainAddresses: FinancialAccount.BlockchainAddresses?) =
blockchainAddresses(JsonField.ofNullable(blockchainAddresses))
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEvent.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEvent.kt
index 0285afdf5..7c46e82a3 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEvent.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEvent.kt
@@ -206,8 +206,8 @@ private constructor(
fun accountNumber(): Optional = accountNumber.getOptional("account_number")
/**
- * Provisioned blockchain deposit addresses for this financial account, keyed by the blockchain
- * network that each address belongs to
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the full name
+ * of the blockchain network that each address belongs to (e.g. `ETHEREUM`)
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
@@ -619,8 +619,8 @@ private constructor(
}
/**
- * Provisioned blockchain deposit addresses for this financial account, keyed by the
- * blockchain network that each address belongs to
+ * Provisioned blockchain deposit addresses for this financial account, keyed by the full
+ * name of the blockchain network that each address belongs to (e.g. `ETHEREUM`)
*/
fun blockchainAddresses(blockchainAddresses: FinancialAccount.BlockchainAddresses?) =
blockchainAddresses(JsonField.ofNullable(blockchainAddresses))
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialEvent.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialEvent.kt
index 02efa0c00..d7f28b871 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialEvent.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/FinancialEvent.kt
@@ -631,10 +631,16 @@ private constructor(
@JvmField val STABLECOIN_RECEIVED = of("STABLECOIN_RECEIVED")
+ @JvmField val STABLECOIN_INITIATED = of("STABLECOIN_INITIATED")
+
@JvmField val STABLECOIN_REVIEWED = of("STABLECOIN_REVIEWED")
+ @JvmField val STABLECOIN_SENT = of("STABLECOIN_SENT")
+
@JvmField val STABLECOIN_SETTLED = of("STABLECOIN_SETTLED")
+ @JvmField val STABLECOIN_REJECTED = of("STABLECOIN_REJECTED")
+
@JvmStatic fun of(value: String) = FinancialEventType(JsonField.of(value))
}
@@ -731,8 +737,11 @@ private constructor(
MONTHLY_REVERSAL,
ACCOUNT_TO_ACCOUNT,
STABLECOIN_RECEIVED,
+ STABLECOIN_INITIATED,
STABLECOIN_REVIEWED,
+ STABLECOIN_SENT,
STABLECOIN_SETTLED,
+ STABLECOIN_REJECTED,
}
/**
@@ -836,8 +845,11 @@ private constructor(
MONTHLY_REVERSAL,
ACCOUNT_TO_ACCOUNT,
STABLECOIN_RECEIVED,
+ STABLECOIN_INITIATED,
STABLECOIN_REVIEWED,
+ STABLECOIN_SENT,
STABLECOIN_SETTLED,
+ STABLECOIN_REJECTED,
/**
* An enum member indicating that [FinancialEventType] was instantiated with an unknown
* value.
@@ -945,8 +957,11 @@ private constructor(
MONTHLY_REVERSAL -> Value.MONTHLY_REVERSAL
ACCOUNT_TO_ACCOUNT -> Value.ACCOUNT_TO_ACCOUNT
STABLECOIN_RECEIVED -> Value.STABLECOIN_RECEIVED
+ STABLECOIN_INITIATED -> Value.STABLECOIN_INITIATED
STABLECOIN_REVIEWED -> Value.STABLECOIN_REVIEWED
+ STABLECOIN_SENT -> Value.STABLECOIN_SENT
STABLECOIN_SETTLED -> Value.STABLECOIN_SETTLED
+ STABLECOIN_REJECTED -> Value.STABLECOIN_REJECTED
else -> Value._UNKNOWN
}
@@ -1052,8 +1067,11 @@ private constructor(
MONTHLY_REVERSAL -> Known.MONTHLY_REVERSAL
ACCOUNT_TO_ACCOUNT -> Known.ACCOUNT_TO_ACCOUNT
STABLECOIN_RECEIVED -> Known.STABLECOIN_RECEIVED
+ STABLECOIN_INITIATED -> Known.STABLECOIN_INITIATED
STABLECOIN_REVIEWED -> Known.STABLECOIN_REVIEWED
+ STABLECOIN_SENT -> Known.STABLECOIN_SENT
STABLECOIN_SETTLED -> Known.STABLECOIN_SETTLED
+ STABLECOIN_REJECTED -> Known.STABLECOIN_REJECTED
else -> throw LithicInvalidDataException("Unknown FinancialEventType: $value")
}
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
index 78771264d..d1e4eda4e 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
@@ -1645,8 +1645,16 @@ private constructor(
* Stablecoin events:
* * `STABLECOIN_RECEIVED` - Stablecoin pay-in received on-chain and pending release to
* available balance.
- * * `STABLECOIN_REVIEWED` - Stablecoin pay-in has completed the review process.
- * * `STABLECOIN_SETTLED` - Stablecoin pay-in funds released to available balance.
+ * * `STABLECOIN_INITIATED` - Stablecoin withdrawal initiated, with the funds placed on
+ * hold.
+ * * `STABLECOIN_REVIEWED` - Stablecoin pay-in or withdrawal has completed the review
+ * process.
+ * * `STABLECOIN_SENT` - Stablecoin withdrawal accepted for on-chain submission to the
+ * destination address, and pending confirmation.
+ * * `STABLECOIN_SETTLED` - Stablecoin pay-in funds released to available balance, or
+ * stablecoin withdrawal confirmed on-chain.
+ * * `STABLECOIN_REJECTED` - Stablecoin withdrawal failed and the hold placed at initiation
+ * has been reversed.
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type or is
* unexpectedly missing or null (e.g. if the server responded with an unexpected value).
@@ -1664,7 +1672,9 @@ private constructor(
/**
* Payment event external ID. For ACH transactions, this is the ACH trace number. For
- * inbound wire transfers, this is the IMAD (Input Message Accountability Data).
+ * inbound wire transfers, this is the IMAD (Input Message Accountability Data). For
+ * stablecoin payments, this is the on-chain transaction hash of the transfer; it is present
+ * on events that reflect on-chain activity and null on internal lifecycle events.
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
* server responded with an unexpected value).
@@ -1885,8 +1895,16 @@ private constructor(
* Stablecoin events:
* * `STABLECOIN_RECEIVED` - Stablecoin pay-in received on-chain and pending release to
* available balance.
- * * `STABLECOIN_REVIEWED` - Stablecoin pay-in has completed the review process.
- * * `STABLECOIN_SETTLED` - Stablecoin pay-in funds released to available balance.
+ * * `STABLECOIN_INITIATED` - Stablecoin withdrawal initiated, with the funds placed on
+ * hold.
+ * * `STABLECOIN_REVIEWED` - Stablecoin pay-in or withdrawal has completed the review
+ * process.
+ * * `STABLECOIN_SENT` - Stablecoin withdrawal accepted for on-chain submission to the
+ * destination address, and pending confirmation.
+ * * `STABLECOIN_SETTLED` - Stablecoin pay-in funds released to available balance, or
+ * stablecoin withdrawal confirmed on-chain.
+ * * `STABLECOIN_REJECTED` - Stablecoin withdrawal failed and the hold placed at
+ * initiation has been reversed.
*/
fun type(type: PaymentEventType) = type(JsonField.of(type))
@@ -1928,7 +1946,10 @@ private constructor(
/**
* Payment event external ID. For ACH transactions, this is the ACH trace number. For
- * inbound wire transfers, this is the IMAD (Input Message Accountability Data).
+ * inbound wire transfers, this is the IMAD (Input Message Accountability Data). For
+ * stablecoin payments, this is the on-chain transaction hash of the transfer; it is
+ * present on events that reflect on-chain activity and null on internal lifecycle
+ * events.
*/
fun externalId(externalId: String?) = externalId(JsonField.ofNullable(externalId))
@@ -2237,8 +2258,16 @@ private constructor(
* Stablecoin events:
* * `STABLECOIN_RECEIVED` - Stablecoin pay-in received on-chain and pending release to
* available balance.
- * * `STABLECOIN_REVIEWED` - Stablecoin pay-in has completed the review process.
- * * `STABLECOIN_SETTLED` - Stablecoin pay-in funds released to available balance.
+ * * `STABLECOIN_INITIATED` - Stablecoin withdrawal initiated, with the funds placed on
+ * hold.
+ * * `STABLECOIN_REVIEWED` - Stablecoin pay-in or withdrawal has completed the review
+ * process.
+ * * `STABLECOIN_SENT` - Stablecoin withdrawal accepted for on-chain submission to the
+ * destination address, and pending confirmation.
+ * * `STABLECOIN_SETTLED` - Stablecoin pay-in funds released to available balance, or
+ * stablecoin withdrawal confirmed on-chain.
+ * * `STABLECOIN_REJECTED` - Stablecoin withdrawal failed and the hold placed at initiation
+ * has been reversed.
*/
class PaymentEventType
@JsonCreator
@@ -2302,10 +2331,16 @@ private constructor(
@JvmField val STABLECOIN_RECEIVED = of("STABLECOIN_RECEIVED")
+ @JvmField val STABLECOIN_INITIATED = of("STABLECOIN_INITIATED")
+
@JvmField val STABLECOIN_REVIEWED = of("STABLECOIN_REVIEWED")
+ @JvmField val STABLECOIN_SENT = of("STABLECOIN_SENT")
+
@JvmField val STABLECOIN_SETTLED = of("STABLECOIN_SETTLED")
+ @JvmField val STABLECOIN_REJECTED = of("STABLECOIN_REJECTED")
+
@JvmStatic fun of(value: String) = PaymentEventType(JsonField.of(value))
}
@@ -2334,8 +2369,11 @@ private constructor(
WIRE_RETURN_OUTBOUND_SETTLED,
WIRE_RETURN_OUTBOUND_REJECTED,
STABLECOIN_RECEIVED,
+ STABLECOIN_INITIATED,
STABLECOIN_REVIEWED,
+ STABLECOIN_SENT,
STABLECOIN_SETTLED,
+ STABLECOIN_REJECTED,
}
/**
@@ -2372,8 +2410,11 @@ private constructor(
WIRE_RETURN_OUTBOUND_SETTLED,
WIRE_RETURN_OUTBOUND_REJECTED,
STABLECOIN_RECEIVED,
+ STABLECOIN_INITIATED,
STABLECOIN_REVIEWED,
+ STABLECOIN_SENT,
STABLECOIN_SETTLED,
+ STABLECOIN_REJECTED,
/**
* An enum member indicating that [PaymentEventType] was instantiated with an
* unknown value.
@@ -2413,8 +2454,11 @@ private constructor(
WIRE_RETURN_OUTBOUND_SETTLED -> Value.WIRE_RETURN_OUTBOUND_SETTLED
WIRE_RETURN_OUTBOUND_REJECTED -> Value.WIRE_RETURN_OUTBOUND_REJECTED
STABLECOIN_RECEIVED -> Value.STABLECOIN_RECEIVED
+ STABLECOIN_INITIATED -> Value.STABLECOIN_INITIATED
STABLECOIN_REVIEWED -> Value.STABLECOIN_REVIEWED
+ STABLECOIN_SENT -> Value.STABLECOIN_SENT
STABLECOIN_SETTLED -> Value.STABLECOIN_SETTLED
+ STABLECOIN_REJECTED -> Value.STABLECOIN_REJECTED
else -> Value._UNKNOWN
}
@@ -2452,8 +2496,11 @@ private constructor(
WIRE_RETURN_OUTBOUND_SETTLED -> Known.WIRE_RETURN_OUTBOUND_SETTLED
WIRE_RETURN_OUTBOUND_REJECTED -> Known.WIRE_RETURN_OUTBOUND_REJECTED
STABLECOIN_RECEIVED -> Known.STABLECOIN_RECEIVED
+ STABLECOIN_INITIATED -> Known.STABLECOIN_INITIATED
STABLECOIN_REVIEWED -> Known.STABLECOIN_REVIEWED
+ STABLECOIN_SENT -> Known.STABLECOIN_SENT
STABLECOIN_SETTLED -> Known.STABLECOIN_SETTLED
+ STABLECOIN_REJECTED -> Known.STABLECOIN_REJECTED
else -> throw LithicInvalidDataException("Unknown PaymentEventType: $value")
}
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/StatementLineItems.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/StatementLineItems.kt
index 4bce77220..7fc41b0d8 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/StatementLineItems.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/StatementLineItems.kt
@@ -1409,10 +1409,16 @@ private constructor(
@JvmField val STABLECOIN_RECEIVED = of("STABLECOIN_RECEIVED")
+ @JvmField val STABLECOIN_INITIATED = of("STABLECOIN_INITIATED")
+
@JvmField val STABLECOIN_REVIEWED = of("STABLECOIN_REVIEWED")
+ @JvmField val STABLECOIN_SENT = of("STABLECOIN_SENT")
+
@JvmField val STABLECOIN_SETTLED = of("STABLECOIN_SETTLED")
+ @JvmField val STABLECOIN_REJECTED = of("STABLECOIN_REJECTED")
+
@JvmStatic fun of(value: String) = FinancialEventType(JsonField.of(value))
}
@@ -1509,8 +1515,11 @@ private constructor(
MONTHLY_REVERSAL,
ACCOUNT_TO_ACCOUNT,
STABLECOIN_RECEIVED,
+ STABLECOIN_INITIATED,
STABLECOIN_REVIEWED,
+ STABLECOIN_SENT,
STABLECOIN_SETTLED,
+ STABLECOIN_REJECTED,
}
/**
@@ -1616,8 +1625,11 @@ private constructor(
MONTHLY_REVERSAL,
ACCOUNT_TO_ACCOUNT,
STABLECOIN_RECEIVED,
+ STABLECOIN_INITIATED,
STABLECOIN_REVIEWED,
+ STABLECOIN_SENT,
STABLECOIN_SETTLED,
+ STABLECOIN_REJECTED,
/**
* An enum member indicating that [FinancialEventType] was instantiated with an
* unknown value.
@@ -1725,8 +1737,11 @@ private constructor(
MONTHLY_REVERSAL -> Value.MONTHLY_REVERSAL
ACCOUNT_TO_ACCOUNT -> Value.ACCOUNT_TO_ACCOUNT
STABLECOIN_RECEIVED -> Value.STABLECOIN_RECEIVED
+ STABLECOIN_INITIATED -> Value.STABLECOIN_INITIATED
STABLECOIN_REVIEWED -> Value.STABLECOIN_REVIEWED
+ STABLECOIN_SENT -> Value.STABLECOIN_SENT
STABLECOIN_SETTLED -> Value.STABLECOIN_SETTLED
+ STABLECOIN_REJECTED -> Value.STABLECOIN_REJECTED
else -> Value._UNKNOWN
}
@@ -1832,8 +1847,11 @@ private constructor(
MONTHLY_REVERSAL -> Known.MONTHLY_REVERSAL
ACCOUNT_TO_ACCOUNT -> Known.ACCOUNT_TO_ACCOUNT
STABLECOIN_RECEIVED -> Known.STABLECOIN_RECEIVED
+ STABLECOIN_INITIATED -> Known.STABLECOIN_INITIATED
STABLECOIN_REVIEWED -> Known.STABLECOIN_REVIEWED
+ STABLECOIN_SENT -> Known.STABLECOIN_SENT
STABLECOIN_SETTLED -> Known.STABLECOIN_SETTLED
+ STABLECOIN_REJECTED -> Known.STABLECOIN_REJECTED
else -> throw LithicInvalidDataException("Unknown FinancialEventType: $value")
}
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEventTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEventTest.kt
index be975bc13..1a5983280 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEventTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountCreatedWebhookEventTest.kt
@@ -44,7 +44,7 @@ internal class FinancialAccountCreatedWebhookEventTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -92,7 +92,7 @@ internal class FinancialAccountCreatedWebhookEventTest {
.contains(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -136,7 +136,7 @@ internal class FinancialAccountCreatedWebhookEventTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountListPageResponseTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountListPageResponseTest.kt
index fe20ef1ab..4fcad53e2 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountListPageResponseTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountListPageResponseTest.kt
@@ -48,7 +48,7 @@ internal class FinancialAccountListPageResponseTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -91,7 +91,7 @@ internal class FinancialAccountListPageResponseTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -140,7 +140,7 @@ internal class FinancialAccountListPageResponseTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountTest.kt
index c2b6a0fc6..08f37d8d0 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountTest.kt
@@ -44,7 +44,7 @@ internal class FinancialAccountTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -87,7 +87,7 @@ internal class FinancialAccountTest {
.contains(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -129,7 +129,7 @@ internal class FinancialAccountTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEventTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEventTest.kt
index 155ce8fe0..b15b6d8dd 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEventTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/FinancialAccountUpdatedWebhookEventTest.kt
@@ -44,7 +44,7 @@ internal class FinancialAccountUpdatedWebhookEventTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -92,7 +92,7 @@ internal class FinancialAccountUpdatedWebhookEventTest {
.contains(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -136,7 +136,7 @@ internal class FinancialAccountUpdatedWebhookEventTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/ParsedWebhookEventTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/ParsedWebhookEventTest.kt
index 313ef7d2a..cc450b476 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/ParsedWebhookEventTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/ParsedWebhookEventTest.kt
@@ -7242,7 +7242,7 @@ internal class ParsedWebhookEventTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -7359,7 +7359,7 @@ internal class ParsedWebhookEventTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -7413,7 +7413,7 @@ internal class ParsedWebhookEventTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
@@ -7530,7 +7530,7 @@ internal class ParsedWebhookEventTest {
.blockchainAddresses(
FinancialAccount.BlockchainAddresses.builder()
.putAdditionalProperty(
- "ETH",
+ "ETHEREUM",
JsonValue.from("0x5f2b9e8a1c4d7f0e3a6b9c2d5e8f1a4b7c0d3e6f"),
)
.build()
From cd6e1c3244d56d6c37ea9806d4de572a19ca5244 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 10 Aug 2026 08:30:42 +0000
Subject: [PATCH 06/14] feat(api): add PROGRAM scope to
AchPayment/CardTransaction, entity types to Case
---
.stats.yml | 4 +-
.../api/models/AchPaymentUpdateAction.kt | 8 +++-
.../api/models/CardTransactionUpdateAction.kt | 6 +++
.../com/lithic/api/models/CaseEntity.kt | 40 ++++++++++++++++---
.../TransactionMonitoringCaseListParams.kt | 12 +++++-
.../api/models/V2ListResultsResponse.kt | 14 ++++++-
.../com/lithic/api/models/CaseEntityTest.kt | 2 +-
7 files changed, 73 insertions(+), 13 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 7149eb0d1..a5ccef8d0 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-4ea61aa22fa852629c506efa84f633535d32a7133bdf3ae2d09040d2fb6caeb2.yml
-openapi_spec_hash: 76c21b84082530356fe45eed27e84cfe
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-c0289201680f9b61dd0d9887f88dfb7d0f6bc99d2d04fb93a2350d3ce96a3591.yml
+openapi_spec_hash: dd5295389b7ef07182cc6ad20310a05b
config_hash: 337a99d8cc30006358b7bc2531401669
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/AchPaymentUpdateAction.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/AchPaymentUpdateAction.kt
index c4a6a5e6c..70e3bc0f3 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/AchPaymentUpdateAction.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/AchPaymentUpdateAction.kt
@@ -862,12 +862,15 @@ private constructor(
@JvmField val FINANCIAL_ACCOUNT = of("FINANCIAL_ACCOUNT")
+ @JvmField val PROGRAM = of("PROGRAM")
+
@JvmStatic fun of(value: String) = Scope(JsonField.of(value))
}
/** An enum containing [Scope]'s known values. */
enum class Known {
- FINANCIAL_ACCOUNT
+ FINANCIAL_ACCOUNT,
+ PROGRAM,
}
/**
@@ -881,6 +884,7 @@ private constructor(
*/
enum class Value {
FINANCIAL_ACCOUNT,
+ PROGRAM,
/**
* An enum member indicating that [Scope] was instantiated with an unknown value.
*/
@@ -897,6 +901,7 @@ private constructor(
fun value(): Value =
when (this) {
FINANCIAL_ACCOUNT -> Value.FINANCIAL_ACCOUNT
+ PROGRAM -> Value.PROGRAM
else -> Value._UNKNOWN
}
@@ -912,6 +917,7 @@ private constructor(
fun known(): Known =
when (this) {
FINANCIAL_ACCOUNT -> Known.FINANCIAL_ACCOUNT
+ PROGRAM -> Known.PROGRAM
else -> throw LithicInvalidDataException("Unknown Scope: $value")
}
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/CardTransactionUpdateAction.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/CardTransactionUpdateAction.kt
index 52b12b4bc..e165eba49 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/CardTransactionUpdateAction.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/CardTransactionUpdateAction.kt
@@ -866,6 +866,8 @@ private constructor(
@JvmField val ACCOUNT = of("ACCOUNT")
+ @JvmField val PROGRAM = of("PROGRAM")
+
@JvmStatic fun of(value: String) = Scope(JsonField.of(value))
}
@@ -873,6 +875,7 @@ private constructor(
enum class Known {
CARD,
ACCOUNT,
+ PROGRAM,
}
/**
@@ -887,6 +890,7 @@ private constructor(
enum class Value {
CARD,
ACCOUNT,
+ PROGRAM,
/**
* An enum member indicating that [Scope] was instantiated with an unknown value.
*/
@@ -904,6 +908,7 @@ private constructor(
when (this) {
CARD -> Value.CARD
ACCOUNT -> Value.ACCOUNT
+ PROGRAM -> Value.PROGRAM
else -> Value._UNKNOWN
}
@@ -920,6 +925,7 @@ private constructor(
when (this) {
CARD -> Known.CARD
ACCOUNT -> Known.ACCOUNT
+ PROGRAM -> Known.PROGRAM
else -> throw LithicInvalidDataException("Unknown Scope: $value")
}
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/CaseEntity.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/CaseEntity.kt
index 62944dff2..b04662a78 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/CaseEntity.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/CaseEntity.kt
@@ -15,6 +15,7 @@ import com.lithic.api.core.checkRequired
import com.lithic.api.errors.LithicInvalidDataException
import java.util.Collections
import java.util.Objects
+import java.util.Optional
import kotlin.jvm.optionals.getOrNull
/** The entity a case is associated with */
@@ -37,17 +38,21 @@ private constructor(
) : this(entityToken, entityType, mutableMapOf())
/**
- * Globally unique identifier for the associated entity
+ * Globally unique identifier for the associated entity: the card token for `CARD`, the account
+ * token for `ACCOUNT`, and the financial account token for `FINANCIAL_ACCOUNT`. Null for
+ * `PROGRAM`, which is not scoped to an individual entity
*
- * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
- * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
*/
- fun entityToken(): String = entityToken.getRequired("entity_token")
+ fun entityToken(): Optional = entityToken.getOptional("entity_token")
/**
* The type of entity a case is associated with:
* - `CARD` - The case is associated with a card
* - `ACCOUNT` - The case is associated with an account
+ * - `FINANCIAL_ACCOUNT` - The case is associated with a financial account
+ * - `PROGRAM` - The case is associated with the whole program
*
* @throws LithicInvalidDataException if the JSON field has an unexpected type or is
* unexpectedly missing or null (e.g. if the server responded with an unexpected value).
@@ -112,8 +117,15 @@ private constructor(
additionalProperties = caseEntity.additionalProperties.toMutableMap()
}
- /** Globally unique identifier for the associated entity */
- fun entityToken(entityToken: String) = entityToken(JsonField.of(entityToken))
+ /**
+ * Globally unique identifier for the associated entity: the card token for `CARD`, the
+ * account token for `ACCOUNT`, and the financial account token for `FINANCIAL_ACCOUNT`.
+ * Null for `PROGRAM`, which is not scoped to an individual entity
+ */
+ fun entityToken(entityToken: String?) = entityToken(JsonField.ofNullable(entityToken))
+
+ /** Alias for calling [Builder.entityToken] with `entityToken.orElse(null)`. */
+ fun entityToken(entityToken: Optional) = entityToken(entityToken.getOrNull())
/**
* Sets [Builder.entityToken] to an arbitrary JSON value.
@@ -128,6 +140,8 @@ private constructor(
* The type of entity a case is associated with:
* - `CARD` - The case is associated with a card
* - `ACCOUNT` - The case is associated with an account
+ * - `FINANCIAL_ACCOUNT` - The case is associated with a financial account
+ * - `PROGRAM` - The case is associated with the whole program
*/
fun entityType(entityType: EntityType2) = entityType(JsonField.of(entityType))
@@ -222,6 +236,8 @@ private constructor(
* The type of entity a case is associated with:
* - `CARD` - The case is associated with a card
* - `ACCOUNT` - The case is associated with an account
+ * - `FINANCIAL_ACCOUNT` - The case is associated with a financial account
+ * - `PROGRAM` - The case is associated with the whole program
*/
class EntityType2 @JsonCreator private constructor(private val value: JsonField) :
Enum {
@@ -242,6 +258,10 @@ private constructor(
@JvmField val ACCOUNT = of("ACCOUNT")
+ @JvmField val FINANCIAL_ACCOUNT = of("FINANCIAL_ACCOUNT")
+
+ @JvmField val PROGRAM = of("PROGRAM")
+
@JvmStatic fun of(value: String) = EntityType2(JsonField.of(value))
}
@@ -249,6 +269,8 @@ private constructor(
enum class Known {
CARD,
ACCOUNT,
+ FINANCIAL_ACCOUNT,
+ PROGRAM,
}
/**
@@ -263,6 +285,8 @@ private constructor(
enum class Value {
CARD,
ACCOUNT,
+ FINANCIAL_ACCOUNT,
+ PROGRAM,
/**
* An enum member indicating that [EntityType2] was instantiated with an unknown value.
*/
@@ -280,6 +304,8 @@ private constructor(
when (this) {
CARD -> Value.CARD
ACCOUNT -> Value.ACCOUNT
+ FINANCIAL_ACCOUNT -> Value.FINANCIAL_ACCOUNT
+ PROGRAM -> Value.PROGRAM
else -> Value._UNKNOWN
}
@@ -296,6 +322,8 @@ private constructor(
when (this) {
CARD -> Known.CARD
ACCOUNT -> Known.ACCOUNT
+ FINANCIAL_ACCOUNT -> Known.FINANCIAL_ACCOUNT
+ PROGRAM -> Known.PROGRAM
else -> throw LithicInvalidDataException("Unknown EntityType2: $value")
}
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/TransactionMonitoringCaseListParams.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/TransactionMonitoringCaseListParams.kt
index 8c5b0ca7e..b8d07a346 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/TransactionMonitoringCaseListParams.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/TransactionMonitoringCaseListParams.kt
@@ -62,7 +62,11 @@ private constructor(
*/
fun endingBefore(): Optional = Optional.ofNullable(endingBefore)
- /** Only return cases associated with the provided entity. */
+ /**
+ * Only return cases associated with the provided entity. Accepts a card, account, or financial
+ * account token. Cases with a `PROGRAM` entity have no entity token and are never returned by
+ * this filter.
+ */
fun entityToken(): Optional = Optional.ofNullable(entityToken)
/** Page size (for pagination). */
@@ -199,7 +203,11 @@ private constructor(
/** Alias for calling [Builder.endingBefore] with `endingBefore.orElse(null)`. */
fun endingBefore(endingBefore: Optional) = endingBefore(endingBefore.getOrNull())
- /** Only return cases associated with the provided entity. */
+ /**
+ * Only return cases associated with the provided entity. Accepts a card, account, or
+ * financial account token. Cases with a `PROGRAM` entity have no entity token and are never
+ * returned by this filter.
+ */
fun entityToken(entityToken: String?) = apply { this.entityToken = entityToken }
/** Alias for calling [Builder.entityToken] with `entityToken.orElse(null)`. */
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/V2ListResultsResponse.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/V2ListResultsResponse.kt
index 538d9d889..e45b8e0fc 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/V2ListResultsResponse.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/V2ListResultsResponse.kt
@@ -10109,6 +10109,8 @@ private constructor(
@JvmField val ACCOUNT = of("ACCOUNT")
+ @JvmField val PROGRAM = of("PROGRAM")
+
@JvmStatic fun of(value: String) = Scope(JsonField.of(value))
}
@@ -10116,6 +10118,7 @@ private constructor(
enum class Known {
CARD,
ACCOUNT,
+ PROGRAM,
}
/**
@@ -10130,6 +10133,7 @@ private constructor(
enum class Value {
CARD,
ACCOUNT,
+ PROGRAM,
/**
* An enum member indicating that [Scope] was instantiated with an unknown
* value.
@@ -10148,6 +10152,7 @@ private constructor(
when (this) {
CARD -> Value.CARD
ACCOUNT -> Value.ACCOUNT
+ PROGRAM -> Value.PROGRAM
else -> Value._UNKNOWN
}
@@ -10164,6 +10169,7 @@ private constructor(
when (this) {
CARD -> Known.CARD
ACCOUNT -> Known.ACCOUNT
+ PROGRAM -> Known.PROGRAM
else -> throw LithicInvalidDataException("Unknown Scope: $value")
}
@@ -12181,12 +12187,15 @@ private constructor(
@JvmField val FINANCIAL_ACCOUNT = of("FINANCIAL_ACCOUNT")
+ @JvmField val PROGRAM = of("PROGRAM")
+
@JvmStatic fun of(value: String) = Scope(JsonField.of(value))
}
/** An enum containing [Scope]'s known values. */
enum class Known {
- FINANCIAL_ACCOUNT
+ FINANCIAL_ACCOUNT,
+ PROGRAM,
}
/**
@@ -12200,6 +12209,7 @@ private constructor(
*/
enum class Value {
FINANCIAL_ACCOUNT,
+ PROGRAM,
/**
* An enum member indicating that [Scope] was instantiated with an unknown
* value.
@@ -12217,6 +12227,7 @@ private constructor(
fun value(): Value =
when (this) {
FINANCIAL_ACCOUNT -> Value.FINANCIAL_ACCOUNT
+ PROGRAM -> Value.PROGRAM
else -> Value._UNKNOWN
}
@@ -12232,6 +12243,7 @@ private constructor(
fun known(): Known =
when (this) {
FINANCIAL_ACCOUNT -> Known.FINANCIAL_ACCOUNT
+ PROGRAM -> Known.PROGRAM
else -> throw LithicInvalidDataException("Unknown Scope: $value")
}
diff --git a/lithic-java-core/src/test/kotlin/com/lithic/api/models/CaseEntityTest.kt b/lithic-java-core/src/test/kotlin/com/lithic/api/models/CaseEntityTest.kt
index 23eb4902e..36cd66150 100644
--- a/lithic-java-core/src/test/kotlin/com/lithic/api/models/CaseEntityTest.kt
+++ b/lithic-java-core/src/test/kotlin/com/lithic/api/models/CaseEntityTest.kt
@@ -17,7 +17,7 @@ internal class CaseEntityTest {
.entityType(CaseEntity.EntityType2.CARD)
.build()
- assertThat(caseEntity.entityToken()).isEqualTo("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
+ assertThat(caseEntity.entityToken()).contains("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e")
assertThat(caseEntity.entityType()).isEqualTo(CaseEntity.EntityType2.CARD)
}
From 3b3dd7ae05e57fd7d4112db5dab1a752cdacbe72 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 10 Aug 2026 16:02:41 +0000
Subject: [PATCH 07/14] feat(api): Add STABLECOIN to approvals request and
transfer type enums
---
.stats.yml | 4 ++--
.../src/main/kotlin/com/lithic/api/models/Payment.kt | 6 ++++++
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index a5ccef8d0..4f5b5f067 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-c0289201680f9b61dd0d9887f88dfb7d0f6bc99d2d04fb93a2350d3ce96a3591.yml
-openapi_spec_hash: dd5295389b7ef07182cc6ad20310a05b
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-9c9038d362c6a423011de6cfe5bf4a93ca2ea6e6991327583c4dcc47ceb8d7e3.yml
+openapi_spec_hash: c2acf17ac5eb3d9e11f86c57a0af3cb3
config_hash: 337a99d8cc30006358b7bc2531401669
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
index d1e4eda4e..ece4def66 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
@@ -5465,6 +5465,8 @@ private constructor(
@JvmField val WIRE_INBOUND_DRAWDOWN_REQUEST = of("WIRE_INBOUND_DRAWDOWN_REQUEST")
+ @JvmField val STABLECOIN = of("STABLECOIN")
+
@JvmStatic fun of(value: String) = TransferType(JsonField.of(value))
}
@@ -5479,6 +5481,7 @@ private constructor(
WIRE_OUTBOUND_PAYMENT,
WIRE_OUTBOUND_ADMIN,
WIRE_INBOUND_DRAWDOWN_REQUEST,
+ STABLECOIN,
}
/**
@@ -5500,6 +5503,7 @@ private constructor(
WIRE_OUTBOUND_PAYMENT,
WIRE_OUTBOUND_ADMIN,
WIRE_INBOUND_DRAWDOWN_REQUEST,
+ STABLECOIN,
/**
* An enum member indicating that [TransferType] was instantiated with an unknown value.
*/
@@ -5524,6 +5528,7 @@ private constructor(
WIRE_OUTBOUND_PAYMENT -> Value.WIRE_OUTBOUND_PAYMENT
WIRE_OUTBOUND_ADMIN -> Value.WIRE_OUTBOUND_ADMIN
WIRE_INBOUND_DRAWDOWN_REQUEST -> Value.WIRE_INBOUND_DRAWDOWN_REQUEST
+ STABLECOIN -> Value.STABLECOIN
else -> Value._UNKNOWN
}
@@ -5547,6 +5552,7 @@ private constructor(
WIRE_OUTBOUND_PAYMENT -> Known.WIRE_OUTBOUND_PAYMENT
WIRE_OUTBOUND_ADMIN -> Known.WIRE_OUTBOUND_ADMIN
WIRE_INBOUND_DRAWDOWN_REQUEST -> Known.WIRE_INBOUND_DRAWDOWN_REQUEST
+ STABLECOIN -> Known.STABLECOIN
else -> throw LithicInvalidDataException("Unknown TransferType: $value")
}
From 2049b4f4d053f177ead72665411e442a0ecef14d Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 11 Aug 2026 20:32:08 +0000
Subject: [PATCH 08/14] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 4f5b5f067..e428cbd88 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-9c9038d362c6a423011de6cfe5bf4a93ca2ea6e6991327583c4dcc47ceb8d7e3.yml
-openapi_spec_hash: c2acf17ac5eb3d9e11f86c57a0af3cb3
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-fded34f73c5a63b9a5796a375e1dd8864051c14a1bd0123c8084554ffb2889bb.yml
+openapi_spec_hash: 4b64ebb958ea2ef8e7e20f564a5f30ed
config_hash: 337a99d8cc30006358b7bc2531401669
From 5c383bd94b665fc89aa5d1bc1dbe298329a8cc57 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 12 Aug 2026 14:09:59 +0000
Subject: [PATCH 09/14] feat(api): add STABLECOIN method to Payment and related
responses
---
.stats.yml | 4 +-
.../kotlin/com/lithic/api/models/Payment.kt | 277 +++++++++++++++++-
.../api/models/PaymentCreateResponse.kt | 7 +
.../lithic/api/models/PaymentRetryResponse.kt | 7 +
.../PaymentTransactionCreatedWebhookEvent.kt | 7 +
.../PaymentTransactionUpdatedWebhookEvent.kt | 7 +
6 files changed, 305 insertions(+), 4 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index e428cbd88..db7728c76 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-fded34f73c5a63b9a5796a375e1dd8864051c14a1bd0123c8084554ffb2889bb.yml
-openapi_spec_hash: 4b64ebb958ea2ef8e7e20f564a5f30ed
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-0a244b9dc934ff683c683f6b8fc053d923ffd40fcd32516e2fc79f36b7f61395.yml
+openapi_spec_hash: c0c04c03b24b8baecd070e9faf7dccbd
config_hash: 337a99d8cc30006358b7bc2531401669
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
index ece4def66..74f51c1cb 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/Payment.kt
@@ -760,6 +760,12 @@ private constructor(
fun methodAttributes(wire: MethodAttributes.WireMethodAttributes) =
methodAttributes(MethodAttributes.ofWire(wire))
+ /**
+ * Alias for calling [methodAttributes] with `MethodAttributes.ofStablecoin(stablecoin)`.
+ */
+ fun methodAttributes(stablecoin: MethodAttributes.StablecoinMethodAttributes) =
+ methodAttributes(MethodAttributes.ofStablecoin(stablecoin))
+
/** Pending amount in cents */
fun pendingAmount(pendingAmount: Long) = pendingAmount(JsonField.of(pendingAmount))
@@ -2926,6 +2932,8 @@ private constructor(
@JvmField val WIRE = of("WIRE")
+ @JvmField val STABLECOIN = of("STABLECOIN")
+
@JvmStatic fun of(value: String) = Method(JsonField.of(value))
}
@@ -2934,6 +2942,7 @@ private constructor(
ACH_NEXT_DAY,
ACH_SAME_DAY,
WIRE,
+ STABLECOIN,
}
/**
@@ -2949,6 +2958,7 @@ private constructor(
ACH_NEXT_DAY,
ACH_SAME_DAY,
WIRE,
+ STABLECOIN,
/** An enum member indicating that [Method] was instantiated with an unknown value. */
_UNKNOWN,
}
@@ -2965,6 +2975,7 @@ private constructor(
ACH_NEXT_DAY -> Value.ACH_NEXT_DAY
ACH_SAME_DAY -> Value.ACH_SAME_DAY
WIRE -> Value.WIRE
+ STABLECOIN -> Value.STABLECOIN
else -> Value._UNKNOWN
}
@@ -2982,6 +2993,7 @@ private constructor(
ACH_NEXT_DAY -> Known.ACH_NEXT_DAY
ACH_SAME_DAY -> Known.ACH_SAME_DAY
WIRE -> Known.WIRE
+ STABLECOIN -> Known.STABLECOIN
else -> throw LithicInvalidDataException("Unknown Method: $value")
}
@@ -3053,6 +3065,7 @@ private constructor(
private constructor(
private val ach: AchMethodAttributes? = null,
private val wire: WireMethodAttributes? = null,
+ private val stablecoin: StablecoinMethodAttributes? = null,
private val _json: JsonValue? = null,
) {
@@ -3060,14 +3073,20 @@ private constructor(
fun wire(): Optional = Optional.ofNullable(wire)
+ fun stablecoin(): Optional = Optional.ofNullable(stablecoin)
+
fun isAch(): Boolean = ach != null
fun isWire(): Boolean = wire != null
+ fun isStablecoin(): Boolean = stablecoin != null
+
fun asAch(): AchMethodAttributes = ach.getOrThrow("ach")
fun asWire(): WireMethodAttributes = wire.getOrThrow("wire")
+ fun asStablecoin(): StablecoinMethodAttributes = stablecoin.getOrThrow("stablecoin")
+
fun _json(): Optional = Optional.ofNullable(_json)
/**
@@ -3103,6 +3122,7 @@ private constructor(
when {
ach != null -> visitor.visitAch(ach)
wire != null -> visitor.visitWire(wire)
+ stablecoin != null -> visitor.visitStablecoin(stablecoin)
else -> visitor.unknown(_json)
}
@@ -3131,6 +3151,10 @@ private constructor(
override fun visitWire(wire: WireMethodAttributes) {
wire.validate()
}
+
+ override fun visitStablecoin(stablecoin: StablecoinMethodAttributes) {
+ stablecoin.validate()
+ }
}
)
validated = true
@@ -3158,6 +3182,9 @@ private constructor(
override fun visitWire(wire: WireMethodAttributes) = wire.validity()
+ override fun visitStablecoin(stablecoin: StablecoinMethodAttributes) =
+ stablecoin.validity()
+
override fun unknown(json: JsonValue?) = 0
}
)
@@ -3167,15 +3194,19 @@ private constructor(
return true
}
- return other is MethodAttributes && ach == other.ach && wire == other.wire
+ return other is MethodAttributes &&
+ ach == other.ach &&
+ wire == other.wire &&
+ stablecoin == other.stablecoin
}
- override fun hashCode(): Int = Objects.hash(ach, wire)
+ override fun hashCode(): Int = Objects.hash(ach, wire, stablecoin)
override fun toString(): String =
when {
ach != null -> "MethodAttributes{ach=$ach}"
wire != null -> "MethodAttributes{wire=$wire}"
+ stablecoin != null -> "MethodAttributes{stablecoin=$stablecoin}"
_json != null -> "MethodAttributes{_unknown=$_json}"
else -> throw IllegalStateException("Invalid MethodAttributes")
}
@@ -3185,6 +3216,10 @@ private constructor(
@JvmStatic fun ofAch(ach: AchMethodAttributes) = MethodAttributes(ach = ach)
@JvmStatic fun ofWire(wire: WireMethodAttributes) = MethodAttributes(wire = wire)
+
+ @JvmStatic
+ fun ofStablecoin(stablecoin: StablecoinMethodAttributes) =
+ MethodAttributes(stablecoin = stablecoin)
}
/**
@@ -3197,6 +3232,8 @@ private constructor(
fun visitWire(wire: WireMethodAttributes): T
+ fun visitStablecoin(stablecoin: StablecoinMethodAttributes): T
+
/**
* Maps an unknown variant of [MethodAttributes] to a value of type [T].
*
@@ -3225,6 +3262,8 @@ private constructor(
tryDeserialize(node, jacksonTypeRef())?.let {
MethodAttributes(wire = it, _json = json)
},
+ tryDeserialize(node, jacksonTypeRef())
+ ?.let { MethodAttributes(stablecoin = it, _json = json) },
)
.filterNotNull()
.allMaxBy { it.validity() }
@@ -3252,6 +3291,7 @@ private constructor(
when {
value.ach != null -> generator.writeObject(value.ach)
value.wire != null -> generator.writeObject(value.wire)
+ value.stablecoin != null -> generator.writeObject(value.stablecoin)
value._json != null -> generator.writeObject(value._json)
else -> throw IllegalStateException("Invalid MethodAttributes")
}
@@ -4637,6 +4677,239 @@ private constructor(
override fun toString() =
"WireMethodAttributes{wireMessageType=$wireMessageType, wireNetwork=$wireNetwork, creditor=$creditor, debtor=$debtor, messageId=$messageId, remittanceInformation=$remittanceInformation, additionalProperties=$additionalProperties}"
}
+
+ class StablecoinMethodAttributes
+ @JsonCreator(mode = JsonCreator.Mode.DISABLED)
+ private constructor(
+ private val chain: JsonField,
+ private val transactionHash: JsonField,
+ private val additionalProperties: MutableMap,
+ ) {
+
+ @JsonCreator
+ private constructor(
+ @JsonProperty("chain") @ExcludeMissing chain: JsonField = JsonMissing.of(),
+ @JsonProperty("transaction_hash")
+ @ExcludeMissing
+ transactionHash: JsonField = JsonMissing.of(),
+ ) : this(chain, transactionHash, mutableMapOf())
+
+ /**
+ * Blockchain the stablecoin transfer settled on
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected
+ * value).
+ */
+ fun chain(): String = chain.getRequired("chain")
+
+ /**
+ * On-chain transaction hash of the transfer. Null until the transfer has settled on
+ * chain
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if
+ * the server responded with an unexpected value).
+ */
+ fun transactionHash(): Optional =
+ transactionHash.getOptional("transaction_hash")
+
+ /**
+ * Returns the raw JSON value of [chain].
+ *
+ * Unlike [chain], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("chain") @ExcludeMissing fun _chain(): JsonField = chain
+
+ /**
+ * Returns the raw JSON value of [transactionHash].
+ *
+ * Unlike [transactionHash], this method doesn't throw if the JSON field has an
+ * unexpected type.
+ */
+ @JsonProperty("transaction_hash")
+ @ExcludeMissing
+ fun _transactionHash(): JsonField = transactionHash
+
+ @JsonAnySetter
+ private fun putAdditionalProperty(key: String, value: JsonValue) {
+ additionalProperties.put(key, value)
+ }
+
+ @JsonAnyGetter
+ @ExcludeMissing
+ fun _additionalProperties(): Map =
+ Collections.unmodifiableMap(additionalProperties)
+
+ fun toBuilder() = Builder().from(this)
+
+ companion object {
+
+ /**
+ * Returns a mutable builder for constructing an instance of
+ * [StablecoinMethodAttributes].
+ *
+ * The following fields are required:
+ * ```java
+ * .chain()
+ * ```
+ */
+ @JvmStatic fun builder() = Builder()
+ }
+
+ /** A builder for [StablecoinMethodAttributes]. */
+ class Builder internal constructor() {
+
+ private var chain: JsonField? = null
+ private var transactionHash: JsonField = JsonMissing.of()
+ private var additionalProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(stablecoinMethodAttributes: StablecoinMethodAttributes) = apply {
+ chain = stablecoinMethodAttributes.chain
+ transactionHash = stablecoinMethodAttributes.transactionHash
+ additionalProperties =
+ stablecoinMethodAttributes.additionalProperties.toMutableMap()
+ }
+
+ /** Blockchain the stablecoin transfer settled on */
+ fun chain(chain: String) = chain(JsonField.of(chain))
+
+ /**
+ * Sets [Builder.chain] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.chain] with a well-typed [String] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet
+ * supported value.
+ */
+ fun chain(chain: JsonField) = apply { this.chain = chain }
+
+ /**
+ * On-chain transaction hash of the transfer. Null until the transfer has settled on
+ * chain
+ */
+ fun transactionHash(transactionHash: String?) =
+ transactionHash(JsonField.ofNullable(transactionHash))
+
+ /**
+ * Alias for calling [Builder.transactionHash] with `transactionHash.orElse(null)`.
+ */
+ fun transactionHash(transactionHash: Optional) =
+ transactionHash(transactionHash.getOrNull())
+
+ /**
+ * Sets [Builder.transactionHash] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.transactionHash] with a well-typed [String]
+ * value instead. This method is primarily for setting the field to an undocumented
+ * or not yet supported value.
+ */
+ fun transactionHash(transactionHash: JsonField) = apply {
+ this.transactionHash = transactionHash
+ }
+
+ fun additionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.clear()
+ putAllAdditionalProperties(additionalProperties)
+ }
+
+ fun putAdditionalProperty(key: String, value: JsonValue) = apply {
+ additionalProperties.put(key, value)
+ }
+
+ fun putAllAdditionalProperties(additionalProperties: Map) =
+ apply {
+ this.additionalProperties.putAll(additionalProperties)
+ }
+
+ fun removeAdditionalProperty(key: String) = apply {
+ additionalProperties.remove(key)
+ }
+
+ fun removeAllAdditionalProperties(keys: Set) = apply {
+ keys.forEach(::removeAdditionalProperty)
+ }
+
+ /**
+ * Returns an immutable instance of [StablecoinMethodAttributes].
+ *
+ * Further updates to this [Builder] will not mutate the returned instance.
+ *
+ * The following fields are required:
+ * ```java
+ * .chain()
+ * ```
+ *
+ * @throws IllegalStateException if any required field is unset.
+ */
+ fun build(): StablecoinMethodAttributes =
+ StablecoinMethodAttributes(
+ checkRequired("chain", chain),
+ transactionHash,
+ additionalProperties.toMutableMap(),
+ )
+ }
+
+ private var validated: Boolean = false
+
+ /**
+ * Validates that the types of all values in this object match their expected types
+ * recursively.
+ *
+ * This method is _not_ forwards compatible with new types from the API for existing
+ * fields.
+ *
+ * @throws LithicInvalidDataException if any value type in this object doesn't match its
+ * expected type.
+ */
+ fun validate(): StablecoinMethodAttributes = apply {
+ if (validated) {
+ return@apply
+ }
+
+ chain()
+ transactionHash()
+ validated = true
+ }
+
+ fun isValid(): Boolean =
+ try {
+ validate()
+ true
+ } catch (e: LithicInvalidDataException) {
+ false
+ }
+
+ /**
+ * Returns a score indicating how many valid values are contained in this object
+ * recursively.
+ *
+ * Used for best match union deserialization.
+ */
+ @JvmSynthetic
+ internal fun validity(): Int =
+ (if (chain.asKnown().isPresent) 1 else 0) +
+ (if (transactionHash.asKnown().isPresent) 1 else 0)
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is StablecoinMethodAttributes &&
+ chain == other.chain &&
+ transactionHash == other.transactionHash &&
+ additionalProperties == other.additionalProperties
+ }
+
+ private val hashCode: Int by lazy {
+ Objects.hash(chain, transactionHash, additionalProperties)
+ }
+
+ override fun hashCode(): Int = hashCode
+
+ override fun toString() =
+ "StablecoinMethodAttributes{chain=$chain, transactionHash=$transactionHash, additionalProperties=$additionalProperties}"
+ }
}
/** Account tokens related to a payment transaction */
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentCreateResponse.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentCreateResponse.kt
index 5dd180722..0174a6c85 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentCreateResponse.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentCreateResponse.kt
@@ -818,6 +818,13 @@ private constructor(
fun methodAttributes(wire: Payment.MethodAttributes.WireMethodAttributes) =
methodAttributes(Payment.MethodAttributes.ofWire(wire))
+ /**
+ * Alias for calling [methodAttributes] with
+ * `Payment.MethodAttributes.ofStablecoin(stablecoin)`.
+ */
+ fun methodAttributes(stablecoin: Payment.MethodAttributes.StablecoinMethodAttributes) =
+ methodAttributes(Payment.MethodAttributes.ofStablecoin(stablecoin))
+
/** Pending amount in cents */
fun pendingAmount(pendingAmount: Long) = pendingAmount(JsonField.of(pendingAmount))
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentRetryResponse.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentRetryResponse.kt
index e417fc59f..918864bb0 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentRetryResponse.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentRetryResponse.kt
@@ -818,6 +818,13 @@ private constructor(
fun methodAttributes(wire: Payment.MethodAttributes.WireMethodAttributes) =
methodAttributes(Payment.MethodAttributes.ofWire(wire))
+ /**
+ * Alias for calling [methodAttributes] with
+ * `Payment.MethodAttributes.ofStablecoin(stablecoin)`.
+ */
+ fun methodAttributes(stablecoin: Payment.MethodAttributes.StablecoinMethodAttributes) =
+ methodAttributes(Payment.MethodAttributes.ofStablecoin(stablecoin))
+
/** Pending amount in cents */
fun pendingAmount(pendingAmount: Long) = pendingAmount(JsonField.of(pendingAmount))
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentTransactionCreatedWebhookEvent.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentTransactionCreatedWebhookEvent.kt
index 9268b7ee9..399c36f55 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentTransactionCreatedWebhookEvent.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentTransactionCreatedWebhookEvent.kt
@@ -827,6 +827,13 @@ private constructor(
fun methodAttributes(wire: Payment.MethodAttributes.WireMethodAttributes) =
methodAttributes(Payment.MethodAttributes.ofWire(wire))
+ /**
+ * Alias for calling [methodAttributes] with
+ * `Payment.MethodAttributes.ofStablecoin(stablecoin)`.
+ */
+ fun methodAttributes(stablecoin: Payment.MethodAttributes.StablecoinMethodAttributes) =
+ methodAttributes(Payment.MethodAttributes.ofStablecoin(stablecoin))
+
/** Pending amount in cents */
fun pendingAmount(pendingAmount: Long) = pendingAmount(JsonField.of(pendingAmount))
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentTransactionUpdatedWebhookEvent.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentTransactionUpdatedWebhookEvent.kt
index 1670c6fb5..b6bed6694 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentTransactionUpdatedWebhookEvent.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/PaymentTransactionUpdatedWebhookEvent.kt
@@ -827,6 +827,13 @@ private constructor(
fun methodAttributes(wire: Payment.MethodAttributes.WireMethodAttributes) =
methodAttributes(Payment.MethodAttributes.ofWire(wire))
+ /**
+ * Alias for calling [methodAttributes] with
+ * `Payment.MethodAttributes.ofStablecoin(stablecoin)`.
+ */
+ fun methodAttributes(stablecoin: Payment.MethodAttributes.StablecoinMethodAttributes) =
+ methodAttributes(Payment.MethodAttributes.ofStablecoin(stablecoin))
+
/** Pending amount in cents */
fun pendingAmount(pendingAmount: Long) = pendingAmount(JsonField.of(pendingAmount))
From 0188b4ae0bc6b0df2b453cca67ddd0a1cd37c47d Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 12 Aug 2026 20:51:13 +0000
Subject: [PATCH 10/14] feat(api): add blockchain_recipients create endpoint
---
.stats.yml | 8 +-
.../com/lithic/api/client/LithicClient.kt | 5 +
.../lithic/api/client/LithicClientAsync.kt | 5 +
.../api/client/LithicClientAsyncImpl.kt | 15 +
.../com/lithic/api/client/LithicClientImpl.kt | 15 +
.../lithic/api/models/BlockchainRecipient.kt | 990 ++++++++++++++++++
.../models/BlockchainRecipientCreateParams.kt | 869 +++++++++++++++
.../async/BlockchainRecipientServiceAsync.kt | 74 ++
.../BlockchainRecipientServiceAsyncImpl.kt | 91 ++
.../blocking/BlockchainRecipientService.kt | 74 ++
.../BlockchainRecipientServiceImpl.kt | 84 ++
.../BlockchainRecipientCreateParamsTest.kt | 66 ++
.../api/models/BlockchainRecipientTest.kt | 80 ++
.../BlockchainRecipientServiceAsyncTest.kt | 40 +
.../BlockchainRecipientServiceTest.kt | 39 +
.../api/proguard/ProGuardCompatibilityTest.kt | 1 +
16 files changed, 2452 insertions(+), 4 deletions(-)
create mode 100644 lithic-java-core/src/main/kotlin/com/lithic/api/models/BlockchainRecipient.kt
create mode 100644 lithic-java-core/src/main/kotlin/com/lithic/api/models/BlockchainRecipientCreateParams.kt
create mode 100644 lithic-java-core/src/main/kotlin/com/lithic/api/services/async/BlockchainRecipientServiceAsync.kt
create mode 100644 lithic-java-core/src/main/kotlin/com/lithic/api/services/async/BlockchainRecipientServiceAsyncImpl.kt
create mode 100644 lithic-java-core/src/main/kotlin/com/lithic/api/services/blocking/BlockchainRecipientService.kt
create mode 100644 lithic-java-core/src/main/kotlin/com/lithic/api/services/blocking/BlockchainRecipientServiceImpl.kt
create mode 100644 lithic-java-core/src/test/kotlin/com/lithic/api/models/BlockchainRecipientCreateParamsTest.kt
create mode 100644 lithic-java-core/src/test/kotlin/com/lithic/api/models/BlockchainRecipientTest.kt
create mode 100644 lithic-java-core/src/test/kotlin/com/lithic/api/services/async/BlockchainRecipientServiceAsyncTest.kt
create mode 100644 lithic-java-core/src/test/kotlin/com/lithic/api/services/blocking/BlockchainRecipientServiceTest.kt
diff --git a/.stats.yml b/.stats.yml
index db7728c76..2f38062b1 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 214
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-0a244b9dc934ff683c683f6b8fc053d923ffd40fcd32516e2fc79f36b7f61395.yml
-openapi_spec_hash: c0c04c03b24b8baecd070e9faf7dccbd
-config_hash: 337a99d8cc30006358b7bc2531401669
+configured_endpoints: 215
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-c20cf1ee200fdf3f08472f48b563bab3dcad9452cd92b88b7f7fe079c9316745.yml
+openapi_spec_hash: 51e1cb45ee5d65dd02635946d53ef94f
+config_hash: f6d04d790aaddf639fc04b7f0092e7ec
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClient.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClient.kt
index 18a13ed98..c05b467c4 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClient.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClient.kt
@@ -14,6 +14,7 @@ import com.lithic.api.services.blocking.AccountService
import com.lithic.api.services.blocking.AuthRuleService
import com.lithic.api.services.blocking.AuthStreamEnrollmentService
import com.lithic.api.services.blocking.BalanceService
+import com.lithic.api.services.blocking.BlockchainRecipientService
import com.lithic.api.services.blocking.BookTransferService
import com.lithic.api.services.blocking.CardAuthorizationService
import com.lithic.api.services.blocking.CardBulkOrderService
@@ -120,6 +121,8 @@ interface LithicClient {
fun externalBankAccounts(): ExternalBankAccountService
+ fun blockchainRecipients(): BlockchainRecipientService
+
fun payments(): PaymentService
fun threeDS(): ThreeDSService
@@ -232,6 +235,8 @@ interface LithicClient {
fun externalBankAccounts(): ExternalBankAccountService.WithRawResponse
+ fun blockchainRecipients(): BlockchainRecipientService.WithRawResponse
+
fun payments(): PaymentService.WithRawResponse
fun threeDS(): ThreeDSService.WithRawResponse
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientAsync.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientAsync.kt
index 73317d5c8..00d01ba85 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientAsync.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientAsync.kt
@@ -13,6 +13,7 @@ import com.lithic.api.services.async.AccountServiceAsync
import com.lithic.api.services.async.AuthRuleServiceAsync
import com.lithic.api.services.async.AuthStreamEnrollmentServiceAsync
import com.lithic.api.services.async.BalanceServiceAsync
+import com.lithic.api.services.async.BlockchainRecipientServiceAsync
import com.lithic.api.services.async.BookTransferServiceAsync
import com.lithic.api.services.async.CardAuthorizationServiceAsync
import com.lithic.api.services.async.CardBulkOrderServiceAsync
@@ -120,6 +121,8 @@ interface LithicClientAsync {
fun externalBankAccounts(): ExternalBankAccountServiceAsync
+ fun blockchainRecipients(): BlockchainRecipientServiceAsync
+
fun payments(): PaymentServiceAsync
fun threeDS(): ThreeDSServiceAsync
@@ -235,6 +238,8 @@ interface LithicClientAsync {
fun externalBankAccounts(): ExternalBankAccountServiceAsync.WithRawResponse
+ fun blockchainRecipients(): BlockchainRecipientServiceAsync.WithRawResponse
+
fun payments(): PaymentServiceAsync.WithRawResponse
fun threeDS(): ThreeDSServiceAsync.WithRawResponse
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientAsyncImpl.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientAsyncImpl.kt
index 52e8a4e5c..3078c82cf 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientAsyncImpl.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientAsyncImpl.kt
@@ -29,6 +29,8 @@ import com.lithic.api.services.async.AuthStreamEnrollmentServiceAsync
import com.lithic.api.services.async.AuthStreamEnrollmentServiceAsyncImpl
import com.lithic.api.services.async.BalanceServiceAsync
import com.lithic.api.services.async.BalanceServiceAsyncImpl
+import com.lithic.api.services.async.BlockchainRecipientServiceAsync
+import com.lithic.api.services.async.BlockchainRecipientServiceAsyncImpl
import com.lithic.api.services.async.BookTransferServiceAsync
import com.lithic.api.services.async.BookTransferServiceAsyncImpl
import com.lithic.api.services.async.CardAuthorizationServiceAsync
@@ -183,6 +185,10 @@ class LithicClientAsyncImpl(private val clientOptions: ClientOptions) : LithicCl
ExternalBankAccountServiceAsyncImpl(clientOptionsWithUserAgent)
}
+ private val blockchainRecipients: BlockchainRecipientServiceAsync by lazy {
+ BlockchainRecipientServiceAsyncImpl(clientOptionsWithUserAgent)
+ }
+
private val payments: PaymentServiceAsync by lazy {
PaymentServiceAsyncImpl(clientOptionsWithUserAgent)
}
@@ -295,6 +301,8 @@ class LithicClientAsyncImpl(private val clientOptions: ClientOptions) : LithicCl
override fun externalBankAccounts(): ExternalBankAccountServiceAsync = externalBankAccounts
+ override fun blockchainRecipients(): BlockchainRecipientServiceAsync = blockchainRecipients
+
override fun payments(): PaymentServiceAsync = payments
override fun threeDS(): ThreeDSServiceAsync = threeDS
@@ -422,6 +430,10 @@ class LithicClientAsyncImpl(private val clientOptions: ClientOptions) : LithicCl
ExternalBankAccountServiceAsyncImpl.WithRawResponseImpl(clientOptions)
}
+ private val blockchainRecipients: BlockchainRecipientServiceAsync.WithRawResponse by lazy {
+ BlockchainRecipientServiceAsyncImpl.WithRawResponseImpl(clientOptions)
+ }
+
private val payments: PaymentServiceAsync.WithRawResponse by lazy {
PaymentServiceAsyncImpl.WithRawResponseImpl(clientOptions)
}
@@ -542,6 +554,9 @@ class LithicClientAsyncImpl(private val clientOptions: ClientOptions) : LithicCl
override fun externalBankAccounts(): ExternalBankAccountServiceAsync.WithRawResponse =
externalBankAccounts
+ override fun blockchainRecipients(): BlockchainRecipientServiceAsync.WithRawResponse =
+ blockchainRecipients
+
override fun payments(): PaymentServiceAsync.WithRawResponse = payments
override fun threeDS(): ThreeDSServiceAsync.WithRawResponse = threeDS
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientImpl.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientImpl.kt
index bb2ee7ddd..bacca4e62 100644
--- a/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientImpl.kt
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/client/LithicClientImpl.kt
@@ -29,6 +29,8 @@ import com.lithic.api.services.blocking.AuthStreamEnrollmentService
import com.lithic.api.services.blocking.AuthStreamEnrollmentServiceImpl
import com.lithic.api.services.blocking.BalanceService
import com.lithic.api.services.blocking.BalanceServiceImpl
+import com.lithic.api.services.blocking.BlockchainRecipientService
+import com.lithic.api.services.blocking.BlockchainRecipientServiceImpl
import com.lithic.api.services.blocking.BookTransferService
import com.lithic.api.services.blocking.BookTransferServiceImpl
import com.lithic.api.services.blocking.CardAuthorizationService
@@ -174,6 +176,10 @@ class LithicClientImpl(private val clientOptions: ClientOptions) : LithicClient
ExternalBankAccountServiceImpl(clientOptionsWithUserAgent)
}
+ private val blockchainRecipients: BlockchainRecipientService by lazy {
+ BlockchainRecipientServiceImpl(clientOptionsWithUserAgent)
+ }
+
private val payments: PaymentService by lazy { PaymentServiceImpl(clientOptionsWithUserAgent) }
private val threeDS: ThreeDSService by lazy { ThreeDSServiceImpl(clientOptionsWithUserAgent) }
@@ -275,6 +281,8 @@ class LithicClientImpl(private val clientOptions: ClientOptions) : LithicClient
override fun externalBankAccounts(): ExternalBankAccountService = externalBankAccounts
+ override fun blockchainRecipients(): BlockchainRecipientService = blockchainRecipients
+
override fun payments(): PaymentService = payments
override fun threeDS(): ThreeDSService = threeDS
@@ -401,6 +409,10 @@ class LithicClientImpl(private val clientOptions: ClientOptions) : LithicClient
ExternalBankAccountServiceImpl.WithRawResponseImpl(clientOptions)
}
+ private val blockchainRecipients: BlockchainRecipientService.WithRawResponse by lazy {
+ BlockchainRecipientServiceImpl.WithRawResponseImpl(clientOptions)
+ }
+
private val payments: PaymentService.WithRawResponse by lazy {
PaymentServiceImpl.WithRawResponseImpl(clientOptions)
}
@@ -521,6 +533,9 @@ class LithicClientImpl(private val clientOptions: ClientOptions) : LithicClient
override fun externalBankAccounts(): ExternalBankAccountService.WithRawResponse =
externalBankAccounts
+ override fun blockchainRecipients(): BlockchainRecipientService.WithRawResponse =
+ blockchainRecipients
+
override fun payments(): PaymentService.WithRawResponse = payments
override fun threeDS(): ThreeDSService.WithRawResponse = threeDS
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/BlockchainRecipient.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/BlockchainRecipient.kt
new file mode 100644
index 000000000..d6b6ffc82
--- /dev/null
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/BlockchainRecipient.kt
@@ -0,0 +1,990 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.lithic.api.models
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter
+import com.fasterxml.jackson.annotation.JsonAnySetter
+import com.fasterxml.jackson.annotation.JsonCreator
+import com.fasterxml.jackson.annotation.JsonProperty
+import com.lithic.api.core.Enum
+import com.lithic.api.core.ExcludeMissing
+import com.lithic.api.core.JsonField
+import com.lithic.api.core.JsonMissing
+import com.lithic.api.core.JsonValue
+import com.lithic.api.core.checkRequired
+import com.lithic.api.errors.LithicInvalidDataException
+import java.time.OffsetDateTime
+import java.util.Collections
+import java.util.Objects
+import java.util.Optional
+import kotlin.jvm.optionals.getOrNull
+
+class BlockchainRecipient
+@JsonCreator(mode = JsonCreator.Mode.DISABLED)
+private constructor(
+ private val token: JsonField,
+ private val accountToken: JsonField,
+ private val addressTag: JsonField,
+ private val chain: JsonField,
+ private val created: JsonField,
+ private val externalId: JsonField,
+ private val name: JsonField,
+ private val owner: JsonField,
+ private val ownerType: JsonField,
+ private val programId: JsonField,
+ private val state: JsonField,
+ private val updated: JsonField,
+ private val verificationState: JsonField,
+ private val additionalProperties: MutableMap,
+) {
+
+ @JsonCreator
+ private constructor(
+ @JsonProperty("token") @ExcludeMissing token: JsonField = JsonMissing.of(),
+ @JsonProperty("account_token")
+ @ExcludeMissing
+ accountToken: JsonField = JsonMissing.of(),
+ @JsonProperty("address_tag")
+ @ExcludeMissing
+ addressTag: JsonField = JsonMissing.of(),
+ @JsonProperty("chain") @ExcludeMissing chain: JsonField = JsonMissing.of(),
+ @JsonProperty("created")
+ @ExcludeMissing
+ created: JsonField = JsonMissing.of(),
+ @JsonProperty("external_id")
+ @ExcludeMissing
+ externalId: JsonField = JsonMissing.of(),
+ @JsonProperty("name") @ExcludeMissing name: JsonField = JsonMissing.of(),
+ @JsonProperty("owner") @ExcludeMissing owner: JsonField = JsonMissing.of(),
+ @JsonProperty("owner_type")
+ @ExcludeMissing
+ ownerType: JsonField = JsonMissing.of(),
+ @JsonProperty("program_id") @ExcludeMissing programId: JsonField = JsonMissing.of(),
+ @JsonProperty("state") @ExcludeMissing state: JsonField = JsonMissing.of(),
+ @JsonProperty("updated")
+ @ExcludeMissing
+ updated: JsonField = JsonMissing.of(),
+ @JsonProperty("verification_state")
+ @ExcludeMissing
+ verificationState: JsonField = JsonMissing.of(),
+ ) : this(
+ token,
+ accountToken,
+ addressTag,
+ chain,
+ created,
+ externalId,
+ name,
+ owner,
+ ownerType,
+ programId,
+ state,
+ updated,
+ verificationState,
+ mutableMapOf(),
+ )
+
+ /**
+ * A globally unique identifier for this blockchain recipient
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun token(): String = token.getRequired("token")
+
+ /**
+ * The financial account the blockchain recipient belongs to
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun accountToken(): String = accountToken.getRequired("account_token")
+
+ /**
+ * An optional tag or memo used by some chains to identify the destination of a transfer within
+ * a shared address
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun addressTag(): Optional = addressTag.getOptional("address_tag")
+
+ /**
+ * The blockchain network that the address belongs to
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun chain(): String = chain.getRequired("chain")
+
+ /**
+ * An ISO 8601 string representing when this blockchain recipient was created
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun created(): OffsetDateTime = created.getRequired("created")
+
+ /**
+ * The identifier the recipient is registered under with the payment provider
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun externalId(): Optional = externalId.getOptional("external_id")
+
+ /**
+ * The nickname for this blockchain recipient
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun name(): Optional = name.getOptional("name")
+
+ /**
+ * Legal name of the business or individual who owns the blockchain address
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun owner(): String = owner.getRequired("owner")
+
+ /**
+ * Owner Type
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun ownerType(): OwnerType = ownerType.getRequired("owner_type")
+
+ /**
+ * Globally unique identifier for the program the blockchain recipient is associated with
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun programId(): String = programId.getRequired("program_id")
+
+ /**
+ * Account State
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun state(): State = state.getRequired("state")
+
+ /**
+ * An ISO 8601 string representing when this blockchain recipient was last updated
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun updated(): OffsetDateTime = updated.getRequired("updated")
+
+ /**
+ * Verification State
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun verificationState(): VerificationState = verificationState.getRequired("verification_state")
+
+ /**
+ * Returns the raw JSON value of [token].
+ *
+ * Unlike [token], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("token") @ExcludeMissing fun _token(): JsonField = token
+
+ /**
+ * Returns the raw JSON value of [accountToken].
+ *
+ * Unlike [accountToken], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("account_token")
+ @ExcludeMissing
+ fun _accountToken(): JsonField = accountToken
+
+ /**
+ * Returns the raw JSON value of [addressTag].
+ *
+ * Unlike [addressTag], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("address_tag") @ExcludeMissing fun _addressTag(): JsonField = addressTag
+
+ /**
+ * Returns the raw JSON value of [chain].
+ *
+ * Unlike [chain], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("chain") @ExcludeMissing fun _chain(): JsonField = chain
+
+ /**
+ * Returns the raw JSON value of [created].
+ *
+ * Unlike [created], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("created") @ExcludeMissing fun _created(): JsonField = created
+
+ /**
+ * Returns the raw JSON value of [externalId].
+ *
+ * Unlike [externalId], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("external_id") @ExcludeMissing fun _externalId(): JsonField = externalId
+
+ /**
+ * Returns the raw JSON value of [name].
+ *
+ * Unlike [name], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("name") @ExcludeMissing fun _name(): JsonField = name
+
+ /**
+ * Returns the raw JSON value of [owner].
+ *
+ * Unlike [owner], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("owner") @ExcludeMissing fun _owner(): JsonField = owner
+
+ /**
+ * Returns the raw JSON value of [ownerType].
+ *
+ * Unlike [ownerType], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("owner_type") @ExcludeMissing fun _ownerType(): JsonField = ownerType
+
+ /**
+ * Returns the raw JSON value of [programId].
+ *
+ * Unlike [programId], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("program_id") @ExcludeMissing fun _programId(): JsonField = programId
+
+ /**
+ * Returns the raw JSON value of [state].
+ *
+ * Unlike [state], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("state") @ExcludeMissing fun _state(): JsonField = state
+
+ /**
+ * Returns the raw JSON value of [updated].
+ *
+ * Unlike [updated], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ @JsonProperty("updated") @ExcludeMissing fun _updated(): JsonField = updated
+
+ /**
+ * Returns the raw JSON value of [verificationState].
+ *
+ * Unlike [verificationState], this method doesn't throw if the JSON field has an unexpected
+ * type.
+ */
+ @JsonProperty("verification_state")
+ @ExcludeMissing
+ fun _verificationState(): JsonField = verificationState
+
+ @JsonAnySetter
+ private fun putAdditionalProperty(key: String, value: JsonValue) {
+ additionalProperties.put(key, value)
+ }
+
+ @JsonAnyGetter
+ @ExcludeMissing
+ fun _additionalProperties(): Map =
+ Collections.unmodifiableMap(additionalProperties)
+
+ fun toBuilder() = Builder().from(this)
+
+ companion object {
+
+ /**
+ * Returns a mutable builder for constructing an instance of [BlockchainRecipient].
+ *
+ * The following fields are required:
+ * ```java
+ * .token()
+ * .accountToken()
+ * .addressTag()
+ * .chain()
+ * .created()
+ * .externalId()
+ * .name()
+ * .owner()
+ * .ownerType()
+ * .programId()
+ * .state()
+ * .updated()
+ * .verificationState()
+ * ```
+ */
+ @JvmStatic fun builder() = Builder()
+ }
+
+ /** A builder for [BlockchainRecipient]. */
+ class Builder internal constructor() {
+
+ private var token: JsonField? = null
+ private var accountToken: JsonField? = null
+ private var addressTag: JsonField? = null
+ private var chain: JsonField? = null
+ private var created: JsonField? = null
+ private var externalId: JsonField? = null
+ private var name: JsonField? = null
+ private var owner: JsonField? = null
+ private var ownerType: JsonField? = null
+ private var programId: JsonField? = null
+ private var state: JsonField? = null
+ private var updated: JsonField? = null
+ private var verificationState: JsonField? = null
+ private var additionalProperties: MutableMap = mutableMapOf()
+
+ @JvmSynthetic
+ internal fun from(blockchainRecipient: BlockchainRecipient) = apply {
+ token = blockchainRecipient.token
+ accountToken = blockchainRecipient.accountToken
+ addressTag = blockchainRecipient.addressTag
+ chain = blockchainRecipient.chain
+ created = blockchainRecipient.created
+ externalId = blockchainRecipient.externalId
+ name = blockchainRecipient.name
+ owner = blockchainRecipient.owner
+ ownerType = blockchainRecipient.ownerType
+ programId = blockchainRecipient.programId
+ state = blockchainRecipient.state
+ updated = blockchainRecipient.updated
+ verificationState = blockchainRecipient.verificationState
+ additionalProperties = blockchainRecipient.additionalProperties.toMutableMap()
+ }
+
+ /** A globally unique identifier for this blockchain recipient */
+ fun token(token: String) = token(JsonField.of(token))
+
+ /**
+ * Sets [Builder.token] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.token] with a well-typed [String] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun token(token: JsonField) = apply { this.token = token }
+
+ /** The financial account the blockchain recipient belongs to */
+ fun accountToken(accountToken: String) = accountToken(JsonField.of(accountToken))
+
+ /**
+ * Sets [Builder.accountToken] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.accountToken] with a well-typed [String] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun accountToken(accountToken: JsonField) = apply {
+ this.accountToken = accountToken
+ }
+
+ /**
+ * An optional tag or memo used by some chains to identify the destination of a transfer
+ * within a shared address
+ */
+ fun addressTag(addressTag: String?) = addressTag(JsonField.ofNullable(addressTag))
+
+ /** Alias for calling [Builder.addressTag] with `addressTag.orElse(null)`. */
+ fun addressTag(addressTag: Optional) = addressTag(addressTag.getOrNull())
+
+ /**
+ * Sets [Builder.addressTag] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.addressTag] with a well-typed [String] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun addressTag(addressTag: JsonField) = apply { this.addressTag = addressTag }
+
+ /** The blockchain network that the address belongs to */
+ fun chain(chain: String) = chain(JsonField.of(chain))
+
+ /**
+ * Sets [Builder.chain] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.chain] with a well-typed [String] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun chain(chain: JsonField) = apply { this.chain = chain }
+
+ /** An ISO 8601 string representing when this blockchain recipient was created */
+ fun created(created: OffsetDateTime) = created(JsonField.of(created))
+
+ /**
+ * Sets [Builder.created] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.created] with a well-typed [OffsetDateTime] value
+ * instead. This method is primarily for setting the field to an undocumented or not yet
+ * supported value.
+ */
+ fun created(created: JsonField) = apply { this.created = created }
+
+ /** The identifier the recipient is registered under with the payment provider */
+ fun externalId(externalId: String?) = externalId(JsonField.ofNullable(externalId))
+
+ /** Alias for calling [Builder.externalId] with `externalId.orElse(null)`. */
+ fun externalId(externalId: Optional) = externalId(externalId.getOrNull())
+
+ /**
+ * Sets [Builder.externalId] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.externalId] with a well-typed [String] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun externalId(externalId: JsonField) = apply { this.externalId = externalId }
+
+ /** The nickname for this blockchain recipient */
+ fun name(name: String?) = name(JsonField.ofNullable(name))
+
+ /** Alias for calling [Builder.name] with `name.orElse(null)`. */
+ fun name(name: Optional) = name(name.getOrNull())
+
+ /**
+ * Sets [Builder.name] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.name] with a well-typed [String] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun name(name: JsonField) = apply { this.name = name }
+
+ /** Legal name of the business or individual who owns the blockchain address */
+ fun owner(owner: String) = owner(JsonField.of(owner))
+
+ /**
+ * Sets [Builder.owner] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.owner] with a well-typed [String] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun owner(owner: JsonField) = apply { this.owner = owner }
+
+ /** Owner Type */
+ fun ownerType(ownerType: OwnerType) = ownerType(JsonField.of(ownerType))
+
+ /**
+ * Sets [Builder.ownerType] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.ownerType] with a well-typed [OwnerType] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun ownerType(ownerType: JsonField) = apply { this.ownerType = ownerType }
+
+ /**
+ * Globally unique identifier for the program the blockchain recipient is associated with
+ */
+ fun programId(programId: String) = programId(JsonField.of(programId))
+
+ /**
+ * Sets [Builder.programId] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.programId] with a well-typed [String] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun programId(programId: JsonField) = apply { this.programId = programId }
+
+ /** Account State */
+ fun state(state: State) = state(JsonField.of(state))
+
+ /**
+ * Sets [Builder.state] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.state] with a well-typed [State] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun state(state: JsonField) = apply { this.state = state }
+
+ /** An ISO 8601 string representing when this blockchain recipient was last updated */
+ fun updated(updated: OffsetDateTime) = updated(JsonField.of(updated))
+
+ /**
+ * Sets [Builder.updated] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.updated] with a well-typed [OffsetDateTime] value
+ * instead. This method is primarily for setting the field to an undocumented or not yet
+ * supported value.
+ */
+ fun updated(updated: JsonField) = apply { this.updated = updated }
+
+ /** Verification State */
+ fun verificationState(verificationState: VerificationState) =
+ verificationState(JsonField.of(verificationState))
+
+ /**
+ * Sets [Builder.verificationState] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.verificationState] with a well-typed [VerificationState]
+ * value instead. This method is primarily for setting the field to an undocumented or not
+ * yet supported value.
+ */
+ fun verificationState(verificationState: JsonField) = apply {
+ this.verificationState = verificationState
+ }
+
+ fun additionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.clear()
+ putAllAdditionalProperties(additionalProperties)
+ }
+
+ fun putAdditionalProperty(key: String, value: JsonValue) = apply {
+ additionalProperties.put(key, value)
+ }
+
+ fun putAllAdditionalProperties(additionalProperties: Map) = apply {
+ this.additionalProperties.putAll(additionalProperties)
+ }
+
+ fun removeAdditionalProperty(key: String) = apply { additionalProperties.remove(key) }
+
+ fun removeAllAdditionalProperties(keys: Set) = apply {
+ keys.forEach(::removeAdditionalProperty)
+ }
+
+ /**
+ * Returns an immutable instance of [BlockchainRecipient].
+ *
+ * Further updates to this [Builder] will not mutate the returned instance.
+ *
+ * The following fields are required:
+ * ```java
+ * .token()
+ * .accountToken()
+ * .addressTag()
+ * .chain()
+ * .created()
+ * .externalId()
+ * .name()
+ * .owner()
+ * .ownerType()
+ * .programId()
+ * .state()
+ * .updated()
+ * .verificationState()
+ * ```
+ *
+ * @throws IllegalStateException if any required field is unset.
+ */
+ fun build(): BlockchainRecipient =
+ BlockchainRecipient(
+ checkRequired("token", token),
+ checkRequired("accountToken", accountToken),
+ checkRequired("addressTag", addressTag),
+ checkRequired("chain", chain),
+ checkRequired("created", created),
+ checkRequired("externalId", externalId),
+ checkRequired("name", name),
+ checkRequired("owner", owner),
+ checkRequired("ownerType", ownerType),
+ checkRequired("programId", programId),
+ checkRequired("state", state),
+ checkRequired("updated", updated),
+ checkRequired("verificationState", verificationState),
+ additionalProperties.toMutableMap(),
+ )
+ }
+
+ private var validated: Boolean = false
+
+ /**
+ * Validates that the types of all values in this object match their expected types recursively.
+ *
+ * This method is _not_ forwards compatible with new types from the API for existing fields.
+ *
+ * @throws LithicInvalidDataException if any value type in this object doesn't match its
+ * expected type.
+ */
+ fun validate(): BlockchainRecipient = apply {
+ if (validated) {
+ return@apply
+ }
+
+ token()
+ accountToken()
+ addressTag()
+ chain()
+ created()
+ externalId()
+ name()
+ owner()
+ ownerType().validate()
+ programId()
+ state().validate()
+ updated()
+ verificationState().validate()
+ validated = true
+ }
+
+ fun isValid(): Boolean =
+ try {
+ validate()
+ true
+ } catch (e: LithicInvalidDataException) {
+ false
+ }
+
+ /**
+ * Returns a score indicating how many valid values are contained in this object recursively.
+ *
+ * Used for best match union deserialization.
+ */
+ @JvmSynthetic
+ internal fun validity(): Int =
+ (if (token.asKnown().isPresent) 1 else 0) +
+ (if (accountToken.asKnown().isPresent) 1 else 0) +
+ (if (addressTag.asKnown().isPresent) 1 else 0) +
+ (if (chain.asKnown().isPresent) 1 else 0) +
+ (if (created.asKnown().isPresent) 1 else 0) +
+ (if (externalId.asKnown().isPresent) 1 else 0) +
+ (if (name.asKnown().isPresent) 1 else 0) +
+ (if (owner.asKnown().isPresent) 1 else 0) +
+ (ownerType.asKnown().getOrNull()?.validity() ?: 0) +
+ (if (programId.asKnown().isPresent) 1 else 0) +
+ (state.asKnown().getOrNull()?.validity() ?: 0) +
+ (if (updated.asKnown().isPresent) 1 else 0) +
+ (verificationState.asKnown().getOrNull()?.validity() ?: 0)
+
+ /** Account State */
+ class State @JsonCreator private constructor(private val value: JsonField) : Enum {
+
+ /**
+ * Returns this class instance's raw value.
+ *
+ * This is usually only useful if this instance was deserialized from data that doesn't
+ * match any known member, and you want to know that value. For example, if the SDK is on an
+ * older version than the API, then the API may respond with new members that the SDK is
+ * unaware of.
+ */
+ @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value
+
+ companion object {
+
+ @JvmField val ENABLED = of("ENABLED")
+
+ @JvmField val CLOSED = of("CLOSED")
+
+ @JvmField val PAUSED = of("PAUSED")
+
+ @JvmStatic fun of(value: String) = State(JsonField.of(value))
+ }
+
+ /** An enum containing [State]'s known values. */
+ enum class Known {
+ ENABLED,
+ CLOSED,
+ PAUSED,
+ }
+
+ /**
+ * An enum containing [State]'s known values, as well as an [_UNKNOWN] member.
+ *
+ * An instance of [State] can contain an unknown value in a couple of cases:
+ * - It was deserialized from data that doesn't match any known member. For example, if the
+ * SDK is on an older version than the API, then the API may respond with new members that
+ * the SDK is unaware of.
+ * - It was constructed with an arbitrary value using the [of] method.
+ */
+ enum class Value {
+ ENABLED,
+ CLOSED,
+ PAUSED,
+ /** An enum member indicating that [State] was instantiated with an unknown value. */
+ _UNKNOWN,
+ }
+
+ /**
+ * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN]
+ * if the class was instantiated with an unknown value.
+ *
+ * Use the [known] method instead if you're certain the value is always known or if you want
+ * to throw for the unknown case.
+ */
+ fun value(): Value =
+ when (this) {
+ ENABLED -> Value.ENABLED
+ CLOSED -> Value.CLOSED
+ PAUSED -> Value.PAUSED
+ else -> Value._UNKNOWN
+ }
+
+ /**
+ * Returns an enum member corresponding to this class instance's value.
+ *
+ * Use the [value] method instead if you're uncertain the value is always known and don't
+ * want to throw for the unknown case.
+ *
+ * @throws LithicInvalidDataException if this class instance's value is a not a known
+ * member.
+ */
+ fun known(): Known =
+ when (this) {
+ ENABLED -> Known.ENABLED
+ CLOSED -> Known.CLOSED
+ PAUSED -> Known.PAUSED
+ else -> throw LithicInvalidDataException("Unknown State: $value")
+ }
+
+ /**
+ * Returns this class instance's primitive wire representation.
+ *
+ * This differs from the [toString] method because that method is primarily for debugging
+ * and generally doesn't throw.
+ *
+ * @throws LithicInvalidDataException if this class instance's value does not have the
+ * expected primitive type.
+ */
+ fun asString(): String =
+ _value().asString().orElseThrow { LithicInvalidDataException("Value is not a String") }
+
+ private var validated: Boolean = false
+
+ /**
+ * Validates that the types of all values in this object match their expected types
+ * recursively.
+ *
+ * This method is _not_ forwards compatible with new types from the API for existing fields.
+ *
+ * @throws LithicInvalidDataException if any value type in this object doesn't match its
+ * expected type.
+ */
+ fun validate(): State = apply {
+ if (validated) {
+ return@apply
+ }
+
+ known()
+ validated = true
+ }
+
+ fun isValid(): Boolean =
+ try {
+ validate()
+ true
+ } catch (e: LithicInvalidDataException) {
+ false
+ }
+
+ /**
+ * Returns a score indicating how many valid values are contained in this object
+ * recursively.
+ *
+ * Used for best match union deserialization.
+ */
+ @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is State && value == other.value
+ }
+
+ override fun hashCode() = value.hashCode()
+
+ override fun toString() = value.toString()
+ }
+
+ /** Verification State */
+ class VerificationState @JsonCreator private constructor(private val value: JsonField) :
+ Enum {
+
+ /**
+ * Returns this class instance's raw value.
+ *
+ * This is usually only useful if this instance was deserialized from data that doesn't
+ * match any known member, and you want to know that value. For example, if the SDK is on an
+ * older version than the API, then the API may respond with new members that the SDK is
+ * unaware of.
+ */
+ @com.fasterxml.jackson.annotation.JsonValue fun _value(): JsonField = value
+
+ companion object {
+
+ @JvmField val PENDING = of("PENDING")
+
+ @JvmField val ENABLED = of("ENABLED")
+
+ @JvmField val FAILED_VERIFICATION = of("FAILED_VERIFICATION")
+
+ @JvmField val INSUFFICIENT_FUNDS = of("INSUFFICIENT_FUNDS")
+
+ @JvmStatic fun of(value: String) = VerificationState(JsonField.of(value))
+ }
+
+ /** An enum containing [VerificationState]'s known values. */
+ enum class Known {
+ PENDING,
+ ENABLED,
+ FAILED_VERIFICATION,
+ INSUFFICIENT_FUNDS,
+ }
+
+ /**
+ * An enum containing [VerificationState]'s known values, as well as an [_UNKNOWN] member.
+ *
+ * An instance of [VerificationState] can contain an unknown value in a couple of cases:
+ * - It was deserialized from data that doesn't match any known member. For example, if the
+ * SDK is on an older version than the API, then the API may respond with new members that
+ * the SDK is unaware of.
+ * - It was constructed with an arbitrary value using the [of] method.
+ */
+ enum class Value {
+ PENDING,
+ ENABLED,
+ FAILED_VERIFICATION,
+ INSUFFICIENT_FUNDS,
+ /**
+ * An enum member indicating that [VerificationState] was instantiated with an unknown
+ * value.
+ */
+ _UNKNOWN,
+ }
+
+ /**
+ * Returns an enum member corresponding to this class instance's value, or [Value._UNKNOWN]
+ * if the class was instantiated with an unknown value.
+ *
+ * Use the [known] method instead if you're certain the value is always known or if you want
+ * to throw for the unknown case.
+ */
+ fun value(): Value =
+ when (this) {
+ PENDING -> Value.PENDING
+ ENABLED -> Value.ENABLED
+ FAILED_VERIFICATION -> Value.FAILED_VERIFICATION
+ INSUFFICIENT_FUNDS -> Value.INSUFFICIENT_FUNDS
+ else -> Value._UNKNOWN
+ }
+
+ /**
+ * Returns an enum member corresponding to this class instance's value.
+ *
+ * Use the [value] method instead if you're uncertain the value is always known and don't
+ * want to throw for the unknown case.
+ *
+ * @throws LithicInvalidDataException if this class instance's value is a not a known
+ * member.
+ */
+ fun known(): Known =
+ when (this) {
+ PENDING -> Known.PENDING
+ ENABLED -> Known.ENABLED
+ FAILED_VERIFICATION -> Known.FAILED_VERIFICATION
+ INSUFFICIENT_FUNDS -> Known.INSUFFICIENT_FUNDS
+ else -> throw LithicInvalidDataException("Unknown VerificationState: $value")
+ }
+
+ /**
+ * Returns this class instance's primitive wire representation.
+ *
+ * This differs from the [toString] method because that method is primarily for debugging
+ * and generally doesn't throw.
+ *
+ * @throws LithicInvalidDataException if this class instance's value does not have the
+ * expected primitive type.
+ */
+ fun asString(): String =
+ _value().asString().orElseThrow { LithicInvalidDataException("Value is not a String") }
+
+ private var validated: Boolean = false
+
+ /**
+ * Validates that the types of all values in this object match their expected types
+ * recursively.
+ *
+ * This method is _not_ forwards compatible with new types from the API for existing fields.
+ *
+ * @throws LithicInvalidDataException if any value type in this object doesn't match its
+ * expected type.
+ */
+ fun validate(): VerificationState = apply {
+ if (validated) {
+ return@apply
+ }
+
+ known()
+ validated = true
+ }
+
+ fun isValid(): Boolean =
+ try {
+ validate()
+ true
+ } catch (e: LithicInvalidDataException) {
+ false
+ }
+
+ /**
+ * Returns a score indicating how many valid values are contained in this object
+ * recursively.
+ *
+ * Used for best match union deserialization.
+ */
+ @JvmSynthetic internal fun validity(): Int = if (value() == Value._UNKNOWN) 0 else 1
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is VerificationState && value == other.value
+ }
+
+ override fun hashCode() = value.hashCode()
+
+ override fun toString() = value.toString()
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) {
+ return true
+ }
+
+ return other is BlockchainRecipient &&
+ token == other.token &&
+ accountToken == other.accountToken &&
+ addressTag == other.addressTag &&
+ chain == other.chain &&
+ created == other.created &&
+ externalId == other.externalId &&
+ name == other.name &&
+ owner == other.owner &&
+ ownerType == other.ownerType &&
+ programId == other.programId &&
+ state == other.state &&
+ updated == other.updated &&
+ verificationState == other.verificationState &&
+ additionalProperties == other.additionalProperties
+ }
+
+ private val hashCode: Int by lazy {
+ Objects.hash(
+ token,
+ accountToken,
+ addressTag,
+ chain,
+ created,
+ externalId,
+ name,
+ owner,
+ ownerType,
+ programId,
+ state,
+ updated,
+ verificationState,
+ additionalProperties,
+ )
+ }
+
+ override fun hashCode(): Int = hashCode
+
+ override fun toString() =
+ "BlockchainRecipient{token=$token, accountToken=$accountToken, addressTag=$addressTag, chain=$chain, created=$created, externalId=$externalId, name=$name, owner=$owner, ownerType=$ownerType, programId=$programId, state=$state, updated=$updated, verificationState=$verificationState, additionalProperties=$additionalProperties}"
+}
diff --git a/lithic-java-core/src/main/kotlin/com/lithic/api/models/BlockchainRecipientCreateParams.kt b/lithic-java-core/src/main/kotlin/com/lithic/api/models/BlockchainRecipientCreateParams.kt
new file mode 100644
index 000000000..15353521d
--- /dev/null
+++ b/lithic-java-core/src/main/kotlin/com/lithic/api/models/BlockchainRecipientCreateParams.kt
@@ -0,0 +1,869 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.lithic.api.models
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter
+import com.fasterxml.jackson.annotation.JsonAnySetter
+import com.fasterxml.jackson.annotation.JsonCreator
+import com.fasterxml.jackson.annotation.JsonProperty
+import com.lithic.api.core.ExcludeMissing
+import com.lithic.api.core.JsonField
+import com.lithic.api.core.JsonMissing
+import com.lithic.api.core.JsonValue
+import com.lithic.api.core.Params
+import com.lithic.api.core.checkRequired
+import com.lithic.api.core.http.Headers
+import com.lithic.api.core.http.QueryParams
+import com.lithic.api.errors.LithicInvalidDataException
+import java.util.Collections
+import java.util.Objects
+import java.util.Optional
+import kotlin.jvm.optionals.getOrNull
+
+/**
+ * Register a blockchain address as a withdrawal destination for a financial account
+ *
+ * The recipient is created with a `PENDING` verification state and cannot receive a payout until
+ * screening of the address completes. Registering an address that is already registered to the same
+ * financial account returns the existing recipient and its current verification state, rather than
+ * creating a second one
+ */
+class BlockchainRecipientCreateParams
+private constructor(
+ private val body: BlockchainRecipientRequest,
+ private val additionalHeaders: Headers,
+ private val additionalQueryParams: QueryParams,
+) : Params {
+
+ /**
+ * The financial account the blockchain recipient belongs to
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun accountToken(): String = body.accountToken()
+
+ /**
+ * The blockchain address funds will be withdrawn to
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun address(): String = body.address()
+
+ /**
+ * The blockchain network that the address belongs to
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun chain(): String = body.chain()
+
+ /**
+ * Legal name of the business or individual who owns the blockchain address
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun owner(): String = body.owner()
+
+ /**
+ * Owner Type
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type or is
+ * unexpectedly missing or null (e.g. if the server responded with an unexpected value).
+ */
+ fun ownerType(): OwnerType = body.ownerType()
+
+ /**
+ * An optional tag or memo used by some chains to identify the destination of a transfer within
+ * a shared address
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun addressTag(): Optional = body.addressTag()
+
+ /**
+ * The nickname for this blockchain recipient
+ *
+ * @throws LithicInvalidDataException if the JSON field has an unexpected type (e.g. if the
+ * server responded with an unexpected value).
+ */
+ fun name(): Optional = body.name()
+
+ /**
+ * Returns the raw JSON value of [accountToken].
+ *
+ * Unlike [accountToken], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ fun _accountToken(): JsonField = body._accountToken()
+
+ /**
+ * Returns the raw JSON value of [address].
+ *
+ * Unlike [address], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ fun _address(): JsonField = body._address()
+
+ /**
+ * Returns the raw JSON value of [chain].
+ *
+ * Unlike [chain], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ fun _chain(): JsonField = body._chain()
+
+ /**
+ * Returns the raw JSON value of [owner].
+ *
+ * Unlike [owner], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ fun _owner(): JsonField = body._owner()
+
+ /**
+ * Returns the raw JSON value of [ownerType].
+ *
+ * Unlike [ownerType], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ fun _ownerType(): JsonField = body._ownerType()
+
+ /**
+ * Returns the raw JSON value of [addressTag].
+ *
+ * Unlike [addressTag], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ fun _addressTag(): JsonField = body._addressTag()
+
+ /**
+ * Returns the raw JSON value of [name].
+ *
+ * Unlike [name], this method doesn't throw if the JSON field has an unexpected type.
+ */
+ fun _name(): JsonField = body._name()
+
+ fun _additionalBodyProperties(): Map = body._additionalProperties()
+
+ /** Additional headers to send with the request. */
+ fun _additionalHeaders(): Headers = additionalHeaders
+
+ /** Additional query param to send with the request. */
+ fun _additionalQueryParams(): QueryParams = additionalQueryParams
+
+ fun toBuilder() = Builder().from(this)
+
+ companion object {
+
+ /**
+ * Returns a mutable builder for constructing an instance of
+ * [BlockchainRecipientCreateParams].
+ *
+ * The following fields are required:
+ * ```java
+ * .accountToken()
+ * .address()
+ * .chain()
+ * .owner()
+ * .ownerType()
+ * ```
+ */
+ @JvmStatic fun builder() = Builder()
+ }
+
+ /** A builder for [BlockchainRecipientCreateParams]. */
+ class Builder internal constructor() {
+
+ private var body: BlockchainRecipientRequest.Builder = BlockchainRecipientRequest.builder()
+ private var additionalHeaders: Headers.Builder = Headers.builder()
+ private var additionalQueryParams: QueryParams.Builder = QueryParams.builder()
+
+ @JvmSynthetic
+ internal fun from(blockchainRecipientCreateParams: BlockchainRecipientCreateParams) =
+ apply {
+ body = blockchainRecipientCreateParams.body.toBuilder()
+ additionalHeaders = blockchainRecipientCreateParams.additionalHeaders.toBuilder()
+ additionalQueryParams =
+ blockchainRecipientCreateParams.additionalQueryParams.toBuilder()
+ }
+
+ /**
+ * Sets the entire request body.
+ *
+ * This is generally only useful if you are already constructing the body separately.
+ * Otherwise, it's more convenient to use the top-level setters instead:
+ * - [accountToken]
+ * - [address]
+ * - [chain]
+ * - [owner]
+ * - [ownerType]
+ * - etc.
+ */
+ fun body(body: BlockchainRecipientRequest) = apply { this.body = body.toBuilder() }
+
+ /** The financial account the blockchain recipient belongs to */
+ fun accountToken(accountToken: String) = apply { body.accountToken(accountToken) }
+
+ /**
+ * Sets [Builder.accountToken] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.accountToken] with a well-typed [String] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun accountToken(accountToken: JsonField) = apply {
+ body.accountToken(accountToken)
+ }
+
+ /** The blockchain address funds will be withdrawn to */
+ fun address(address: String) = apply { body.address(address) }
+
+ /**
+ * Sets [Builder.address] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.address] with a well-typed [String] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun address(address: JsonField) = apply { body.address(address) }
+
+ /** The blockchain network that the address belongs to */
+ fun chain(chain: String) = apply { body.chain(chain) }
+
+ /**
+ * Sets [Builder.chain] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.chain] with a well-typed [String] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun chain(chain: JsonField) = apply { body.chain(chain) }
+
+ /** Legal name of the business or individual who owns the blockchain address */
+ fun owner(owner: String) = apply { body.owner(owner) }
+
+ /**
+ * Sets [Builder.owner] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.owner] with a well-typed [String] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun owner(owner: JsonField) = apply { body.owner(owner) }
+
+ /** Owner Type */
+ fun ownerType(ownerType: OwnerType) = apply { body.ownerType(ownerType) }
+
+ /**
+ * Sets [Builder.ownerType] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.ownerType] with a well-typed [OwnerType] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun ownerType(ownerType: JsonField) = apply { body.ownerType(ownerType) }
+
+ /**
+ * An optional tag or memo used by some chains to identify the destination of a transfer
+ * within a shared address
+ */
+ fun addressTag(addressTag: String) = apply { body.addressTag(addressTag) }
+
+ /**
+ * Sets [Builder.addressTag] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.addressTag] with a well-typed [String] value instead.
+ * This method is primarily for setting the field to an undocumented or not yet supported
+ * value.
+ */
+ fun addressTag(addressTag: JsonField) = apply { body.addressTag(addressTag) }
+
+ /** The nickname for this blockchain recipient */
+ fun name(name: String) = apply { body.name(name) }
+
+ /**
+ * Sets [Builder.name] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.name] with a well-typed [String] value instead. This
+ * method is primarily for setting the field to an undocumented or not yet supported value.
+ */
+ fun name(name: JsonField) = apply { body.name(name) }
+
+ fun additionalBodyProperties(additionalBodyProperties: Map) = apply {
+ body.additionalProperties(additionalBodyProperties)
+ }
+
+ fun putAdditionalBodyProperty(key: String, value: JsonValue) = apply {
+ body.putAdditionalProperty(key, value)
+ }
+
+ fun putAllAdditionalBodyProperties(additionalBodyProperties: Map) =
+ apply {
+ body.putAllAdditionalProperties(additionalBodyProperties)
+ }
+
+ fun removeAdditionalBodyProperty(key: String) = apply { body.removeAdditionalProperty(key) }
+
+ fun removeAllAdditionalBodyProperties(keys: Set) = apply {
+ body.removeAllAdditionalProperties(keys)
+ }
+
+ fun additionalHeaders(additionalHeaders: Headers) = apply {
+ this.additionalHeaders.clear()
+ putAllAdditionalHeaders(additionalHeaders)
+ }
+
+ fun additionalHeaders(additionalHeaders: Map>) = apply {
+ this.additionalHeaders.clear()
+ putAllAdditionalHeaders(additionalHeaders)
+ }
+
+ fun putAdditionalHeader(name: String, value: String) = apply {
+ additionalHeaders.put(name, value)
+ }
+
+ fun putAdditionalHeaders(name: String, values: Iterable) = apply {
+ additionalHeaders.put(name, values)
+ }
+
+ fun putAllAdditionalHeaders(additionalHeaders: Headers) = apply {
+ this.additionalHeaders.putAll(additionalHeaders)
+ }
+
+ fun putAllAdditionalHeaders(additionalHeaders: Map>) = apply {
+ this.additionalHeaders.putAll(additionalHeaders)
+ }
+
+ fun replaceAdditionalHeaders(name: String, value: String) = apply {
+ additionalHeaders.replace(name, value)
+ }
+
+ fun replaceAdditionalHeaders(name: String, values: Iterable) = apply {
+ additionalHeaders.replace(name, values)
+ }
+
+ fun replaceAllAdditionalHeaders(additionalHeaders: Headers) = apply {
+ this.additionalHeaders.replaceAll(additionalHeaders)
+ }
+
+ fun replaceAllAdditionalHeaders(additionalHeaders: Map>) = apply {
+ this.additionalHeaders.replaceAll(additionalHeaders)
+ }
+
+ fun removeAdditionalHeaders(name: String) = apply { additionalHeaders.remove(name) }
+
+ fun removeAllAdditionalHeaders(names: Set) = apply {
+ additionalHeaders.removeAll(names)
+ }
+
+ fun additionalQueryParams(additionalQueryParams: QueryParams) = apply {
+ this.additionalQueryParams.clear()
+ putAllAdditionalQueryParams(additionalQueryParams)
+ }
+
+ fun additionalQueryParams(additionalQueryParams: Map>) = apply {
+ this.additionalQueryParams.clear()
+ putAllAdditionalQueryParams(additionalQueryParams)
+ }
+
+ fun putAdditionalQueryParam(key: String, value: String) = apply {
+ additionalQueryParams.put(key, value)
+ }
+
+ fun putAdditionalQueryParams(key: String, values: Iterable) = apply {
+ additionalQueryParams.put(key, values)
+ }
+
+ fun putAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply {
+ this.additionalQueryParams.putAll(additionalQueryParams)
+ }
+
+ fun putAllAdditionalQueryParams(additionalQueryParams: Map>) =
+ apply {
+ this.additionalQueryParams.putAll(additionalQueryParams)
+ }
+
+ fun replaceAdditionalQueryParams(key: String, value: String) = apply {
+ additionalQueryParams.replace(key, value)
+ }
+
+ fun replaceAdditionalQueryParams(key: String, values: Iterable) = apply {
+ additionalQueryParams.replace(key, values)
+ }
+
+ fun replaceAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply {
+ this.additionalQueryParams.replaceAll(additionalQueryParams)
+ }
+
+ fun replaceAllAdditionalQueryParams(additionalQueryParams: Map>) =
+ apply {
+ this.additionalQueryParams.replaceAll(additionalQueryParams)
+ }
+
+ fun removeAdditionalQueryParams(key: String) = apply { additionalQueryParams.remove(key) }
+
+ fun removeAllAdditionalQueryParams(keys: Set) = apply {
+ additionalQueryParams.removeAll(keys)
+ }
+
+ /**
+ * Returns an immutable instance of [BlockchainRecipientCreateParams].
+ *
+ * Further updates to this [Builder] will not mutate the returned instance.
+ *
+ * The following fields are required:
+ * ```java
+ * .accountToken()
+ * .address()
+ * .chain()
+ * .owner()
+ * .ownerType()
+ * ```
+ *
+ * @throws IllegalStateException if any required field is unset.
+ */
+ fun build(): BlockchainRecipientCreateParams =
+ BlockchainRecipientCreateParams(
+ body.build(),
+ additionalHeaders.build(),
+ additionalQueryParams.build(),
+ )
+ }
+
+ fun _body(): BlockchainRecipientRequest = body
+
+ override fun _headers(): Headers = additionalHeaders
+
+ override fun _queryParams(): QueryParams = additionalQueryParams
+
+ class BlockchainRecipientRequest
+ @JsonCreator(mode = JsonCreator.Mode.DISABLED)
+ private constructor(
+ private val accountToken: JsonField,
+ private val address: JsonField,
+ private val chain: JsonField,
+ private val owner: JsonField,
+ private val ownerType: JsonField,
+ private val addressTag: JsonField