@layerzerolabs/common-canton 1.2.8 → 1.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.turbo/turbo-build.log +665 -667
  2. package/.turbo/turbo-test.log +12 -12
  3. package/dist/3K5JL2TP.js +71 -0
  4. package/dist/3K5JL2TP.js.map +1 -0
  5. package/dist/{SLTAV2JF.js → ANKLDEGA.js} +3 -3
  6. package/dist/{SLTAV2JF.js.map → ANKLDEGA.js.map} +1 -1
  7. package/dist/{ESNOKXKB.js → ATWV2RHX.js} +4 -4
  8. package/dist/{ESNOKXKB.js.map → ATWV2RHX.js.map} +1 -1
  9. package/dist/{NRSV2VHQ.js → AWR6H7TM.js} +3 -3
  10. package/dist/{NRSV2VHQ.js.map → AWR6H7TM.js.map} +1 -1
  11. package/dist/{4G6A7TFX.js → DSYVONFP.js} +3 -3
  12. package/dist/{4G6A7TFX.js.map → DSYVONFP.js.map} +1 -1
  13. package/dist/{3ZCDWNJG.js → FR4CYWZT.js} +72 -128
  14. package/dist/FR4CYWZT.js.map +1 -0
  15. package/dist/{ST5U5WZ4.js → ZZCNITRN.js} +3 -3
  16. package/dist/{ST5U5WZ4.js.map → ZZCNITRN.js.map} +1 -1
  17. package/dist/client/amulet.js +2 -2
  18. package/dist/client/canton-client.d.ts +1 -1
  19. package/dist/client/canton-client.d.ts.map +1 -1
  20. package/dist/client/canton-client.js +3 -3
  21. package/dist/client/grpc.js +2 -2
  22. package/dist/client/index.js +8 -8
  23. package/dist/errors.d.ts +21 -0
  24. package/dist/errors.d.ts.map +1 -1
  25. package/dist/errors.js +1 -1
  26. package/dist/index.js +12 -12
  27. package/dist/provider.js +9 -9
  28. package/dist/refresh/index.js +3 -3
  29. package/dist/refresh/resolve.js +3 -3
  30. package/dist/sdk/canton-sdk.js +2 -2
  31. package/dist/sdk/index.js +2 -2
  32. package/package.json +10 -10
  33. package/src/client/canton-client.ts +110 -131
  34. package/src/errors.ts +51 -0
  35. package/dist/3ZCDWNJG.js.map +0 -1
  36. package/dist/A7Z5O57E.js +0 -34
  37. package/dist/A7Z5O57E.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/amulet.ts"],"names":["AMULET_INSTRUMENT_ID","CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS","fetchAmuletContext","walletUrl","token","instrumentId","now","Date","later","getTime","response","fetch","URL","method","headers","Authorization","body","JSON","stringify","choiceArguments","expectedAdmin","admin","transfer","sender","receiver","amount","requestedAt","toISOString","executeBefore","inputHoldingCids","meta","values","extraArgs","context","ok","text","CantonProtocolError","status","data","json","disclosedContracts","choiceContextData","amuletContext","choiceContext","injectExternalPartyAmuletRules","externalRulesContract","find","contract","templateId","includes","NonRetryableError","tag","value","contractId","externalPartyAmuletRulesCid","fetchDsoParty","dso_party_id"],"mappings":";;;;AAeO,IAAMA,oBAAAA,GAAuB;AAepC,IAAMC,sCAAAA,GAAyC,KAAK,EAAA,GAAK,GAAA;AAUlD,IAAMC,kBAAAA,mBAAqB,MAAA,CAAA,OAC9BC,SAAAA,EACAC,KAAAA,EACAC,YAAAA,KAAAA;AAEA,EAAA,MAAMC,GAAAA,uBAAUC,IAAAA,EAAAA;AAChB,EAAA,MAAMC,QAAQ,IAAID,IAAAA,CAAKD,GAAAA,CAAIG,OAAAA,KAAYR,sCAAAA,CAAAA;AAEvC,EAAA,MAAMS,WAAW,MAAMC,KAAAA,CACnB,IAAIC,GAAAA,CACA,gFAAA,EACAT,SAAAA,CAAAA,EAEJ;IACIU,MAAAA,EAAQ,MAAA;IACRC,OAAAA,EAAS;AACLC,MAAAA,aAAAA,EAAe,UAAUX,KAAAA,CAAAA,CAAAA;MACzB,cAAA,EAAgB;AACpB,KAAA;AACAY,IAAAA,IAAAA,EAAMC,KAAKC,SAAAA,CAAU;MACjBC,eAAAA,EAAiB;AACbC,QAAAA,aAAAA,EAAef,YAAAA,CAAagB,KAAAA;QAC5BC,QAAAA,EAAU;AACNC,UAAAA,MAAAA,EAAQlB,YAAAA,CAAagB,KAAAA;AACrBG,UAAAA,QAAAA,EAAUnB,YAAAA,CAAagB,KAAAA;UACvBI,MAAAA,EAAQ,GAAA;AACRpB,UAAAA,YAAAA;AACAqB,UAAAA,WAAAA,EAAapB,IAAIqB,WAAAA,EAAW;AAC5BC,UAAAA,aAAAA,EAAepB,MAAMmB,WAAAA,EAAW;AAChCE,UAAAA,gBAAAA,EAAkB,EAAA;UAClBC,IAAAA,EAAM;AAAEC,YAAAA,MAAAA,EAAQ;AAAG;AACvB,SAAA;QACAC,SAAAA,EAAW;UAAEC,OAAAA,EAAS;AAAEF,YAAAA,MAAAA,EAAQ;AAAG,WAAA;UAAGD,IAAAA,EAAM;AAAEC,YAAAA,MAAAA,EAAQ;AAAG;AAAE;AAC/D;KACJ;GACJ,CAAA;AAGJ,EAAA,IAAI,CAACrB,SAASwB,EAAAA,EAAI;AACd,IAAA,MAAMC,IAAAA,GAAO,MAAMzB,QAAAA,CAASyB,IAAAA,EAAI;AAChC,IAAA,MAAM,IAAIC,mBAAAA,CAAoB,CAAA,8BAAA,EAAiC1B,SAAS2B,MAAM,CAAA,CAAA,EAAIF,IAAAA,CAAAA,CAAM,CAAA;AAC5F,EAAA;AAEA,EAAA,MAAMG,IAAAA,GAAQ,MAAM5B,QAAAA,CAAS6B,IAAAA,EAAI;AACjC,EAAA,MAAM,EAAEC,kBAAAA,EAAoBC,iBAAAA,EAAmBC,aAAAA,KAAkBJ,IAAAA,CAAKK,aAAAA;AAEtE,EAAA,OAAO;AAAED,IAAAA,aAAAA;AAAeF,IAAAA;AAAmB,GAAA;AAC/C,CAAA,EA/CkC,oBAAA;AAkD3B,IAAMI,8BAAAA,mBAAiC,MAAA,CAAA,CAC1CF,aAAAA,EACAF,kBAAAA,KAAAA;AAEA,EAAA,MAAMK,qBAAAA,GAAwBL,mBAAmBM,IAAAA,CAAK,CAACC,aACnDA,QAAAA,CAASC,UAAAA,EAAYC,QAAAA,CAAS,0BAAA,CAAA,CAAA;AAGlC,EAAA,IAAI,CAACJ,qBAAAA,EAAuB;AACxB,IAAA,MAAM,IAAIK,kBACN,+EAAA,CAAA;AAER,EAAA;AAEA,EAAA,OAAO;IACHR,aAAAA,EAAe;MACXX,MAAAA,EAAQ;AACJ,QAAA,GAAGW,aAAAA,CAAcX,MAAAA;QACjB,6BAAA,EAA+B;UAC3BoB,GAAAA,EAAK,eAAA;AACLC,UAAAA,KAAAA,EAAOP,qBAAAA,CAAsBQ;AACjC;AACJ;AACJ,KAAA;AACAC,IAAAA,2BAAAA,EAA6BT,qBAAAA,CAAsBQ;AACvD,GAAA;AACJ,CAAA,EA1B8C,gCAAA;AA6BvC,IAAME,aAAAA,mBAAgB,MAAA,CAAA,OAAOpD,SAAAA,EAAmBC,KAAAA,KAAAA;AACnD,EAAA,MAAMM,WAAW,MAAMC,KAAAA,CAAM,IAAIC,GAAAA,CAAI,2CAAA,EAA6CT,SAAAA,CAAAA,EAAY;IAC1FW,OAAAA,EAAS;AAAEC,MAAAA,aAAAA,EAAe,UAAUX,KAAAA,CAAAA;AAAQ;GAChD,CAAA;AACA,EAAA,IAAI,CAACM,SAASwB,EAAAA,EAAI;AACd,IAAA,MAAM,IAAIE,mBAAAA,CAAoB,CAAA,yBAAA,EAA4B1B,QAAAA,CAAS2B,MAAM,CAAA,CAAE,CAAA;AAC/E,EAAA;AACA,EAAA,MAAMC,IAAAA,GAAQ,MAAM5B,QAAAA,CAAS6B,IAAAA,EAAI;AACjC,EAAA,OAAOD,IAAAA,CAAKkB,YAAAA;AAChB,CAAA,EAT6B,eAAA","file":"4G6A7TFX.js","sourcesContent":["import { NonRetryableError } from '@layerzerolabs/common-error-utils';\n\nimport type { TokenProvider } from '../auth/token-provider';\nimport { CantonProtocolError } from '../errors';\nimport type { DisclosedContract } from '../open-api/models';\n\n/** Validator-wallet access a {@link CantonClient} needs to serve amulet endpoints. */\nexport type CantonClientWalletConfig = {\n /** Validator wallet URL for scan-proxy CIP-56 endpoints. */\n walletUrl: string;\n /** Bearer-token source for wallet requests. */\n tokenProvider: TokenProvider;\n};\n\n/** The single Amulet instrument id used across Canton Network fee flows. */\nexport const AMULET_INSTRUMENT_ID = 'Amulet';\n\n/** Instrument identifier for an amulet context probe. */\nexport type InstrumentId = { admin: string; id: string };\n\n/** DAML ChoiceContext — a bag of named AnyValues passed to fee-bearing choices. */\nexport type ChoiceContext = { values: Record<string, unknown> };\n\nexport type AmuletContextResult = {\n amuletContext: ChoiceContext;\n disclosedContracts: DisclosedContract[];\n externalPartyAmuletRulesCid: string;\n};\n\n// The probe (amount 0, sender = receiver = admin) never executes — it only fetches context; 1-hour window is ample.\nconst CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS = 60 * 60 * 1000;\n\ntype AmuletContextResponse = {\n choiceContext: {\n disclosedContracts: DisclosedContract[];\n choiceContextData: ChoiceContext;\n };\n};\n\n/** Amulet ChoiceContext from the validator scan-proxy — same call for all fee-bearing choices. */\nexport const fetchAmuletContext = async (\n walletUrl: string,\n token: string,\n instrumentId: InstrumentId,\n): Promise<{ amuletContext: ChoiceContext; disclosedContracts: DisclosedContract[] }> => {\n const now = new Date();\n const later = new Date(now.getTime() + CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS);\n\n const response = await fetch(\n new URL(\n '/api/validator/v0/scan-proxy/registry/transfer-instruction/v1/transfer-factory',\n walletUrl,\n ),\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n choiceArguments: {\n expectedAdmin: instrumentId.admin,\n transfer: {\n sender: instrumentId.admin,\n receiver: instrumentId.admin,\n amount: '0',\n instrumentId,\n requestedAt: now.toISOString(),\n executeBefore: later.toISOString(),\n inputHoldingCids: [],\n meta: { values: {} },\n },\n extraArgs: { context: { values: {} }, meta: { values: {} } },\n },\n }),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new CantonProtocolError(`Failed to get amulet context: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as AmuletContextResponse;\n const { disclosedContracts, choiceContextData: amuletContext } = data.choiceContext;\n\n return { amuletContext, disclosedContracts };\n};\n\n/** Injects ExternalPartyAmuletRules cid into the ChoiceContext — required by every flow hitting FeeUtils.validateContext. */\nexport const injectExternalPartyAmuletRules = (\n amuletContext: ChoiceContext,\n disclosedContracts: DisclosedContract[],\n): { amuletContext: ChoiceContext; externalPartyAmuletRulesCid: string } => {\n const externalRulesContract = disclosedContracts.find((contract) =>\n contract.templateId?.includes('ExternalPartyAmuletRules'),\n );\n\n if (!externalRulesContract) {\n throw new NonRetryableError(\n 'ExternalPartyAmuletRules not found in disclosed contracts from amulet context',\n );\n }\n\n return {\n amuletContext: {\n values: {\n ...amuletContext.values,\n 'external-party-amulet-rules': {\n tag: 'AV_ContractId',\n value: externalRulesContract.contractId,\n },\n },\n },\n externalPartyAmuletRulesCid: externalRulesContract.contractId,\n };\n};\n\n/** Fetch the DSO party id from the validator scan-proxy API. */\nexport const fetchDsoParty = async (walletUrl: string, token: string): Promise<string> => {\n const response = await fetch(new URL('/api/validator/v0/scan-proxy/dso-party-id', walletUrl), {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) {\n throw new CantonProtocolError(`Failed to get DSO party: ${response.status}`);\n }\n const data = (await response.json()) as { dso_party_id: string };\n return data.dso_party_id;\n};\n"]}
1
+ {"version":3,"sources":["../src/client/amulet.ts"],"names":["AMULET_INSTRUMENT_ID","CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS","fetchAmuletContext","walletUrl","token","instrumentId","now","Date","later","getTime","response","fetch","URL","method","headers","Authorization","body","JSON","stringify","choiceArguments","expectedAdmin","admin","transfer","sender","receiver","amount","requestedAt","toISOString","executeBefore","inputHoldingCids","meta","values","extraArgs","context","ok","text","CantonProtocolError","status","data","json","disclosedContracts","choiceContextData","amuletContext","choiceContext","injectExternalPartyAmuletRules","externalRulesContract","find","contract","templateId","includes","NonRetryableError","tag","value","contractId","externalPartyAmuletRulesCid","fetchDsoParty","dso_party_id"],"mappings":";;;;AAeO,IAAMA,oBAAAA,GAAuB;AAepC,IAAMC,sCAAAA,GAAyC,KAAK,EAAA,GAAK,GAAA;AAUlD,IAAMC,kBAAAA,mBAAqB,MAAA,CAAA,OAC9BC,SAAAA,EACAC,KAAAA,EACAC,YAAAA,KAAAA;AAEA,EAAA,MAAMC,GAAAA,uBAAUC,IAAAA,EAAAA;AAChB,EAAA,MAAMC,QAAQ,IAAID,IAAAA,CAAKD,GAAAA,CAAIG,OAAAA,KAAYR,sCAAAA,CAAAA;AAEvC,EAAA,MAAMS,WAAW,MAAMC,KAAAA,CACnB,IAAIC,GAAAA,CACA,gFAAA,EACAT,SAAAA,CAAAA,EAEJ;IACIU,MAAAA,EAAQ,MAAA;IACRC,OAAAA,EAAS;AACLC,MAAAA,aAAAA,EAAe,UAAUX,KAAAA,CAAAA,CAAAA;MACzB,cAAA,EAAgB;AACpB,KAAA;AACAY,IAAAA,IAAAA,EAAMC,KAAKC,SAAAA,CAAU;MACjBC,eAAAA,EAAiB;AACbC,QAAAA,aAAAA,EAAef,YAAAA,CAAagB,KAAAA;QAC5BC,QAAAA,EAAU;AACNC,UAAAA,MAAAA,EAAQlB,YAAAA,CAAagB,KAAAA;AACrBG,UAAAA,QAAAA,EAAUnB,YAAAA,CAAagB,KAAAA;UACvBI,MAAAA,EAAQ,GAAA;AACRpB,UAAAA,YAAAA;AACAqB,UAAAA,WAAAA,EAAapB,IAAIqB,WAAAA,EAAW;AAC5BC,UAAAA,aAAAA,EAAepB,MAAMmB,WAAAA,EAAW;AAChCE,UAAAA,gBAAAA,EAAkB,EAAA;UAClBC,IAAAA,EAAM;AAAEC,YAAAA,MAAAA,EAAQ;AAAG;AACvB,SAAA;QACAC,SAAAA,EAAW;UAAEC,OAAAA,EAAS;AAAEF,YAAAA,MAAAA,EAAQ;AAAG,WAAA;UAAGD,IAAAA,EAAM;AAAEC,YAAAA,MAAAA,EAAQ;AAAG;AAAE;AAC/D;KACJ;GACJ,CAAA;AAGJ,EAAA,IAAI,CAACrB,SAASwB,EAAAA,EAAI;AACd,IAAA,MAAMC,IAAAA,GAAO,MAAMzB,QAAAA,CAASyB,IAAAA,EAAI;AAChC,IAAA,MAAM,IAAIC,mBAAAA,CAAoB,CAAA,8BAAA,EAAiC1B,SAAS2B,MAAM,CAAA,CAAA,EAAIF,IAAAA,CAAAA,CAAM,CAAA;AAC5F,EAAA;AAEA,EAAA,MAAMG,IAAAA,GAAQ,MAAM5B,QAAAA,CAAS6B,IAAAA,EAAI;AACjC,EAAA,MAAM,EAAEC,kBAAAA,EAAoBC,iBAAAA,EAAmBC,aAAAA,KAAkBJ,IAAAA,CAAKK,aAAAA;AAEtE,EAAA,OAAO;AAAED,IAAAA,aAAAA;AAAeF,IAAAA;AAAmB,GAAA;AAC/C,CAAA,EA/CkC,oBAAA;AAkD3B,IAAMI,8BAAAA,mBAAiC,MAAA,CAAA,CAC1CF,aAAAA,EACAF,kBAAAA,KAAAA;AAEA,EAAA,MAAMK,qBAAAA,GAAwBL,mBAAmBM,IAAAA,CAAK,CAACC,aACnDA,QAAAA,CAASC,UAAAA,EAAYC,QAAAA,CAAS,0BAAA,CAAA,CAAA;AAGlC,EAAA,IAAI,CAACJ,qBAAAA,EAAuB;AACxB,IAAA,MAAM,IAAIK,kBACN,+EAAA,CAAA;AAER,EAAA;AAEA,EAAA,OAAO;IACHR,aAAAA,EAAe;MACXX,MAAAA,EAAQ;AACJ,QAAA,GAAGW,aAAAA,CAAcX,MAAAA;QACjB,6BAAA,EAA+B;UAC3BoB,GAAAA,EAAK,eAAA;AACLC,UAAAA,KAAAA,EAAOP,qBAAAA,CAAsBQ;AACjC;AACJ;AACJ,KAAA;AACAC,IAAAA,2BAAAA,EAA6BT,qBAAAA,CAAsBQ;AACvD,GAAA;AACJ,CAAA,EA1B8C,gCAAA;AA6BvC,IAAME,aAAAA,mBAAgB,MAAA,CAAA,OAAOpD,SAAAA,EAAmBC,KAAAA,KAAAA;AACnD,EAAA,MAAMM,WAAW,MAAMC,KAAAA,CAAM,IAAIC,GAAAA,CAAI,2CAAA,EAA6CT,SAAAA,CAAAA,EAAY;IAC1FW,OAAAA,EAAS;AAAEC,MAAAA,aAAAA,EAAe,UAAUX,KAAAA,CAAAA;AAAQ;GAChD,CAAA;AACA,EAAA,IAAI,CAACM,SAASwB,EAAAA,EAAI;AACd,IAAA,MAAM,IAAIE,mBAAAA,CAAoB,CAAA,yBAAA,EAA4B1B,QAAAA,CAAS2B,MAAM,CAAA,CAAE,CAAA;AAC/E,EAAA;AACA,EAAA,MAAMC,IAAAA,GAAQ,MAAM5B,QAAAA,CAAS6B,IAAAA,EAAI;AACjC,EAAA,OAAOD,IAAAA,CAAKkB,YAAAA;AAChB,CAAA,EAT6B,eAAA","file":"DSYVONFP.js","sourcesContent":["import { NonRetryableError } from '@layerzerolabs/common-error-utils';\n\nimport type { TokenProvider } from '../auth/token-provider';\nimport { CantonProtocolError } from '../errors';\nimport type { DisclosedContract } from '../open-api/models';\n\n/** Validator-wallet access a {@link CantonClient} needs to serve amulet endpoints. */\nexport type CantonClientWalletConfig = {\n /** Validator wallet URL for scan-proxy CIP-56 endpoints. */\n walletUrl: string;\n /** Bearer-token source for wallet requests. */\n tokenProvider: TokenProvider;\n};\n\n/** The single Amulet instrument id used across Canton Network fee flows. */\nexport const AMULET_INSTRUMENT_ID = 'Amulet';\n\n/** Instrument identifier for an amulet context probe. */\nexport type InstrumentId = { admin: string; id: string };\n\n/** DAML ChoiceContext — a bag of named AnyValues passed to fee-bearing choices. */\nexport type ChoiceContext = { values: Record<string, unknown> };\n\nexport type AmuletContextResult = {\n amuletContext: ChoiceContext;\n disclosedContracts: DisclosedContract[];\n externalPartyAmuletRulesCid: string;\n};\n\n// The probe (amount 0, sender = receiver = admin) never executes — it only fetches context; 1-hour window is ample.\nconst CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS = 60 * 60 * 1000;\n\ntype AmuletContextResponse = {\n choiceContext: {\n disclosedContracts: DisclosedContract[];\n choiceContextData: ChoiceContext;\n };\n};\n\n/** Amulet ChoiceContext from the validator scan-proxy — same call for all fee-bearing choices. */\nexport const fetchAmuletContext = async (\n walletUrl: string,\n token: string,\n instrumentId: InstrumentId,\n): Promise<{ amuletContext: ChoiceContext; disclosedContracts: DisclosedContract[] }> => {\n const now = new Date();\n const later = new Date(now.getTime() + CONTEXT_PROBE_EXECUTE_BEFORE_WINDOW_MS);\n\n const response = await fetch(\n new URL(\n '/api/validator/v0/scan-proxy/registry/transfer-instruction/v1/transfer-factory',\n walletUrl,\n ),\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n choiceArguments: {\n expectedAdmin: instrumentId.admin,\n transfer: {\n sender: instrumentId.admin,\n receiver: instrumentId.admin,\n amount: '0',\n instrumentId,\n requestedAt: now.toISOString(),\n executeBefore: later.toISOString(),\n inputHoldingCids: [],\n meta: { values: {} },\n },\n extraArgs: { context: { values: {} }, meta: { values: {} } },\n },\n }),\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new CantonProtocolError(`Failed to get amulet context: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as AmuletContextResponse;\n const { disclosedContracts, choiceContextData: amuletContext } = data.choiceContext;\n\n return { amuletContext, disclosedContracts };\n};\n\n/** Injects ExternalPartyAmuletRules cid into the ChoiceContext — required by every flow hitting FeeUtils.validateContext. */\nexport const injectExternalPartyAmuletRules = (\n amuletContext: ChoiceContext,\n disclosedContracts: DisclosedContract[],\n): { amuletContext: ChoiceContext; externalPartyAmuletRulesCid: string } => {\n const externalRulesContract = disclosedContracts.find((contract) =>\n contract.templateId?.includes('ExternalPartyAmuletRules'),\n );\n\n if (!externalRulesContract) {\n throw new NonRetryableError(\n 'ExternalPartyAmuletRules not found in disclosed contracts from amulet context',\n );\n }\n\n return {\n amuletContext: {\n values: {\n ...amuletContext.values,\n 'external-party-amulet-rules': {\n tag: 'AV_ContractId',\n value: externalRulesContract.contractId,\n },\n },\n },\n externalPartyAmuletRulesCid: externalRulesContract.contractId,\n };\n};\n\n/** Fetch the DSO party id from the validator scan-proxy API. */\nexport const fetchDsoParty = async (walletUrl: string, token: string): Promise<string> => {\n const response = await fetch(new URL('/api/validator/v0/scan-proxy/dso-party-id', walletUrl), {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) {\n throw new CantonProtocolError(`Failed to get DSO party: ${response.status}`);\n }\n const data = (await response.json()) as { dso_party_id: string };\n return data.dso_party_id;\n};\n"]}
@@ -1,7 +1,8 @@
1
+ import { fetchDsoParty, fetchAmuletContext, injectExternalPartyAmuletRules } from './DSYVONFP.js';
1
2
  import { DefaultApi } from './TZTIULG5.js';
2
3
  import { JsActiveContractFromJSON } from './NIN7X4D3.js';
3
- import { fetchDsoParty, fetchAmuletContext, injectExternalPartyAmuletRules } from './4G6A7TFX.js';
4
- import { CantonProtocolError, CantonTransportError } from './A7Z5O57E.js';
4
+ import { ResponseError } from './KBNUN3MF.js';
5
+ import { CantonProtocolError, cantonApiErrorFromResponse, CantonTransportError, CantonApiError } from './3K5JL2TP.js';
5
6
  import { __name } from './VUOMXK5T.js';
6
7
  import { once } from 'es-toolkit';
7
8
  import { randomUUID } from 'crypto';
@@ -53,32 +54,18 @@ var CantonClient = class {
53
54
  return obj[pascal] ?? obj[camel];
54
55
  }
55
56
  /**
56
- * Try to extract error body from API response.
57
- * Returns the parsed body or null if extraction fails.
57
+ * Run an API call, normalizing a thrown `ResponseError` into a `CantonApiError`
58
+ * that carries `errorCategory` (for retry classification). Other errors pass through.
58
59
  */
59
- async #extractErrorBody(err) {
60
- if (err && typeof err === "object" && "response" in err) {
61
- const resp = err.response;
62
- if (resp && typeof resp.json === "function") {
63
- return await resp.json().catch(() => null);
60
+ async #invoke(call) {
61
+ try {
62
+ return await call();
63
+ } catch (err) {
64
+ if (err instanceof ResponseError) {
65
+ throw await cantonApiErrorFromResponse(err.response);
64
66
  }
67
+ throw err;
65
68
  }
66
- return null;
67
- }
68
- /**
69
- * Throw a CantonProtocolError with extracted error details from API response.
70
- * Handles the common pattern of extracting JSON error details from failed requests.
71
- *
72
- * @param err - The caught error
73
- * @param context - Description of the operation (e.g., "DAR upload", "Party allocation")
74
- * @throws CantonProtocolError with extracted error details, or re-throws original error
75
- */
76
- async #throwApiError(err, context) {
77
- const body = await this.#extractErrorBody(err);
78
- if (body) {
79
- throw new CantonProtocolError(`${context} failed: ${JSON.stringify(body)}`);
80
- }
81
- throw err;
82
69
  }
83
70
  /**
84
71
  * Build party-based filter object for event queries.
@@ -152,7 +139,7 @@ var CantonClient = class {
152
139
  * Returns all connected synchronizer IDs.
153
140
  */
154
141
  async connectedSynchronizers() {
155
- const response = await this.#api.getV2StateConnectedSynchronizers();
142
+ const response = await this.#invoke(() => this.#api.getV2StateConnectedSynchronizers());
156
143
  const synchronizers = response.connectedSynchronizers ?? [];
157
144
  return synchronizers.map((s) => s.synchronizerId).filter((id) => !!id);
158
145
  }
@@ -191,22 +178,16 @@ var CantonClient = class {
191
178
  synchronizerId
192
179
  };
193
180
  try {
194
- return await this.#api.postV2Dars(request);
181
+ return await this.#invoke(() => this.#api.postV2Dars(request));
195
182
  } catch (err) {
196
- if (opts.skipIfVetted) {
197
- const body2 = await this.#extractErrorBody(err);
198
- if (body2) {
199
- if (body2.code === "KNOWN_PACKAGE_VERSION") {
200
- return {
201
- skipped: true,
202
- reason: "already_vetted",
203
- details: body2
204
- };
205
- }
206
- throw new CantonProtocolError(`DAR upload failed: ${JSON.stringify(body2)}`);
207
- }
183
+ if (opts.skipIfVetted && err instanceof CantonApiError && err.code === "KNOWN_PACKAGE_VERSION") {
184
+ return {
185
+ skipped: true,
186
+ reason: "already_vetted",
187
+ details: err.body
188
+ };
208
189
  }
209
- throw await this.#throwApiError(err, "DAR upload");
190
+ throw err;
210
191
  }
211
192
  }
212
193
  /**
@@ -227,12 +208,12 @@ var CantonClient = class {
227
208
  synchronizerId: opts.synchronizerId
228
209
  };
229
210
  if (!request.synchronizerId) {
230
- return this.#ensureSynchronizerId().then((synchronizerId) => this.#api.postV2DarsValidate({
211
+ return this.#ensureSynchronizerId().then((synchronizerId) => this.#invoke(() => this.#api.postV2DarsValidate({
231
212
  ...request,
232
213
  synchronizerId
233
- }));
214
+ })));
234
215
  }
235
- return this.#api.postV2DarsValidate(request);
216
+ return this.#invoke(() => this.#api.postV2DarsValidate(request));
236
217
  }
237
218
  // ─────────────────────────────────────────────────────────────────────────
238
219
  // Party Management
@@ -245,10 +226,10 @@ var CantonClient = class {
245
226
  * @returns Array of party IDs and pagination token
246
227
  */
247
228
  async listParties(opts = {}) {
248
- const response = await this.#api.getV2Parties({
229
+ const response = await this.#invoke(() => this.#api.getV2Parties({
249
230
  pageSize: opts.pageSize,
250
231
  pageToken: opts.pageToken
251
- });
232
+ }));
252
233
  return {
253
234
  parties: response.partyDetails?.map((p) => p.party) ?? [],
254
235
  nextPageToken: response.nextPageToken
@@ -264,9 +245,9 @@ var CantonClient = class {
264
245
  * ourselves to preserve the actual variant payload.
265
246
  */
266
247
  async listUserRights() {
267
- const apiResponse = await this.#api.getV2UsersUserIdRightsRaw({
248
+ const apiResponse = await this.#invoke(() => this.#api.getV2UsersUserIdRightsRaw({
268
249
  userId: this.#userId
269
- });
250
+ }));
270
251
  const raw = await apiResponse.raw.json();
271
252
  return raw.rights ?? [];
272
253
  }
@@ -305,19 +286,14 @@ var CantonClient = class {
305
286
  */
306
287
  async allocateParty(partyIdHint, opts = {}) {
307
288
  const synchronizerId = opts.synchronizerId ?? await this.#ensureSynchronizerId();
308
- let response;
309
- try {
310
- response = await this.#api.postV2Parties({
311
- allocatePartyRequest: {
312
- partyIdHint,
313
- synchronizerId,
314
- userId: opts.userId ?? "",
315
- identityProviderId: opts.identityProviderId ?? ""
316
- }
317
- });
318
- } catch (err) {
319
- throw await this.#throwApiError(err, "Party allocation");
320
- }
289
+ const response = await this.#invoke(() => this.#api.postV2Parties({
290
+ allocatePartyRequest: {
291
+ partyIdHint,
292
+ synchronizerId,
293
+ userId: opts.userId ?? "",
294
+ identityProviderId: opts.identityProviderId ?? ""
295
+ }
296
+ }));
321
297
  const party = response.partyDetails?.party;
322
298
  if (!party) {
323
299
  throw new CantonProtocolError("Party allocation response missing party ID");
@@ -340,12 +316,7 @@ var CantonClient = class {
340
316
  confirmationThreshold: args.confirmationThreshold
341
317
  }
342
318
  };
343
- let response;
344
- try {
345
- response = await this.#api.postV2PartiesExternalGenerateTopology(request);
346
- } catch (err) {
347
- throw await this.#throwApiError(err, "External party topology generation");
348
- }
319
+ const response = await this.#invoke(() => this.#api.postV2PartiesExternalGenerateTopology(request));
349
320
  if (!response.partyId || !response.multiHash) {
350
321
  throw new CantonProtocolError("generateExternalPartyTopology response missing partyId or multiHash");
351
322
  }
@@ -375,12 +346,7 @@ var CantonClient = class {
375
346
  identityProviderId: ""
376
347
  }
377
348
  };
378
- let response;
379
- try {
380
- response = await this.#api.postV2PartiesExternalAllocate(request);
381
- } catch (err) {
382
- throw await this.#throwApiError(err, "External party allocation");
383
- }
349
+ const response = await this.#invoke(() => this.#api.postV2PartiesExternalAllocate(request));
384
350
  if (!response.partyId) {
385
351
  throw new CantonProtocolError("allocateExternalParty response missing partyId");
386
352
  }
@@ -393,28 +359,24 @@ var CantonClient = class {
393
359
  * POST /v2/users/{userId}/rights
394
360
  */
395
361
  async grantCanActAs(partyId) {
396
- try {
397
- await this.#api.postV2UsersUserIdRights({
362
+ await this.#invoke(() => this.#api.postV2UsersUserIdRights({
363
+ userId: this.#userId,
364
+ grantUserRightsRequest: {
398
365
  userId: this.#userId,
399
- grantUserRightsRequest: {
400
- userId: this.#userId,
401
- rights: [
402
- {
403
- kind: {
404
- canActAs: {
405
- value: {
406
- party: partyId
407
- }
366
+ rights: [
367
+ {
368
+ kind: {
369
+ canActAs: {
370
+ value: {
371
+ party: partyId
408
372
  }
409
373
  }
410
374
  }
411
- ],
412
- identityProviderId: ""
413
- }
414
- });
415
- } catch (err) {
416
- throw await this.#throwApiError(err, `Grant canActAs for party ${partyId}`);
417
- }
375
+ }
376
+ ],
377
+ identityProviderId: ""
378
+ }
379
+ }));
418
380
  }
419
381
  /**
420
382
  * Get the package ID for a package by name.
@@ -437,12 +399,7 @@ var CantonClient = class {
437
399
  synchronizerId
438
400
  }
439
401
  };
440
- let response;
441
- try {
442
- response = await this.#api.postV2InteractiveSubmissionPreferredPackages(request);
443
- } catch (err) {
444
- throw await this.#throwApiError(err, "Package lookup");
445
- }
402
+ const response = await this.#invoke(() => this.#api.postV2InteractiveSubmissionPreferredPackages(request));
446
403
  const packageRef = response.packageReferences?.find((ref) => ref.packageName === packageName);
447
404
  if (!packageRef?.packageId) {
448
405
  throw new CantonProtocolError(`Package "${packageName}" not found or not vetted for parties`);
@@ -460,7 +417,7 @@ var CantonClient = class {
460
417
  async submit(actors, commands, opts = {}) {
461
418
  const synchronizerId = await this.#ensureSynchronizerId();
462
419
  const commandId = opts.commandId ?? randomUUID();
463
- const ledgerEndResponse = await this.#api.getV2StateLedgerEnd();
420
+ const ledgerEndResponse = await this.#invoke(() => this.#api.getV2StateLedgerEnd());
464
421
  const completionOffset = ledgerEndResponse.offset;
465
422
  const request = {
466
423
  jsCommands: {
@@ -473,11 +430,7 @@ var CantonClient = class {
473
430
  disclosedContracts: opts.disclosedContracts
474
431
  }
475
432
  };
476
- try {
477
- await this.#api.postV2CommandsAsyncSubmit(request);
478
- } catch (err) {
479
- throw await this.#throwApiError(err, "Command submission");
480
- }
433
+ await this.#invoke(() => this.#api.postV2CommandsAsyncSubmit(request));
481
434
  return {
482
435
  commandId,
483
436
  completionOffset
@@ -510,7 +463,7 @@ var CantonClient = class {
510
463
  limit,
511
464
  streamIdleTimeoutMs
512
465
  };
513
- const rawResponse = await this.#api.postV2CommandsCompletionsRaw(request);
466
+ const rawResponse = await this.#invoke(() => this.#api.postV2CommandsCompletionsRaw(request));
514
467
  const responseText = await rawResponse.raw.text();
515
468
  const completions = JSON.parse(responseText);
516
469
  for (const item of completions) {
@@ -587,7 +540,7 @@ var CantonClient = class {
587
540
  }
588
541
  }
589
542
  };
590
- const response = await this.#api.postV2EventsEventsByContractId(request);
543
+ const response = await this.#invoke(() => this.#api.postV2EventsEventsByContractId(request));
591
544
  if (response.archived) return void 0;
592
545
  return response.created?.createdEvent;
593
546
  }
@@ -635,7 +588,7 @@ var CantonClient = class {
635
588
  }
636
589
  }
637
590
  };
638
- const response = await this.#api.postV2EventsEventsByContractId(request);
591
+ const response = await this.#invoke(() => this.#api.postV2EventsEventsByContractId(request));
639
592
  return {
640
593
  created: response.created?.createdEvent,
641
594
  archived: response.archived?.archivedEvent
@@ -648,12 +601,12 @@ var CantonClient = class {
648
601
  * @returns The full update response
649
602
  */
650
603
  async fetchTransactionByUpdateId(updateId, parties) {
651
- const response = await this.#api.postV2UpdatesUpdateByIdRaw({
604
+ const response = await this.#invoke(() => this.#api.postV2UpdatesUpdateByIdRaw({
652
605
  getUpdateByIdRequest: {
653
606
  updateId,
654
607
  updateFormat: this.#buildUpdateFormat(parties)
655
608
  }
656
- });
609
+ }));
657
610
  const updateResponse = await response.raw.json();
658
611
  return this.#parseTransactionFromUpdate(updateResponse, `Update ${updateId} is not a transaction`);
659
612
  }
@@ -664,12 +617,12 @@ var CantonClient = class {
664
617
  * @returns The full transaction including recordTime
665
618
  */
666
619
  async fetchTransactionByOffset(offset, parties) {
667
- const response = await this.#api.postV2UpdatesUpdateByOffsetRaw({
620
+ const response = await this.#invoke(() => this.#api.postV2UpdatesUpdateByOffsetRaw({
668
621
  getUpdateByOffsetRequest: {
669
622
  offset,
670
623
  updateFormat: this.#buildUpdateFormat(parties)
671
624
  }
672
- });
625
+ }));
673
626
  const updateResponse = await response.raw.json();
674
627
  return this.#parseTransactionFromUpdate(updateResponse, `Update at offset ${offset} is not a transaction`);
675
628
  }
@@ -707,12 +660,7 @@ var CantonClient = class {
707
660
  packageIdSelectionPreference: []
708
661
  }
709
662
  };
710
- let response;
711
- try {
712
- response = await this.#api.postV2InteractiveSubmissionPrepare(request);
713
- } catch (error) {
714
- throw await this.#throwApiError(error, "Interactive submission prepare");
715
- }
663
+ const response = await this.#invoke(() => this.#api.postV2InteractiveSubmissionPrepare(request));
716
664
  const validated = this.#validatePrepareResponse(response);
717
665
  return {
718
666
  ...validated,
@@ -726,7 +674,7 @@ var CantonClient = class {
726
674
  * The generic type T flows from prepareForSigning() for type documentation.
727
675
  */
728
676
  async submitSigned(prepared, signatures) {
729
- const ledgerEndResponse = await this.#api.getV2StateLedgerEnd();
677
+ const ledgerEndResponse = await this.#invoke(() => this.#api.getV2StateLedgerEnd());
730
678
  const completionOffset = ledgerEndResponse.offset;
731
679
  const request = {
732
680
  jsExecuteSubmissionRequest: {
@@ -758,11 +706,7 @@ var CantonClient = class {
758
706
  hashingSchemeVersion: prepared.hashingSchemeVersion
759
707
  }
760
708
  };
761
- try {
762
- await this.#api.postV2InteractiveSubmissionExecute(request);
763
- } catch (error) {
764
- throw await this.#throwApiError(error, "Interactive submission execute");
765
- }
709
+ await this.#invoke(() => this.#api.postV2InteractiveSubmissionExecute(request));
766
710
  return {
767
711
  commandId: prepared.commandId,
768
712
  completionOffset
@@ -775,7 +719,7 @@ var CantonClient = class {
775
719
  * Get the current ledger end offset.
776
720
  */
777
721
  async getLedgerEndOffset() {
778
- const response = await this.#api.getV2StateLedgerEnd();
722
+ const response = await this.#invoke(() => this.#api.getV2StateLedgerEnd());
779
723
  return response.offset;
780
724
  }
781
725
  /**
@@ -825,7 +769,7 @@ var CantonClient = class {
825
769
  cumulative: cumulativeFilter
826
770
  }
827
771
  ]));
828
- const rawResponse = await this.#api.postV2StateActiveContractsRaw({
772
+ const rawResponse = await this.#invoke(() => this.#api.postV2StateActiveContractsRaw({
829
773
  getActiveContractsRequest: {
830
774
  filter: {
831
775
  filtersByParty
@@ -834,7 +778,7 @@ var CantonClient = class {
834
778
  activeAtOffset: offset
835
779
  },
836
780
  limit: opts?.limit
837
- });
781
+ }));
838
782
  const rawJson = await rawResponse.raw.json();
839
783
  return rawJson.map((item) => item.contractEntry?.JsActiveContract).filter((contract) => contract != null).map((contract) => JsActiveContractFromJSON(contract));
840
784
  }
@@ -862,7 +806,7 @@ var CantonClient = class {
862
806
  },
863
807
  verbose: false
864
808
  };
865
- const rawResponse = await this.#api.postV2UpdatesRaw({
809
+ const rawResponse = await this.#invoke(() => this.#api.postV2UpdatesRaw({
866
810
  getUpdatesRequest: {
867
811
  beginExclusive,
868
812
  endInclusive,
@@ -875,7 +819,7 @@ var CantonClient = class {
875
819
  }
876
820
  },
877
821
  limit: opts?.limit
878
- });
822
+ }));
879
823
  const updateResponses = await rawResponse.raw.json();
880
824
  return updateResponses.map((response) => response.update);
881
825
  }
@@ -965,5 +909,5 @@ var CantonClient = class {
965
909
  };
966
910
 
967
911
  export { CantonClient };
968
- //# sourceMappingURL=3ZCDWNJG.js.map
969
- //# sourceMappingURL=3ZCDWNJG.js.map
912
+ //# sourceMappingURL=FR4CYWZT.js.map
913
+ //# sourceMappingURL=FR4CYWZT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/canton-client.ts"],"names":["CantonClient","config","userId","wallet","DefaultApi","CantonProtocolError","getDsoParty","walletUrl","tokenProvider","fetchDsoParty","getToken","getAmuletContextWithExternalRules","instrumentId","amuletContext","disclosedContracts","fetchAmuletContext","contextWithRules","externalPartyAmuletRulesCid","injectExternalPartyAmuletRules","obj","key","undefined","pascal","charAt","toUpperCase","slice","camel","toLowerCase","call","err","ResponseError","cantonApiErrorFromResponse","response","parties","includeCreatedEventBlob","Object","fromEntries","map","p","cumulative","identifierFilter","wildcardFilter","value","event","contractId","templateId","createdEventBlob","preparedTransaction","preparedTransactionHash","hashingSchemeVersion","connectedSynchronizers","getV2StateConnectedSynchronizers","synchronizers","s","synchronizerId","filter","id","once","CantonTransportError","uploadDar","dar","opts","bytes","byteOffset","byteLength","buffer","body","Blob","type","request","vetAllPackages","postV2Dars","skipIfVetted","CantonApiError","code","skipped","reason","details","validateDar","then","postV2DarsValidate","listParties","getV2Parties","pageSize","pageToken","partyDetails","party","nextPageToken","listUserRights","apiResponse","getV2UsersUserIdRightsRaw","raw","json","rights","listUserParties","Set","right","kind","CanActAs","CanReadAs","add","allocateParty","partyIdHint","postV2Parties","allocatePartyRequest","identityProviderId","generateExternalPartyTopology","args","generateExternalPartyTopologyRequest","synchronizer","partyHint","publicKey","localParticipantObservationOnly","confirmationThreshold","postV2PartiesExternalGenerateTopology","partyId","multiHash","topologyTransactions","length","allocateExternalParty","allocateExternalPartyRequest","onboardingTransactions","tx","transaction","multiHashSignatures","postV2PartiesExternalAllocate","grantCanActAs","postV2UsersUserIdRights","grantUserRightsRequest","canActAs","getPackageId","packageName","getPreferredPackagesRequest","packageVettingRequirements","postV2InteractiveSubmissionPreferredPackages","packageRef","packageReferences","find","ref","packageId","submit","actors","commands","commandId","randomUUID","ledgerEndResponse","getV2StateLedgerEnd","completionOffset","offset","jsCommands","actAs","readAs","postV2CommandsAsyncSubmit","waitForCommand","timeoutMs","poll","limit","streamIdleTimeoutMs","initialBackoffMs","backoffMs","initial","maxBackoffMs","max","beginExclusive","currentBackoff","deadline","Date","now","completionStreamRequest","rawResponse","postV2CommandsCompletionsRaw","responseText","text","completions","JSON","parse","item","normalized","completionResponse","offsetCheckpoint","checkpoint","checkpointOffset","Math","completionWrapper","completion","completionCommandId","status","updateId","error","message","remainingTime","sleepTime","min","Promise","resolve","setTimeout","lastCheckedOffset","getEventsByContractIdRequest","eventFormat","filtersByParty","verbose","postV2EventsEventsByContractId","archived","created","createdEvent","createDisclosure","validated","fetchContractById","fetchEventsByContractId","archivedEvent","fetchTransactionByUpdateId","postV2UpdatesUpdateByIdRaw","getUpdateByIdRequest","updateFormat","updateResponse","fetchTransactionByOffset","postV2UpdatesUpdateByOffsetRaw","getUpdateByOffsetRequest","prepareForSigning","jsPrepareSubmissionRequest","verboseHashing","packageIdSelectionPreference","postV2InteractiveSubmissionPrepare","submitSigned","prepared","signatures","jsExecuteSubmissionRequest","partySignatures","sig","format","signature","signedBy","signingAlgorithmSpec","deduplicationPeriod","deduplicationDuration","seconds","nanos","submissionId","postV2InteractiveSubmissionExecute","getLedgerEndOffset","queryActiveContracts","queryActiveContractsByParties","templateIds","queryActiveContractsByInterface","interfaceIds","cumulativeFilter","postV2StateActiveContractsRaw","getActiveContractsRequest","activeAtOffset","rawJson","contractEntry","JsActiveContract","contract","JsActiveContractFromJSON","getUpdates","endInclusive","postV2UpdatesRaw","getUpdatesRequest","includeTransactions","transactionShape","updateResponses","update","templateFilter","interfaceId","interfaceFilter","includeInterfaceView","notFoundMessage","Transaction"],"mappings":"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","file":"FR4CYWZT.js","sourcesContent":["import type { ContractId } from '@daml/types';\nimport { once } from 'es-toolkit';\nimport { randomUUID } from 'node:crypto';\n\nimport {\n CantonApiError,\n cantonApiErrorFromResponse,\n CantonProtocolError,\n CantonTransportError,\n} from '../errors';\nimport {\n DefaultApi,\n type PostV2CommandsAsyncSubmitRequest,\n type PostV2CommandsCompletionsRequest,\n type PostV2DarsRequest,\n type PostV2DarsValidateRequest,\n type PostV2EventsEventsByContractIdRequest,\n type PostV2InteractiveSubmissionExecuteRequest,\n type PostV2InteractiveSubmissionPreferredPackagesRequest,\n type PostV2InteractiveSubmissionPrepareRequest,\n type PostV2PartiesExternalAllocateRequest,\n type PostV2PartiesExternalGenerateTopologyRequest,\n} from '../open-api/apis/DefaultApi';\nimport {\n type ArchivedEvent,\n type Command,\n type CreatedEvent,\n type CumulativeFilter,\n type DisclosedContract,\n type JsActiveContract,\n JsActiveContractFromJSON,\n} from '../open-api/models';\nimport { type Configuration, ResponseError } from '../open-api/runtime';\nimport type {\n ExternalSignature,\n PreparedTransaction,\n SubmitActors,\n SubmitResult,\n UserRight,\n WaitOptions,\n WaitResult,\n} from '../types';\nimport {\n type AmuletContextResult,\n type CantonClientWalletConfig,\n fetchAmuletContext,\n fetchDsoParty,\n injectExternalPartyAmuletRules,\n type InstrumentId,\n} from './amulet';\nimport type {\n CantonTransaction,\n CantonUpdate,\n CantonUpdateResponse,\n ICantonClient,\n} from './interface';\n\n/**\n * CantonClient - The engine layer for Canton ledger operations.\n *\n * Responsibilities:\n * - Synchronizer discovery and caching\n * - Command submission and completion waiting\n * - Disclosed contract building\n * - JSON normalization (temporary workaround)\n *\n * This class uses composition (not inheritance) to wrap the generated API,\n * exposing only the minimal surface needed for ledger app operations.\n */\nexport class CantonClient implements ICantonClient {\n readonly #api: DefaultApi;\n readonly #userId: string;\n readonly #wallet?: CantonClientWalletConfig;\n #dsoParty?: string;\n\n constructor(\n config: Configuration,\n userId: string = 'participant_admin',\n wallet?: CantonClientWalletConfig,\n ) {\n this.#api = new DefaultApi(config);\n this.#userId = userId;\n this.#wallet = wallet;\n }\n\n #requireWallet(): CantonClientWalletConfig {\n if (!this.#wallet) {\n throw new CantonProtocolError(\n 'CantonClient has no wallet config (walletUrl + tokenProvider); amulet endpoints are unavailable',\n );\n }\n return this.#wallet;\n }\n\n async getDsoParty(): Promise<string> {\n const { walletUrl, tokenProvider } = this.#requireWallet();\n if (this.#dsoParty) return this.#dsoParty;\n this.#dsoParty = await fetchDsoParty(walletUrl, await tokenProvider.getToken());\n return this.#dsoParty;\n }\n\n /** Amulet ChoiceContext with ExternalPartyAmuletRules injected — required by every flow hitting FeeUtils.validateContext. */\n async getAmuletContextWithExternalRules(\n instrumentId: InstrumentId,\n ): Promise<AmuletContextResult> {\n const { walletUrl, tokenProvider } = this.#requireWallet();\n const { amuletContext, disclosedContracts } = await fetchAmuletContext(\n walletUrl,\n await tokenProvider.getToken(),\n instrumentId,\n );\n const { amuletContext: contextWithRules, externalPartyAmuletRulesCid } =\n injectExternalPartyAmuletRules(amuletContext, disclosedContracts);\n return { amuletContext: contextWithRules, disclosedContracts, externalPartyAmuletRulesCid };\n }\n\n /**\n * Get a property from an object, trying PascalCase first then camelCase.\n * Canton API returns PascalCase but OpenAPI expects camelCase.\n */\n #getField<T>(obj: Record<string, unknown> | undefined, key: string): T | undefined {\n if (!obj) return undefined;\n const pascal = key.charAt(0).toUpperCase() + key.slice(1);\n const camel = key.charAt(0).toLowerCase() + key.slice(1);\n return (obj[pascal] ?? obj[camel]) as T | undefined;\n }\n\n /**\n * Run an API call, normalizing a thrown `ResponseError` into a `CantonApiError`\n * that carries `errorCategory` (for retry classification). Other errors pass through.\n */\n async #invoke<T>(call: () => Promise<T>): Promise<T> {\n try {\n return await call();\n } catch (err) {\n if (err instanceof ResponseError) {\n throw await cantonApiErrorFromResponse(err.response);\n }\n throw err;\n }\n }\n\n /**\n * Build party-based filter object for event queries.\n */\n #buildPartyFilters(parties: string[], includeCreatedEventBlob: boolean) {\n return Object.fromEntries(\n parties.map((p) => [\n p,\n {\n cumulative: [\n {\n identifierFilter: {\n wildcardFilter: { value: { includeCreatedEventBlob } },\n },\n },\n ],\n },\n ]),\n );\n }\n\n /**\n * Validate and extract disclosure fields from a CreatedEvent.\n */\n #validateDisclosureEvent(\n event: { templateId?: string; contractId?: string; createdEventBlob?: string },\n contractId: ContractId<unknown>,\n ): { templateId: string; contractId: string; createdEventBlob: string } {\n if (!event.templateId) {\n throw new CantonProtocolError('Disclosure response missing templateId', {\n contractId,\n });\n }\n if (!event.contractId) {\n throw new CantonProtocolError('Disclosure response missing contractId', {\n contractId,\n });\n }\n if (!event.createdEventBlob) {\n throw new CantonProtocolError('Disclosure response missing createdEventBlob', {\n contractId,\n });\n }\n return {\n templateId: event.templateId,\n contractId: event.contractId,\n createdEventBlob: event.createdEventBlob,\n };\n }\n\n /**\n * Validate and extract prepared transaction fields from a prepare response.\n */\n #validatePrepareResponse(response: {\n preparedTransaction?: string;\n preparedTransactionHash?: string;\n hashingSchemeVersion?: string;\n }): {\n preparedTransaction: string;\n preparedTransactionHash: string;\n hashingSchemeVersion: string;\n } {\n if (!response.preparedTransaction) {\n throw new CantonProtocolError('Prepare response missing preparedTransaction');\n }\n if (!response.preparedTransactionHash) {\n throw new CantonProtocolError('Prepare response missing preparedTransactionHash');\n }\n if (!response.hashingSchemeVersion) {\n throw new CantonProtocolError('Prepare response missing hashingSchemeVersion');\n }\n return {\n preparedTransaction: response.preparedTransaction,\n preparedTransactionHash: response.preparedTransactionHash,\n hashingSchemeVersion: response.hashingSchemeVersion,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Synchronizer Discovery\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Returns all connected synchronizer IDs.\n */\n async connectedSynchronizers(): Promise<string[]> {\n const response = await this.#invoke(() => this.#api.getV2StateConnectedSynchronizers());\n const synchronizers = response.connectedSynchronizers ?? [];\n return synchronizers.map((s) => s.synchronizerId).filter((id): id is string => !!id);\n }\n\n /**\n * Internal: ensures we have a cached synchronizer ID, fetching if needed.\n */\n #ensureSynchronizerId = once(async (): Promise<string> => {\n const [id] = await this.connectedSynchronizers();\n\n if (!id) {\n throw new CantonTransportError('No connected synchronizers found');\n }\n\n return id;\n });\n\n // ─────────────────────────────────────────────────────────────────────────\n // DAR Upload / Validation\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Upload a DAR (Daml Archive) to the participant node.\n *\n * @param dar - Raw DAR bytes.\n * @param opts.vetAllPackages - Whether to vet all packages in the DAR.\n * @param opts.synchronizerId - Synchronizer to upload to (auto-detected if omitted).\n * @param opts.skipIfVetted - If true, silently succeeds when the DAR is already vetted.\n */\n async uploadDar(\n dar: Uint8Array<ArrayBuffer>,\n opts: { vetAllPackages?: boolean; synchronizerId?: string; skipIfVetted?: boolean } = {},\n ): Promise<object> {\n // Extract the underlying ArrayBuffer, handling views that don't start at offset 0\n const bytes =\n dar.byteOffset === 0 && dar.byteLength === dar.buffer.byteLength\n ? dar.buffer\n : dar.buffer.slice(dar.byteOffset, dar.byteOffset + dar.byteLength);\n const body = new Blob([bytes], { type: 'application/octet-stream' });\n const synchronizerId = opts.synchronizerId ?? (await this.#ensureSynchronizerId());\n const request: PostV2DarsRequest = {\n body,\n vetAllPackages: opts.vetAllPackages,\n synchronizerId,\n };\n\n try {\n return await this.#invoke(() => this.#api.postV2Dars(request));\n } catch (err: unknown) {\n // If skipIfVetted, treat KNOWN_PACKAGE_VERSION as a no-op success\n if (\n opts.skipIfVetted &&\n err instanceof CantonApiError &&\n err.code === 'KNOWN_PACKAGE_VERSION'\n ) {\n return { skipped: true, reason: 'already_vetted', details: err.body };\n }\n throw err;\n }\n }\n\n /**\n * Validate a DAR against the participant without uploading it.\n *\n * @param dar - Raw DAR bytes.\n * @param opts.synchronizerId - Synchronizer to validate against (auto-detected if omitted).\n */\n async validateDar(\n dar: Uint8Array<ArrayBuffer>,\n opts: { synchronizerId?: string } = {},\n ): Promise<void> {\n const bytes =\n dar.byteOffset === 0 && dar.byteLength === dar.buffer.byteLength\n ? dar.buffer\n : dar.buffer.slice(dar.byteOffset, dar.byteOffset + dar.byteLength);\n const body = new Blob([bytes], { type: 'application/octet-stream' });\n const request: PostV2DarsValidateRequest = {\n body,\n synchronizerId: opts.synchronizerId,\n };\n\n if (!request.synchronizerId) {\n return this.#ensureSynchronizerId().then((synchronizerId) =>\n this.#invoke(() => this.#api.postV2DarsValidate({ ...request, synchronizerId })),\n );\n }\n\n return this.#invoke(() => this.#api.postV2DarsValidate(request));\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Party Management\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * List all known parties on the participant node.\n *\n * @param opts.pageSize - Maximum number of results per page\n * @param opts.pageToken - Pagination token from previous response\n * @returns Array of party IDs and pagination token\n */\n async listParties(\n opts: { pageSize?: number; pageToken?: string } = {},\n ): Promise<{ parties: string[]; nextPageToken: string }> {\n const response = await this.#invoke(() =>\n this.#api.getV2Parties({\n pageSize: opts.pageSize,\n pageToken: opts.pageToken,\n }),\n );\n\n return {\n parties: response.partyDetails?.map((p) => p.party) ?? [],\n nextPageToken: response.nextPageToken,\n };\n }\n\n /**\n * Return the rights granted to the current user (this.#userId).\n *\n * Bypasses the OpenAPI generator's typed `Kind` converter, which is\n * broken: `instanceOfKindOneOf` checks lowercase `canActAs in value`, but\n * `KindOneOfFromJSONTyped` reads uppercase `json['CanActAs']`, so the\n * typed client returns every `kind` as `{}`. We parse the raw JSON\n * ourselves to preserve the actual variant payload.\n */\n async listUserRights(): Promise<UserRight[]> {\n const apiResponse = await this.#invoke(() =>\n this.#api.getV2UsersUserIdRightsRaw({\n userId: this.#userId,\n }),\n );\n const raw = (await apiResponse.raw.json()) as { rights?: UserRight[] };\n return raw.rights ?? [];\n }\n\n /**\n * Return the parties the current user has CanActAs or CanReadAs rights\n * for. Convenience wrapper over `listUserRights()` for the common case\n * where the caller just needs party-scoped access (e.g. to query events\n * or fetch transactions).\n *\n * Use this instead of `listParties()` when the caller only has scoped\n * rights — `listParties()` returns *all* parties on the participant\n * (including DSO, splice parties), and Canton returns 403 if you query\n * as a party you can't read.\n */\n async listUserParties(): Promise<string[]> {\n const rights = await this.listUserRights();\n const parties = new Set<string>();\n for (const right of rights) {\n // Only `CanActAs` / `CanReadAs` carry a party; the other four\n // variants (ParticipantAdmin, IdentityProviderAdmin,\n // CanReadAsAnyParty, CanExecuteAsAnyParty) have empty payloads.\n const party = right.kind.CanActAs?.value.party ?? right.kind.CanReadAs?.value.party;\n if (party !== undefined) {\n parties.add(party);\n }\n }\n return [...parties];\n }\n\n /**\n * Allocate a new party on the participant node.\n *\n * @param partyIdHint - A hint for the party ID (e.g., \"alice\", \"bob\")\n * @param opts.userId - User who gets actAs rights (empty string = no user)\n * @param opts.synchronizerId - Synchronizer to allocate on (auto-detected if omitted)\n * @param opts.identityProviderId - Identity provider ID (empty string = default)\n * @returns The allocated party ID\n */\n async allocateParty(\n partyIdHint: string,\n opts: { userId?: string; synchronizerId?: string; identityProviderId?: string } = {},\n ): Promise<string> {\n const synchronizerId = opts.synchronizerId ?? (await this.#ensureSynchronizerId());\n\n const response = await this.#invoke(() =>\n this.#api.postV2Parties({\n allocatePartyRequest: {\n partyIdHint,\n synchronizerId,\n userId: opts.userId ?? '',\n identityProviderId: opts.identityProviderId ?? '',\n },\n }),\n );\n\n const party = response.partyDetails?.party;\n if (!party) {\n throw new CantonProtocolError('Party allocation response missing party ID');\n }\n\n return party;\n }\n\n /**\n * Generate unsigned topology transactions for an external party.\n *\n * POST /v2/parties/external/generate-topology\n */\n async generateExternalPartyTopology(args: {\n partyHint: string;\n publicKey: { format: string; keyData: string; keySpec: string };\n localParticipantObservationOnly: boolean;\n confirmationThreshold: number;\n }): Promise<{\n partyId: string;\n topologyTransactions: string[];\n multiHash: string;\n synchronizerId: string;\n }> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const request: PostV2PartiesExternalGenerateTopologyRequest = {\n generateExternalPartyTopologyRequest: {\n synchronizer: synchronizerId,\n partyHint: args.partyHint,\n publicKey: args.publicKey,\n localParticipantObservationOnly: args.localParticipantObservationOnly,\n confirmationThreshold: args.confirmationThreshold,\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2PartiesExternalGenerateTopology(request),\n );\n\n if (!response.partyId || !response.multiHash) {\n throw new CantonProtocolError(\n 'generateExternalPartyTopology response missing partyId or multiHash',\n );\n }\n\n if (!response.topologyTransactions?.length) {\n throw new CantonProtocolError(\n 'generateExternalPartyTopology response missing topologyTransactions',\n );\n }\n\n return {\n partyId: response.partyId,\n topologyTransactions: response.topologyTransactions,\n multiHash: response.multiHash,\n synchronizerId,\n };\n }\n\n /**\n * Submit signed topology transactions to register an external party.\n *\n * POST /v2/parties/external/allocate\n */\n async allocateExternalParty(args: {\n synchronizerId: string;\n topologyTransactions: string[];\n multiHashSignatures: Array<{\n format: string;\n signature: string;\n signedBy: string;\n signingAlgorithmSpec: string;\n }>;\n }): Promise<string> {\n const request: PostV2PartiesExternalAllocateRequest = {\n allocateExternalPartyRequest: {\n synchronizer: args.synchronizerId,\n onboardingTransactions: args.topologyTransactions.map((tx) => ({\n transaction: tx,\n })),\n multiHashSignatures: args.multiHashSignatures,\n identityProviderId: '',\n },\n };\n\n const response = await this.#invoke(() => this.#api.postV2PartiesExternalAllocate(request));\n\n if (!response.partyId) {\n throw new CantonProtocolError('allocateExternalParty response missing partyId');\n }\n\n return response.partyId;\n }\n\n /**\n * Grant canActAs right for a party to the current service user.\n * Idempotent — safe to call even if the right is already granted.\n *\n * POST /v2/users/{userId}/rights\n */\n async grantCanActAs(partyId: string): Promise<void> {\n await this.#invoke(() =>\n this.#api.postV2UsersUserIdRights({\n userId: this.#userId,\n grantUserRightsRequest: {\n userId: this.#userId,\n rights: [{ kind: { canActAs: { value: { party: partyId } } } }],\n identityProviderId: '',\n },\n }),\n );\n }\n\n /**\n * Get the package ID for a package by name.\n *\n * @param packageName - The package name (e.g., \"layerzero-oft\")\n * @param parties - Parties whose vetting state should be considered\n * @param opts.synchronizerId - Synchronizer to query (auto-detected if omitted)\n * @returns The package ID (hash)\n */\n async getPackageId(\n packageName: string,\n parties: string[],\n opts: { synchronizerId?: string } = {},\n ): Promise<string> {\n const synchronizerId = opts.synchronizerId ?? (await this.#ensureSynchronizerId());\n\n const request: PostV2InteractiveSubmissionPreferredPackagesRequest = {\n getPreferredPackagesRequest: {\n packageVettingRequirements: [\n {\n packageName,\n parties,\n },\n ],\n synchronizerId,\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2InteractiveSubmissionPreferredPackages(request),\n );\n\n const packageRef = response.packageReferences?.find(\n (ref) => ref.packageName === packageName,\n );\n if (!packageRef?.packageId) {\n throw new CantonProtocolError(\n `Package \"${packageName}\" not found or not vetted for parties`,\n );\n }\n\n return packageRef.packageId;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Command Submission\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Submit a batch of commands atomically.\n *\n * @returns commandId and completionOffset for use with waitForCommand()\n */\n async submit(\n actors: SubmitActors,\n commands: Command[],\n opts: { disclosedContracts?: DisclosedContract[]; commandId?: string } = {},\n ): Promise<SubmitResult> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const commandId = opts.commandId ?? randomUUID();\n\n // Snapshot ledger end before submission so waitForCommand knows where to start polling\n const ledgerEndResponse = await this.#invoke(() => this.#api.getV2StateLedgerEnd());\n const completionOffset = ledgerEndResponse.offset;\n\n const request: PostV2CommandsAsyncSubmitRequest = {\n jsCommands: {\n commandId,\n actAs: actors.actAs,\n readAs: actors.readAs ?? actors.actAs,\n userId: this.#userId,\n synchronizerId,\n commands,\n disclosedContracts: opts.disclosedContracts,\n },\n };\n\n await this.#invoke(() => this.#api.postV2CommandsAsyncSubmit(request));\n\n return { commandId, completionOffset };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Completion Waiting / Reconciliation\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Wait for a command to be accepted or rejected.\n *\n * Uses bounded exponential backoff to avoid hammering the participant.\n */\n async waitForCommand(commandId: string, opts: WaitOptions): Promise<WaitResult> {\n const { parties, timeoutMs = 30_000, poll = {} } = opts;\n\n const limit = poll.limit ?? 50;\n const streamIdleTimeoutMs = poll.streamIdleTimeoutMs ?? 1000;\n const initialBackoffMs = poll.backoffMs?.initial ?? 100;\n const maxBackoffMs = poll.backoffMs?.max ?? 5000;\n\n let beginExclusive = opts.beginExclusive ?? 0;\n let currentBackoff = initialBackoffMs;\n const deadline = Date.now() + timeoutMs;\n\n // Poll the completions stream until we find our commandId or timeout\n while (Date.now() < deadline) {\n const request: PostV2CommandsCompletionsRequest = {\n completionStreamRequest: {\n beginExclusive,\n parties,\n userId: this.#userId,\n },\n limit,\n streamIdleTimeoutMs,\n };\n\n const rawResponse = await this.#invoke(() =>\n this.#api.postV2CommandsCompletionsRaw(request),\n );\n const responseText = await rawResponse.raw.text();\n const completions = JSON.parse(responseText) as unknown[];\n\n // Scan each completion for our commandId\n for (const item of completions) {\n const normalized = item as Record<string, unknown>;\n const completionResponse = this.#getField<Record<string, unknown>>(\n normalized,\n 'completionResponse',\n );\n if (!completionResponse) continue;\n\n // Handle offsetCheckpoint responses (no commandId)\n const offsetCheckpoint = this.#getField<Record<string, unknown>>(\n completionResponse,\n 'offsetCheckpoint',\n );\n if (offsetCheckpoint) {\n const checkpoint =\n this.#getField<Record<string, unknown>>(offsetCheckpoint, 'value') ??\n offsetCheckpoint;\n const checkpointOffset = this.#getField<number>(checkpoint, 'offset');\n if (checkpointOffset !== undefined) {\n beginExclusive = Math.max(beginExclusive, checkpointOffset);\n }\n continue;\n }\n\n // Navigate: completionResponse.completion.value\n const completionWrapper = this.#getField<Record<string, unknown>>(\n completionResponse,\n 'completion',\n );\n const completion =\n this.#getField<Record<string, unknown>>(completionWrapper, 'value') ??\n completionWrapper;\n if (!completion) continue;\n\n const offset = this.#getField<number>(completion, 'offset');\n const completionCommandId = this.#getField<string>(completion, 'commandId');\n\n // Found our command — check gRPC status to determine accept/reject\n if (completionCommandId === commandId) {\n const status = this.#getField<{\n code?: number;\n message?: string;\n details?: unknown;\n }>(completion, 'status');\n\n // code === 0 or status undefined means success (gRPC OK)\n if (!status || status.code === 0) {\n return {\n status: 'accepted',\n commandId,\n updateId: this.#getField<string>(completion, 'updateId') ?? '',\n offset: offset ?? 0,\n };\n } else {\n return {\n status: 'rejected',\n commandId,\n offset: offset ?? 0,\n error: {\n code: status.code,\n message: status.message ?? 'Unknown rejection',\n details: status.details,\n },\n };\n }\n }\n\n // Not our command — advance offset cursor past it\n if (offset !== undefined) {\n beginExclusive = Math.max(beginExclusive, offset);\n }\n }\n\n // Bounded exponential backoff\n const remainingTime = deadline - Date.now();\n const sleepTime = Math.min(currentBackoff, remainingTime, maxBackoffMs);\n if (sleepTime > 0) {\n await new Promise((resolve) => setTimeout(resolve, sleepTime));\n }\n currentBackoff = Math.min(currentBackoff * 2, maxBackoffMs);\n }\n\n return { status: 'timeout', commandId, lastCheckedOffset: beginExclusive };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disclosed Contracts\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch active contract's created event by ID.\n * Returns undefined if contract doesn't exist or is archived.\n */\n async #fetchActiveContractEvent(\n contractId: ContractId<unknown>,\n parties: string[],\n includeCreatedEventBlob: boolean,\n ): Promise<CreatedEvent | undefined> {\n const request: PostV2EventsEventsByContractIdRequest = {\n getEventsByContractIdRequest: {\n contractId,\n eventFormat: {\n filtersByParty: this.#buildPartyFilters(parties, includeCreatedEventBlob),\n verbose: false,\n },\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2EventsEventsByContractId(request),\n );\n\n // If archived, contract is not active\n if (response.archived) return undefined;\n\n return response.created?.createdEvent;\n }\n\n /**\n * Build a disclosure for a contract.\n *\n * @param contractId - The contract ID to create disclosure for\n * @param parties - Parties that have visibility to the contract\n * @returns DisclosedContract if visible, undefined if not found\n * @throws CantonProtocolError if contract visible but blob missing (server/config mismatch)\n */\n async createDisclosure(\n contractId: ContractId<unknown>,\n parties: string[],\n ): Promise<DisclosedContract | undefined> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const created = await this.#fetchActiveContractEvent(contractId, parties, true);\n\n if (!created) return undefined;\n\n const validated = this.#validateDisclosureEvent(created, contractId);\n return {\n ...validated,\n synchronizerId,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal: Active Contract Queries (used by CantonSdk)\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Fetch a single contract by ID.\n *\n * @param contractId The contract ID to fetch\n * @param parties Parties to use for filtering (required for non-admin tokens)\n */\n async fetchContractById(\n contractId: ContractId<unknown>,\n parties: string[],\n ): Promise<CreatedEvent | undefined> {\n return this.#fetchActiveContractEvent(contractId, parties, false);\n }\n\n /**\n * Fetch both the created and archived events for a contract by ID.\n * Unlike fetchContractById, this preserves archival information.\n */\n async fetchEventsByContractId(\n contractId: string,\n parties: string[],\n ): Promise<{ created: CreatedEvent | undefined; archived: ArchivedEvent | undefined }> {\n const request: PostV2EventsEventsByContractIdRequest = {\n getEventsByContractIdRequest: {\n contractId,\n eventFormat: {\n filtersByParty: this.#buildPartyFilters(parties, false),\n verbose: false,\n },\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2EventsEventsByContractId(request),\n );\n\n return {\n created: response.created?.createdEvent,\n archived: response.archived?.archivedEvent,\n };\n }\n\n /**\n * Fetch an update (transaction) by its ID.\n * @param updateId The update ID from a completion\n * @param parties Parties to use for the query filter\n * @returns The full update response\n */\n async fetchTransactionByUpdateId(\n updateId: string,\n parties: string[],\n ): Promise<CantonTransaction> {\n const response = await this.#invoke(() =>\n this.#api.postV2UpdatesUpdateByIdRaw({\n getUpdateByIdRequest: {\n updateId,\n updateFormat: this.#buildUpdateFormat(parties),\n },\n }),\n );\n\n const updateResponse: CantonUpdateResponse = await response.raw.json();\n return this.#parseTransactionFromUpdate(\n updateResponse,\n `Update ${updateId} is not a transaction`,\n );\n }\n\n /**\n * Fetch a transaction by its offset.\n * @param offset - The ledger offset\n * @param parties - Parties to use for the query filter\n * @returns The full transaction including recordTime\n */\n async fetchTransactionByOffset(offset: number, parties: string[]): Promise<CantonTransaction> {\n const response = await this.#invoke(() =>\n this.#api.postV2UpdatesUpdateByOffsetRaw({\n getUpdateByOffsetRequest: {\n offset,\n updateFormat: this.#buildUpdateFormat(parties),\n },\n }),\n );\n\n const updateResponse: CantonUpdateResponse = await response.raw.json();\n return this.#parseTransactionFromUpdate(\n updateResponse,\n `Update at offset ${offset} is not a transaction`,\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // External Party / Interactive Submission\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Prepare commands for external party signing.\n *\n * Returns a typed PreparedTransaction that preserves the contract type\n * through the signing flow. After signing, use submitSigned() to submit.\n *\n * @typeparam T The contract payload type (phantom type for type safety)\n *\n * @example\n * ```ts\n * const prepared = await client.prepareForSigning<Oft>({ actAs: [party] }, [cmd]);\n * const signature = await sign(prepared.preparedTransactionHash);\n * await client.submitSigned(prepared, [signature]);\n * ```\n */\n async prepareForSigning(\n actors: SubmitActors,\n commands: Command[],\n opts: { disclosedContracts?: DisclosedContract[]; commandId?: string } = {},\n ): Promise<PreparedTransaction> {\n const synchronizerId = await this.#ensureSynchronizerId();\n const commandId = opts.commandId ?? randomUUID();\n\n const request: PostV2InteractiveSubmissionPrepareRequest = {\n jsPrepareSubmissionRequest: {\n userId: this.#userId,\n commandId,\n commands,\n actAs: actors.actAs,\n readAs: actors.readAs ?? actors.actAs,\n disclosedContracts: opts.disclosedContracts,\n synchronizerId,\n verboseHashing: false,\n packageIdSelectionPreference: [],\n },\n };\n\n const response = await this.#invoke(() =>\n this.#api.postV2InteractiveSubmissionPrepare(request),\n );\n const validated = this.#validatePrepareResponse(response);\n\n return {\n ...validated,\n hashingSchemeVersion:\n validated.hashingSchemeVersion as PreparedTransaction['hashingSchemeVersion'],\n commandId,\n };\n }\n\n /**\n * Submit a pre-signed transaction.\n *\n * The generic type T flows from prepareForSigning() for type documentation.\n */\n async submitSigned(\n prepared: PreparedTransaction,\n signatures: ExternalSignature[],\n ): Promise<SubmitResult> {\n // Snapshot ledger end so the caller can poll for completion from this point\n const ledgerEndResponse = await this.#invoke(() => this.#api.getV2StateLedgerEnd());\n const completionOffset = ledgerEndResponse.offset;\n\n const request: PostV2InteractiveSubmissionExecuteRequest = {\n jsExecuteSubmissionRequest: {\n preparedTransaction: prepared.preparedTransaction,\n // Map each ExternalSignature into the Canton per-party signature format\n partySignatures: {\n signatures: signatures.map((sig) => ({\n party: sig.party,\n signatures: [\n {\n format: sig.format,\n signature: sig.signature,\n signedBy: sig.signedBy,\n signingAlgorithmSpec: sig.signingAlgorithmSpec,\n },\n ],\n })),\n },\n deduplicationPeriod: {\n deduplicationDuration: {\n value: { seconds: 3600, nanos: 0 }, // 1 hour default\n },\n },\n submissionId: randomUUID(),\n userId: this.#userId,\n hashingSchemeVersion: prepared.hashingSchemeVersion,\n },\n };\n\n await this.#invoke(() => this.#api.postV2InteractiveSubmissionExecute(request));\n\n return { commandId: prepared.commandId, completionOffset };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Active Contracts Query\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the current ledger end offset.\n */\n async getLedgerEndOffset(): Promise<number> {\n const response = await this.#invoke(() => this.#api.getV2StateLedgerEnd());\n return response.offset;\n }\n\n /**\n * Query active contracts at a given offset with optional template filtering.\n *\n * @param party - Party to query as\n * @param offset - Ledger offset for the snapshot\n * @param opts.templateIds - Optional template IDs to filter by\n * @param opts.limit - Maximum number of contracts to return\n */\n async queryActiveContracts(\n party: string,\n offset: number,\n opts?: { templateIds?: string[]; limit?: number },\n ): Promise<JsActiveContract[]> {\n return this.queryActiveContractsByParties([party], offset, opts?.templateIds ?? [], {\n limit: opts?.limit,\n });\n }\n\n /**\n * Query active contracts visible to any of the given parties.\n *\n * Single API call with all parties in filtersByParty.\n *\n * @param parties - Parties to query as (for visibility)\n * @param offset - Ledger offset for the snapshot\n * @param templateIds - Template IDs to filter by\n * @param opts.limit - Maximum number of contracts to return\n */\n async queryActiveContractsByParties(\n parties: string[],\n offset: number,\n templateIds: string[],\n opts?: { limit?: number },\n ): Promise<JsActiveContract[]> {\n return this.#fetchActiveContracts(\n parties,\n offset,\n this.#buildCumulativeFilters(templateIds),\n opts,\n );\n }\n\n /**\n * Query active contracts visible to any of the given parties that implement\n * the given interfaces.\n *\n * @param parties - Parties to query as (for visibility)\n * @param offset - Ledger offset for the snapshot\n * @param interfaceIds - Interface IDs to filter by (e.g. \"#package:Module:Interface\")\n * @param opts.limit - Maximum number of contracts to return\n */\n async queryActiveContractsByInterface(\n parties: string[],\n offset: number,\n interfaceIds: string[],\n opts?: { limit?: number },\n ): Promise<JsActiveContract[]> {\n return this.#fetchActiveContracts(\n parties,\n offset,\n this.#buildInterfaceCumulativeFilters(interfaceIds),\n opts,\n );\n }\n\n async #fetchActiveContracts(\n parties: string[],\n offset: number,\n cumulativeFilter: CumulativeFilter[],\n opts?: { limit?: number },\n ): Promise<JsActiveContract[]> {\n const filtersByParty = Object.fromEntries(\n parties.map((party) => [party, { cumulative: cumulativeFilter }]),\n );\n\n const rawResponse = await this.#invoke(() =>\n this.#api.postV2StateActiveContractsRaw({\n getActiveContractsRequest: {\n filter: { filtersByParty },\n verbose: true,\n activeAtOffset: offset,\n },\n limit: opts?.limit,\n }),\n );\n\n // Raw response is an array of streamed entries; extract and deserialize contracts\n type RawActiveContractsResponse = Array<{\n contractEntry?: { JsActiveContract?: Record<string, unknown> };\n }>;\n const rawJson: RawActiveContractsResponse = await rawResponse.raw.json();\n\n return rawJson\n .map((item) => item.contractEntry?.JsActiveContract)\n .filter((contract): contract is Record<string, unknown> => contract != null)\n .map((contract) => JsActiveContractFromJSON(contract));\n }\n\n /**\n * Stream transactions from a given offset.\n *\n * Uses `updateFormat` with `TRANSACTION_SHAPE_LEDGER_EFFECTS` so consumers\n * receive `ExercisedEvent`s (e.g. the request-poller depends on\n * `Request_Create` exercise results). The deprecated legacy `filter`\n * shape would default to `ACS_DELTA`, which only emits Created/Archived\n * events and silently drops every exercise on the wire.\n *\n * @param party - Party to query as\n * @param beginExclusive - Start offset (exclusive)\n * @param endInclusive - End offset (inclusive)\n * @param opts.templateIds - Optional template IDs to filter by\n * @param opts.limit - Maximum number of transactions to return\n */\n async getUpdates(\n party: string,\n beginExclusive: number,\n endInclusive: number,\n opts?: { templateIds?: string[]; limit?: number },\n ): Promise<CantonUpdate[]> {\n const eventFormat = {\n filtersByParty: {\n [party]: { cumulative: this.#buildCumulativeFilters(opts?.templateIds) },\n },\n verbose: false,\n };\n const rawResponse = await this.#invoke(() =>\n this.#api.postV2UpdatesRaw({\n getUpdatesRequest: {\n beginExclusive,\n endInclusive,\n verbose: false,\n updateFormat: {\n includeTransactions: {\n eventFormat,\n transactionShape: 'TRANSACTION_SHAPE_LEDGER_EFFECTS' as const,\n },\n },\n },\n limit: opts?.limit,\n }),\n );\n\n const updateResponses: CantonUpdateResponse[] = await rawResponse.raw.json();\n\n return updateResponses.map((response) => response.update);\n }\n\n /**\n * Build cumulative filters for party-based queries.\n * If templateIds provided, filters by those templates; otherwise uses wildcard.\n */\n #buildCumulativeFilters(templateIds?: string[]): CumulativeFilter[] {\n if (templateIds?.length) {\n return templateIds.map((templateId) => ({\n identifierFilter: {\n templateFilter: { value: { templateId, includeCreatedEventBlob: false } },\n },\n }));\n }\n return [\n { identifierFilter: { wildcardFilter: { value: { includeCreatedEventBlob: false } } } },\n ];\n }\n\n /**\n * Build cumulative filters for interface-based ACS queries.\n * If interfaceIds provided, filters by those interfaces; otherwise uses wildcard.\n */\n #buildInterfaceCumulativeFilters(interfaceIds?: string[]): CumulativeFilter[] {\n if (interfaceIds?.length) {\n return interfaceIds.map((interfaceId) => ({\n identifierFilter: {\n interfaceFilter: {\n value: {\n interfaceId,\n includeInterfaceView: true,\n includeCreatedEventBlob: false,\n },\n },\n },\n }));\n }\n return [\n { identifierFilter: { wildcardFilter: { value: { includeCreatedEventBlob: false } } } },\n ];\n }\n\n /**\n * Build the standard update format for fetching transactions.\n */\n #buildUpdateFormat(parties: string[]) {\n return {\n includeTransactions: {\n eventFormat: {\n filtersByParty: this.#buildPartyFilters(parties, false),\n verbose: false,\n },\n transactionShape: 'TRANSACTION_SHAPE_LEDGER_EFFECTS' as const,\n },\n };\n }\n\n /**\n * Parse an update response and extract the transaction.\n * The response structure is: { update: { Transaction: { value: CantonTransaction } } }\n */\n #parseTransactionFromUpdate(\n json: CantonUpdateResponse,\n notFoundMessage: string,\n ): CantonTransaction {\n // Update can be a Transaction, Reassignment, TopologyTransaction, or OffsetCheckpoint\n if (!('Transaction' in json.update)) {\n throw new CantonProtocolError(notFoundMessage);\n }\n\n return json.update.Transaction.value;\n }\n}\n"]}