Skip to content

Commit

Permalink
Update Splice from CCI (#96)
Browse files Browse the repository at this point in the history
Signed-off-by: DA Automation <[email protected]>
Co-authored-by: DA Automation <[email protected]>
  • Loading branch information
canton-network-da and DA Automation authored Nov 6, 2024
1 parent 201533b commit 0fc9f9c
Show file tree
Hide file tree
Showing 2,559 changed files with 161,926 additions and 70,003 deletions.
2 changes: 1 addition & 1 deletion LATEST_RELEASE
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.2.6
0.2.7
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ clean: cluster/clean

.PHONY: clean-all
clean-all: clean ## Completely clean all local build state, including model codegen.
sbt --batch clean-cn
sbt --batch clean-splice
find . -type d -name ".daml" -exec rm -rf {} +
find . -type d -name "target" -exec rm -rf {} +

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.2.7
0.3.0
4 changes: 2 additions & 2 deletions apps/ans/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
"devDependencies": {
"@tanstack/eslint-plugin-query": "4.29.4",
"@tanstack/react-query-devtools": "4.29.6",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "^14.0.0",
"@testing-library/jest-dom": "^6.6.2",
"@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^14.4.3",
"@trivago/prettier-plugin-sort-imports": "4.0.0",
"@types/jest": "29.2.0",
Expand Down
5 changes: 4 additions & 1 deletion apps/ans/frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@ import AuthCheck from './routes/authCheck';
import Home from './routes/home';
import PostPayment from './routes/postPayment';
import Root from './routes/root';
import { useAnsConfig } from './utils';
import { useAnsConfig, useConfigPollInterval } from './utils';

const Providers: React.FC<React.PropsWithChildren> = ({ children }) => {
const config = useAnsConfig();
const refetchInterval = useConfigPollInterval();

const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchInterval,
structuralSharing: replaceEqualDeep,
},
},
Expand Down
4 changes: 0 additions & 4 deletions apps/ans/frontend/src/hooks/queries/useEntriesWithPayData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,12 @@
// SPDX-License-Identifier: Apache-2.0
import { useQuery, UseQueryResult } from '@tanstack/react-query';
import { ListAnsEntriesResponse } from 'ans-external-openapi';
import { PollingStrategy } from 'common-frontend-utils';

import { useExternalAnsClient } from '../../context/AnsServiceContext';

const useEntriesWithPayData = (): UseQueryResult<ListAnsEntriesResponse> => {
const refetchInterval = PollingStrategy.FIXED;

const ansApi = useExternalAnsClient();
return useQuery({
refetchInterval,
queryKey: ['queryEntriesWithPayData'],
queryFn: async () => {
return ansApi.listAnsEntries();
Expand Down
2 changes: 0 additions & 2 deletions apps/ans/frontend/src/hooks/queries/useUserStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// TODO(#8515) - reuse this from wallet UI
import { useQuery, UseQueryResult } from '@tanstack/react-query';
import { useUserState } from 'common-frontend';
import { PollingStrategy } from 'common-frontend-utils';

import { useWalletClient, UserStatusResponse } from '../../context/WalletServiceContext';

Expand All @@ -12,7 +11,6 @@ export const useUserStatus = (): UseQueryResult<UserStatusResponse> => {
const { isAuthenticated } = useUserState();

return useQuery({
refetchInterval: PollingStrategy.FIXED,
queryKey: ['user-status', isAuthenticated],
queryFn: userStatus,
enabled: !!isAuthenticated,
Expand Down
11 changes: 11 additions & 0 deletions apps/ans/frontend/src/utils/config.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import {
testAuthSchema,
ConfigProvider,
useConfig,
pollIntervalSchema,
} from 'common-frontend';
import { PollingStrategy } from 'common-frontend-utils';
import React from 'react';
import { z } from 'zod';

Expand All @@ -25,6 +27,7 @@ type AnsConfig = {
testAuth?: z.infer<typeof testAuthSchema>;
services: AnsServicesConfig;
spliceInstanceNames: z.infer<typeof spliceInstanceNamesSchema>;
pollInterval?: z.infer<typeof pollIntervalSchema>;
};

const configScheme = z.object({
Expand All @@ -37,6 +40,7 @@ const configScheme = z.object({
validator: serviceSchema,
}),
spliceInstanceNames: spliceInstanceNamesSchema,
pollInterval: pollIntervalSchema,
});

export const ConfigContext = React.createContext<AnsConfig | undefined>(undefined);
Expand All @@ -52,3 +56,10 @@ export const AnsConfigProvider: React.FC<{
};

export const useAnsConfig: () => AnsConfig = () => useConfig<AnsConfig>(ConfigContext);

export const useConfigPollInterval: () => number = () => {
const config = useAnsConfig();

// Use default poll interval if not specified in config
return config.pollInterval ?? PollingStrategy.FIXED;
};
4 changes: 2 additions & 2 deletions apps/app-manager/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"devDependencies": {
"@tanstack/eslint-plugin-query": "4.29.4",
"@tanstack/react-query-devtools": "4.29.6",
"@testing-library/react": "^14.0.0",
"@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^14.4.3",
"@trivago/prettier-plugin-sort-imports": "4.0.0",
"@types/react": "18.0.28",
Expand All @@ -48,7 +48,7 @@
"typescript": "4.9.5",
"vite": "^5.4.2",
"vite-tsconfig-paths": "^4.2.1",
"vitest": "^2.0.5"
"vitest": "^2.1.4"
},
"private": true,
"scripts": {
Expand Down
1 change: 1 addition & 0 deletions apps/app/src/main/resources/application.conf
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
# This is deliberately lower than ConsoleCommandTimeout.defaultRequestTimeout
pekko.http.server.request-timeout = 38 seconds
pekko.http.server.parsing.error-handler="org.lfdecentralizedtrust.splice.http.PekkoHttpParsingErrorHandler$"
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import org.lfdecentralizedtrust.splice.util.Codec
import org.lfdecentralizedtrust.splice.validator.config.*
import org.lfdecentralizedtrust.splice.wallet.config.{
AutoAcceptTransfersConfig,
TransferPreapprovalConfig,
TreasuryConfig,
WalletAppClientConfig,
WalletSweepConfig,
Expand Down Expand Up @@ -455,18 +456,24 @@ object SpliceConfig {
implicit val approvedSvIdentityConfigReader: ConfigReader[ApprovedSvIdentityConfig] =
deriveReader[ApprovedSvIdentityConfig]
implicit val cometBftConfigReader: ConfigReader[CometBftConfig] = deriveReader
implicit val svSequencerConfig: ConfigReader[SvSequencerConfig] =
deriveReader[SvSequencerConfig].emap { sequencerConfig =>
UrlValidator
.isValid(sequencerConfig.externalPublicApiUrl)
.bimap(
invalidUrl =>
ConfigValidationFailed(s"Sequencer external url is not valid: $invalidUrl"),
_ => sequencerConfig,
)
}
implicit val sequencerPruningConfig: ConfigReader[SequencerPruningConfig] =
deriveReader[SequencerPruningConfig]
implicit val svSequencerConfig: ConfigReader[SvSequencerConfig] = {
// Somehow the implicit search seems to have trouble finding the sequencer pruning config implicit.
// Redefining it here works though.
@nowarn("cat=unused")
implicit val sequencerPruningConfig2 = sequencerPruningConfig
deriveReader[SvSequencerConfig]
.emap { sequencerConfig =>
UrlValidator
.isValid(sequencerConfig.externalPublicApiUrl)
.bimap(
invalidUrl =>
ConfigValidationFailed(s"Sequencer external url is not valid: $invalidUrl"),
_ => sequencerConfig,
)
}
}
implicit val svMediatorConfig: ConfigReader[SvMediatorConfig] =
deriveReader[SvMediatorConfig]
implicit val svScanConfig: ConfigReader[SvScanConfig] =
Expand Down Expand Up @@ -600,6 +607,16 @@ object SpliceConfig {
deriveReader[InitialInstalledApp]
implicit val appManagerConfigReader: ConfigReader[AppManagerConfig] =
deriveReader[AppManagerConfig]
implicit val transferPreapprovalConfigReader: ConfigReader[TransferPreapprovalConfig] =
deriveReader[TransferPreapprovalConfig].emap { conf =>
Either.cond(
conf.renewalDuration.duration.toSeconds < conf.preapprovalLifetime.duration.toSeconds,
conf,
ConfigValidationFailed(
"renewalDuration must be smaller than preapprovalLifetime for TransferPreapprovals"
),
)
}
implicit val migrateValidatorPartyConfigReader: ConfigReader[MigrateValidatorPartyConfig] =
deriveReader[MigrateValidatorPartyConfig]
implicit val validatorConfigReader: ConfigReader[ValidatorAppBackendConfig] =
Expand Down Expand Up @@ -855,6 +872,8 @@ object SpliceConfig {
deriveWriter[InitialInstalledApp]
implicit val appManagerConfigWriter: ConfigWriter[AppManagerConfig] =
deriveWriter[AppManagerConfig]
implicit val transferPreapprovalConfigWriter: ConfigWriter[TransferPreapprovalConfig] =
deriveWriter[TransferPreapprovalConfig]
implicit val migrateValidatorPartyConfigWriter: ConfigWriter[MigrateValidatorPartyConfig] =
deriveWriter[MigrateValidatorPartyConfig]
implicit val validatorConfigWriter: ConfigWriter[ValidatorAppBackendConfig] =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package org.lfdecentralizedtrust.splice.console
import com.daml.ledger.api.v2.CommandsOuterClass
import com.daml.ledger.api.v2.commands.{Command, DisclosedContract}
import com.daml.ledger.api.v2.event.CreatedEvent
import com.daml.ledger.api.v2.participant_offset.ParticipantOffset
import com.daml.ledger.api.v2.transaction.TransactionTree
import com.daml.ledger.javaapi
import com.daml.ledger.javaapi.data.TransactionTree as JavaTransactionTree
Expand Down Expand Up @@ -193,10 +192,8 @@ trait LedgerApiExtensions {
def treesJava(
partyIds: Set[PartyId],
completeAfter: Int,
beginOffset: ParticipantOffset = new ParticipantOffset().withBoundary(
ParticipantOffset.ParticipantBoundary.PARTICIPANT_BOUNDARY_BEGIN
),
endOffset: Option[ParticipantOffset] = None,
beginOffset: Long,
endOffset: Option[Long] = None,
verbose: Boolean = true,
timeout: NonNegativeDuration = ledgerApi.timeouts.ledgerCommand,
): Seq[JavaTransactionTree] = {
Expand Down Expand Up @@ -235,7 +232,7 @@ trait LedgerApiExtensions {
result
.get()
.toRight(
s"Failed to find contract of type ${companion.TEMPLATE_ID} after ${timeout}"
s"Failed to find contract of type ${companion.getTemplateIdWithPackageId} after ${timeout}"
)
)
}
Expand All @@ -257,7 +254,7 @@ trait LedgerApiExtensions {
partyId: PartyId,
predicate: TC => Boolean = (_: TC) => true,
): Seq[TC] = {
val filterIdentifier = PackageQualifiedName(templateCompanion.TEMPLATE_ID)
val filterIdentifier = PackageQualifiedName(templateCompanion.getTemplateIdWithPackageId)
val templateId = TemplateId(
s"#${filterIdentifier.packageName}",
filterIdentifier.qualifiedName.moduleName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ import org.lfdecentralizedtrust.splice.codegen.java.splice.amulet.FeaturedAppRig
import org.lfdecentralizedtrust.splice.codegen.java.splice.amuletrules.{
AmuletRules,
AppTransferContext,
TransferPreapproval,
}
import org.lfdecentralizedtrust.splice.codegen.java.splice.externalpartyamuletrules.{
ExternalPartyAmuletRules,
TransferCommandCounter,
}
import org.lfdecentralizedtrust.splice.codegen.java.splice.round.{
ClosedMiningRound,
Expand Down Expand Up @@ -100,6 +105,15 @@ abstract class ScanAppReference(
httpCommand(HttpScanAppClient.GetAmuletRules(None))
}

@Help.Summary(
"Returns the ExternalPartyAmuletRules."
)
def getExternalPartyAmuletRules()
: ContractWithState[ExternalPartyAmuletRules.ContractId, ExternalPartyAmuletRules] =
consoleEnvironment.run {
httpCommand(HttpScanAppClient.GetExternalPartyAmuletRules(None))
}

@Help.Summary(
"Returns the AnsRules."
)
Expand Down Expand Up @@ -140,6 +154,31 @@ abstract class ScanAppReference(
)
}

@Help.Summary("Lookup a TransferPreapproval by the receiver party")
def lookupTransferPreapprovalByParty(
party: PartyId
): Option[ContractWithState[TransferPreapproval.ContractId, TransferPreapproval]] =
consoleEnvironment.run {
httpCommand(HttpScanAppClient.LookupTransferPreapprovalByParty(party))
}

@Help.Summary("Lookup a TransferCommandCounter by the receiver party")
def lookupTransferCommandCounterByParty(
party: PartyId
): Option[ContractWithState[TransferCommandCounter.ContractId, TransferCommandCounter]] =
consoleEnvironment.run {
httpCommand(HttpScanAppClient.LookupTransferCommandCounterByParty(party))
}

@Help.Summary("Lookup the status of a TransferCommand")
def lookupTransferCommandStatus(
sender: PartyId,
nonce: Long,
): Option[definitions.LookupTransferCommandStatusResponse] =
consoleEnvironment.run {
httpCommand(HttpScanAppClient.LookupTransferCommandStatus(sender, nonce))
}

@Help.Summary(
"Get the (cached) amulet config effective now. Note that changes to the config might take some time to propagate due to the client-side caching."
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ import org.lfdecentralizedtrust.splice.environment.{
import org.lfdecentralizedtrust.splice.util.HasHealth
import com.daml.scalautil.Statement.discard
import com.digitalasset.canton.admin.api.client.commands.GrpcAdminCommand
import com.digitalasset.canton.admin.api.client.data.NodeStatus
import com.digitalasset.canton.config.NonNegativeDuration
import com.digitalasset.canton.console.commands.{
HealthAdministration,
KeyAdministrationGroup,
PartiesAdministrationGroup,
TopologyAdministrationGroup,
Expand All @@ -35,7 +35,6 @@ import com.digitalasset.canton.console.{
RemoteSequencerReference,
}
import com.digitalasset.canton.domain.sequencing.config.RemoteSequencerConfig
import com.digitalasset.canton.health.admin.data.{NodeStatus, SimpleStatus}
import com.digitalasset.canton.logging.NamedLoggerFactory
import com.digitalasset.canton.participant.config.RemoteParticipantConfig
import com.digitalasset.canton.topology.NodeIdentity
Expand All @@ -61,17 +60,13 @@ trait AppReference extends InstanceReference {
override protected val loggerFactory: NamedLoggerFactory =
consoleEnvironment.environment.loggerFactory.append("app", name)

override type Status = SimpleStatus
override type Status = SpliceStatus

// TODO(#736): remove/cleanup all the uninteresting console commands copied from Canton.
@Help.Summary("Health and diagnostic related commands")
@Help.Group("Health")
override def health =
new HealthAdministration[SimpleStatus](
this,
consoleEnvironment,
SimpleStatus.fromProtoV30,
)
// Doesn't make sense for splice
override def health = ???

// clear_cache exists to invalidate topology caches which we don't have in our apps.
override def clear_cache(): Unit = ()
Expand All @@ -95,16 +90,10 @@ trait AppReference extends InstanceReference {
def waitForInitialization(
timeout: NonNegativeDuration = spliceConsoleEnvironment.commandTimeouts.bounded,
maxBackoff: NonNegativeDuration = NonNegativeDuration.tryFromDuration(20.seconds),
): Unit =
try {
ConsoleMacros.utils.retry_until_true(timeout, maxBackoff)(
health.status.successOption.exists(_.active)
)
} catch {
case NonFatal(e) =>
noTracingLogger.error(s"Timeout while waiting for initialization of ${name}", e)
throw e
}
): Unit

// Doesn't make sense for Splice
override def adminToken = ???
}

trait HttpAppReference extends AppReference with HttpCommandRunner {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ import org.lfdecentralizedtrust.splice.sv.automation.{
import org.lfdecentralizedtrust.splice.sv.config.SvAppBackendConfig
import org.lfdecentralizedtrust.splice.sv.migration.{DomainDataSnapshot, SynchronizerNodeIdentities}
import org.lfdecentralizedtrust.splice.util.Contract
import com.digitalasset.canton.admin.api.client.data.NodeStatus
import com.digitalasset.canton.console.{BaseInspection, Help}
import com.digitalasset.canton.health.admin.data.NodeStatus
import com.digitalasset.canton.topology.{DomainId, ParticipantId, PartyId}
import com.digitalasset.canton.tracing.TraceContext
import org.apache.pekko.actor.ActorSystem
Expand Down
Loading

0 comments on commit 0fc9f9c

Please sign in to comment.