Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
05a11dd
feat: multi-sync example (example 15)
Viktor-Kalashnykov-da May 11, 2026
3ac0eb2
Code Review: removed dependency on @canton-network/core-splice-client…
Viktor-Kalashnykov-da May 11, 2026
1a39f86
Code Review: refactored names of parties in logs
Viktor-Kalashnykov-da May 12, 2026
2aa3c9e
Code Review: added TokenAdmin party and replaced reassignment of Toke…
Viktor-Kalashnykov-da May 12, 2026
6dbe1f2
Code Review: removed usage of hardcoded values for adding for request…
Viktor-Kalashnykov-da May 13, 2026
a41b840
Code Review: replaced the reassignment of Bob's Token to self-transfe…
Viktor-Kalashnykov-da May 13, 2026
0360ed3
Code Review: removed Token interface disovery description from docume…
Viktor-Kalashnykov-da May 13, 2026
aa5b3db
Code Review: removed reference to token dars Troubleshooting section
Viktor-Kalashnykov-da May 13, 2026
9107d7b
Code Review: moved globalSynchronizerId() method from common.ts to n…
Viktor-Kalashnykov-da May 13, 2026
2da82a6
docs(example-15): simplify README, run all commands from repo root
jarekr-da May 20, 2026
a200b12
chore: reworking scenario - interna.reassign used
jarekr-da May 20, 2026
60e8711
feat: working version - explicit reassign
jarekr-da May 20, 2026
f7a8b00
chore(example-15): revert self-transfer token variant and remove gene…
jarekr-da May 20, 2026
dee7903
chore: fixed dar use
jarekr-da May 20, 2026
c41e310
chore: fixed wrong logger message
jarekr-da May 20, 2026
09f2e4b
refactor: move globalSynchronizerId logic out of wallet-sdk into exam…
jarekr-da May 20, 2026
eab802d
revert: restore party/external/service.ts to pre-multisync state
jarekr-da May 20, 2026
98dfc85
fix: restore multi-sync example (run-15) after rebase
jarekr-da May 20, 2026
4b07e51
Merge branch 'main' into wiktor/multisync-example
jarekr-da May 21, 2026
1219732
Merge branch 'main' into wiktor/multisync-example
jarekr-da May 21, 2026
5ba125e
fix(example-15): use URL type for registryUrl
jarekr-da May 21, 2026
571a759
fix(ci): disable multi-sync for snippets tests
jarekr-da May 21, 2026
fd87894
fix(portfolio-e2e): wait for window.canton after page navigation
jarekr-da May 21, 2026
b5ff575
Merge branch 'main' into wiktor/multisync-example
jarekr-da May 21, 2026
bca9177
fix: build fix
jarekr-da May 21, 2026
d2fa4fd
Code Review: added wrapping function for registering party on multipl…
Viktor-Kalashnykov-da May 26, 2026
3bdd4ab
Code Review: replaced usage of additional vetDar() function usage to …
Viktor-Kalashnykov-da May 26, 2026
26c81e8
Code Review: added dependency to @canton-network/core-token-standard …
Viktor-Kalashnykov-da May 26, 2026
b235c86
Code Review: simlified Amulet Minting
Viktor-Kalashnykov-da May 26, 2026
6a065b1
Code Review: Moved Amulet Template ID to Amulet Core Service
Viktor-Kalashnykov-da May 26, 2026
baed84f
Code Review: removed condition checking for Bob token reassigning to …
Viktor-Kalashnykov-da May 26, 2026
cc1eef1
Code Review: moved functionality of connected synchronizers checking …
Viktor-Kalashnykov-da May 26, 2026
3438b58
Code Review: moved constants from example 15 / _config.to to config.t…
Viktor-Kalashnykov-da May 26, 2026
e183db6
Code Review: added Codegen usage for DAML types usage in example 15
Viktor-Kalashnykov-da May 27, 2026
ca065ca
Code Review: extended party.create() method
Viktor-Kalashnykov-da May 27, 2026
7cb8f57
Code Review: refactoring
Viktor-Kalashnykov-da May 27, 2026
a70dad4
Code Review: error handling for SUBMITTER_ALWAYS_STAKEHOLDER issue th…
Viktor-Kalashnykov-da May 27, 2026
a2d929d
Code Review: refactoring
Viktor-Kalashnykov-da May 28, 2026
8db91e0
Improvement: added multi-sync tests for CI
Viktor-Kalashnykov-da May 28, 2026
43b877f
Merge branch 'main' into wiktor/multisync-example
Viktor-Kalashnykov-da May 28, 2026
c9acad5
Fixex wallet-remote-gateway build
Viktor-Kalashnykov-da May 28, 2026
9066199
Fix for CI
Viktor-Kalashnykov-da May 28, 2026
fb45fc1
Merge branch 'main' into wiktor/multisync-example
Viktor-Kalashnykov-da May 28, 2026
a95177a
Fix: post merge-conflitc resolution fix
Viktor-Kalashnykov-da May 28, 2026
68c30a4
Fix: fixed location of DAR file assumption for multi-sync example
Viktor-Kalashnykov-da May 28, 2026
4db49f8
Test: testing failure of Multi-Sync tests
Viktor-Kalashnykov-da May 28, 2026
b5fd5f9
Fix: added reassignment of Bob's Tokens to global sync again
Viktor-Kalashnykov-da May 28, 2026
c680622
Improvement: Removed unnecessary reassignments
Viktor-Kalashnykov-da May 28, 2026
61cd787
Improvement: Compensation logic for errors during settlement
Viktor-Kalashnykov-da May 28, 2026
ece364c
Improvement: splitted _trade_ops.ts + imporved competing logic for Tr…
Viktor-Kalashnykov-da May 28, 2026
7a9cb1f
Code Review: fixed comment for vertPackage() function from SDK
Viktor-Kalashnykov-da May 28, 2026
2133db8
Improvement: removed vetAllPackages parameter from vetPackage() and r…
Viktor-Kalashnykov-da May 28, 2026
c8a1ba8
Refactoring: replaced trading app core project with DARs from localnet
Viktor-Kalashnykov-da Jun 2, 2026
e606b91
feat: extended readme
jarekr-da Jun 2, 2026
be239d4
fix: changed dar name
jarekr-da Jun 8, 2026
5e83f2b
fix: use of disclosed contract
jarekr-da Jun 8, 2026
c5d42ec
fix: pass disclosed token allocation to settle call site
jarekr-da Jun 8, 2026
fbcc465
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 8, 2026
89d3712
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 8, 2026
57ad50d
feat: multi-sync example tests unification (#1912)
Viktor-Kalashnykov-da Jun 8, 2026
8da1df9
feat: used multi-sync
jarekr-da Jun 8, 2026
eaa14b2
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 8, 2026
de7299f
feat: trying damls simplification
jarekr-da Jun 8, 2026
b1b053b
feat: filtering trade proposals
jarekr-da Jun 8, 2026
7235e64
fix: removed redundant change
jarekr-da Jun 8, 2026
6313193
fix: removed redundant change
jarekr-da Jun 8, 2026
4a0a2ae
fix: removed redundant change
jarekr-da Jun 8, 2026
ae994f8
tech: added todo
jarekr-da Jun 9, 2026
6217012
fix: eliminate custom multi-synchronizer bootstrap script (#1955)
mziolekda Jun 9, 2026
70776ea
fix(docs-wallet-integration-guide-examples): poll and reassign Alice'…
jarekr-da Jun 10, 2026
b910f7a
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 10, 2026
eb08ea3
feat: extended readme
jarekr-da Jun 10, 2026
7256fbd
ci: remove outdated multi-sync TODO comment from stress-tests workflow
jarekr-da Jun 10, 2026
256fe75
docs(docs-wallet-integration-guide-examples): drop redundant --multi-…
jarekr-da Jun 10, 2026
d681417
refactor(docs-wallet-integration-guide-examples): P3 does not know ab…
jarekr-da Jun 10, 2026
18cefa6
refactor: participant names changed
jarekr-da Jun 11, 2026
f3cb71d
fix: TokenRules must be on sv
jarekr-da Jun 11, 2026
a7db2de
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 11, 2026
ad45497
feat: token standard off-ledger api for multisync example (#1974)
jarekr-da Jun 11, 2026
b5479fc
doc: improved run-15 documentation
jarekr-da Jun 11, 2026
6a85d62
review: moved warning log
jarekr-da Jun 16, 2026
3e59913
review: moved vetDar to dar namespace
jarekr-da Jun 16, 2026
3a8a838
review: throw new error improved
jarekr-da Jun 16, 2026
db1edc5
review: prepareAndExecuteOnALlSynchronizers name change
jarekr-da Jun 16, 2026
0a26dbe
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 16, 2026
1b21875
fix: build fix try
jarekr-da Jun 16, 2026
82db9a1
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 17, 2026
1bee65e
fix: removed mock check from tests
jarekr-da Jun 17, 2026
da4ff33
refactor(wallet-sdk): remove synchronizer auto-selection; callers pro…
jarekr-da Jun 9, 2026
53c560e
test(docs-wallet-integration-guide-examples): pass synchronizerId in …
jarekr-da Jun 9, 2026
42ac758
fix(core-wallet-test-utils): pass global synchronizerId to DAR upload…
jarekr-da Jun 10, 2026
7e50116
fix(docs-wallet-integration-guide-examples): pass global synchronizer…
jarekr-da Jun 10, 2026
df4f11b
fix(docs-wallet-integration-guide-examples): pass global synchronizer…
jarekr-da Jun 10, 2026
5fb4f5e
fix(docs-wallet-integration-guide-examples): pass synchronizerId to p…
jarekr-da Jun 10, 2026
0309d83
tech: removed redundant comment
jarekr-da Jun 16, 2026
f937203
fix:rebase fix
jarekr-da Jun 17, 2026
4af0f4a
fix: after rebase test fixes
jarekr-da Jun 18, 2026
8795142
review: fixes
jarekr-da Jul 17, 2026
2df9f70
review: changed throw new Error
jarekr-da Jul 17, 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
6 changes: 5 additions & 1 deletion .github/actions/setup_localnet/artifacts/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ inputs:
splice_version:
description: 'Splice version (required)'
required: true
multi_sync:
description: 'Enable multi-sync profile (default: true)'
required: false
default: 'true'
runs:
using: 'composite'
steps:
Expand All @@ -31,4 +35,4 @@ runs:

- name: Start Localnet
shell: bash
run: yarn start:localnet -- --network=${{ inputs.network }}
run: yarn start:localnet -- --network=${{ inputs.network }} ${{ inputs.multi_sync == 'false' && '--no-multi-sync' || '' }}
17 changes: 17 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,7 @@ jobs:
with:
network: ${{ matrix.network }}
splice_version: ${{ matrix.network == 'devnet' && needs.version-config.outputs.devnet_splice_version || needs.version-config.outputs.mainnet_splice_version }}
multi_sync: 'true'

- name: Start remote WK
run: yarn pm2 start ecosystem.ci.config.js --env development
Expand Down Expand Up @@ -458,6 +459,7 @@ jobs:
with:
network: ${{ matrix.network }}
splice_version: ${{ matrix.network == 'devnet' && needs.version-config.outputs.devnet_splice_version || needs.version-config.outputs.mainnet_splice_version }}
multi_sync: 'true'

- uses: ./.github/actions/check_resources

Expand Down Expand Up @@ -508,6 +510,21 @@ jobs:
with:
network: ${{ matrix.network }}
splice_version: ${{ matrix.network == 'devnet' && needs.version-config.outputs.devnet_splice_version || needs.version-config.outputs.mainnet_splice_version }}
multi_sync: 'true'

- name: Restore DPM cache
uses: actions/cache/restore@v5
with:
path: |
~/.dpm
key: dpm-${{ runner.os }}-${{ needs.version-config.outputs.daml_release_version }}

- name: Generate featured DARs
run: yarn script:generate:featured-dars

- name: Rebuild DAML-dependent packages
run: |
yarn workspace @canton-network/core-test-token build

- uses: ./.github/actions/check_resources

Expand Down
1 change: 0 additions & 1 deletion .github/workflows/stress-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ jobs:
run: yarn script:test:stress-scripts

- uses: ./.github/actions/check_resources

- name: Stop localnet (${{ github.event.inputs.network || 'devnet' }})
if: always()
run: yarn stop:localnet -- --network=${{ github.event.inputs.network || 'devnet' }}
Expand Down
69 changes: 0 additions & 69 deletions canton/multi-sync/app-synchronizer.sc

This file was deleted.

1 change: 1 addition & 0 deletions core/amulet-service/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

export * from './interface-ids.const.js'
export * from './amulet-service.js'
4 changes: 4 additions & 0 deletions core/amulet-service/src/interface-ids.const.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

export const AMULET_TEMPLATE_ID = '#splice-amulet:Splice.Amulet:Amulet'
21 changes: 16 additions & 5 deletions core/ledger-client/src/ledger-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -511,20 +511,31 @@ export class LedgerClient {
return this.valueOrError(resp)
}

// Retrieve an (arbitrary) synchronizer id from the validator.
// Retrieve the default synchronizer id from the validator.
// Prefers a synchronizer aliased 'global' or 'global-domain' over application-specific ones.
// This synchronizer id is cached for the remainder of this object's life.
public async getSynchronizerId(): Promise<string> {
if (this.synchronizerId) return this.synchronizerId
const response = await this.getWithRetry(
'/v2/state/connected-synchronizers'
)
if (!response.connectedSynchronizers?.[0]) {
const synchronizers = response.connectedSynchronizers
if (!synchronizers?.[0]) {
throw new Error('No connected synchronizers found')
}
const synchronizerId = response.connectedSynchronizers[0].synchronizerId
if (response.connectedSynchronizers.length > 1) {
const defaultEntry =
synchronizers.find((s) => s.synchronizerAlias === 'global') ??
synchronizers.find(
(s) => s.synchronizerAlias === 'global-domain'
) ??
synchronizers.find(
(s) => s.synchronizerAlias !== 'app-synchronizer'
) ??
synchronizers[0]
const synchronizerId = defaultEntry.synchronizerId
if (synchronizers.length > 1) {
this.logger.warn(
`Found ${response.connectedSynchronizers.length} synchronizers, defaulting to ${synchronizerId}`
`Found ${synchronizers.length} synchronizers, defaulting to ${synchronizerId}`
)
}
this.synchronizerId = synchronizerId
Expand Down
1 change: 1 addition & 0 deletions core/test-token/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.rollup.cache
50 changes: 50 additions & 0 deletions core/test-token/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"name": "@canton-network/core-test-token",
"version": "0.0.1",
"type": "module",
"description": "DAML codegen JS for splice-test-token-v1",
"license": "Apache-2.0",
"main": "dist/index.cjs",
"module": "dist/index.js",
"types": "dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"browser": "./dist/index.browser.js",
"import": "./dist/index.js",
"require": "./dist/index.cjs",
"default": "./dist/index.js"
}
},
"scripts": {
"build": "yarn clean && rollup -c && yarn clean:types-tmp",
"clean:types-tmp": "rm -rf dist/types",
"clean": "rm -rf dist"
},
"dependencies": {
"@daml/types": "^3.5.0",
"@mojotech/json-type-validation": "^3.1.0"
},
"devDependencies": {
"@rollup/plugin-alias": "^5.0.0",
"@rollup/plugin-commonjs": "^29.0.0",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-typescript": "^12.3.0",
"rollup": "^4.59.0",
"rollup-plugin-dts": "^6.3.0",
"tslib": "^2.8.1",
"typescript": "^5.9.3"
},
"files": [
"dist/**"
],
"publishConfig": {
"access": "public"
},
"repository": {
"type": "git",
"url": "git+https://github.com/canton-network/wallet.git",
"directory": "core/test-token"
}
}
150 changes: 150 additions & 0 deletions core/test-token/rollup.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

import typescript from '@rollup/plugin-typescript'
import commonjs from '@rollup/plugin-commonjs'
import { nodeResolve } from '@rollup/plugin-node-resolve'
import json from '@rollup/plugin-json'
import alias from '@rollup/plugin-alias'

import fs from 'node:fs'
import path from 'node:path'
import dts from 'rollup-plugin-dts'

const DAML_JS_BASE = path.resolve(
import.meta.dirname,
'../../damljs/splice-test-token-v1'
)

/** Auto-discover every @daml.js/* package present in baseDir. */
function discoverDamlJsPackages(baseDir) {
const packages = {}
for (const entry of fs.readdirSync(baseDir, { withFileTypes: true })) {
if (!entry.isDirectory()) continue
const pkgJsonPath = path.join(baseDir, entry.name, 'package.json')
if (!fs.existsSync(pkgJsonPath)) continue
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'))
if (pkgJson.name?.startsWith('@daml.js/')) {
packages[pkgJson.name] = path.join(baseDir, entry.name)
}
}
return packages
}

function buildPathsMap(packageDirs) {
const map = {}
for (const [name, pkgDir] of Object.entries(packageDirs)) {
const pkgJson = JSON.parse(
fs.readFileSync(path.join(pkgDir, 'package.json'), 'utf8')
)
const typesRel = pkgJson.types || pkgJson.typings || 'lib/index.d.ts'
const typesAbs = path.resolve(pkgDir, typesRel)
const libDir = path.resolve(pkgDir, 'lib')
map[name] = [typesAbs]
map[`${name}/*`] = [path.join(libDir, '*')]
map[`${name}/lib/*/module.js`] = [path.join(libDir, '*/module.d.ts')]
map[`${name}/lib/*/index.js`] = [path.join(libDir, '*/index.d.ts')]
}
return map
}

function buildAliasEntries(packageDirs) {
const entries = []
for (const [name, pkgDir] of Object.entries(packageDirs)) {
const pkgJson = JSON.parse(
fs.readFileSync(path.join(pkgDir, 'package.json'), 'utf8')
)
const mainAbs = path.resolve(pkgDir, pkgJson.main || 'lib/index.js')
const escapedName = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
entries.push({
find: new RegExp(`^${escapedName}/(.+)$`),
replacement: `${pkgDir}/$1`,
})
entries.push({ find: name, replacement: mainAbs })
}
return entries
}

const DAML_JS_PACKAGES = discoverDamlJsPackages(DAML_JS_BASE)
const pathsMap = buildPathsMap(DAML_JS_PACKAGES)
const damlJsAlias = alias({ entries: buildAliasEntries(DAML_JS_PACKAGES) })
const commonjsPlugin = commonjs({
transformMixedEsModules: true,
esmExternals: true,
requireReturnsDefault: false,
})

const pkgPath = path.resolve(process.cwd(), 'package.json')
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))

const exceptions = [
'@daml/types',
'@daml/ledger',
'@mojotech/json-type-validation',
]
const external = [
...Object.keys(pkg.dependencies || {}),
...Object.keys(pkg.peerDependencies || {}),
].filter((dep) => !exceptions.includes(dep))

// bundle ESM
const codeEsm = {
input: 'src/index.ts',
output: { file: 'dist/index.js', format: 'es', sourcemap: true },
external,
plugins: [damlJsAlias, json(), commonjsPlugin, nodeResolve(), typescript()],
}

// bundle CJS
const codeCjs = {
input: 'src/index.ts',
output: {
file: 'dist/index.cjs',
format: 'cjs',
interop: 'auto',
sourcemap: true,
exports: 'named',
},
external,
plugins: [damlJsAlias, json(), commonjsPlugin, nodeResolve(), typescript()],
}

// bundle for browser
const codeBrowser = {
input: 'src/index.ts',
output: {
file: 'dist/index.browser.js',
format: 'es',
sourcemap: true,
},
external,
plugins: [
damlJsAlias,
json(),
commonjsPlugin,
nodeResolve({
browser: true,
preferBuiltins: false,
}),
typescript(),
],
}

// bundle DTS including types from codegen
const types = {
input: 'src/index.ts',
output: { file: 'dist/index.d.ts', format: 'es' },
plugins: [
dts({
respectExternal: false,
compilerOptions: {
baseUrl: '.',
paths: pathsMap,
declaration: true,
emitDeclarationOnly: true,
},
}),
],
}

export default [codeEsm, codeCjs, codeBrowser, types]
Loading