Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
8bc2e07
Partition overflow problem solved per issue #6919 [ci] (#6923)
kajalshah-da Aug 21, 2026
ba7f572
Fix grafana dashboard panel for hidden app reward coupons (#6850)
rautenrieth-da Aug 24, 2026
99e962c
Enable minimal whitelisting by default (#6928)
nicu-da Aug 24, 2026
b959ffb
Final Implementation Initiate Proposal Flow (#6410)
timpel-fcs Aug 24, 2026
5031a6a
fix stack references and their mocks to allow migrating to split-SV d…
mblaze-da Aug 24, 2026
1ad2ac9
Improve splice rate limit dashboard - include rate limiter type and a…
nicu-da Aug 24, 2026
1c2b31e
Use configured client IP headers in request logs (#6924)
loglapa Aug 24, 2026
66f1319
Traffic-Based App Rewards: Clearly distinguish not-ingestable from no…
adetokunbo Aug 24, 2026
ce37e33
Remove logic to restart triggers on epoch changes. (#6935)
mrdziuban Aug 24, 2026
d105e1c
Remove log ignore that is stale after #6935 (#6941)
martinflorian-da Aug 24, 2026
1b6c1bb
Replace all `(Long, CantonTimestamp)` tuples with `TimestampWithMigra…
mrdziuban Aug 25, 2026
ffbd96d
fix GCP_GET_DATABASE_INSTANCES mock to include the right cluster name…
mblaze-da Aug 25, 2026
f17fe6a
Upgrade base image to 1.0.13
cocreature Aug 19, 2026
a267c1c
Upgrade base image to 1.0.13 (#6948)
moritzkiefer-da Aug 25, 2026
5b48337
add rate limits by CIDRs (#6660)
krzysztofczyz-da Aug 25, 2026
20e2030
Upgrade Canton to 3.5.15-snapshot.20260825.19200.0.va4ea4fe4
cocreature Aug 25, 2026
44a7b1b
Upgrade Canton to 3.5.15-snapshot.20260825.19200.0.va4ea4fe4 (#6956)
moritzkiefer-da Aug 25, 2026
66dc1a7
Widen proposal-details IDs/URLs and show requester party ID (#6915) (…
puneetfinoa Aug 25, 2026
4d1f63d
[ci] fix race condition in writing s3 objects (#6942)
isegall-da Aug 25, 2026
ebd5713
Revert "add rate limits by CIDRs" (#6962)
OriolMunoz-da Aug 25, 2026
a6619d1
bulk storage: count also committed objects in metrics (#6916)
isegall-da Aug 25, 2026
48d6bf5
script to auto-generate monday.com events for versions (#6775)
isegall-da Aug 25, 2026
1ee0f00
Log consensus scan URIs, revert BFT logging (#6413)
tellary Aug 26, 2026
3b10b59
Improve http client dashboard (#6932)
nicu-da Aug 26, 2026
356924a
Disable alerts for close to max capacity for per attribute rate limit…
nicu-da Aug 26, 2026
176a0b5
TestTokenV2SettlementIntegrationTest prevent validators from using sh…
OriolMunoz-da Aug 26, 2026
fd05af5
Add `globalSynchronizerHealth` alerts (#6969)
martinflorian-da Aug 26, 2026
738a4dc
Expose sv app endpoints to the minimum users (#6934)
nicu-da Aug 26, 2026
6bcae32
Add treasury service metrics (#6971)
moritzkiefer-da Aug 26, 2026
3525561
Introduce optional use of ComputeClasses (#6868)
rautenrieth-da Aug 26, 2026
ce85ac1
Align proposal placeholders and Your Vote styling (#6910, #6912) (#6972)
puneetfinoa Aug 26, 2026
4b7899b
Enable test that verifies high tapped amount. (#6913)
mrdziuban Aug 26, 2026
e6323f4
fixed app activity table primary and partition keys [ci] (#6981)
kajalshah-da Aug 26, 2026
7832d95
Port from Canton: give native protoc plugins a stable launcher path (…
OriolMunoz-da Aug 26, 2026
fbd2232
bulk storage: Add debug capabilities (#6961)
isegall-da Aug 26, 2026
909c253
Remove log ignore for `Waiting for allocation` (#6984)
martinflorian-da Aug 27, 2026
713e1cf
Move standalone mediator ignores where they're picked up (#6982)
OriolMunoz-da Aug 27, 2026
6e96647
Exclude duplicate requests for confirmation request failure alert (#6…
martinflorian-da Aug 27, 2026
a7bed2e
Add http status label to scan failures (#6996)
nicu-da Aug 27, 2026
3fa1d34
Upgrade Canton to 3.5.15 (#7000)
moritzkiefer-da Aug 27, 2026
b80adc1
Add new ACS snapshot endpoints using opaque pagination tokens (#6995)
OriolMunoz-da Aug 27, 2026
3ce3c7f
Update cantonbft dashboards (#7002)
nicu-da Aug 27, 2026
0e5dc2a
Report how to resolve rate-limit failures in deployment-rest (#7001)
OriolMunoz-da Aug 27, 2026
b7b22de
fix loopback routes when deploying with GKE L7 ALB (#6095)
stephencompall-DA Aug 27, 2026
a79f2cf
Support for installing Sweet Security via pulumi (#6989)
isegall-da Aug 27, 2026
badeb6c
[static] remove redundant ns for sweet-operator (#7006)
isegall-da Aug 28, 2026
808b45e
Align vote reason URL width and copy with SV IDs (#6914) (#6976)
puneetfinoa Aug 28, 2026
964ff20
bump resources for deployment tests (#7009)
isegall-da Aug 28, 2026
5370647
[ci] changes post release 0.7.5 (#7005)
isegall-da Aug 28, 2026
ce85b79
SV app: deprecate `/v0/dso` in favor of authenticated `/v1/dso` (#6957)
martinflorian-da Aug 28, 2026
b134f89
Merge main into staging-0.9.0
martinflorian-da Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.deployment_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:

jobs:
deployment_test:
runs-on: self-hosted-k8s-x-small
runs-on: self-hosted-k8s-small

container:
image: us-central1-docker.pkg.dev/da-cn-shared/ghcr/digital-asset/decentralized-canton-sync-dev/docker/splice-test-ci:0.3.12
Expand Down
53 changes: 53 additions & 0 deletions .github/workflows/monthly-schedule.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Monthly Schedule

on:
workflow_dispatch:
inputs:
version:
description: "Splice version, e.g. 0.8"
required: true
type: string

month:
description: "Month in YYYY-MM format, e.g. 2026-08"
required: true
type: string

dry_run:
description: "Dry run only — do not modify Monday"
required: true
default: true
type: boolean

permissions:
contents: read

jobs:
create-schedule:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.13"

- name: Create monthly schedule
env:
MONDAY_API_TOKEN: ${{ secrets.MONDAY_API_TOKEN }}
MONDAY_BOARD_ID: ${{ secrets.MONDAY_BOARD_ID }}
shell: bash
run: |
ARGS=(
"${{ inputs.version }}"
"${{ inputs.month }}"
)

if [[ "${{ inputs.dry_run }}" == "true" ]]; then
ARGS+=("--dry-run")
fi

python3 scripts/monthly-schedule.py "${ARGS[@]}"
2 changes: 1 addition & 1 deletion LATEST_RELEASE
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.7.4
0.7.5
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.7.5
0.8.0
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,7 @@ import org.lfdecentralizedtrust.splice.codegen.java.splice.ans.AnsRules
import org.lfdecentralizedtrust.splice.config.NetworkAppClientConfig
import org.lfdecentralizedtrust.splice.environment.SpliceConsoleEnvironment
import org.lfdecentralizedtrust.splice.http.v0.definitions
import org.lfdecentralizedtrust.splice.http.v0.definitions.{
GetDsoInfoResponse,
UpdateHistoryItem,
UpdateHistoryItemV2,
}
import org.lfdecentralizedtrust.splice.http.v0.definitions.{UpdateHistoryItem, UpdateHistoryItemV2}
import org.lfdecentralizedtrust.splice.scan.{ScanApp, ScanAppBootstrap}
import org.lfdecentralizedtrust.splice.store.VoteResultsFilters
import org.lfdecentralizedtrust.splice.scan.automation.ScanAutomationService
Expand All @@ -43,6 +39,7 @@ import org.lfdecentralizedtrust.splice.util.{
ChoiceContextWithDisclosures,
Contract,
ContractWithState,
DsoInfo,
FactoryChoiceWithDisclosures,
PackageQualifiedName,
SpliceUtil,
Expand Down Expand Up @@ -89,7 +86,7 @@ abstract class ScanAppReference(
httpCommand(HttpScanAppClient.GetDsoPartyId(List()))
}

def getDsoInfo(): GetDsoInfoResponse = {
def getDsoInfo(): DsoInfo = {
consoleEnvironment.run {
httpCommand(HttpScanAppClient.GetDsoInfo(List()))
}
Expand Down Expand Up @@ -452,6 +449,31 @@ abstract class ScanAppReference(
)
}

def getAcsSnapshotAtV2(
at: CantonTimestamp,
migrationId: Long,
recordTimeMatch: Option[definitions.AcsRequestV2.RecordTimeMatch] = Some(
definitions.AcsRequestV2.RecordTimeMatch.Exact
),
after: Option[String] = None,
pageSize: Int = 100,
partyIds: Option[Vector[PartyId]] = None,
templates: Option[Vector[PackageQualifiedName]] = None,
) =
consoleEnvironment.run {
httpCommand(
HttpScanAppClient.GetAcsSnapshotAtV2(
at.toInstant.atOffset(java.time.ZoneOffset.UTC),
migrationId,
recordTimeMatch,
after,
pageSize,
partyIds,
templates,
)
)
}

def getHoldingsStateAt(
at: CantonTimestamp,
migrationId: Long,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ import org.lfdecentralizedtrust.splice.sv.config.{
}
import org.lfdecentralizedtrust.splice.sv.migration.SynchronizerNodeIdentities
import org.lfdecentralizedtrust.splice.sv.util.ValidatorOnboarding
import org.lfdecentralizedtrust.splice.util.Contract
import org.lfdecentralizedtrust.splice.util.{Contract, DsoInfo}

import java.time.Instant
import scala.concurrent.duration.FiniteDuration
Expand Down Expand Up @@ -89,9 +89,9 @@ abstract class SvAppReference(
httpCommand(HttpSvPublicAppClient.DevNetOnboardValidatorPrepare())
}

def getDsoInfo(): HttpSvPublicAppClient.DsoInfo =
def getDsoInfo(): DsoInfo =
consoleEnvironment.run {
httpCommand(HttpSvPublicAppClient.GetDsoInfo)
httpCommand(HttpSvOperatorAppClient.GetDsoInfo)
}

@Help.Summary("Get the CometBFT node status")
Expand Down Expand Up @@ -292,13 +292,10 @@ class SvAppBackendReference(
def appState: SvApp.State = _appState[SvApp.State, SvApp]

@Help.Summary(
"Returns the current delegate based automation. Do not keep references to the result, as this automation gets replaced whenever the DSO delegate changes."
"Returns the delegate based automation. The reference is stable for the lifetime of the app."
)
def dsoDelegateBasedAutomation: DsoDelegateBasedAutomationService = {
appState.dsoAutomation.restartDsoDelegateBasedAutomationTrigger.epochState
.getOrElse(throw new RuntimeException("LeaderBasedAutomation is not fully started up"))
.dsoDelegateBasedAutomation
}
def dsoDelegateBasedAutomation: DsoDelegateBasedAutomationService =
appState.dsoAutomation.dsoDelegateBasedAutomation

@Help.Summary(
"Returns the current DSO automation."
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import org.lfdecentralizedtrust.splice.scan.admin.api.client.commands.HttpScanAp
import org.lfdecentralizedtrust.splice.util.{
ChoiceContextWithDisclosures,
ContractWithState,
DsoInfo,
FactoryChoiceWithDisclosures,
}
import org.lfdecentralizedtrust.splice.validator.admin.api.client.commands.*
Expand Down Expand Up @@ -360,7 +361,7 @@ abstract class ValidatorAppReference(
}
}

def getDsoInfo(): definitions.GetDsoInfoResponse = {
def getDsoInfo(): DsoInfo = {
consoleEnvironment.run {
httpCommand(
HttpScanProxyAppClient.GetDsoInfo
Expand Down
1 change: 1 addition & 0 deletions apps/app/src/pack/examples/sv-helm/sv-values.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
joinWithKeyOnboarding:
sponsorApiUrl: "https://sv.sv-2.TARGET_HOSTNAME"
sponsorScanUrl: "https://scan.sv-2.TARGET_HOSTNAME"

# Replace YOUR_SV_NAME with the name you provided for your SV identity
onboardingName: YOUR_SV_NAME
Expand Down
1 change: 1 addition & 0 deletions apps/app/src/test/resources/include/svs/sv2.conf
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
url = "http://127.0.0.1:"${?canton.sv-apps.sv1.admin-api.port}
url = ${?SV1_URL}
}
include required("../scan-client")
# keys generated using scripts/generate-sv-keys.sh
include required("_sv2-id")
private-key = "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgYsPjtGcZLnQ3Ck35lm2805dL1Ds/JTKqlyGLbDewgEuhRANCAARV23y0sB+/7ofqzoQalgxu2FJ20RvKRQ7YVq7STbCKl//oLQD/7HMq2oomUGTJtwGIgIb9micaS4qBYEALWNUC"
Expand Down
1 change: 1 addition & 0 deletions apps/app/src/test/resources/include/svs/sv3.conf
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
url = "http://127.0.0.1:"${?canton.sv-apps.sv1.admin-api.port}
url = ${?SV1_URL}
}
include required("../scan-client")
# keys generated using scripts/generate-sv-keys.sh
include required("_sv3-id")
private-key = "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWqaaIK3+vm8fymB1ZPh6PHYk/J7GyOYUdchj4I5gpzKhRANCAATuwdANiRWKxXOe4Wq+NZbEfe7xL5/Tt/UcJn6bH7KPbzKxEmNtq082exUBuIUO7Zc6rIhPH6iz8Z3f2mI5/LDb"
Expand Down
1 change: 1 addition & 0 deletions apps/app/src/test/resources/include/svs/sv4.conf
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
url = "http://127.0.0.1:"${?canton.sv-apps.sv1.admin-api.port}
url = ${?SV1_URL}
}
include required("../scan-client")
# keys generated using scripts/generate-sv-keys.sh
include required("_sv4-id")
private-key = "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgxED/gH8AeSwNujZAVLhBRSN55Hx0ntC6FKKhgn+7h92hRANCAARkw2wMmvW5PAxMgiXNRmlR7FMupUYywPtxHhjyyphgViGV1Ux4cbnNK5t/6n5ZlssTIxQJPmcEIIGHSiJRj1ys"
Expand Down
6 changes: 6 additions & 0 deletions apps/app/src/test/resources/preflight-topology.conf
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ canton {
sv2Scan {
admin-api.url = "https://scan.sv-2-eng."${NETWORK_APPS_ADDRESS}""
}
sv3Scan {
admin-api.url = "https://scan.sv-3-eng."${NETWORK_APPS_ADDRESS}""
}
svda1Scan {
admin-api.url = "https://scan.sv-1."${NETWORK_APPS_ADDRESS}""
}
}

splitwell-app-clients {
Expand Down
2 changes: 1 addition & 1 deletion apps/app/src/test/resources/sv-preflight-topology.conf
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ canton {
}
}
scan-app-clients {
svTestScan {
svScan {
admin-api {
url = "https://scan.sv."${NETWORK_APPS_ADDRESS}""
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ class EventHistorySanityCheckPlugin(
.fromJson(exercised.choiceArgument.noSpaces)
.newSvParty == otherScan
.getDsoInfo()
.svPartyId
.svParty
.toProtoPrimitive
case _ => false
})
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import org.lfdecentralizedtrust.splice.config.ConfigTransforms.updateAllScanAppC
import org.lfdecentralizedtrust.splice.config.SpliceConfig
import org.lfdecentralizedtrust.splice.console.ScanAppBackendReference
import org.lfdecentralizedtrust.splice.http.v0.definitions.DamlValueEncoding.members.CompactJson
import org.lfdecentralizedtrust.splice.http.v0.definitions.{AcsResponseV1, UpdateHistoryItemV2}
import org.lfdecentralizedtrust.splice.http.v0.definitions.{AcsResponseV2, UpdateHistoryItemV2}
import org.lfdecentralizedtrust.splice.http.v0.definitions.UpdateHistoryItemV2.members
import org.lfdecentralizedtrust.splice.http.v0.definitions.UpdateHistoryReassignment.Event.members as reassignmentMembers
import org.lfdecentralizedtrust.splice.integration.tests.SpliceTests.SpliceTestConsoleEnvironment
Expand All @@ -15,7 +15,6 @@ import com.digitalasset.canton.ScalaFuturesWithPatience
import com.digitalasset.canton.data.CantonTimestamp
import com.digitalasset.canton.logging.SuppressingLogger
import com.digitalasset.canton.tracing.TraceContext
import org.lfdecentralizedtrust.splice.codegen.java.splice.dsorules.DsoRules
import org.lfdecentralizedtrust.splice.scan.config.ScanStorageConfigs.scanStorageConfigV1
import org.lfdecentralizedtrust.splice.store.UpdateHistory.BackfillingState
import org.scalatest.{Inspectors, LoneElement}
Expand Down Expand Up @@ -65,10 +64,9 @@ class UpdateHistorySanityCheckPlugin(
initializedScans.foreach(waitUntilBackfillingComplete)
val (founders, others) = initializedScans.partition(_.config.isFirstSv)
val founder = founders.loneElement
val dsoRules =
DsoRules.fromJson(founder.getDsoInfo().dsoRules.contract.payload.noSpaces)
val dsoRules = founder.getDsoInfo().dsoRules.payload
val (scansInDsoRules, scansNotInDsoRules) = others.partition { otherScan =>
val svPartyId = otherScan.getDsoInfo().svPartyId
val svPartyId = otherScan.getDsoInfo().svParty.toProtoPrimitive
dsoRules.svs.containsKey(svPartyId)
}
scansNotInDsoRules.foreach { notInDso =>
Expand All @@ -78,7 +76,7 @@ class UpdateHistorySanityCheckPlugin(
// - U2: Involves SV
// founder sees U1, U2 but otherScan only U2
logger.info(
s"The SV party of Scan ${notInDso.name} (partyId=${notInDso.getDsoInfo().svPartyId}) is not in DsoRules. Ignoring."
s"The SV party of Scan ${notInDso.name} (partyId=${notInDso.getDsoInfo().svParty}) is not in DsoRules. Ignoring."
)
}
compareHistories(founder, scansInDsoRules)
Expand Down Expand Up @@ -217,14 +215,14 @@ class UpdateHistorySanityCheckPlugin(
private def getAllSnapshots(
scan: ScanAppBackendReference,
before: CantonTimestamp,
acc: List[AcsResponseV1],
): List[AcsResponseV1] = {
acc: List[AcsResponseV2],
): List[AcsResponseV2] = {
val acsSnapshotPeriodHours = scanStorageConfigV1.dbAcsSnapshotPeriodHours
val migrationId = scan.getMigrationId()
scan.getDateOfMostRecentSnapshotBefore(before, migrationId) match {
case Some(snapshotDate) =>
val snapshot = scan
.getAcsSnapshotAtV1(
.getAcsSnapshotAtV2(
CantonTimestamp.assertFromInstant(snapshotDate.toInstant),
migrationId,
pageSize = 1000,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import org.lfdecentralizedtrust.splice.wallet.store.BalanceChangeTxLogEntry
import com.digitalasset.canton.config.CantonRequireTypes.InstanceName
import com.digitalasset.canton.data.CantonTimestamp
import com.digitalasset.canton.logging.{NamedLoggerFactory, NamedLogging}
import com.digitalasset.canton.topology.PartyId
import com.digitalasset.canton.topology.admin.grpc.TopologyStoreId
import com.digitalasset.canton.topology.store.TimeQuery.HeadState
import monocle.macros.syntax.lens.*
Expand Down Expand Up @@ -160,7 +161,6 @@ class AppUpgradeIntegrationTest
bobValidatorBackend.participantClient.upload_dar_unless_exists(splitwellDarPathV1)

val sv2Wallet = wc("sv2Wallet")
val sv1Client = sv_client("sv1Client")

val bob = onboardWalletUser(bobWalletClient, bobValidatorBackend)

Expand Down Expand Up @@ -208,11 +208,14 @@ class AppUpgradeIntegrationTest
clue("Testing some more transactions after 2 SVs upgraded") {
sv2Wallet.tap(1003)
sv2Wallet.balance().unlockedQty should be > BigDecimal(2000)
// p2p transfer between an upgraded validator (alice's) and a non-upgraded (sv-1's)
// p2p transfer between an upgraded validator (alice's) and a non-upgraded (sv-1's).
// Note: we cannot use sv1's (authenticated, current-version) /v1/dso to look up its
// party here, as sv1 is still running the old release at this point.
// TODO(DACH-NY/canton-network-internal#2106) clean this up once the old release is new enough
p2pTransfer(
bobValidatorWalletClient,
sv1WalletClient,
sv1Client.getDsoInfo().svParty,
PartyId.tryFromProtoPrimitive(sv1WalletClient.userStatus().party),
501,
)
sv1WalletClient.balance().unlockedQty should be > BigDecimal(400)
Expand Down Expand Up @@ -299,7 +302,7 @@ class AppUpgradeIntegrationTest
)(
"observing AmuletRules with upgraded config",
_ => {
val newAmuletRules = sv1Client.getDsoInfo().amuletRules
val newAmuletRules = sv1Backend.getDsoInfo().amuletRules
val config =
newAmuletRules.payload.configSchedule.initialValue
config.packageConfig.amulet should endWith(".123")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class ScanFrontendTimeBasedIntegrationTest
}
contract should be(
Some(
dsoInfo.dsoRules.contract.payload.asObject
dsoInfo.dsoRules.contract.toHttp.payload.asObject
.valueOrFail("This is definitely an object.")
)
)
Expand Down
Loading
Loading