@temple-digital-group/temple-canton-js 2.0.0 → 2.0.2
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.
- package/dist/canton/deposits.js +12 -10
- package/package.json +1 -1
- package/src/canton/deposits.ts +10 -10
- package/src/canton/index.js +191 -14
- package/src/canton/instrumentCatalog.d.ts +1 -0
- package/src/canton/instrumentCatalog.js +137 -37
package/dist/canton/deposits.js
CHANGED
|
@@ -3,7 +3,7 @@ import axios from "axios";
|
|
|
3
3
|
import { getDisclosures } from "../api/index.js";
|
|
4
4
|
import { getUserId } from "../api/tokenStore.js";
|
|
5
5
|
import { getAdapterPartyId, getWalletAdapter, submitCommand, payDueGasIfAny } from "../../src/canton/walletAdapter.js";
|
|
6
|
-
import { normalizeAssetId, instrumentCatalog } from "../../src/canton/instrumentCatalog.js";
|
|
6
|
+
import { normalizeAssetId, instrumentCatalog, instrumentIdToSymbol, resolveOnChainInstrumentId } from "../../src/canton/instrumentCatalog.js";
|
|
7
7
|
import { randomUUID, shouldUseLedgerForMetadata, normalizeContractId, resolveInstrumentDefinition, getInstrumentRegistrar, resolveProvider, dedupeDisclosedContracts, buildHeaders, DEFAULT_UTILITY_CONTEXT_KEYS, } from "./helpers.js";
|
|
8
8
|
import { resolveAmuletContext, resolveUtilityInstrumentConfiguration, resolveUtilityAllocationFactory, getAmuletHoldingsForParty, getUtilityHoldingsForParty, getUtxoCount, } from "../../src/canton/index.js";
|
|
9
9
|
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
@@ -48,14 +48,16 @@ export async function prepareDepositHoldings(amount, symbol) {
|
|
|
48
48
|
if (!createdEvent)
|
|
49
49
|
continue;
|
|
50
50
|
const createArg = createdEvent.createArgument;
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
// Utility holdings: filter by asset type and drop locked ones.
|
|
52
|
+
// Amulet holdings come pre-filtered by template, so no further checks needed.
|
|
53
|
+
if (!isAmulet) {
|
|
54
|
+
if (createArg?.lock)
|
|
55
|
+
continue;
|
|
56
|
+
const onChainId = createArg?.instrument?.id;
|
|
57
|
+
const heldSymbol = instrumentIdToSymbol[onChainId] || onChainId;
|
|
58
|
+
if (heldSymbol !== assetId)
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
59
61
|
const amountField = createArg?.amount;
|
|
60
62
|
const quantity = isAmulet
|
|
61
63
|
? parseFloat(amountField?.initialAmount || "0")
|
|
@@ -237,7 +239,7 @@ export async function depositFunds(opts, returnCommand = false) {
|
|
|
237
239
|
amount: parseFloat(parseFloat(String(amount)).toFixed(10)).toString(),
|
|
238
240
|
instrumentId: {
|
|
239
241
|
admin: admin,
|
|
240
|
-
id: assetId,
|
|
242
|
+
id: resolveOnChainInstrumentId(assetId),
|
|
241
243
|
},
|
|
242
244
|
meta: { values: {} },
|
|
243
245
|
},
|
package/package.json
CHANGED
package/src/canton/deposits.ts
CHANGED
|
@@ -3,7 +3,7 @@ import axios from "axios";
|
|
|
3
3
|
import { getDisclosures } from "../api/index.js";
|
|
4
4
|
import { getUserId } from "../api/tokenStore.js";
|
|
5
5
|
import { getAdapterPartyId, getWalletAdapter, submitCommand, payDueGasIfAny } from "../../src/canton/walletAdapter.js";
|
|
6
|
-
import { normalizeAssetId, instrumentCatalog } from "../../src/canton/instrumentCatalog.js";
|
|
6
|
+
import { normalizeAssetId, instrumentCatalog, instrumentIdToSymbol, resolveOnChainInstrumentId } from "../../src/canton/instrumentCatalog.js";
|
|
7
7
|
import {
|
|
8
8
|
randomUUID,
|
|
9
9
|
shouldUseLedgerForMetadata,
|
|
@@ -94,7 +94,6 @@ export async function prepareDepositHoldings(
|
|
|
94
94
|
if (!holdings || (holdings as unknown[]).length === 0) {
|
|
95
95
|
return { error: `prepareDepositHoldings: no holdings found for party ${party}` };
|
|
96
96
|
}
|
|
97
|
-
|
|
98
97
|
// Parse holdings into { contractId, quantity } and filter out locked
|
|
99
98
|
const parsed: { contractId: string; quantity: number }[] = [];
|
|
100
99
|
for (const h of holdings as Record<string, unknown>[]) {
|
|
@@ -105,13 +104,14 @@ export async function prepareDepositHoldings(
|
|
|
105
104
|
|
|
106
105
|
const createArg = createdEvent.createArgument as Record<string, unknown> | undefined;
|
|
107
106
|
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
// Utility holdings: filter by asset type and drop locked ones.
|
|
108
|
+
// Amulet holdings come pre-filtered by template, so no further checks needed.
|
|
109
|
+
if (!isAmulet) {
|
|
110
|
+
if (createArg?.lock) continue;
|
|
111
|
+
const onChainId = (createArg?.instrument as Record<string, unknown> | undefined)?.id as string;
|
|
112
|
+
const heldSymbol = instrumentIdToSymbol[onChainId] || onChainId;
|
|
113
|
+
if (heldSymbol !== assetId) continue;
|
|
114
|
+
}
|
|
115
115
|
|
|
116
116
|
const amountField = createArg?.amount as Record<string, unknown> | string | undefined;
|
|
117
117
|
const quantity = isAmulet
|
|
@@ -323,7 +323,7 @@ export async function depositFunds(
|
|
|
323
323
|
amount: parseFloat(parseFloat(String(amount)).toFixed(10)).toString(),
|
|
324
324
|
instrumentId: {
|
|
325
325
|
admin: admin,
|
|
326
|
-
id: assetId,
|
|
326
|
+
id: resolveOnChainInstrumentId(assetId),
|
|
327
327
|
},
|
|
328
328
|
meta: { values: {} },
|
|
329
329
|
},
|
package/src/canton/index.js
CHANGED
|
@@ -45,7 +45,7 @@ import unlockAmuletSchema from "./request_schemas/unlock_amulet.json" with { typ
|
|
|
45
45
|
import createUtilityCredentialSchema from "./request_schemas/create_utility_credential.json" with { type: "json" };
|
|
46
46
|
|
|
47
47
|
// Import instrument catalog
|
|
48
|
-
import { RegistrarInternalScheme, instrumentCatalog, instrumentIdToSymbol, supportedTradingPairs, supportedSymbols, normalizeAssetId } from "./instrumentCatalog.js";
|
|
48
|
+
import { RegistrarInternalScheme, instrumentCatalog, instrumentIdToSymbol, supportedTradingPairs, supportedSymbols, normalizeAssetId, resolveOnChainInstrumentId } from "./instrumentCatalog.js";
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
/**
|
|
@@ -1233,7 +1233,7 @@ async function buildLocalUtilityTransferFactory(investor, registrar, amount, hol
|
|
|
1233
1233
|
amount: amount,
|
|
1234
1234
|
instrumentId: {
|
|
1235
1235
|
admin: registrar,
|
|
1236
|
-
id: utilityAsset || "tSBC",
|
|
1236
|
+
id: resolveOnChainInstrumentId(utilityAsset) || "tSBC",
|
|
1237
1237
|
},
|
|
1238
1238
|
},
|
|
1239
1239
|
expectedAdmin: registrar,
|
|
@@ -1270,7 +1270,7 @@ async function getTransferFactoryFromRegistry(investor, registrar, amount, holdi
|
|
|
1270
1270
|
dso: registrar,
|
|
1271
1271
|
amount: amount,
|
|
1272
1272
|
holding_ids: holdingIds,
|
|
1273
|
-
instrument_id: utilityAsset,
|
|
1273
|
+
instrument_id: resolveOnChainInstrumentId(utilityAsset),
|
|
1274
1274
|
time: new Date().toISOString(),
|
|
1275
1275
|
timeEnd: new Date(Date.now() + 3600 * 1000).toISOString(),
|
|
1276
1276
|
};
|
|
@@ -1315,7 +1315,7 @@ export async function getTransferFactory(investor, admin, amount, holdingIds, re
|
|
|
1315
1315
|
dso: admin,
|
|
1316
1316
|
amount: amount,
|
|
1317
1317
|
holding_ids: holdingIds,
|
|
1318
|
-
instrument_id: utilityAsset || "Amulet",
|
|
1318
|
+
instrument_id: resolveOnChainInstrumentId(utilityAsset) || "Amulet",
|
|
1319
1319
|
time: new Date().toISOString(),
|
|
1320
1320
|
timeEnd: new Date(Date.now() + 3600 * 1000).toISOString(),
|
|
1321
1321
|
};
|
|
@@ -1627,8 +1627,9 @@ export async function getUtxoCount(party, assetId, provider = null) {
|
|
|
1627
1627
|
quantity = parseFloat(createArg?.amount?.initialAmount || 0);
|
|
1628
1628
|
matchesAsset = true;
|
|
1629
1629
|
} else {
|
|
1630
|
-
const
|
|
1631
|
-
|
|
1630
|
+
const onChainId = createArg?.instrument?.id || null;
|
|
1631
|
+
const heldSymbol = instrumentIdToSymbol[onChainId] || onChainId;
|
|
1632
|
+
if (heldSymbol !== assetId) continue;
|
|
1632
1633
|
isLocked = !!createArg?.lock;
|
|
1633
1634
|
quantity = parseFloat(createArg?.amount || 0);
|
|
1634
1635
|
matchesAsset = true;
|
|
@@ -1818,8 +1819,12 @@ export async function getCandidateHoldingForOrderCreation(party, isAmulet, requi
|
|
|
1818
1819
|
// For Utility, quantity is in createArgument.amount
|
|
1819
1820
|
const quantity = isAmulet ? parseFloat(createdEvent.createArgument?.amount?.initialAmount || 0) : parseFloat(createdEvent.createArgument?.amount || 0);
|
|
1820
1821
|
|
|
1821
|
-
// For Utility, also get the asset ID and scheme
|
|
1822
|
-
|
|
1822
|
+
// For Utility, also get the asset ID and scheme.
|
|
1823
|
+
// instrument.id from the ledger is the on-chain value (UUID for USDA/SBC);
|
|
1824
|
+
// translate to catalog symbol so downstream comparisons against user-passed
|
|
1825
|
+
// expectedAssetId work uniformly.
|
|
1826
|
+
const onChainId = isAmulet ? null : createdEvent.createArgument?.instrument?.id || null;
|
|
1827
|
+
const asset = isAmulet ? "Amulet" : instrumentIdToSymbol[onChainId] || onChainId;
|
|
1823
1828
|
const instrumentScheme = isAmulet ? null : createdEvent.createArgument?.instrument?.scheme || null;
|
|
1824
1829
|
|
|
1825
1830
|
// Extract owner/holder/operator/provider for debugging
|
|
@@ -2006,8 +2011,8 @@ export async function mergeAmuletHoldingsForParty(party, returnCommand = false,
|
|
|
2006
2011
|
return null;
|
|
2007
2012
|
}
|
|
2008
2013
|
|
|
2009
|
-
// Sort by quantity
|
|
2010
|
-
contracts.sort((a, b) =>
|
|
2014
|
+
// Sort by quantity descending (largest first) and apply maxUtxos limit
|
|
2015
|
+
contracts.sort((a, b) => b.quantity - a.quantity);
|
|
2011
2016
|
const selectedContracts = maxUtxos && maxUtxos < contracts.length ? contracts.slice(0, maxUtxos) : contracts;
|
|
2012
2017
|
|
|
2013
2018
|
if (selectedContracts.length < 2) {
|
|
@@ -2209,7 +2214,8 @@ export async function mergeUtilityHoldingsForParty(party, utilityAsset, returnCo
|
|
|
2209
2214
|
const source = createArg?.instrument?.source || null;
|
|
2210
2215
|
const rawAmount = createArg?.amount || "0";
|
|
2211
2216
|
const quantity = parseFloat(rawAmount);
|
|
2212
|
-
const
|
|
2217
|
+
const onChainId = createArg?.instrument?.id || null;
|
|
2218
|
+
const asset = instrumentIdToSymbol[onChainId] || onChainId;
|
|
2213
2219
|
const lock = createArg?.lock || false;
|
|
2214
2220
|
// Extract the holder from the holding contract (for utility tokens)
|
|
2215
2221
|
// Try multiple possible field names
|
|
@@ -2312,9 +2318,9 @@ export async function mergeUtilityHoldingsForParty(party, utilityAsset, returnCo
|
|
|
2312
2318
|
const finalHolders = [...new Set(contracts.map((c) => c.holder).filter(Boolean))];
|
|
2313
2319
|
const holder = finalHolders[0] || party; // Use the holder from filtered holdings
|
|
2314
2320
|
|
|
2315
|
-
// Sort
|
|
2321
|
+
// Sort descending by quantity so largest UTXOs are merged first
|
|
2316
2322
|
if (maxUtxos) {
|
|
2317
|
-
contracts.sort((a, b) =>
|
|
2323
|
+
contracts.sort((a, b) => b.quantity - a.quantity);
|
|
2318
2324
|
if (contracts.length > maxUtxos) {
|
|
2319
2325
|
contracts.length = maxUtxos;
|
|
2320
2326
|
}
|
|
@@ -2368,7 +2374,7 @@ export async function mergeUtilityHoldingsForParty(party, utilityAsset, returnCo
|
|
|
2368
2374
|
const rawAmount = transferInstruction.amount || totalQuantity;
|
|
2369
2375
|
const actualAmount = parseFloat(parseFloat(rawAmount).toFixed(10));
|
|
2370
2376
|
const instrumentAdmin = transferInstruction.instrumentId?.admin || registrar;
|
|
2371
|
-
const instrumentIdValue = transferInstruction.instrumentId?.id || utilityAsset;
|
|
2377
|
+
const instrumentIdValue = transferInstruction.instrumentId?.id || resolveOnChainInstrumentId(utilityAsset);
|
|
2372
2378
|
// For utility tokens the TransferFactory is registrar-administered, so expectedAdmin = registrar.
|
|
2373
2379
|
// Prefer the value returned by the Registry API, then fall back to the registrar from holdings.
|
|
2374
2380
|
const expectedAdmin = transferFactoryData.expectedAdmin || registrar;
|
|
@@ -3011,6 +3017,177 @@ export async function isUserOnboarded(user = null, returnCommand = false) {
|
|
|
3011
3017
|
}
|
|
3012
3018
|
}
|
|
3013
3019
|
|
|
3020
|
+
/**
|
|
3021
|
+
* Build an Allocation_Withdraw ExerciseCommand for one or more stuck allocation CIDs.
|
|
3022
|
+
* Returns the command(s) ready for submission via wallet adapter or ledger API.
|
|
3023
|
+
*
|
|
3024
|
+
* @param {Object} opts
|
|
3025
|
+
* @param {string|string[]} opts.allocationCids - Single CID or array of allocation contract IDs
|
|
3026
|
+
* @param {string} opts.assetId - The asset symbol ("Amulet", "CC", "USDCx", etc.)
|
|
3027
|
+
* @param {string} [opts.sender] - Party ID. Falls back to wallet adapter or VALIDATOR_USER_PARTY_ID.
|
|
3028
|
+
* @param {Object} [opts.disclosures] - Pre-fetched disclosures (optional, will be resolved if missing)
|
|
3029
|
+
* @returns {Promise<Object>} { commands: [...] } array of { command, endpoint } objects, or { error }
|
|
3030
|
+
*/
|
|
3031
|
+
export async function buildAllocationWithdrawCommand(opts) {
|
|
3032
|
+
const { disclosures, userId } = opts || {};
|
|
3033
|
+
const assetId = (opts.assetId === "CC" || opts.assetId === "cc") ? "Amulet" : opts.assetId;
|
|
3034
|
+
const sender = getAdapterPartyId() || opts.sender || config.VALIDATOR_USER_PARTY_ID;
|
|
3035
|
+
|
|
3036
|
+
if (!opts.allocationCids || !sender || !assetId) {
|
|
3037
|
+
return { error: "buildAllocationWithdrawCommand: allocationCids, sender, and assetId are required" };
|
|
3038
|
+
}
|
|
3039
|
+
|
|
3040
|
+
const cids = Array.isArray(opts.allocationCids) ? opts.allocationCids : [opts.allocationCids];
|
|
3041
|
+
if (cids.length === 0) {
|
|
3042
|
+
return { error: "buildAllocationWithdrawCommand: allocationCids must not be empty" };
|
|
3043
|
+
}
|
|
3044
|
+
|
|
3045
|
+
const isAmulet = assetId === "Amulet";
|
|
3046
|
+
|
|
3047
|
+
// --- Resolve context and disclosures (once for all CIDs) ---
|
|
3048
|
+
let choiceContextData = {};
|
|
3049
|
+
let disclosedContracts = [];
|
|
3050
|
+
|
|
3051
|
+
if (shouldUseLedgerForMetadata()) {
|
|
3052
|
+
if (isAmulet) {
|
|
3053
|
+
const amuletCtx = await resolveAmuletContext({ investor: sender, holdingIds: [], transferAmount: 0 });
|
|
3054
|
+
if (!amuletCtx) {
|
|
3055
|
+
return { error: "buildAllocationWithdrawCommand: failed to resolve Amulet context from ledger" };
|
|
3056
|
+
}
|
|
3057
|
+
const contextKeys = amuletCtx.contextKeys;
|
|
3058
|
+
choiceContextData = {
|
|
3059
|
+
values: {
|
|
3060
|
+
[contextKeys.amuletRules]: { tag: "AV_ContractId", value: amuletCtx.amuletRules.contractCid },
|
|
3061
|
+
[contextKeys.openRound]: { tag: "AV_ContractId", value: amuletCtx.openMiningRound.contractCid },
|
|
3062
|
+
[contextKeys.featuredAppRight]: { tag: "AV_ContractId", value: amuletCtx.featuredAppRight.contractCid },
|
|
3063
|
+
[contextKeys.expireLock]: { tag: "AV_Bool", value: true },
|
|
3064
|
+
},
|
|
3065
|
+
};
|
|
3066
|
+
disclosedContracts = [
|
|
3067
|
+
{ templateId: amuletCtx.amuletRules.templateId || null, contractId: amuletCtx.amuletRules.contractCid, createdEventBlob: amuletCtx.amuletRules.disclosureCid, synchronizerId: amuletCtx.amuletRules.synchronizerId },
|
|
3068
|
+
{ templateId: amuletCtx.openMiningRound.templateId || null, contractId: amuletCtx.openMiningRound.contractCid, createdEventBlob: amuletCtx.openMiningRound.disclosureCid, synchronizerId: amuletCtx.openMiningRound.synchronizerId },
|
|
3069
|
+
{ templateId: amuletCtx.externalAmuletRules.templateId || null, contractId: amuletCtx.externalAmuletRules.contractCid, createdEventBlob: amuletCtx.externalAmuletRules.disclosureCid, synchronizerId: amuletCtx.externalAmuletRules.synchronizerId },
|
|
3070
|
+
];
|
|
3071
|
+
if (amuletCtx.featuredAppRight?.contractCid && amuletCtx.featuredAppRight?.disclosureCid) {
|
|
3072
|
+
disclosedContracts.push({ templateId: amuletCtx.featuredAppRight.templateId || null, contractId: amuletCtx.featuredAppRight.contractCid, createdEventBlob: amuletCtx.featuredAppRight.disclosureCid, synchronizerId: amuletCtx.featuredAppRight.synchronizerId });
|
|
3073
|
+
}
|
|
3074
|
+
} else {
|
|
3075
|
+
const instrumentDef = resolveInstrumentDefinition(assetId);
|
|
3076
|
+
const networkDef = instrumentDef?.[config.NETWORK];
|
|
3077
|
+
const registrar = networkDef?.registrar || getInstrumentRegistrar(assetId) || config.VALIDATOR_REGISTRAR_PARTY_ID;
|
|
3078
|
+
const [allocFactory, instConfig] = await Promise.all([
|
|
3079
|
+
resolveUtilityAllocationFactory(registrar, sender),
|
|
3080
|
+
resolveUtilityInstrumentConfiguration(assetId, registrar),
|
|
3081
|
+
]);
|
|
3082
|
+
if (instConfig) {
|
|
3083
|
+
choiceContextData = {
|
|
3084
|
+
values: {
|
|
3085
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.instrumentConfiguration]: { tag: "AV_ContractId", value: instConfig.contractCid },
|
|
3086
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.instrumentConfigurationPrefixed]: { tag: "AV_ContractId", value: instConfig.contractCid },
|
|
3087
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.senderCredentials]: { tag: "AV_List", value: [] },
|
|
3088
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.senderCredentialsPrefixed]: { tag: "AV_List", value: [] },
|
|
3089
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.receiverCredentials]: { tag: "AV_List", value: [] },
|
|
3090
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.receiverCredentialsPrefixed]: { tag: "AV_List", value: [] },
|
|
3091
|
+
[DEFAULT_AMULET_CONTEXT_KEYS.expireLock]: { tag: "AV_Bool", value: true },
|
|
3092
|
+
},
|
|
3093
|
+
};
|
|
3094
|
+
disclosedContracts.push({ templateId: null, contractId: instConfig.contractCid, createdEventBlob: instConfig.disclosureCid, synchronizerId: instConfig.synchronizerId });
|
|
3095
|
+
}
|
|
3096
|
+
if (allocFactory) {
|
|
3097
|
+
disclosedContracts.push({ templateId: null, contractId: allocFactory.contractCid, createdEventBlob: allocFactory.disclosureCid, synchronizerId: allocFactory.synchronizerId });
|
|
3098
|
+
}
|
|
3099
|
+
}
|
|
3100
|
+
} else if (isAmulet) {
|
|
3101
|
+
// Resolve via disclosures API
|
|
3102
|
+
let resolvedData = disclosures?.disclosures || disclosures || null;
|
|
3103
|
+
if (!resolvedData?.choiceContext) {
|
|
3104
|
+
const disclosuresResult = await getDisclosures(sender);
|
|
3105
|
+
resolvedData = disclosuresResult?.disclosures;
|
|
3106
|
+
if (disclosuresResult?.error || !resolvedData?.choiceContext) {
|
|
3107
|
+
return { error: `buildAllocationWithdrawCommand: failed to resolve Amulet disclosures: ${disclosuresResult?.message || disclosuresResult?.error || "missing choiceContext"}` };
|
|
3108
|
+
}
|
|
3109
|
+
}
|
|
3110
|
+
choiceContextData = resolvedData.choiceContext.choiceContextData || {};
|
|
3111
|
+
const values = choiceContextData.values;
|
|
3112
|
+
if (values && !values[DEFAULT_AMULET_CONTEXT_KEYS.expireLock]) {
|
|
3113
|
+
values[DEFAULT_AMULET_CONTEXT_KEYS.expireLock] = { tag: "AV_Bool", value: true };
|
|
3114
|
+
}
|
|
3115
|
+
disclosedContracts = (resolvedData.choiceContext.disclosedContracts || []).map(dc => ({
|
|
3116
|
+
templateId: dc.templateId, contractId: dc.contractId, createdEventBlob: dc.createdEventBlob, synchronizerId: dc.synchronizerId,
|
|
3117
|
+
}));
|
|
3118
|
+
} else {
|
|
3119
|
+
// Utility: build context from catalog data (no ledger/validator access needed)
|
|
3120
|
+
const instrumentDef = resolveInstrumentDefinition(assetId);
|
|
3121
|
+
const networkContracts = instrumentDef?.[config.NETWORK];
|
|
3122
|
+
if (!networkContracts) {
|
|
3123
|
+
return { error: `buildAllocationWithdrawCommand: no ${config.NETWORK} config for ${assetId} in instrument catalog` };
|
|
3124
|
+
}
|
|
3125
|
+
const instConfig = networkContracts.instrumentConfiguration;
|
|
3126
|
+
const allocFactory = networkContracts.allocationFactory;
|
|
3127
|
+
const synchronizerId = networkContracts.synchronizerId;
|
|
3128
|
+
|
|
3129
|
+
if (!instConfig?.contractId || !instConfig?.eventBlob) {
|
|
3130
|
+
return { error: `buildAllocationWithdrawCommand: instrumentConfiguration missing for ${assetId} on ${config.NETWORK}` };
|
|
3131
|
+
}
|
|
3132
|
+
|
|
3133
|
+
choiceContextData = {
|
|
3134
|
+
values: {
|
|
3135
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.instrumentConfiguration]: { tag: "AV_ContractId", value: instConfig.contractId },
|
|
3136
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.instrumentConfigurationPrefixed]: { tag: "AV_ContractId", value: instConfig.contractId },
|
|
3137
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.senderCredentials]: { tag: "AV_List", value: [] },
|
|
3138
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.senderCredentialsPrefixed]: { tag: "AV_List", value: [] },
|
|
3139
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.receiverCredentials]: { tag: "AV_List", value: [] },
|
|
3140
|
+
[DEFAULT_UTILITY_CONTEXT_KEYS.receiverCredentialsPrefixed]: { tag: "AV_List", value: [] },
|
|
3141
|
+
[DEFAULT_AMULET_CONTEXT_KEYS.expireLock]: { tag: "AV_Bool", value: true },
|
|
3142
|
+
},
|
|
3143
|
+
};
|
|
3144
|
+
disclosedContracts.push({
|
|
3145
|
+
templateId: instConfig.templateId || null,
|
|
3146
|
+
contractId: instConfig.contractId,
|
|
3147
|
+
createdEventBlob: instConfig.eventBlob,
|
|
3148
|
+
synchronizerId: synchronizerId,
|
|
3149
|
+
});
|
|
3150
|
+
if (allocFactory?.contractId && allocFactory?.eventBlob) {
|
|
3151
|
+
disclosedContracts.push({
|
|
3152
|
+
templateId: allocFactory.templateId || null,
|
|
3153
|
+
contractId: allocFactory.contractId,
|
|
3154
|
+
createdEventBlob: allocFactory.eventBlob,
|
|
3155
|
+
synchronizerId: synchronizerId,
|
|
3156
|
+
});
|
|
3157
|
+
}
|
|
3158
|
+
}
|
|
3159
|
+
|
|
3160
|
+
// --- Build one command per allocation CID ---
|
|
3161
|
+
const endpoint = `${config.VALIDATOR_API_URL}/v2/commands/submit-and-wait`;
|
|
3162
|
+
const commands = cids.map(cid => {
|
|
3163
|
+
const allocationCid = normalizeContractId(cid);
|
|
3164
|
+
const command = {
|
|
3165
|
+
commands: [{
|
|
3166
|
+
ExerciseCommand: {
|
|
3167
|
+
templateId: "#splice-api-token-allocation-v1:Splice.Api.Token.AllocationV1:Allocation",
|
|
3168
|
+
contractId: allocationCid,
|
|
3169
|
+
choice: "Allocation_Withdraw",
|
|
3170
|
+
choiceArgument: {
|
|
3171
|
+
extraArgs: {
|
|
3172
|
+
context: choiceContextData,
|
|
3173
|
+
meta: { values: {} },
|
|
3174
|
+
},
|
|
3175
|
+
},
|
|
3176
|
+
},
|
|
3177
|
+
}],
|
|
3178
|
+
commandId: randomUUID(),
|
|
3179
|
+
userId: userId || getUserId() || config.AUTH0_USER_ID || "temple",
|
|
3180
|
+
applicationId: "temple",
|
|
3181
|
+
actAs: [sender],
|
|
3182
|
+
disclosedContracts: [...disclosedContracts],
|
|
3183
|
+
};
|
|
3184
|
+
dedupeDisclosedContracts(command);
|
|
3185
|
+
return { command, endpoint };
|
|
3186
|
+
});
|
|
3187
|
+
|
|
3188
|
+
return { commands };
|
|
3189
|
+
}
|
|
3190
|
+
|
|
3014
3191
|
/**
|
|
3015
3192
|
* Get all balances for a party, grouped by asset type.
|
|
3016
3193
|
* Returns Amulet, locked Amulet, and utility token holdings with totals.
|
|
@@ -4,3 +4,4 @@ export const instrumentIdToSymbol: Record<string, string>;
|
|
|
4
4
|
export const supportedTradingPairs: Array<{ baseAsset: string; quoteAsset: string }>;
|
|
5
5
|
export const supportedSymbols: Record<string, unknown>;
|
|
6
6
|
export function normalizeAssetId(symbol: string): string;
|
|
7
|
+
export function resolveOnChainInstrumentId(symbol: string): string;
|
|
@@ -7,17 +7,18 @@ export const RegistrarInternalScheme = "RegistrarInternalScheme";
|
|
|
7
7
|
// operator/provider define which party's AllocationFactory and InstrumentConfiguration to use
|
|
8
8
|
// Holdings must have matching operator/provider to be compatible
|
|
9
9
|
export const instrumentCatalog = {
|
|
10
|
-
|
|
10
|
+
Amulet: {
|
|
11
11
|
id: "Amulet",
|
|
12
|
+
aliases: ["CC"],
|
|
12
13
|
kind: InstrumentKindAmulet,
|
|
13
14
|
scheme: null,
|
|
14
15
|
registrar: null,
|
|
15
16
|
operator: null,
|
|
16
17
|
provider: null,
|
|
17
18
|
disclosureURL: null,
|
|
18
|
-
requireCredentials: false
|
|
19
|
+
requireCredentials: false,
|
|
19
20
|
},
|
|
20
|
-
|
|
21
|
+
USDCx: {
|
|
21
22
|
id: "USDCx",
|
|
22
23
|
scheme: RegistrarInternalScheme,
|
|
23
24
|
kind: InstrumentKindUtility,
|
|
@@ -25,29 +26,33 @@ export const instrumentCatalog = {
|
|
|
25
26
|
requireCredentials: false,
|
|
26
27
|
// TestNet contracts - from https://docs.digitalasset.com/usdc/xreserve/appendix-testnet-technical-setup.html
|
|
27
28
|
testnet: {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
registryAPI:
|
|
29
|
+
synchronizerId: "global-domain::1220f22a8b8f2d813c25b9a684dc4dd52b532a0174d8e73a13cdf2baabfff7518337",
|
|
30
|
+
registrar: "decentralized-usdc-interchain-rep::122049e2af8a725bd19759320fc83c638e7718973eac189d8f201309c512d1ffec61",
|
|
31
|
+
operator: "DigitalAsset-UtilityOperator::12202679f2bbe57d8cba9ef3cee847ac8239df0877105ab1f01a77d47477fdce1204",
|
|
32
|
+
provider: "Bridge-Operator::12209d011ce250de439fefc35d16d1ab9d56fb99ccb24c18d798efb22352d533bcdb",
|
|
33
|
+
registryAPI:
|
|
34
|
+
"https://api.utilities.digitalasset-staging.com/api/token-standard/v0/registrars/decentralized-usdc-interchain-rep::122049e2af8a725bd19759320fc83c638e7718973eac189d8f201309c512d1ffec61/registry",
|
|
33
35
|
instrumentConfiguration: {
|
|
34
36
|
contractId: "00042d3cc4195cd3e03407be8654e36cf1881aeaa771cc8e631f793999fd2df0fdca1112200ae23ea2ffdcf4841e345dde1cbc84cec7576989eeadb2c77e77e63501e6f581",
|
|
35
37
|
templateId: "b4ae77b8c0c7faa8bc8bb048f035dfe3d85d3e36d4bafaa4cf59631ec635ddb2:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
|
|
36
|
-
|
|
38
|
+
eventBlob:
|
|
39
|
+
"CgMyLjEStAkKRQAELTzEGVzT4DQHvoZU42zxiBrqp3HMjmMfeTmZ/S3w/coREiAK4j6i/9z0hB40Xd4cvITOx1dpie6tssd+d+Y1Aeb1gRITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAYjRhZTc3YjhjMGM3ZmFhOGJjOGJiMDQ4ZjAzNWRmZTNkODVkM2UzNmQ0YmFmYWE0Y2Y1OTYzMWVjNjM1ZGRiMhIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiLsBGrpBApmCmQ6YkRpZ2l0YWxBc3NldC1VdGlsaXR5T3BlcmF0b3I6OjEyMjAyNjc5ZjJiYmU1N2Q4Y2JhOWVmM2NlZTg0N2FjODIzOWRmMDg3NzEwNWFiMWYwMWE3N2Q0NzQ3N2ZkY2UxMjA0ClkKVzpVQnJpZGdlLU9wZXJhdG9yOjoxMjIwOWQwMTFjZTI1MGRlNDM5ZmVmYzM1ZDE2ZDFhYjlkNTZmYjk5Y2NiMjRjMThkNzk4ZWZiMjIzNTJkNTMzYmNkYgprCmk6Z2RlY2VudHJhbGl6ZWQtdXNkYy1pbnRlcmNoYWluLXJlcDo6MTIyMDQ5ZTJhZjhhNzI1YmQxOTc1OTMyMGZjODNjNjM4ZTc3MTg5NzNlYWMxODlkOGYyMDEzMDljNTEyZDFmZmVjNjEKmwEKmAFqlQEKawppOmdkZWNlbnRyYWxpemVkLXVzZGMtaW50ZXJjaGFpbi1yZXA6OjEyMjA0OWUyYWY4YTcyNWJkMTk3NTkzMjBmYzgzYzYzOGU3NzE4OTczZWFjMTg5ZDhmMjAxMzA5YzUxMmQxZmZlYzYxCgkKB0IFVVNEQ3gKGwoZQhdSZWdpc3RyYXJJbnRlcm5hbFNjaGVtZQoECgJaAAqMAQqJAVqGAQqDAWqAAQpZClc6VUJyaWRnZS1PcGVyYXRvcjo6MTIyMDlkMDExY2UyNTBkZTQzOWZlZmMzNWQxNmQxYWI5ZDU2ZmI5OWNjYjI0YzE4ZDc5OGVmYjIyMzUyZDUzM2JjZGIKIwohWh8KHWobCg4KDEIKSXNJc3N1ZXJPZgoJCgdCBVVTREN4CgQKAloAKlVCcmlkZ2UtT3BlcmF0b3I6OjEyMjA5ZDAxMWNlMjUwZGU0MzlmZWZjMzVkMTZkMWFiOWQ1NmZiOTljY2IyNGMxOGQ3OThlZmIyMjM1MmQ1MzNiY2RiKmdkZWNlbnRyYWxpemVkLXVzZGMtaW50ZXJjaGFpbi1yZXA6OjEyMjA0OWUyYWY4YTcyNWJkMTk3NTkzMjBmYzgzYzYzOGU3NzE4OTczZWFjMTg5ZDhmMjAxMzA5YzUxMmQxZmZlYzYxMmJEaWdpdGFsQXNzZXQtVXRpbGl0eU9wZXJhdG9yOjoxMjIwMjY3OWYyYmJlNTdkOGNiYTllZjNjZWU4NDdhYzgyMzlkZjA4NzcxMDVhYjFmMDFhNzdkNDc0NzdmZGNlMTIwNDmUW0iuSUEGAEIqCiYKJAgBEiB22c8ZP/kGXXsITRrlviqwHjLXxwQvBCjqh0oYm2E5gRAe",
|
|
37
40
|
},
|
|
38
41
|
allocationFactory: {
|
|
39
42
|
contractId: "00bede5fa4fd3d4f7ac250facd513ded42859076c2890a62b6ad148634c2fee59cca1112200101f0642c657e51f7f4a41e50502167fbbb4ea7b1d5552b9e6e1ab81b457d86",
|
|
40
43
|
templateId: "8c335bb7d522489d71faf3eef046ad1a56f091b55b4f2d3086c7266afca1d647:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory",
|
|
41
|
-
|
|
44
|
+
eventBlob:
|
|
45
|
+
"CgMyLjES/wYKRQC+3l+k/T1PesJQ+s1RPe1ChZB2wokKYratFIY0wv7lnMoREiABAfBkLGV+Uff0pB5QUCFn+7tOp7HVVSuebhq4G0V9hhIXdXRpbGl0eS1yZWdpc3RyeS1hcHAtdjAajQEKQDhjMzM1YmI3ZDUyMjQ4OWQ3MWZhZjNlZWYwNDZhZDFhNTZmMDkxYjU1YjRmMmQzMDg2YzcyNjZhZmNhMWQ2NDcSB1V0aWxpdHkSCFJlZ2lzdHJ5EgNBcHASAlYwEgdTZXJ2aWNlEhFBbGxvY2F0aW9uRmFjdG9yeRoRQWxsb2NhdGlvbkZhY3RvcnkiswJqsAIKWQpXOlVCcmlkZ2UtT3BlcmF0b3I6OjEyMjA5ZDAxMWNlMjUwZGU0MzlmZWZjMzVkMTZkMWFiOWQ1NmZiOTljY2IyNGMxOGQ3OThlZmIyMjM1MmQ1MzNiY2RiCmsKaTpnZGVjZW50cmFsaXplZC11c2RjLWludGVyY2hhaW4tcmVwOjoxMjIwNDllMmFmOGE3MjViZDE5NzU5MzIwZmM4M2M2MzhlNzcxODk3M2VhYzE4OWQ4ZjIwMTMwOWM1MTJkMWZmZWM2MQpmCmQ6YkRpZ2l0YWxBc3NldC1VdGlsaXR5T3BlcmF0b3I6OjEyMjAyNjc5ZjJiYmU1N2Q4Y2JhOWVmM2NlZTg0N2FjODIzOWRmMDg3NzEwNWFiMWYwMWE3N2Q0NzQ3N2ZkY2UxMjA0KlVCcmlkZ2UtT3BlcmF0b3I6OjEyMjA5ZDAxMWNlMjUwZGU0MzlmZWZjMzVkMTZkMWFiOWQ1NmZiOTljY2IyNGMxOGQ3OThlZmIyMjM1MmQ1MzNiY2RiKmdkZWNlbnRyYWxpemVkLXVzZGMtaW50ZXJjaGFpbi1yZXA6OjEyMjA0OWUyYWY4YTcyNWJkMTk3NTkzMjBmYzgzYzYzOGU3NzE4OTczZWFjMTg5ZDhmMjAxMzA5YzUxMmQxZmZlYzYxMmJEaWdpdGFsQXNzZXQtVXRpbGl0eU9wZXJhdG9yOjoxMjIwMjY3OWYyYmJlNTdkOGNiYTllZjNjZWU4NDdhYzgyMzlkZjA4NzcxMDVhYjFmMDFhNzdkNDc0NzdmZGNlMTIwNDmUW0iuSUEGAEIqCiYKJAgBEiCzbjLLZHXmAykV4okcMgzmrn1NLufmehZRjSn4JCCisBAe",
|
|
42
46
|
},
|
|
43
47
|
appRewardConfiguration: {
|
|
44
48
|
contractId: "001a44911feb95bb29e7909419d29de2dfdb56b517a514089839c933e241c61b83ca111220a7779f5db25358272e05d13bba65c1a34cd7cc9740900ed9c8263e139ee6273d",
|
|
45
49
|
templateId: "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.AppReward:AppRewardConfiguration",
|
|
46
|
-
|
|
50
|
+
eventBlob:
|
|
51
|
+
"CgMyLjES+wYKRQAaRJEf65W7KeeQlBnSneLf21a1F6UUCJg5yTPiQcYbg8oREiCnd59dslNYJy4F0Tu6ZcGjTNfMl0CQDtnIJj4TnuYnPRITdXRpbGl0eS1yZWdpc3RyeS12MBqLAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEglBcHBSZXdhcmQaFkFwcFJld2FyZENvbmZpZ3VyYXRpb24ingNqmwMKZgpkOmJEaWdpdGFsQXNzZXQtVXRpbGl0eU9wZXJhdG9yOjoxMjIwMjY3OWYyYmJlNTdkOGNiYTllZjNjZWU4NDdhYzgyMzlkZjA4NzcxMDVhYjFmMDFhNzdkNDc0NzdmZGNlMTIwNApZClc6VUJyaWRnZS1PcGVyYXRvcjo6MTIyMDlkMDExY2UyNTBkZTQzOWZlZmMzNWQxNmQxYWI5ZDU2ZmI5OWNjYjI0YzE4ZDc5OGVmYjIyMzUyZDUzM2JjZGIK1QEK0gFqzwEKTQpLOklEU086OjEyMjBmMjJhOGI4ZjJkODEzYzI1YjlhNjg0ZGM0ZGQ1MmI1MzJhMDE3NGQ4ZTczYTEzY2RmMmJhYWJmZmY3NTE4MzM3Cn4KfGp6CmYKZDpiRGlnaXRhbEFzc2V0LVV0aWxpdHlPcGVyYXRvcjo6MTIyMDI2NzlmMmJiZTU3ZDhjYmE5ZWYzY2VlODQ3YWM4MjM5ZGYwODc3MTA1YWIxZjAxYTc3ZDQ3NDc3ZmRjZTEyMDQKEAoOMgwwLjIwMDAwMDAwMDAqYkRpZ2l0YWxBc3NldC1VdGlsaXR5T3BlcmF0b3I6OjEyMjAyNjc5ZjJiYmU1N2Q4Y2JhOWVmM2NlZTg0N2FjODIzOWRmMDg3NzEwNWFiMWYwMWE3N2Q0NzQ3N2ZkY2UxMjA0MlVCcmlkZ2UtT3BlcmF0b3I6OjEyMjA5ZDAxMWNlMjUwZGU0MzlmZWZjMzVkMTZkMWFiOWQ1NmZiOTljY2IyNGMxOGQ3OThlZmIyMjM1MmQ1MzNiY2RiOZd2MhhIQQYAQioKJgokCAESIK5RtXRcXPi5fDeDJOgQyc3oD9b8hKHJP88dT+saFI+EEB4=",
|
|
47
52
|
},
|
|
48
53
|
featuredAppRight: {
|
|
49
|
-
contractId: "0038c29eaaa23a2f01b6cd583579008cbf596316191f7ceb4d1815a433649f15fcca1112208e4a3e81efa5c5b4797c6c126fd2178b7af408b903e7ae06acda2a4d66f15f9a"
|
|
50
|
-
}
|
|
54
|
+
contractId: "0038c29eaaa23a2f01b6cd583579008cbf596316191f7ceb4d1815a433649f15fcca1112208e4a3e81efa5c5b4797c6c126fd2178b7af408b903e7ae06acda2a4d66f15f9a",
|
|
55
|
+
},
|
|
51
56
|
},
|
|
52
57
|
// MainNet contracts - from https://docs.digitalasset.com/usdc/xreserve/mainnet-technical-setup.html
|
|
53
58
|
mainnet: {
|
|
@@ -55,30 +60,34 @@ export const instrumentCatalog = {
|
|
|
55
60
|
registrar: "decentralized-usdc-interchain-rep::12208115f1e168dd7e792320be9c4ca720c751a02a3053c7606e1c1cd3dad9bf60ef",
|
|
56
61
|
operator: "auth0_007c6643538f2eadd3e573dd05b9::12205bcc106efa0eaa7f18dc491e5c6f5fb9b0cc68dc110ae66f4ed6467475d7c78e",
|
|
57
62
|
provider: "Bridge-Operator::1220c8448890a70e65f6906bd48d797ee6551f094e9e6a53e329fd5b2b549334f13f",
|
|
58
|
-
registryAPI:
|
|
63
|
+
registryAPI:
|
|
64
|
+
"https://api.utilities.digitalasset.com/api/token-standard/v0/registrars/decentralized-usdc-interchain-rep::12208115f1e168dd7e792320be9c4ca720c751a02a3053c7606e1c1cd3dad9bf60ef/registry",
|
|
59
65
|
instrumentConfiguration: {
|
|
60
66
|
contractId: "002a23aed42edb51940f74f6fc5f7b8267c9192ab8e72296673420ffc4c4f22debca1112201d94617a63f11a4ce245498930752e56313d200b6a0976ee621f6add2788ba1b",
|
|
61
67
|
templateId: "b4ae77b8c0c7faa8bc8bb048f035dfe3d85d3e36d4bafaa4cf59631ec635ddb2:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
|
|
62
|
-
eventBlob:
|
|
68
|
+
eventBlob:
|
|
69
|
+
"CgMyLjESwAkKRQAqI67ULttRlA909vxfe4JnyRkquOcilmc0IP/ExPIt68oREiAdlGF6Y/EaTOJFSYkwdS5WMT0gC2oJdu5iH2rdJ4i6GxITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAYjRhZTc3YjhjMGM3ZmFhOGJjOGJiMDQ4ZjAzNWRmZTNkODVkM2UzNmQ0YmFmYWE0Y2Y1OTYzMWVjNjM1ZGRiMhIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiLyBGrvBApsCmo6aGF1dGgwXzAwN2M2NjQzNTM4ZjJlYWRkM2U1NzNkZDA1Yjk6OjEyMjA1YmNjMTA2ZWZhMGVhYTdmMThkYzQ5MWU1YzZmNWZiOWIwY2M2OGRjMTEwYWU2NmY0ZWQ2NDY3NDc1ZDdjNzhlClkKVzpVQnJpZGdlLU9wZXJhdG9yOjoxMjIwYzg0NDg4OTBhNzBlNjVmNjkwNmJkNDhkNzk3ZWU2NTUxZjA5NGU5ZTZhNTNlMzI5ZmQ1YjJiNTQ5MzM0ZjEzZgprCmk6Z2RlY2VudHJhbGl6ZWQtdXNkYy1pbnRlcmNoYWluLXJlcDo6MTIyMDgxMTVmMWUxNjhkZDdlNzkyMzIwYmU5YzRjYTcyMGM3NTFhMDJhMzA1M2M3NjA2ZTFjMWNkM2RhZDliZjYwZWYKmwEKmAFqlQEKawppOmdkZWNlbnRyYWxpemVkLXVzZGMtaW50ZXJjaGFpbi1yZXA6OjEyMjA4MTE1ZjFlMTY4ZGQ3ZTc5MjMyMGJlOWM0Y2E3MjBjNzUxYTAyYTMwNTNjNzYwNmUxYzFjZDNkYWQ5YmY2MGVmCgkKB0IFVVNEQ3gKGwoZQhdSZWdpc3RyYXJJbnRlcm5hbFNjaGVtZQoECgJaAAqMAQqJAVqGAQqDAWqAAQpZClc6VUJyaWRnZS1PcGVyYXRvcjo6MTIyMGM4NDQ4ODkwYTcwZTY1ZjY5MDZiZDQ4ZDc5N2VlNjU1MWYwOTRlOWU2YTUzZTMyOWZkNWIyYjU0OTMzNGYxM2YKIwohWh8KHWobCg4KDEIKSXNJc3N1ZXJPZgoJCgdCBVVTREN4CgQKAloAKlVCcmlkZ2UtT3BlcmF0b3I6OjEyMjBjODQ0ODg5MGE3MGU2NWY2OTA2YmQ0OGQ3OTdlZTY1NTFmMDk0ZTllNmE1M2UzMjlmZDViMmI1NDkzMzRmMTNmKmdkZWNlbnRyYWxpemVkLXVzZGMtaW50ZXJjaGFpbi1yZXA6OjEyMjA4MTE1ZjFlMTY4ZGQ3ZTc5MjMyMGJlOWM0Y2E3MjBjNzUxYTAyYTMwNTNjNzYwNmUxYzFjZDNkYWQ5YmY2MGVmMmhhdXRoMF8wMDdjNjY0MzUzOGYyZWFkZDNlNTczZGQwNWI5OjoxMjIwNWJjYzEwNmVmYTBlYWE3ZjE4ZGM0OTFlNWM2ZjVmYjliMGNjNjhkYzExMGFlNjZmNGVkNjQ2NzQ3NWQ3Yzc4ZTlPYpygnEEGAEIqCiYKJAgBEiDG2u5/5aFqKxIBQ1NhOOUuMloJWjlgtAJ9hY+R5wQVHRAe",
|
|
63
70
|
},
|
|
64
71
|
allocationFactory: {
|
|
65
72
|
contractId: "006289e882123613ea96d71fad9cc38a529e613a8d4b550ef6a0422383e1925934ca11122003bc3af7d468f09465fa72db6182b63e349804e430a81eeeffa9076f5099f796",
|
|
66
73
|
templateId: "8c335bb7d522489d71faf3eef046ad1a56f091b55b4f2d3086c7266afca1d647:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory",
|
|
67
|
-
eventBlob:
|
|
74
|
+
eventBlob:
|
|
75
|
+
"CgMyLjESiwcKRQBiieiCEjYT6pbXH62cw4pSnmE6jUtVDvagQiOD4ZJZNMoREiADvDr31GjwlGX6ctthgrY+NJgE5DCoHu7/qQdvUJn3lhIXdXRpbGl0eS1yZWdpc3RyeS1hcHAtdjAajQEKQDhjMzM1YmI3ZDUyMjQ4OWQ3MWZhZjNlZWYwNDZhZDFhNTZmMDkxYjU1YjRmMmQzMDg2YzcyNjZhZmNhMWQ2NDcSB1V0aWxpdHkSCFJlZ2lzdHJ5EgNBcHASAlYwEgdTZXJ2aWNlEhFBbGxvY2F0aW9uRmFjdG9yeRoRQWxsb2NhdGlvbkZhY3RvcnkiuQJqtgIKWQpXOlVCcmlkZ2UtT3BlcmF0b3I6OjEyMjBjODQ0ODg5MGE3MGU2NWY2OTA2YmQ0OGQ3OTdlZTY1NTFmMDk0ZTllNmE1M2UzMjlmZDViMmI1NDkzMzRmMTNmCmsKaTpnZGVjZW50cmFsaXplZC11c2RjLWludGVyY2hhaW4tcmVwOjoxMjIwODExNWYxZTE2OGRkN2U3OTIzMjBiZTljNGNhNzIwYzc1MWEwMmEzMDUzYzc2MDZlMWMxY2QzZGFkOWJmNjBlZgpsCmo6aGF1dGgwXzAwN2M2NjQzNTM4ZjJlYWRkM2U1NzNkZDA1Yjk6OjEyMjA1YmNjMTA2ZWZhMGVhYTdmMThkYzQ5MWU1YzZmNWZiOWIwY2M2OGRjMTEwYWU2NmY0ZWQ2NDY3NDc1ZDdjNzhlKlVCcmlkZ2UtT3BlcmF0b3I6OjEyMjBjODQ0ODg5MGE3MGU2NWY2OTA2YmQ0OGQ3OTdlZTY1NTFmMDk0ZTllNmE1M2UzMjlmZDViMmI1NDkzMzRmMTNmKmdkZWNlbnRyYWxpemVkLXVzZGMtaW50ZXJjaGFpbi1yZXA6OjEyMjA4MTE1ZjFlMTY4ZGQ3ZTc5MjMyMGJlOWM0Y2E3MjBjNzUxYTAyYTMwNTNjNzYwNmUxYzFjZDNkYWQ5YmY2MGVmMmhhdXRoMF8wMDdjNjY0MzUzOGYyZWFkZDNlNTczZGQwNWI5OjoxMjIwNWJjYzEwNmVmYTBlYWE3ZjE4ZGM0OTFlNWM2ZjVmYjliMGNjNjhkYzExMGFlNjZmNGVkNjQ2NzQ3NWQ3Yzc4ZTlPYpygnEEGAEIqCiYKJAgBEiC7t2lHB3NuKxVhVA0EL5T+JGl5YJ6hVSv8wD+vxG3/+BAe",
|
|
68
76
|
},
|
|
69
77
|
appRewardConfiguration: {
|
|
70
78
|
contractId: "00ad54961b99aa48d545fe0d74a6b56737e8cb0d7935e831ee1afce0619a4a82bfca1112202c765d54dfcc7a1db8d0bbb5f06951ceb4562a1acaaf74de13c6d05ebe4a64c4",
|
|
71
79
|
templateId: "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.AppReward:AppRewardConfiguration",
|
|
72
|
-
eventBlob:
|
|
80
|
+
eventBlob:
|
|
81
|
+
"CgMyLjESkAcKRQCtVJYbmapI1UX+DXSmtWc36MsNeTXoMe4a/OBhmkqCv8oREiAsdl1U38x6HbjQu7XwaVHOtFYqGsqvdN4TxtBevkpkxBITdXRpbGl0eS1yZWdpc3RyeS12MBqLAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEglBcHBSZXdhcmQaFkFwcFJld2FyZENvbmZpZ3VyYXRpb24irQNqqgMKbApqOmhhdXRoMF8wMDdjNjY0MzUzOGYyZWFkZDNlNTczZGQwNWI5OjoxMjIwNWJjYzEwNmVmYTBlYWE3ZjE4ZGM0OTFlNWM2ZjVmYjliMGNjNjhkYzExMGFlNjZmNGVkNjQ2NzQ3NWQ3Yzc4ZQpZClc6VUJyaWRnZS1PcGVyYXRvcjo6MTIyMGM4NDQ4ODkwYTcwZTY1ZjY5MDZiZDQ4ZDc5N2VlNjU1MWYwOTRlOWU2YTUzZTMyOWZkNWIyYjU0OTMzNGYxM2YK3gEK2wFq2AEKTQpLOklEU086OjEyMjBiMTQzMWVmMjE3MzQyZGI0NGQ1MTZiYjliZWZkZTgwMmJlN2Q4ODk5NjM3ZDI5MDg5NWZhNTg4ODBmMTlhY2NjCoYBCoMBaoABCmwKajpoYXV0aDBfMDA3YzY2NDM1MzhmMmVhZGQzZTU3M2RkMDViOTo6MTIyMDViY2MxMDZlZmEwZWFhN2YxOGRjNDkxZTVjNmY1ZmI5YjBjYzY4ZGMxMTBhZTY2ZjRlZDY0Njc0NzVkN2M3OGUKEAoOMgwwLjAwMDAwMDAwMDAqaGF1dGgwXzAwN2M2NjQzNTM4ZjJlYWRkM2U1NzNkZDA1Yjk6OjEyMjA1YmNjMTA2ZWZhMGVhYTdmMThkYzQ5MWU1YzZmNWZiOWIwY2M2OGRjMTEwYWU2NmY0ZWQ2NDY3NDc1ZDdjNzhlMlVCcmlkZ2UtT3BlcmF0b3I6OjEyMjBjODQ0ODg5MGE3MGU2NWY2OTA2YmQ0OGQ3OTdlZTY1NTFmMDk0ZTllNmE1M2UzMjlmZDViMmI1NDkzMzRmMTNmOcSAY/8mQgYAQioKJgokCAESIK+PKFSW8cBTvl2P8GALcq6BORe5200JDD0n1z+pnQylEB4=",
|
|
73
82
|
},
|
|
74
83
|
featuredAppRight: {
|
|
75
|
-
contractId: "0012ec4c4b1fde3234437ea4e87f6e09f672ae5a9dd2ab2b93f19a65da1aafd8dbca111220efbebbc1ca3c63a0babbac1d566668d26117418670021cf2b9be29d24db0245e"
|
|
76
|
-
}
|
|
77
|
-
}
|
|
84
|
+
contractId: "0012ec4c4b1fde3234437ea4e87f6e09f672ae5a9dd2ab2b93f19a65da1aafd8dbca111220efbebbc1ca3c63a0babbac1d566668d26117418670021cf2b9be29d24db0245e",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
78
87
|
},
|
|
79
88
|
// CBTC (Canton Bitcoin) - External token from DA
|
|
80
89
|
// Source: https://docs.dev.sync.global/app_dev/token_standard/index.html#api-references
|
|
81
|
-
|
|
90
|
+
CBTC: {
|
|
82
91
|
id: "CBTC",
|
|
83
92
|
scheme: RegistrarInternalScheme,
|
|
84
93
|
kind: InstrumentKindUtility,
|
|
@@ -94,19 +103,22 @@ export const instrumentCatalog = {
|
|
|
94
103
|
instrumentConfiguration: {
|
|
95
104
|
contractId: "00dcac0a5a71d77dbfa978ea73f9c5b72daf9d26ba0e9b1d8584190358c94581f8ca111220c183c4851805be4cb8d5c5a2f37c6394aaf95400982453d0584c1fdf6c4950ce",
|
|
96
105
|
templateId: "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
|
|
97
|
-
eventBlob:
|
|
106
|
+
eventBlob:
|
|
107
|
+
"CgMyLjESlwgKRQDcrApacdd9v6l46nP5xbctr50mug6bHYWEGQNYyUWB+MoREiDBg8SFGAW+TLjVxaLzfGOUqvlUAJgkU9BYTB/fbElQzhITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiK7BGq4BApmCmQ6YkRpZ2l0YWxBc3NldC1VdGlsaXR5T3BlcmF0b3I6OjEyMjAyNjc5ZjJiYmU1N2Q4Y2JhOWVmM2NlZTg0N2FjODIzOWRmMDg3NzEwNWFiMWYwMWE3N2Q0NzQ3N2ZkY2UxMjA0ClYKVDpSY2J0Yy1uZXR3b3JrOjoxMjIwMWIxNzQxYjYzZTI0OTRlNDIxNGNmMGJlZGMzZDVhMjI0ZGE1M2IzYmY0ZDc2ZGJhNDY4ZjhlOTdlYjE1NTA4ZgpWClQ6UmNidGMtbmV0d29yazo6MTIyMDFiMTc0MWI2M2UyNDk0ZTQyMTRjZjBiZWRjM2Q1YTIyNGRhNTNiM2JmNGQ3NmRiYTQ2OGY4ZTk3ZWIxNTUwOGYKhAEKgQFqfwpWClQ6UmNidGMtbmV0d29yazo6MTIyMDFiMTc0MWI2M2UyNDk0ZTQyMTRjZjBiZWRjM2Q1YTIyNGRhNTNiM2JmNGQ3NmRiYTQ2OGY4ZTk3ZWIxNTUwOGYKCAoGQgRDQlRDChsKGUIXUmVnaXN0cmFySW50ZXJuYWxTY2hlbWUKigEKhwFahAEKgQFqfwpWClQ6UmNidGMtbmV0d29yazo6MTIyMDFiMTc0MWI2M2UyNDk0ZTQyMTRjZjBiZWRjM2Q1YTIyNGRhNTNiM2JmNGQ3NmRiYTQ2OGY4ZTk3ZWIxNTUwOGYKCAoGQgRDQlRDChsKGUIXUmVnaXN0cmFySW50ZXJuYWxTY2hlbWUKBAoCWgAKBAoCWgAqUmNidGMtbmV0d29yazo6MTIyMDFiMTc0MWI2M2UyNDk0ZTQyMTRjZjBiZWRjM2Q1YTIyNGRhNTNiM2JmNGQ3NmRiYTQ2OGY4ZTk3ZWIxNTUwOGYyYkRpZ2l0YWxBc3NldC1VdGlsaXR5T3BlcmF0b3I6OjEyMjAyNjc5ZjJiYmU1N2Q4Y2JhOWVmM2NlZTg0N2FjODIzOWRmMDg3NzEwNWFiMWYwMWE3N2Q0NzQ3N2ZkY2UxMjA0OeYEhmj6QQYAQioKJgokCAESIIFZLFl5oc2bXlpAQxjdZkgA1P4j2ga+zJIx0DdseGTYEB4=",
|
|
98
108
|
},
|
|
99
109
|
allocationFactory: {
|
|
100
110
|
contractId: "00c956e318c52f8aa0b6acebd0bf62cb699df4627b5565fb332c79202479a36bafca111220cc0e27fb3e6fcdfa2cad3b1dd4843348ce60d04f6daacccecab981523620b7da",
|
|
101
111
|
templateId: "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory",
|
|
102
|
-
eventBlob:
|
|
112
|
+
eventBlob:
|
|
113
|
+
"CgMyLjES+wUKRQDJVuMYxS+KoLas69C/YstpnfRie1Vl+zMseSAkeaNrr8oREiDMDif7Pm/N+iytOx3UhDNIzmDQT22qzM7KuYFSNiC32hIXdXRpbGl0eS1yZWdpc3RyeS1hcHAtdjAajQEKQDE3MDkyOWIxMWQ1ZjBlZDEzODVmODkwZjQyODg3YzMxZmY3ZTI4OWMwZjRiYzQ4MmFmZjE5M2E3MTczZDU3NmMSB1V0aWxpdHkSCFJlZ2lzdHJ5EgNBcHASAlYwEgdTZXJ2aWNlEhFBbGxvY2F0aW9uRmFjdG9yeRoRQWxsb2NhdGlvbkZhY3RvcnkimwJqmAIKVgpUOlJjYnRjLW5ldHdvcms6OjEyMjAxYjE3NDFiNjNlMjQ5NGU0MjE0Y2YwYmVkYzNkNWEyMjRkYTUzYjNiZjRkNzZkYmE0NjhmOGU5N2ViMTU1MDhmClYKVDpSY2J0Yy1uZXR3b3JrOjoxMjIwMWIxNzQxYjYzZTI0OTRlNDIxNGNmMGJlZGMzZDVhMjI0ZGE1M2IzYmY0ZDc2ZGJhNDY4ZjhlOTdlYjE1NTA4ZgpmCmQ6YkRpZ2l0YWxBc3NldC1VdGlsaXR5T3BlcmF0b3I6OjEyMjAyNjc5ZjJiYmU1N2Q4Y2JhOWVmM2NlZTg0N2FjODIzOWRmMDg3NzEwNWFiMWYwMWE3N2Q0NzQ3N2ZkY2UxMjA0KlJjYnRjLW5ldHdvcms6OjEyMjAxYjE3NDFiNjNlMjQ5NGU0MjE0Y2YwYmVkYzNkNWEyMjRkYTUzYjNiZjRkNzZkYmE0NjhmOGU5N2ViMTU1MDhmMmJEaWdpdGFsQXNzZXQtVXRpbGl0eU9wZXJhdG9yOjoxMjIwMjY3OWYyYmJlNTdkOGNiYTllZjNjZWU4NDdhYzgyMzlkZjA4NzcxMDVhYjFmMDFhNzdkNDc0NzdmZGNlMTIwNDnmBIZo+kEGAEIqCiYKJAgBEiA28r69uEQ4mN310dzSIOTHLYgxmVinL9FuA/XwQLfheRAe",
|
|
103
114
|
},
|
|
104
115
|
// AppRewardConfig
|
|
105
116
|
appRewardConfiguration: {
|
|
106
117
|
contractId: "0054a69e77fdea17d1c56cf3a64991c37dea34b6568c82db2190446221f6584cb5ca1112201ea595d9349c8644d09b751a4e968d784a51868bdde54a224be94736d09c6e67",
|
|
107
118
|
templateId: "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.AppReward:AppRewardConfiguration",
|
|
108
|
-
eventBlob:
|
|
109
|
-
|
|
119
|
+
eventBlob:
|
|
120
|
+
"CgMyLjES9QYKRQBUpp53/eoX0cVs86ZJkcN96jS2VoyC2yGQRGIh9lhMtcoREiAepZXZNJyGRNCbdRpOlo14SlGGi93lSiJL6Uc20JxuZxITdXRpbGl0eS1yZWdpc3RyeS12MBqLAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEglBcHBSZXdhcmQaFkFwcFJld2FyZENvbmZpZ3VyYXRpb24imwNqmAMKZgpkOmJEaWdpdGFsQXNzZXQtVXRpbGl0eU9wZXJhdG9yOjoxMjIwMjY3OWYyYmJlNTdkOGNiYTllZjNjZWU4NDdhYzgyMzlkZjA4NzcxMDVhYjFmMDFhNzdkNDc0NzdmZGNlMTIwNApWClQ6UmNidGMtbmV0d29yazo6MTIyMDFiMTc0MWI2M2UyNDk0ZTQyMTRjZjBiZWRjM2Q1YTIyNGRhNTNiM2JmNGQ3NmRiYTQ2OGY4ZTk3ZWIxNTUwOGYK1QEK0gFqzwEKTQpLOklEU086OjEyMjBmMjJhOGI4ZjJkODEzYzI1YjlhNjg0ZGM0ZGQ1MmI1MzJhMDE3NGQ4ZTczYTEzY2RmMmJhYWJmZmY3NTE4MzM3Cn4KfGp6CmYKZDpiRGlnaXRhbEFzc2V0LVV0aWxpdHlPcGVyYXRvcjo6MTIyMDI2NzlmMmJiZTU3ZDhjYmE5ZWYzY2VlODQ3YWM4MjM5ZGYwODc3MTA1YWIxZjAxYTc3ZDQ3NDc3ZmRjZTEyMDQKEAoOMgwwLjIwMDAwMDAwMDAqYkRpZ2l0YWxBc3NldC1VdGlsaXR5T3BlcmF0b3I6OjEyMjAyNjc5ZjJiYmU1N2Q4Y2JhOWVmM2NlZTg0N2FjODIzOWRmMDg3NzEwNWFiMWYwMWE3N2Q0NzQ3N2ZkY2UxMjA0MlJjYnRjLW5ldHdvcms6OjEyMjAxYjE3NDFiNjNlMjQ5NGU0MjE0Y2YwYmVkYzNkNWEyMjRkYTUzYjNiZjRkNzZkYmE0NjhmOGU5N2ViMTU1MDhmOU/l4lj6QQYAQioKJgokCAESIPkBCO0qM3jdW2/BdhZa/gKRPonfxLecpHdyC2yeXu3aEB4=",
|
|
121
|
+
},
|
|
110
122
|
},
|
|
111
123
|
// MainNet contracts
|
|
112
124
|
mainnet: {
|
|
@@ -118,24 +130,82 @@ export const instrumentCatalog = {
|
|
|
118
130
|
instrumentConfiguration: {
|
|
119
131
|
contractId: "00198ff840c58a05f69bf3fa78aacee87dfb1864b586ca0b3ef427a6504bd43dadca1212201be3e457a7ba6bf092979128bcbe46368fdd401a4fd433dafb1b09134a1e690b",
|
|
120
132
|
templateId: "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
|
|
121
|
-
eventBlob:
|
|
133
|
+
eventBlob:
|
|
134
|
+
"CgMyLjESmQwKRQAZj/hAxYoF9pvz+niqzuh9+xhktYbKCz70J6ZQS9Q9rcoSEiAb4+RXp7pr8JKXkSi8vkY2j91AGk/UM9r7GwkTSh5pCxITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiK3CGq0CApsCmo6aGF1dGgwXzAwN2M2NjQzNTM4ZjJlYWRkM2U1NzNkZDA1Yjk6OjEyMjA1YmNjMTA2ZWZhMGVhYTdmMThkYzQ5MWU1YzZmNWZiOWIwY2M2OGRjMTEwYWU2NmY0ZWQ2NDY3NDc1ZDdjNzhlClYKVDpSY2J0Yy1uZXR3b3JrOjoxMjIwNWFmM2I5NDlhMDQ3NzZmYzQ4Y2RjYzA1YTA2MGY2YmRhMmU0NzA2MzI5MzVmMzc1ZDEwNDlhODU0NmEzYjI2MgpWClQ6UmNidGMtbmV0d29yazo6MTIyMDVhZjNiOTQ5YTA0Nzc2ZmM0OGNkY2MwNWEwNjBmNmJkYTJlNDcwNjMyOTM1ZjM3NWQxMDQ5YTg1NDZhM2IyNjIKhAEKgQFqfwpWClQ6UmNidGMtbmV0d29yazo6MTIyMDVhZjNiOTQ5YTA0Nzc2ZmM0OGNkY2MwNWEwNjBmNmJkYTJlNDcwNjMyOTM1ZjM3NWQxMDQ5YTg1NDZhM2IyNjIKCAoGQgRDQlRDChsKGUIXUmVnaXN0cmFySW50ZXJuYWxTY2hlbWUKigEKhwFahAEKgQFqfwpWClQ6UmNidGMtbmV0d29yazo6MTIyMDVhZjNiOTQ5YTA0Nzc2ZmM0OGNkY2MwNWEwNjBmNmJkYTJlNDcwNjMyOTM1ZjM3NWQxMDQ5YTg1NDZhM2IyNjIKCAoGQgRDQlRDChsKGUIXUmVnaXN0cmFySW50ZXJuYWxTY2hlbWUKBAoCWgAKBAoCWgAK8wMK8ANS7QMK6gNa5wMKcGpuCloKWDpWY2J0Yy1iZW5lZmljaWFyeTo6MTIyMDQwOWE5ZmNjNWZmNjQyMmUyOWFiOTc4YzIyYzAwNGRkZTMzMjAyNTQ2YjRiY2JkZTI0YjI1Yjg1MzUzMzY2YzIKEAoOMgwwLjI1MDAwMDAwMDAKgwFqgAEKbApqOmhGaW5vYUNvbnNlbnN1c1NlcnZpY2VzLXZhbGlkYXRvci0xOjoxMjIwYjgxODJmYTQyZDBjZjY1N2JkYTdmMTI0MzY2YTJjNjAzZDVkZjRhYWZkNzg5YTg4NTQ5ZGM5YTBlMzE5MTI1OQoQCg4yDDAuMjUwMDAwMDAwMApzanEKXQpbOlluZXRoZXJtaW5kLWFuZ2tvci0xOjoxMjIwMWQ5NGVjNGJhOTczYWI1YzUxZTNiNzY5YTZhY2E1NGYwNjFhZmM5NjM2MTlhNGQ2MTA5MDQ0ZWFjY2FmYzdiYQoQCg4yDDAuMjUwMDAwMDAwMAp4anYKYgpgOl5kc3J2LW1haW5uZXRWYWxpZGF0b3ItMDE6OjEyMjBlMmY0YWJlMWM1Y2E3ZTA3NDY0MDM3ZmU3ZmVmYzgzOWI3YjhmZWEyNDk4NWQwZDJhMjc5MGZhNzJlM2MxM2FjChAKDjIMMC4yNTAwMDAwMDAwKlJjYnRjLW5ldHdvcms6OjEyMjA1YWYzYjk0OWEwNDc3NmZjNDhjZGNjMDVhMDYwZjZiZGEyZTQ3MDYzMjkzNWYzNzVkMTA0OWE4NTQ2YTNiMjYyMmhhdXRoMF8wMDdjNjY0MzUzOGYyZWFkZDNlNTczZGQwNWI5OjoxMjIwNWJjYzEwNmVmYTBlYWE3ZjE4ZGM0OTFlNWM2ZjVmYjliMGNjNjhkYzExMGFlNjZmNGVkNjQ2NzQ3NWQ3Yzc4ZTmc9gXeakgGAEIqCiYKJAgBEiCzFew8Ty5ImPz2JpD6RroXNwD6O5b5IWJ3xeHBQsW4MRAe",
|
|
122
135
|
},
|
|
123
136
|
allocationFactory: {
|
|
124
137
|
contractId: "00a30be758ed7b5045f82ab37e4037890eb18044e61125854e7391d2de17e602edca1112203c96d5fb70e1cd5856846681484293c5358bc74b0e10d7a8a7a5fa89ce445905",
|
|
125
138
|
templateId: "82798df018301852704f210b97adaabf76d3ecd37d889e1bf96b5f31a20eea34:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory",
|
|
126
|
-
eventBlob:
|
|
139
|
+
eventBlob:
|
|
140
|
+
"CgMyLjEShwYKRQCjC+dY7XtQRfgqs35AN4kOsYBE5hElhU5zkdLeF+YC7coREiA8ltX7cOHNWFaEZoFIQpPFNYvHSw4Q16inpfqJzkRZBRIXdXRpbGl0eS1yZWdpc3RyeS1hcHAtdjAajQEKQDgyNzk4ZGYwMTgzMDE4NTI3MDRmMjEwYjk3YWRhYWJmNzZkM2VjZDM3ZDg4OWUxYmY5NmI1ZjMxYTIwZWVhMzQSB1V0aWxpdHkSCFJlZ2lzdHJ5EgNBcHASAlYwEgdTZXJ2aWNlEhFBbGxvY2F0aW9uRmFjdG9yeRoRQWxsb2NhdGlvbkZhY3RvcnkioQJqngIKVgpUOlJjYnRjLW5ldHdvcms6OjEyMjA1YWYzYjk0OWEwNDc3NmZjNDhjZGNjMDVhMDYwZjZiZGEyZTQ3MDYzMjkzNWYzNzVkMTA0OWE4NTQ2YTNiMjYyClYKVDpSY2J0Yy1uZXR3b3JrOjoxMjIwNWFmM2I5NDlhMDQ3NzZmYzQ4Y2RjYzA1YTA2MGY2YmRhMmU0NzA2MzI5MzVmMzc1ZDEwNDlhODU0NmEzYjI2MgpsCmo6aGF1dGgwXzAwN2M2NjQzNTM4ZjJlYWRkM2U1NzNkZDA1Yjk6OjEyMjA1YmNjMTA2ZWZhMGVhYTdmMThkYzQ5MWU1YzZmNWZiOWIwY2M2OGRjMTEwYWU2NmY0ZWQ2NDY3NDc1ZDdjNzhlKlJjYnRjLW5ldHdvcms6OjEyMjA1YWYzYjk0OWEwNDc3NmZjNDhjZGNjMDVhMDYwZjZiZGEyZTQ3MDYzMjkzNWYzNzVkMTA0OWE4NTQ2YTNiMjYyMmhhdXRoMF8wMDdjNjY0MzUzOGYyZWFkZDNlNTczZGQwNWI5OjoxMjIwNWJjYzEwNmVmYTBlYWE3ZjE4ZGM0OTFlNWM2ZjVmYjliMGNjNjhkYzExMGFlNjZmNGVkNjQ2NzQ3NWQ3Yzc4ZTmmjd2WhT4GAEIqCiYKJAgBEiAmE4gDprYSR3Yqd6tcoPepCoYnxYXkw1UyuRBEypw6YBAe",
|
|
127
141
|
},
|
|
128
142
|
// AppRewardConfig
|
|
129
143
|
appRewardConfiguration: {
|
|
130
144
|
contractId: "005cb47f39ba47615e4aa5dd02b17763cc0eda03087ae6c9ee8e38e82c13462aaeca1112202d25374d3cf2c0a36a8d0710836d4e01a1c5b73473f45b6a81002c5daa8ca0cb",
|
|
131
145
|
templateId: "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.AppReward:AppRewardConfiguration",
|
|
132
|
-
eventBlob:
|
|
133
|
-
|
|
134
|
-
|
|
146
|
+
eventBlob:
|
|
147
|
+
"CgMyLjESigcKRQBctH85ukdhXkql3QKxd2PMDtoDCHrmye6OOOgsE0YqrsoREiAtJTdNPPLAo2qNBxCDbU4BocW3NHP0W2qBACxdqoygyxITdXRpbGl0eS1yZWdpc3RyeS12MBqLAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEglBcHBSZXdhcmQaFkFwcFJld2FyZENvbmZpZ3VyYXRpb24iqgNqpwMKbApqOmhhdXRoMF8wMDdjNjY0MzUzOGYyZWFkZDNlNTczZGQwNWI5OjoxMjIwNWJjYzEwNmVmYTBlYWE3ZjE4ZGM0OTFlNWM2ZjVmYjliMGNjNjhkYzExMGFlNjZmNGVkNjQ2NzQ3NWQ3Yzc4ZQpWClQ6UmNidGMtbmV0d29yazo6MTIyMDVhZjNiOTQ5YTA0Nzc2ZmM0OGNkY2MwNWEwNjBmNmJkYTJlNDcwNjMyOTM1ZjM3NWQxMDQ5YTg1NDZhM2IyNjIK3gEK2wFq2AEKTQpLOklEU086OjEyMjBiMTQzMWVmMjE3MzQyZGI0NGQ1MTZiYjliZWZkZTgwMmJlN2Q4ODk5NjM3ZDI5MDg5NWZhNTg4ODBmMTlhY2NjCoYBCoMBaoABCmwKajpoYXV0aDBfMDA3YzY3ZGM3YzRhZmJmNWJjMzdmOTgwNWUzMTo6MTIyMDViY2MxMDZlZmEwZWFhN2YxOGRjNDkxZTVjNmY1ZmI5YjBjYzY4ZGMxMTBhZTY2ZjRlZDY0Njc0NzVkN2M3OGUKEAoOMgwwLjIwMDAwMDAwMDAqaGF1dGgwXzAwN2M2NjQzNTM4ZjJlYWRkM2U1NzNkZDA1Yjk6OjEyMjA1YmNjMTA2ZWZhMGVhYTdmMThkYzQ5MWU1YzZmNWZiOWIwY2M2OGRjMTEwYWU2NmY0ZWQ2NDY3NDc1ZDdjNzhlMlJjYnRjLW5ldHdvcms6OjEyMjA1YWYzYjk0OWEwNDc3NmZjNDhjZGNjMDVhMDYwZjZiZGEyZTQ3MDYzMjkzNWYzNzVkMTA0OWE4NTQ2YTNiMjYyOSqKuWddQgYAQioKJgokCAESIP6u2ZhXB5fXuwvdDvhv+mn6JPF20D2scQdCh/yRSuNsEB4=",
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
// USDA -- DA-issued stablecoin (utility token, same shape as USDCx)
|
|
153
|
+
USDA: {
|
|
154
|
+
id: "3574b536-cad1-4074-9b64-859398713ba0",
|
|
155
|
+
scheme: RegistrarInternalScheme,
|
|
156
|
+
kind: InstrumentKindUtility,
|
|
157
|
+
disclosureURL: null,
|
|
158
|
+
requireCredentials: false,
|
|
159
|
+
testnet: {
|
|
160
|
+
synchronizerId: "",
|
|
161
|
+
registrar: "",
|
|
162
|
+
operator: "",
|
|
163
|
+
provider: "",
|
|
164
|
+
registryAPI: "",
|
|
165
|
+
instrumentConfiguration: {
|
|
166
|
+
contractId: "",
|
|
167
|
+
templateId: "",
|
|
168
|
+
eventBlob: "",
|
|
169
|
+
},
|
|
170
|
+
allocationFactory: {
|
|
171
|
+
contractId: "",
|
|
172
|
+
templateId: "",
|
|
173
|
+
eventBlob: "",
|
|
174
|
+
},
|
|
175
|
+
appRewardConfiguration: {
|
|
176
|
+
contractId: "",
|
|
177
|
+
templateId: "",
|
|
178
|
+
eventBlob: "",
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
mainnet: {
|
|
182
|
+
synchronizerId: "global-domain::1220b1431ef217342db44d516bb9befde802be7d8899637d290895fa58880f19accc",
|
|
183
|
+
registrar: "party-28dc4516-b5ca-44ff-86c7-2107e90a6807::1220b8301e18aa8a401d6e34e6c20f8b0243183c514373bca8f1b6b9270246341a9e",
|
|
184
|
+
operator: "auth0_007c6643538f2eadd3e573dd05b9::12205bcc106efa0eaa7f18dc491e5c6f5fb9b0cc68dc110ae66f4ed6467475d7c78e",
|
|
185
|
+
provider: "party-28dc4516-b5ca-44ff-86c7-2107e90a6807::1220b8301e18aa8a401d6e34e6c20f8b0243183c514373bca8f1b6b9270246341a9e",
|
|
186
|
+
registryAPI: "https://api.utilities.digitalasset.com/api/token-standard/v0/registrars/party-28dc4516-b5ca-44ff-86c7-2107e90a6807::1220b8301e18aa8a401d6e34e6c20f8b0243183c514373bca8f1b6b9270246341a9e/registry",
|
|
187
|
+
instrumentConfiguration: {
|
|
188
|
+
contractId: "007c6c88f88a02bbe6888b3792991b0e11e081b309ab4cc11f2200831a777a9e9eca121220039f9aa8b4a6a4c1db572b9b525058fad421f9824b6a245650f428b70f644c12",
|
|
189
|
+
templateId: "a236e8e22a3b5f199e37d5554e82bafd2df688f901de02b00be3964bdfa8c1ab:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
|
|
190
|
+
eventBlob:
|
|
191
|
+
"CgMyLjESygkKRQB8bIj4igK75oiLN5KZGw4R4IGzCatMwR8iAIMad3qensoSEiADn5qotKakwdtXK5tSUFj61CH5gktqJFZQ9Ci3D2RMEhITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAYTIzNmU4ZTIyYTNiNWYxOTllMzdkNTU1NGU4MmJhZmQyZGY2ODhmOTAxZGUwMmIwMGJlMzk2NGJkZmE4YzFhYhIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiLKBWrHBQpsCmo6aGF1dGgwXzAwN2M2NjQzNTM4ZjJlYWRkM2U1NzNkZDA1Yjk6OjEyMjA1YmNjMTA2ZWZhMGVhYTdmMThkYzQ5MWU1YzZmNWZiOWIwY2M2OGRjMTEwYWU2NmY0ZWQ2NDY3NDc1ZDdjNzhlCnQKcjpwcGFydHktMjhkYzQ1MTYtYjVjYS00NGZmLTg2YzctMjEwN2U5MGE2ODA3OjoxMjIwYjgzMDFlMThhYThhNDAxZDZlMzRlNmMyMGY4YjAyNDMxODNjNTE0MzczYmNhOGYxYjZiOTI3MDI0NjM0MWE5ZQp0CnI6cHBhcnR5LTI4ZGM0NTE2LWI1Y2EtNDRmZi04NmM3LTIxMDdlOTBhNjgwNzo6MTIyMGI4MzAxZTE4YWE4YTQwMWQ2ZTM0ZTZjMjBmOGIwMjQzMTgzYzUxNDM3M2JjYThmMWI2YjkyNzAyNDYzNDFhOWUKwwEKwAFqvQEKdApyOnBwYXJ0eS0yOGRjNDUxNi1iNWNhLTQ0ZmYtODZjNy0yMTA3ZTkwYTY4MDc6OjEyMjBiODMwMWUxOGFhOGE0MDFkNmUzNGU2YzIwZjhiMDI0MzE4M2M1MTQzNzNiY2E4ZjFiNmI5MjcwMjQ2MzQxYTllCigKJkIkMzU3NGI1MzYtY2FkMS00MDc0LTliNjQtODU5Mzk4NzEzYmEwChsKGUIXUmVnaXN0cmFySW50ZXJuYWxTY2hlbWUKmAEKlQFakgEKjwFqjAEKdApyOnBwYXJ0eS0yOGRjNDUxNi1iNWNhLTQ0ZmYtODZjNy0yMTA3ZTkwYTY4MDc6OjEyMjBiODMwMWUxOGFhOGE0MDFkNmUzNGU2YzIwZjhiMDI0MzE4M2M1MTQzNzNiY2E4ZjFiNmI5MjcwMjQ2MzQxYTllCggKBkIEVVNEQQoKCghCBlRpY2tlcgoECgJaAAoECgJaACpwcGFydHktMjhkYzQ1MTYtYjVjYS00NGZmLTg2YzctMjEwN2U5MGE2ODA3OjoxMjIwYjgzMDFlMThhYThhNDAxZDZlMzRlNmMyMGY4YjAyNDMxODNjNTE0MzczYmNhOGYxYjZiOTI3MDI0NjM0MWE5ZTJoYXV0aDBfMDA3YzY2NDM1MzhmMmVhZGQzZTU3M2RkMDViOTo6MTIyMDViY2MxMDZlZmEwZWFhN2YxOGRjNDkxZTVjNmY1ZmI5YjBjYzY4ZGMxMTBhZTY2ZjRlZDY0Njc0NzVkN2M3OGU5KWaA+FNRBgBCKgomCiQIARIgHk6elwUzf1qka7iWAwMmMiO8d9G8nkxo2vn4fpR6rgkQHg==",
|
|
192
|
+
},
|
|
193
|
+
allocationFactory: {
|
|
194
|
+
contractId: "00f1bdedbfa7fc8b136fa57164cc3d73ec6ae5a9e8c903ba6462629f74f61000ebca1112204927a06b04a9013d29df443e585fe1444393bdd3af841eb379b4c106f80ef7d8",
|
|
195
|
+
templateId: "82798df018301852704f210b97adaabf76d3ecd37d889e1bf96b5f31a20eea34:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory",
|
|
196
|
+
eventBlob:
|
|
197
|
+
"CgMyLjES4QYKRQDxve2/p/yLE2+lcWTMPXPsauWp6MkDumRiYp909hAA68oREiBJJ6BrBKkBPSnfRD5YX+FEQ5O906+EHrN5tMEG+A732BIXdXRpbGl0eS1yZWdpc3RyeS1hcHAtdjAajQEKQDgyNzk4ZGYwMTgzMDE4NTI3MDRmMjEwYjk3YWRhYWJmNzZkM2VjZDM3ZDg4OWUxYmY5NmI1ZjMxYTIwZWVhMzQSB1V0aWxpdHkSCFJlZ2lzdHJ5EgNBcHASAlYwEgdTZXJ2aWNlEhFBbGxvY2F0aW9uRmFjdG9yeRoRQWxsb2NhdGlvbkZhY3Rvcnki3QJq2gIKdApyOnBwYXJ0eS0yOGRjNDUxNi1iNWNhLTQ0ZmYtODZjNy0yMTA3ZTkwYTY4MDc6OjEyMjBiODMwMWUxOGFhOGE0MDFkNmUzNGU2YzIwZjhiMDI0MzE4M2M1MTQzNzNiY2E4ZjFiNmI5MjcwMjQ2MzQxYTllCnQKcjpwcGFydHktMjhkYzQ1MTYtYjVjYS00NGZmLTg2YzctMjEwN2U5MGE2ODA3OjoxMjIwYjgzMDFlMThhYThhNDAxZDZlMzRlNmMyMGY4YjAyNDMxODNjNTE0MzczYmNhOGYxYjZiOTI3MDI0NjM0MWE5ZQpsCmo6aGF1dGgwXzAwN2M2NjQzNTM4ZjJlYWRkM2U1NzNkZDA1Yjk6OjEyMjA1YmNjMTA2ZWZhMGVhYTdmMThkYzQ5MWU1YzZmNWZiOWIwY2M2OGRjMTEwYWU2NmY0ZWQ2NDY3NDc1ZDdjNzhlKnBwYXJ0eS0yOGRjNDUxNi1iNWNhLTQ0ZmYtODZjNy0yMTA3ZTkwYTY4MDc6OjEyMjBiODMwMWUxOGFhOGE0MDFkNmUzNGU2YzIwZjhiMDI0MzE4M2M1MTQzNzNiY2E4ZjFiNmI5MjcwMjQ2MzQxYTllMmhhdXRoMF8wMDdjNjY0MzUzOGYyZWFkZDNlNTczZGQwNWI5OjoxMjIwNWJjYzEwNmVmYTBlYWE3ZjE4ZGM0OTFlNWM2ZjVmYjliMGNjNjhkYzExMGFlNjZmNGVkNjQ2NzQ3NWQ3Yzc4ZTk20/j3nj4GAEIqCiYKJAgBEiBwfsleVvZIGKs93dGaxalgMoApEPy2uONQ6trRzxPTzhAe",
|
|
198
|
+
},
|
|
199
|
+
appRewardConfiguration: {
|
|
200
|
+
contractId: "",
|
|
201
|
+
templateId: "",
|
|
202
|
+
eventBlob: "",
|
|
203
|
+
},
|
|
204
|
+
},
|
|
135
205
|
},
|
|
136
206
|
|
|
137
207
|
// SBC (Stablecoin) -- used for balance reporting, but not a tradable instrument itself
|
|
138
|
-
|
|
208
|
+
SBC: {
|
|
139
209
|
id: "f29bdd7a-1469-498a-ba2a-796bf5387b31",
|
|
140
210
|
scheme: RegistrarInternalScheme,
|
|
141
211
|
kind: InstrumentKindUtility,
|
|
@@ -146,7 +216,7 @@ export const instrumentCatalog = {
|
|
|
146
216
|
registrar: "party-28dc4516-b5ca-44ff-86c7-2107e90a6807::1220b8301e18aa8a401d6e34e6c20f8b0243183c514373bca8f1b6b9270246341a9e",
|
|
147
217
|
operator: "auth0_007c6643538f2eadd3e573dd05b9::12205bcc106efa0eaa7f18dc491e5c6f5fb9b0cc68dc110ae66f4ed6467475d7c78e",
|
|
148
218
|
provider: "party-28dc4516-b5ca-44ff-86c7-2107e90a6807::1220b8301e18aa8a401d6e34e6c20f8b0243183c514373bca8f1b6b9270246341a9e",
|
|
149
|
-
}
|
|
219
|
+
},
|
|
150
220
|
},
|
|
151
221
|
};
|
|
152
222
|
|
|
@@ -155,13 +225,16 @@ export const instrumentCatalog = {
|
|
|
155
225
|
export const instrumentIdToSymbol = Object.fromEntries(
|
|
156
226
|
Object.entries(instrumentCatalog)
|
|
157
227
|
.filter(([key, entry]) => entry.id && entry.id !== key)
|
|
158
|
-
.map(([key, entry]) => [entry.id, key])
|
|
228
|
+
.map(([key, entry]) => [entry.id, key]),
|
|
159
229
|
);
|
|
160
230
|
|
|
161
231
|
// Supported trading pairs (like Go's supportedTradingPairs)
|
|
162
232
|
export const supportedTradingPairs = [
|
|
163
233
|
{ baseAsset: "Amulet", quoteAsset: "USDCx" },
|
|
164
234
|
{ baseAsset: "CBTC", quoteAsset: "USDCx" },
|
|
235
|
+
{ baseAsset: "Amulet", quoteAsset: "USDA" },
|
|
236
|
+
{ baseAsset: "CBTC", quoteAsset: "USDA" },
|
|
237
|
+
{ baseAsset: "USDCx", quoteAsset: "USDA" },
|
|
165
238
|
];
|
|
166
239
|
|
|
167
240
|
// The supported symbols (pairs) - derived from supportedTradingPairs for backward compatibility
|
|
@@ -170,14 +243,41 @@ export const supportedSymbols = supportedTradingPairs.reduce((acc, pair) => {
|
|
|
170
243
|
return acc;
|
|
171
244
|
}, {});
|
|
172
245
|
|
|
173
|
-
// Add CC as an alias for Amulet so users can pass "CC/USDCx"
|
|
246
|
+
// Add CC as an alias for Amulet so users can pass "CC/USDCx" or "CC/USDA"
|
|
174
247
|
supportedSymbols["CC/USDCx"] = supportedSymbols["Amulet/USDCx"];
|
|
248
|
+
supportedSymbols["CC/USDA"] = supportedSymbols["Amulet/USDA"];
|
|
249
|
+
|
|
250
|
+
// Build a case-insensitive alias → canonical-symbol map from the catalog's `aliases` arrays.
|
|
251
|
+
// e.g. instrumentCatalog.Amulet.aliases = ["CC"] → { cc: "Amulet" }
|
|
252
|
+
const aliasToSymbol = Object.entries(instrumentCatalog).reduce((acc, [symbol, entry]) => {
|
|
253
|
+
for (const alias of entry.aliases || []) {
|
|
254
|
+
acc[alias.toLowerCase()] = symbol;
|
|
255
|
+
}
|
|
256
|
+
return acc;
|
|
257
|
+
}, {});
|
|
175
258
|
|
|
176
259
|
/**
|
|
177
|
-
* Normalize asset aliases to their canonical
|
|
178
|
-
*
|
|
260
|
+
* Normalize asset aliases to their canonical catalog symbol.
|
|
261
|
+
* Aliases come from `instrumentCatalog[<symbol>].aliases`, matched case-insensitively.
|
|
262
|
+
* Works on single symbols (`"cc"` → `"Amulet"`) and pair strings (`"CC/USDCx"` → `"Amulet/USDCx"`).
|
|
179
263
|
*/
|
|
180
264
|
export function normalizeAssetId(symbol) {
|
|
181
265
|
if (!symbol || typeof symbol !== "string") return symbol;
|
|
182
|
-
|
|
266
|
+
const trimmed = symbol.trim();
|
|
267
|
+
const normalizeOne = (s) => aliasToSymbol[s.toLowerCase()] || s;
|
|
268
|
+
if (trimmed.includes("/")) {
|
|
269
|
+
return trimmed.split("/").map(normalizeOne).join("/");
|
|
270
|
+
}
|
|
271
|
+
return normalizeOne(trimmed);
|
|
183
272
|
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Catalog symbol → on-chain instrument id.
|
|
276
|
+
* Use whenever building an `instrumentId.id` field for a ledger choice argument or
|
|
277
|
+
* a Registry API request body — those need the value that lives in Holding contracts,
|
|
278
|
+
* which for USDA/SBC is a UUID rather than the display symbol.
|
|
279
|
+
*/
|
|
280
|
+
export function resolveOnChainInstrumentId(symbol) {
|
|
281
|
+
return instrumentCatalog[symbol]?.id || symbol;
|
|
282
|
+
}
|
|
283
|
+
|