-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy path06-merge-utxos.ts
More file actions
106 lines (83 loc) · 2.96 KB
/
06-merge-utxos.ts
File metadata and controls
106 lines (83 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import pino from 'pino'
import { localNetStaticConfig, SDK } from '@canton-network/wallet-sdk'
import {
TOKEN_NAMESPACE_CONFIG,
TOKEN_PROVIDER_CONFIG_DEFAULT,
AMULET_NAMESPACE_CONFIG,
} from './utils/index.js'
const logger = pino({ name: 'v1-06-merge-utxos', level: 'info' })
const sdk = await SDK.create({
auth: TOKEN_PROVIDER_CONFIG_DEFAULT,
ledgerClientUrl: localNetStaticConfig.LOCALNET_APP_USER_LEDGER_URL,
})
const token = await sdk.token(TOKEN_NAMESPACE_CONFIG)
const amulet = await sdk.amulet(AMULET_NAMESPACE_CONFIG)
const aliceKeys = sdk.keys.generate()
const connectedSyncResponse = await sdk.ledger.state.connectedSynchronizers({})
let synchronizerId
if (
connectedSyncResponse.connectedSynchronizers &&
connectedSyncResponse.connectedSynchronizers.length > 0
) {
logger.info(
`connected synchronizers: ${connectedSyncResponse.connectedSynchronizers.map((s) => s.synchronizerId).join(', ')}`
)
synchronizerId =
connectedSyncResponse.connectedSynchronizers[0].synchronizerId
} else {
throw new Error('No connected synchronizers found')
}
const alice = await sdk.party.external
.create(aliceKeys.publicKey, {
partyHint: 'v1-06-alice',
...(synchronizerId && { synchronizerId }),
})
.sign(aliceKeys.privateKey)
.execute()
// Mint holdings for alice
const tapIndices = Array.from({ length: 15 })
const tapPromises = tapIndices.map(async () => {
const [amuletTapCommand, amuletTapDisclosedContracts] = await amulet.tap(
alice.partyId,
'2000000'
)
const synchronizerId = amuletTapDisclosedContracts[0]?.synchronizerId
return sdk.ledger
.prepare({
partyId: alice.partyId,
commands: amuletTapCommand,
disclosedContracts: amuletTapDisclosedContracts,
...(synchronizerId && { synchronizerId }),
})
.sign(aliceKeys.privateKey)
.execute({ partyId: alice.partyId })
})
await Promise.all(tapPromises)
const utxosAlice = await token.utxos.list({
partyId: alice.partyId,
})
logger.info(`number of unlocked utxos for alice ${utxosAlice.length}`)
const [mergeUtxoCommands, mergedDisclosedContracts] = await token.utxos.merge({
partyId: alice.partyId,
})
const mergePromises = mergeUtxoCommands.map((mergeCommand) => {
const synchronizerId = mergedDisclosedContracts[0]?.synchronizerId
return sdk.ledger
.prepare({
partyId: alice.partyId,
commands: mergeCommand,
disclosedContracts: mergedDisclosedContracts,
...(synchronizerId && { synchronizerId }),
})
.sign(aliceKeys.privateKey)
.execute({ partyId: alice.partyId })
})
await Promise.all(mergePromises)
const utxosAliceMerged = await token.utxos.list({
partyId: alice.partyId,
})
if (utxosAliceMerged.length === 1) {
logger.info(`utxos successfully merged from ${utxosAlice.length} to 1`)
} else {
throw new Error(`utxos not successfully merged`)
}