Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 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
9208bff
Merge branch 'main' into wiktor/multisync-example
jarekr-da May 21, 2026
bf258a1
Merge branch 'main' into wiktor/multisync-example
jarekr-da May 21, 2026
c77528d
fix(example-15): use URL type for registryUrl
jarekr-da May 21, 2026
9eeb3c5
fix(ci): disable multi-sync for snippets tests
jarekr-da May 21, 2026
51db02f
fix(portfolio-e2e): wait for window.canton after page navigation
jarekr-da May 21, 2026
a4ec492
Merge branch 'main' into wiktor/multisync-example
jarekr-da May 21, 2026
99ecc1a
fix: build fix
jarekr-da May 21, 2026
949d160
Code Review: added wrapping function for registering party on multipl…
Viktor-Kalashnykov-da May 26, 2026
3f0d98b
Code Review: replaced usage of additional vetDar() function usage to …
Viktor-Kalashnykov-da May 26, 2026
1acb599
Code Review: added dependency to @canton-network/core-token-standard …
Viktor-Kalashnykov-da May 26, 2026
266a027
Code Review: simlified Amulet Minting
Viktor-Kalashnykov-da May 26, 2026
5aaa743
Code Review: Moved Amulet Template ID to Amulet Core Service
Viktor-Kalashnykov-da May 26, 2026
b658408
Code Review: removed condition checking for Bob token reassigning to …
Viktor-Kalashnykov-da May 26, 2026
0324a64
Code Review: moved functionality of connected synchronizers checking …
Viktor-Kalashnykov-da May 26, 2026
590cbb0
Code Review: moved constants from example 15 / _config.to to config.t…
Viktor-Kalashnykov-da May 26, 2026
1b18776
Code Review: added Codegen usage for DAML types usage in example 15
Viktor-Kalashnykov-da May 27, 2026
0828460
Code Review: extended party.create() method
Viktor-Kalashnykov-da May 27, 2026
e0d4658
Code Review: refactoring
Viktor-Kalashnykov-da May 27, 2026
298d493
Code Review: error handling for SUBMITTER_ALWAYS_STAKEHOLDER issue th…
Viktor-Kalashnykov-da May 27, 2026
fbfa773
Code Review: refactoring
Viktor-Kalashnykov-da May 28, 2026
2544ac3
Improvement: added multi-sync tests for CI
Viktor-Kalashnykov-da May 28, 2026
b5bcf4e
Merge branch 'main' into wiktor/multisync-example
Viktor-Kalashnykov-da May 28, 2026
db937f6
Fixex wallet-remote-gateway build
Viktor-Kalashnykov-da May 28, 2026
8c767fc
Fix for CI
Viktor-Kalashnykov-da May 28, 2026
f1f47b0
Merge branch 'main' into wiktor/multisync-example
Viktor-Kalashnykov-da May 28, 2026
ef06df8
Fix: post merge-conflitc resolution fix
Viktor-Kalashnykov-da May 28, 2026
02bb542
Fix: fixed location of DAR file assumption for multi-sync example
Viktor-Kalashnykov-da May 28, 2026
2630049
Test: testing failure of Multi-Sync tests
Viktor-Kalashnykov-da May 28, 2026
33b407e
Fix: added reassignment of Bob's Tokens to global sync again
Viktor-Kalashnykov-da May 28, 2026
a293498
Improvement: Removed unnecessary reassignments
Viktor-Kalashnykov-da May 28, 2026
be2e11e
Improvement: Compensation logic for errors during settlement
Viktor-Kalashnykov-da May 28, 2026
fff4dd6
Improvement: splitted _trade_ops.ts + imporved competing logic for Tr…
Viktor-Kalashnykov-da May 28, 2026
b5f1a3b
Code Review: fixed comment for vertPackage() function from SDK
Viktor-Kalashnykov-da May 28, 2026
0d08ac1
Improvement: removed vetAllPackages parameter from vetPackage() and r…
Viktor-Kalashnykov-da May 28, 2026
9c7d2ea
Refactoring: replaced trading app core project with DARs from localnet
Viktor-Kalashnykov-da Jun 2, 2026
687a8ce
feat: extended readme
jarekr-da Jun 2, 2026
a0a6aa8
fix: changed dar name
jarekr-da Jun 8, 2026
4e534d7
fix: use of disclosed contract
jarekr-da Jun 8, 2026
0901820
fix: pass disclosed token allocation to settle call site
jarekr-da Jun 8, 2026
66e10f5
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 8, 2026
c657f73
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 8, 2026
b6aac2f
feat: multi-sync example tests unification (#1912)
Viktor-Kalashnykov-da Jun 8, 2026
7ef18b0
feat: used multi-sync
jarekr-da Jun 8, 2026
64b4d9a
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 8, 2026
1eeede0
feat: trying damls simplification
jarekr-da Jun 8, 2026
933d527
feat: filtering trade proposals
jarekr-da Jun 8, 2026
e542e4c
fix: removed redundant change
jarekr-da Jun 8, 2026
40c3409
fix: removed redundant change
jarekr-da Jun 8, 2026
2f72a00
fix: removed redundant change
jarekr-da Jun 8, 2026
ea5626e
tech: added todo
jarekr-da Jun 9, 2026
637a4c3
fix: eliminate custom multi-synchronizer bootstrap script (#1955)
mziolekda Jun 9, 2026
3db4194
fix(docs-wallet-integration-guide-examples): poll and reassign Alice'…
jarekr-da Jun 10, 2026
aabfd00
Merge branch 'main' into wiktor/multisync-example
jarekr-da Jun 10, 2026
9a349e7
feat: extended readme
jarekr-da Jun 10, 2026
c461f0d
ci: remove outdated multi-sync TODO comment from stress-tests workflow
jarekr-da Jun 10, 2026
3b7c631
docs(docs-wallet-integration-guide-examples): drop redundant --multi-…
jarekr-da Jun 10, 2026
78a5460
refactor(docs-wallet-integration-guide-examples): P3 does not know ab…
jarekr-da Jun 10, 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 @@ -389,6 +389,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 @@ -450,6 +451,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 @@ -500,6 +502,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 @@ -505,20 +505,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
51 changes: 51 additions & 0 deletions core/test-token/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
{
"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",
"packageManager": "yarn@4.9.4",
"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
Loading