@twin.org/dlt-iota 0.0.3-next.9 → 0.9.0

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 (60) hide show
  1. package/dist/es/index.js +7 -3
  2. package/dist/es/index.js.map +1 -1
  3. package/dist/es/iota.js +356 -93
  4. package/dist/es/iota.js.map +1 -1
  5. package/dist/es/iotaIdentityUtils.js +2 -4
  6. package/dist/es/iotaIdentityUtils.js.map +1 -1
  7. package/dist/es/iotaSmartContractUtils.js +31 -27
  8. package/dist/es/iotaSmartContractUtils.js.map +1 -1
  9. package/dist/es/models/IAdminCapFields.js.map +1 -1
  10. package/dist/es/models/IGasStationExecuteResponse.js.map +1 -1
  11. package/dist/es/models/IIotaConfig.js.map +1 -1
  12. package/dist/es/models/IIotaControllerCapInfo.js.map +1 -1
  13. package/dist/es/models/IIotaResponseOptions.js.map +1 -1
  14. package/dist/es/models/IMigrationStateFields.js.map +1 -1
  15. package/dist/es/models/ISmartContractObject.js.map +1 -1
  16. package/dist/es/models/ITransactionSigner.js +2 -0
  17. package/dist/es/models/ITransactionSigner.js.map +1 -0
  18. package/dist/es/vaultJwkStorage.js +71 -0
  19. package/dist/es/vaultJwkStorage.js.map +1 -0
  20. package/dist/es/vaultJwtSigner.js +49 -0
  21. package/dist/es/vaultJwtSigner.js.map +1 -0
  22. package/dist/es/vaultSigner.js +60 -0
  23. package/dist/es/vaultSigner.js.map +1 -0
  24. package/dist/es/vaultTransactionSigner.js +74 -0
  25. package/dist/es/vaultTransactionSigner.js.map +1 -0
  26. package/dist/types/index.d.ts +7 -3
  27. package/dist/types/iota.d.ts +82 -53
  28. package/dist/types/iotaIdentityUtils.d.ts +2 -4
  29. package/dist/types/iotaSmartContractUtils.d.ts +18 -17
  30. package/dist/types/models/IAdminCapFields.d.ts +2 -2
  31. package/dist/types/models/IGasStationExecuteResponse.d.ts +1 -3
  32. package/dist/types/models/IIotaConfig.d.ts +5 -0
  33. package/dist/types/models/IIotaControllerCapInfo.d.ts +3 -6
  34. package/dist/types/models/IIotaResponseOptions.d.ts +1 -1
  35. package/dist/types/models/IMigrationStateFields.d.ts +2 -2
  36. package/dist/types/models/ISmartContractObject.d.ts +2 -2
  37. package/dist/types/models/ITransactionSigner.d.ts +27 -0
  38. package/dist/types/vaultJwkStorage.d.ts +50 -0
  39. package/dist/types/vaultJwtSigner.d.ts +26 -0
  40. package/dist/types/vaultSigner.d.ts +32 -0
  41. package/dist/types/vaultTransactionSigner.d.ts +39 -0
  42. package/docs/changelog.md +112 -0
  43. package/docs/examples.md +6 -13
  44. package/docs/reference/classes/Iota.md +325 -189
  45. package/docs/reference/classes/IotaIdentityUtils.md +2 -4
  46. package/docs/reference/classes/IotaSmartContractUtils.md +57 -40
  47. package/docs/reference/classes/VaultJwtSigner.md +71 -0
  48. package/docs/reference/classes/VaultSigner.md +106 -0
  49. package/docs/reference/classes/VaultTransactionSigner.md +122 -0
  50. package/docs/reference/index.md +4 -0
  51. package/docs/reference/interfaces/IAdminCapFields.md +2 -2
  52. package/docs/reference/interfaces/IGasStationExecuteResponse.md +1 -3
  53. package/docs/reference/interfaces/IIotaConfig.md +14 -0
  54. package/docs/reference/interfaces/IIotaControllerCapInfo.md +3 -6
  55. package/docs/reference/interfaces/IIotaResponseOptions.md +1 -1
  56. package/docs/reference/interfaces/IMigrationStateFields.md +2 -2
  57. package/docs/reference/interfaces/ISmartContractObject.md +2 -2
  58. package/docs/reference/interfaces/ITransactionSigner.md +67 -0
  59. package/locales/en.json +7 -1
  60. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"iotaSmartContractUtils.js","sourceRoot":"","sources":["../../src/iotaSmartContractUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { bcs } from \"@iota/bcs\";\nimport type { IotaClient } from \"@iota/iota-sdk/client\";\nimport { Transaction } from \"@iota/iota-sdk/transactions\";\nimport { GeneralError, Is, StringHelper } from \"@twin.org/core\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IVaultConnector } from \"@twin.org/vault-models\";\nimport type { IWalletConnector } from \"@twin.org/wallet-models\";\nimport { Iota } from \"./iota.js\";\nimport type { IIotaConfig } from \"./models/IIotaConfig.js\";\nimport type { ISmartContractDeployments } from \"./models/ISmartContractDeployments.js\";\nimport type { NetworkTypes } from \"./models/networkTypes.js\";\n\n/**\n * Utility class providing common smart contract operations for IOTA-based contracts.\n * This class uses composition pattern to provide shared functionality without inheritance complexity.\n */\nexport class IotaSmartContractUtils {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<IotaSmartContractUtils>();\n\n\t/**\n\t * Migrate a smart contract object to the current version using admin privileges.\n\t * This is a generic migration method that works with any IOTA smart contract.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param walletConnector The wallet connector for address generation.\n\t * @param logging Optional logging component.\n\t * @param gasBudget The gas budget for the transaction.\n\t * @param identity The identity of the controller with admin privileges.\n\t * @param objectId The ID of the object to migrate.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param deploymentConfig The deployment configuration containing object IDs.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns Promise that resolves when migration is complete.\n\t */\n\tpublic static async migrateSmartContract(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\twalletConnector: IWalletConnector,\n\t\tlogging: ILoggingComponent | undefined,\n\t\tgasBudget: number,\n\t\tidentity: string,\n\t\tobjectId: string,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\twalletAddressIndex?: number\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst txb = new Transaction();\n\t\t\ttxb.setGasBudget(gasBudget);\n\n\t\t\tconst moduleName = IotaSmartContractUtils.getModuleName(namespace);\n\n\t\t\t// Get admin address for the transaction\n\t\t\tconst adminAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\twalletConnector,\n\t\t\t\tidentity,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get the required object IDs from deployment config\n\t\t\tconst { adminCapId, migrationStateId } = await IotaSmartContractUtils.getContractObjectIds(\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tconfig.network as NetworkTypes,\n\t\t\t\tdeploymentConfig,\n\t\t\t\tpackageId,\n\t\t\t\tadminAddress\n\t\t\t);\n\n\t\t\ttxb.moveCall({\n\t\t\t\ttarget: `${packageId}::${moduleName}::migrate_${moduleName}`,\n\t\t\t\targuments: [txb.object(adminCapId), txb.object(migrationStateId), txb.object(objectId)]\n\t\t\t});\n\n\t\t\tconst result = await Iota.prepareAndPostTransaction(\n\t\t\t\tconfig,\n\t\t\t\tvaultConnector,\n\t\t\t\tlogging as ILoggingComponent,\n\t\t\t\tidentity,\n\t\t\t\tclient,\n\t\t\t\tadminAddress,\n\t\t\t\ttxb,\n\t\t\t\t{\n\t\t\t\t\tdryRunLabel: config.enableCostLogging ? \"migrate_object\" : undefined\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (result.effects?.status?.status !== \"success\") {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"migrationFailed\", {\n\t\t\t\t\terror: result.effects?.status?.error,\n\t\t\t\t\tobjectId\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"migrateSmartContractFailed\",\n\t\t\t\t{ objectId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Enable migration operations using admin privileges.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param walletConnector The wallet connector for address generation.\n\t * @param logging Optional logging component.\n\t * @param gasBudget The gas budget for the transaction.\n\t * @param identity The identity of the controller with admin privileges.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param deploymentConfig The deployment configuration containing object IDs.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns Promise that resolves when migration is enabled.\n\t */\n\tpublic static async enableMigration(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\twalletConnector: IWalletConnector,\n\t\tlogging: ILoggingComponent | undefined,\n\t\tgasBudget: number,\n\t\tidentity: string,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\twalletAddressIndex?: number\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst txb = new Transaction();\n\t\t\ttxb.setGasBudget(gasBudget);\n\n\t\t\tconst moduleName = IotaSmartContractUtils.getModuleName(namespace);\n\n\t\t\t// Get admin address for the transaction\n\t\t\tconst adminAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\twalletConnector,\n\t\t\t\tidentity,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get the required object IDs from deployment config\n\t\t\tconst { adminCapId, migrationStateId } = await IotaSmartContractUtils.getContractObjectIds(\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tconfig.network as NetworkTypes,\n\t\t\t\tdeploymentConfig,\n\t\t\t\tpackageId,\n\t\t\t\tadminAddress\n\t\t\t);\n\n\t\t\ttxb.moveCall({\n\t\t\t\ttarget: `${packageId}::${moduleName}::enable_migration`,\n\t\t\t\targuments: [txb.object(adminCapId), txb.object(migrationStateId)]\n\t\t\t});\n\n\t\t\tconst result = await Iota.prepareAndPostTransaction(\n\t\t\t\tconfig,\n\t\t\t\tvaultConnector,\n\t\t\t\tlogging as ILoggingComponent,\n\t\t\t\tidentity,\n\t\t\t\tclient,\n\t\t\t\tadminAddress,\n\t\t\t\ttxb,\n\t\t\t\t{\n\t\t\t\t\tdryRunLabel: config.enableCostLogging ? \"enable_migration\" : undefined\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (result.effects?.status?.status !== \"success\") {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"enableMigrationFailed\", {\n\t\t\t\t\terror: result.effects?.status?.error\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"enableMigrationFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Disable migration operations using admin privileges.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param walletConnector The wallet connector for address generation.\n\t * @param logging Optional logging component.\n\t * @param gasBudget The gas budget for the transaction.\n\t * @param identity The identity of the controller with admin privileges.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param deploymentConfig The deployment configuration containing object IDs.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns Promise that resolves when migration is disabled.\n\t */\n\tpublic static async disableMigration(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\twalletConnector: IWalletConnector,\n\t\tlogging: ILoggingComponent | undefined,\n\t\tgasBudget: number,\n\t\tidentity: string,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\twalletAddressIndex?: number\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst txb = new Transaction();\n\t\t\ttxb.setGasBudget(gasBudget);\n\n\t\t\tconst moduleName = IotaSmartContractUtils.getModuleName(namespace);\n\n\t\t\t// Get admin address for the transaction\n\t\t\tconst adminAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\twalletConnector,\n\t\t\t\tidentity,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get the required object IDs from deployment config\n\t\t\tconst { adminCapId, migrationStateId } = await IotaSmartContractUtils.getContractObjectIds(\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tconfig.network as NetworkTypes,\n\t\t\t\tdeploymentConfig,\n\t\t\t\tpackageId,\n\t\t\t\tadminAddress\n\t\t\t);\n\n\t\t\ttxb.moveCall({\n\t\t\t\ttarget: `${packageId}::${moduleName}::disable_migration`,\n\t\t\t\targuments: [txb.object(adminCapId), txb.object(migrationStateId)]\n\t\t\t});\n\n\t\t\tconst result = await Iota.prepareAndPostTransaction(\n\t\t\t\tconfig,\n\t\t\t\tvaultConnector,\n\t\t\t\tlogging as ILoggingComponent,\n\t\t\t\tidentity,\n\t\t\t\tclient,\n\t\t\t\tadminAddress,\n\t\t\t\ttxb,\n\t\t\t\t{\n\t\t\t\t\tdryRunLabel: config.enableCostLogging ? \"disable_migration\" : undefined\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (result.effects?.status?.status !== \"success\") {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"disableMigrationFailed\", {\n\t\t\t\t\terror: result.effects?.status?.error\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"disableMigrationFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Check if migration is currently active for a smart contract.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param deploymentConfig The deployment configuration containing object IDs.\n\t * @param identity The identity for MigrationState discovery.\n\t * @param walletConnector The wallet connector for address generation.\n\t * @param walletAddressIndex Optional wallet address index.\n\t * @returns True if migration is enabled, false otherwise.\n\t */\n\tpublic static async isMigrationActive(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\tidentity: string,\n\t\twalletConnector: IWalletConnector,\n\t\twalletAddressIndex?: number\n\t): Promise<boolean> {\n\t\ttry {\n\t\t\t// Get admin address for discovery\n\t\t\tconst adminAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\twalletConnector,\n\t\t\t\tidentity,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get the migration state ID\n\t\t\tconst { migrationStateId } = await IotaSmartContractUtils.getContractObjectIds(\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tconfig.network as NetworkTypes,\n\t\t\t\tdeploymentConfig,\n\t\t\t\tpackageId,\n\t\t\t\tadminAddress\n\t\t\t);\n\n\t\t\tconst migrationStateResponse = await client.getObject({\n\t\t\t\tid: migrationStateId,\n\t\t\t\toptions: {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t\tshowType: true\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!migrationStateResponse.data?.content) {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"migrationStateNotReadable\", {\n\t\t\t\t\tmigrationStateId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst content = migrationStateResponse.data.content;\n\t\t\tif (content.dataType === \"moveObject\" && Is.objectValue(content.fields)) {\n\t\t\t\tconst fields = content.fields as { enabled: boolean };\n\t\t\t\treturn Is.boolean(fields.enabled) ? fields.enabled : false;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"isMigrationActiveFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the current contract version from the deployed smart contract.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param identity The identity for package controller address.\n\t * @param walletConnector The wallet connector for address generation.\n\t * @param walletAddressIndex Optional wallet address index.\n\t * @returns The current version number of the contract.\n\t */\n\tpublic static async getCurrentContractVersion(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tidentity: string,\n\t\twalletConnector: IWalletConnector,\n\t\twalletAddressIndex?: number\n\t): Promise<number> {\n\t\ttry {\n\t\t\tconst tx = new Transaction();\n\t\t\tconst moduleName = IotaSmartContractUtils.getModuleName(namespace);\n\n\t\t\ttx.moveCall({\n\t\t\t\ttarget: `${packageId}::${moduleName}::get_current_version`,\n\t\t\t\targuments: []\n\t\t\t});\n\n\t\t\tconst controllerAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\twalletConnector,\n\t\t\t\tidentity,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\tconst result = await client.devInspectTransactionBlock({\n\t\t\t\tsender: controllerAddress,\n\t\t\t\ttransactionBlock: tx\n\t\t\t});\n\n\t\t\tif (\n\t\t\t\tIs.arrayValue(result.results) &&\n\t\t\t\tIs.object(result.results[0]) &&\n\t\t\t\tIs.arrayValue<Uint8Array>(result.results[0].returnValues)\n\t\t\t) {\n\t\t\t\tconst versionBytes = result.results[0].returnValues[0];\n\n\t\t\t\t// Convert to Uint8Array if it's a regular array\n\t\t\t\tconst byteData = versionBytes[0];\n\t\t\t\tif (!Is.arrayValue(byteData) && !Is.uint8Array(byteData)) {\n\t\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"invalidVersionData\");\n\t\t\t\t}\n\n\t\t\t\t// Convert to Uint8Array for BCS parsing\n\t\t\t\tconst uint8Data = Is.uint8Array(byteData) ? byteData : new Uint8Array(byteData);\n\n\t\t\t\t// The version is returned as a u64, decode it from bytes using BCS\n\t\t\t\t// IOTA Move contracts return data in BCS format\n\t\t\t\tconst version = Number(bcs.u64().parse(uint8Data));\n\t\t\t\treturn version;\n\t\t\t}\n\n\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"getCurrentContractVersionNoData\", {\n\t\t\t\tresultExists: Is.arrayValue(result.results),\n\t\t\t\tresultLength: Is.arrayValue(result.results) ? result.results.length : 0,\n\t\t\t\thasReturnValues: Is.arrayValue(result.results?.[0]?.returnValues)\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"getCurrentContractVersionFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Validate that an object version is compatible with the current contract.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param identity The identity for version checking.\n\t * @param objectId The object ID to validate.\n\t * @param walletConnector The wallet connector for address generation.\n\t * @param versionExtractor Function to extract version from object content.\n\t * @param walletAddressIndex Optional wallet address index.\n\t * @returns True if the object version is compatible, false otherwise.\n\t */\n\tpublic static async validateObjectVersion<T>(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tidentity: string,\n\t\tobjectId: string,\n\t\twalletConnector: IWalletConnector,\n\t\tversionExtractor: (content: T) => number,\n\t\twalletAddressIndex?: number\n\t): Promise<boolean> {\n\t\ttry {\n\t\t\t// Get current contract version\n\t\t\tconst currentVersion = await IotaSmartContractUtils.getCurrentContractVersion(\n\t\t\t\tconfig,\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tpackageId,\n\t\t\t\tidentity,\n\t\t\t\twalletConnector,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get object version\n\t\t\tconst objectResponse = await client.getObject({\n\t\t\t\tid: objectId,\n\t\t\t\toptions: {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t\tshowType: true\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!objectResponse.data?.content) {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"objectNotReadable\", {\n\t\t\t\t\tobjectId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst content = objectResponse.data.content;\n\t\t\tif (content.dataType === \"moveObject\" && Is.objectValue(content.fields)) {\n\t\t\t\tconst objectVersion = versionExtractor(content as T);\n\t\t\t\treturn objectVersion <= currentVersion;\n\t\t\t}\n\n\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"objectInvalidFormat\", {\n\t\t\t\tobjectId,\n\t\t\t\tcontent\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"validateObjectVersionFailed\",\n\t\t\t\t{ objectId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the module name for a given namespace.\n\t * @param namespace The contract namespace.\n\t * @returns The module name in snake_case format.\n\t * @internal\n\t */\n\tprivate static getModuleName(namespace: string): string {\n\t\t// Convert namespace to snake_case for module name\n\t\treturn StringHelper.snakeCase(namespace);\n\t}\n\n\t/**\n\t * Get the package controller address for transactions.\n\t * @param walletConnector The wallet connector for address generation.\n\t * @param identity The identity to use.\n\t * @param addressIndex Optional address index to use.\n\t * @returns The controller address.\n\t * @internal\n\t */\n\tprivate static async getPackageControllerAddress(\n\t\twalletConnector: IWalletConnector,\n\t\tidentity: string,\n\t\taddressIndex = 0\n\t): Promise<string> {\n\t\tconst addresses = await walletConnector.getAddresses(identity, 0, addressIndex, 1);\n\t\treturn addresses[0];\n\t}\n\n\t/**\n\t * Get contract object IDs (AdminCap and MigrationState) from deployment config with fallback discovery.\n\t * @param client The IOTA client instance.\n\t * @param namespace The contract namespace.\n\t * @param network The network name.\n\t * @param deploymentConfig The deployment configuration.\n\t * @param packageId The package ID.\n\t * @param adminAddress The admin address for object discovery.\n\t * @returns Object containing adminCapId and migrationStateId.\n\t * @internal\n\t */\n\tprivate static async getContractObjectIds(\n\t\tclient: IotaClient,\n\t\tnamespace: string,\n\t\tnetwork: NetworkTypes,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\tpackageId: string,\n\t\tadminAddress: string\n\t): Promise<{ adminCapId: string; migrationStateId: string }> {\n\t\ttry {\n\t\t\t// First try to load from deployment JSON\n\t\t\tconst networkConfig = deploymentConfig[network];\n\t\t\tif (Is.objectValue(networkConfig)) {\n\t\t\t\tconst migrationStateId = networkConfig.migrationStateId;\n\n\t\t\t\t// AdminCap must be discovered from blockchain (not stored in JSON)\n\t\t\t\tconst adminCapId = await IotaSmartContractUtils.discoverAdminCap(\n\t\t\t\t\tclient,\n\t\t\t\t\tpackageId,\n\t\t\t\t\tnamespace,\n\t\t\t\t\tadminAddress\n\t\t\t\t);\n\n\t\t\t\tif (Is.stringValue(migrationStateId) && Is.stringValue(adminCapId)) {\n\t\t\t\t\treturn { adminCapId, migrationStateId };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fallback: discover both from blockchain\n\t\t\treturn await IotaSmartContractUtils.discoverContractObjectsFromBlockchain(\n\t\t\t\tclient,\n\t\t\t\tpackageId,\n\t\t\t\tnamespace,\n\t\t\t\tadminAddress\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"getContractObjectIdsFailed\",\n\t\t\t\t{ namespace, network, packageId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Discover AdminCap object from the blockchain.\n\t * @param client The IOTA client instance.\n\t * @param packageId The package ID.\n\t * @param namespace The contract namespace.\n\t * @param adminAddress The admin address.\n\t * @returns The AdminCap object ID.\n\t * @internal\n\t */\n\tprivate static async discoverAdminCap(\n\t\tclient: IotaClient,\n\t\tpackageId: string,\n\t\tnamespace: string,\n\t\tadminAddress: string\n\t): Promise<string> {\n\t\tconst adminCapType = `${packageId}::${IotaSmartContractUtils.getModuleName(namespace)}::AdminCap`;\n\n\t\tconst adminCapObjects = await client.getOwnedObjects({\n\t\t\towner: adminAddress,\n\t\t\tfilter: {\n\t\t\t\tStructType: adminCapType\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowContent: true,\n\t\t\t\tshowType: true\n\t\t\t}\n\t\t});\n\n\t\tif (Is.arrayValue(adminCapObjects.data) && adminCapObjects.data.length > 0) {\n\t\t\tconst adminCapObject = adminCapObjects.data[0];\n\t\t\tif (Is.stringValue(adminCapObject.data?.objectId)) {\n\t\t\t\treturn adminCapObject.data.objectId;\n\t\t\t}\n\t\t}\n\n\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"adminCapNotFound\", {\n\t\t\tadminCapType,\n\t\t\tadminAddress\n\t\t});\n\t}\n\n\t/**\n\t * Discover contract objects from blockchain as fallback.\n\t * @param client The IOTA client instance.\n\t * @param packageId The package ID.\n\t * @param namespace The contract namespace.\n\t * @param adminAddress The admin address.\n\t * @returns Object containing adminCapId and migrationStateId.\n\t * @internal\n\t */\n\tprivate static async discoverContractObjectsFromBlockchain(\n\t\tclient: IotaClient,\n\t\tpackageId: string,\n\t\tnamespace: string,\n\t\tadminAddress: string\n\t): Promise<{ adminCapId: string; migrationStateId: string }> {\n\t\t// Discover AdminCap\n\t\tconst adminCapId = await IotaSmartContractUtils.discoverAdminCap(\n\t\t\tclient,\n\t\t\tpackageId,\n\t\t\tnamespace,\n\t\t\tadminAddress\n\t\t);\n\n\t\t// Discover MigrationState through transaction history\n\t\tconst migrationStateType = `${packageId}::${IotaSmartContractUtils.getModuleName(namespace)}::MigrationState`;\n\n\t\tconst transactions = await client.queryTransactionBlocks({\n\t\t\tfilter: {\n\t\t\t\tFromAddress: adminAddress\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowObjectChanges: true,\n\t\t\t\tshowEffects: true\n\t\t\t},\n\t\t\tlimit: 20,\n\t\t\torder: \"descending\"\n\t\t});\n\n\t\t// Look for MigrationState object creation in transaction history\n\t\tlet migrationStateId: string | undefined;\n\t\tfor (const tx of transactions.data) {\n\t\t\tconst objectChanges = tx.objectChanges;\n\t\t\tif (Is.arrayValue(objectChanges)) {\n\t\t\t\tfor (const change of objectChanges) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(change.type === \"created\" || change.type === \"mutated\") &&\n\t\t\t\t\t\t\"objectType\" in change &&\n\t\t\t\t\t\tchange.objectType === migrationStateType\n\t\t\t\t\t) {\n\t\t\t\t\t\tmigrationStateId = change.objectId;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (migrationStateId) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!migrationStateId) {\n\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"migrationStateNotFound\", {\n\t\t\t\tmigrationStateType,\n\t\t\t\tadminAddress\n\t\t\t});\n\t\t}\n\n\t\treturn { adminCapId, migrationStateId };\n\t}\n}\n"]}
1
+ {"version":3,"file":"iotaSmartContractUtils.js","sourceRoot":"","sources":["../../src/iotaSmartContractUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { bcs } from \"@iota/bcs\";\nimport type { IotaClient } from \"@iota/iota-sdk/client\";\nimport { Transaction } from \"@iota/iota-sdk/transactions\";\nimport { GeneralError, Is, StringHelper } from \"@twin.org/core\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IVaultConnector } from \"@twin.org/vault-models\";\nimport { Iota } from \"./iota.js\";\nimport type { IIotaConfig } from \"./models/IIotaConfig.js\";\nimport type { ISmartContractDeployments } from \"./models/ISmartContractDeployments.js\";\nimport type { NetworkTypes } from \"./models/networkTypes.js\";\n\n/**\n * Utility class providing common smart contract operations for IOTA-based contracts.\n */\nexport class IotaSmartContractUtils {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<IotaSmartContractUtils>();\n\n\t/**\n\t * Migrate a smart contract object to the current version using admin privileges.\n\t * This is a generic migration method that works with any IOTA smart contract.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param logging Optional logging component.\n\t * @param gasBudget The gas budget for the transaction.\n\t * @param identity The identity of the controller with admin privileges.\n\t * @param objectId The ID of the object to migrate.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param deploymentConfig The deployment configuration containing object IDs.\n\t * @param accountAddressIndex Optional account address index for the controller.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns Promise that resolves when migration is complete.\n\t */\n\tpublic static async migrateSmartContract(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\tlogging: ILoggingComponent | undefined,\n\t\tgasBudget: number,\n\t\tidentity: string,\n\t\tobjectId: string,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\taccountAddressIndex?: number,\n\t\twalletAddressIndex?: number\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst txb = new Transaction();\n\t\t\ttxb.setGasBudget(gasBudget);\n\n\t\t\tconst moduleName = IotaSmartContractUtils.getModuleName(namespace);\n\n\t\t\t// Get admin address for the transaction\n\t\t\tconst adminAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\tvaultConnector,\n\t\t\t\tconfig,\n\t\t\t\tidentity,\n\t\t\t\taccountAddressIndex,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get the required object IDs from deployment config\n\t\t\tconst { adminCapId, migrationStateId } = await IotaSmartContractUtils.getContractObjectIds(\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tconfig.network as NetworkTypes,\n\t\t\t\tdeploymentConfig,\n\t\t\t\tpackageId,\n\t\t\t\tadminAddress\n\t\t\t);\n\n\t\t\ttxb.moveCall({\n\t\t\t\ttarget: `${packageId}::${moduleName}::migrate_${moduleName}`,\n\t\t\t\targuments: [txb.object(adminCapId), txb.object(migrationStateId), txb.object(objectId)]\n\t\t\t});\n\n\t\t\tconst result = await Iota.prepareAndPostTransaction(\n\t\t\t\tconfig,\n\t\t\t\tvaultConnector,\n\t\t\t\tlogging,\n\t\t\t\tidentity,\n\t\t\t\tclient,\n\t\t\t\tadminAddress,\n\t\t\t\ttxb,\n\t\t\t\t{\n\t\t\t\t\tdryRunLabel: config.enableCostLogging ? \"migrate_object\" : undefined\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (result.effects?.status?.status !== \"success\") {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"migrationFailed\", {\n\t\t\t\t\terror: result.effects?.status?.error,\n\t\t\t\t\tobjectId\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"migrateSmartContractFailed\",\n\t\t\t\t{ objectId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Enable migration operations using admin privileges.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param logging Optional logging component.\n\t * @param gasBudget The gas budget for the transaction.\n\t * @param identity The identity of the controller with admin privileges.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param deploymentConfig The deployment configuration containing object IDs.\n\t * @param accountAddressIndex Optional account address index for the controller.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns Promise that resolves when migration is enabled.\n\t */\n\tpublic static async enableMigration(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\tlogging: ILoggingComponent | undefined,\n\t\tgasBudget: number,\n\t\tidentity: string,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\taccountAddressIndex?: number,\n\t\twalletAddressIndex?: number\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst txb = new Transaction();\n\t\t\ttxb.setGasBudget(gasBudget);\n\n\t\t\tconst moduleName = IotaSmartContractUtils.getModuleName(namespace);\n\n\t\t\t// Get admin address for the transaction\n\t\t\tconst adminAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\tvaultConnector,\n\t\t\t\tconfig,\n\t\t\t\tidentity,\n\t\t\t\taccountAddressIndex,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get the required object IDs from deployment config\n\t\t\tconst { adminCapId, migrationStateId } = await IotaSmartContractUtils.getContractObjectIds(\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tconfig.network as NetworkTypes,\n\t\t\t\tdeploymentConfig,\n\t\t\t\tpackageId,\n\t\t\t\tadminAddress\n\t\t\t);\n\n\t\t\ttxb.moveCall({\n\t\t\t\ttarget: `${packageId}::${moduleName}::enable_migration`,\n\t\t\t\targuments: [txb.object(adminCapId), txb.object(migrationStateId)]\n\t\t\t});\n\n\t\t\tconst result = await Iota.prepareAndPostTransaction(\n\t\t\t\tconfig,\n\t\t\t\tvaultConnector,\n\t\t\t\tlogging,\n\t\t\t\tidentity,\n\t\t\t\tclient,\n\t\t\t\tadminAddress,\n\t\t\t\ttxb,\n\t\t\t\t{\n\t\t\t\t\tdryRunLabel: config.enableCostLogging ? \"enable_migration\" : undefined\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (result.effects?.status?.status !== \"success\") {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"enableMigrationFailed\", {\n\t\t\t\t\terror: result.effects?.status?.error\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"enableMigrationFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Disable migration operations using admin privileges.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param logging Optional logging component.\n\t * @param gasBudget The gas budget for the transaction.\n\t * @param identity The identity of the controller with admin privileges.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param deploymentConfig The deployment configuration containing object IDs.\n\t * @param accountAddressIndex Optional account address index for the controller.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns Promise that resolves when migration is disabled.\n\t */\n\tpublic static async disableMigration(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\tlogging: ILoggingComponent | undefined,\n\t\tgasBudget: number,\n\t\tidentity: string,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\taccountAddressIndex?: number,\n\t\twalletAddressIndex?: number\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst txb = new Transaction();\n\t\t\ttxb.setGasBudget(gasBudget);\n\n\t\t\tconst moduleName = IotaSmartContractUtils.getModuleName(namespace);\n\n\t\t\t// Get admin address for the transaction\n\t\t\tconst adminAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\tvaultConnector,\n\t\t\t\tconfig,\n\t\t\t\tidentity,\n\t\t\t\taccountAddressIndex,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get the required object IDs from deployment config\n\t\t\tconst { adminCapId, migrationStateId } = await IotaSmartContractUtils.getContractObjectIds(\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tconfig.network as NetworkTypes,\n\t\t\t\tdeploymentConfig,\n\t\t\t\tpackageId,\n\t\t\t\tadminAddress\n\t\t\t);\n\n\t\t\ttxb.moveCall({\n\t\t\t\ttarget: `${packageId}::${moduleName}::disable_migration`,\n\t\t\t\targuments: [txb.object(adminCapId), txb.object(migrationStateId)]\n\t\t\t});\n\n\t\t\tconst result = await Iota.prepareAndPostTransaction(\n\t\t\t\tconfig,\n\t\t\t\tvaultConnector,\n\t\t\t\tlogging,\n\t\t\t\tidentity,\n\t\t\t\tclient,\n\t\t\t\tadminAddress,\n\t\t\t\ttxb,\n\t\t\t\t{\n\t\t\t\t\tdryRunLabel: config.enableCostLogging ? \"disable_migration\" : undefined\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (result.effects?.status?.status !== \"success\") {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"disableMigrationFailed\", {\n\t\t\t\t\terror: result.effects?.status?.error\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"disableMigrationFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Check if migration is currently active for a smart contract.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param deploymentConfig The deployment configuration containing object IDs.\n\t * @param identity The identity for MigrationState discovery.\n\t * @param accountAddressIndex Optional account address index for the controller.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns True if migration is enabled, false otherwise.\n\t */\n\tpublic static async isMigrationActive(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\tidentity: string,\n\t\taccountAddressIndex?: number,\n\t\twalletAddressIndex?: number\n\t): Promise<boolean> {\n\t\ttry {\n\t\t\t// Get admin address for discovery\n\t\t\tconst adminAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\tvaultConnector,\n\t\t\t\tconfig,\n\t\t\t\tidentity,\n\t\t\t\taccountAddressIndex,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get the migration state ID\n\t\t\tconst { migrationStateId } = await IotaSmartContractUtils.getContractObjectIds(\n\t\t\t\tclient,\n\t\t\t\tnamespace,\n\t\t\t\tconfig.network as NetworkTypes,\n\t\t\t\tdeploymentConfig,\n\t\t\t\tpackageId,\n\t\t\t\tadminAddress\n\t\t\t);\n\n\t\t\tconst migrationStateResponse = await client.getObject({\n\t\t\t\tid: migrationStateId,\n\t\t\t\toptions: {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t\tshowType: true\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!migrationStateResponse.data?.content) {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"migrationStateNotReadable\", {\n\t\t\t\t\tmigrationStateId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst content = migrationStateResponse.data.content;\n\t\t\tif (content.dataType === \"moveObject\" && Is.objectValue(content.fields)) {\n\t\t\t\tconst fields = content.fields as { enabled: boolean };\n\t\t\t\treturn Is.boolean(fields.enabled) ? fields.enabled : false;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"isMigrationActiveFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the current contract version from the deployed smart contract.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param identity The identity for package controller address.\n\t * @param accountAddressIndex Optional account address index for the controller.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns The current version number of the contract.\n\t */\n\tpublic static async getCurrentContractVersion(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tidentity: string,\n\t\taccountAddressIndex?: number,\n\t\twalletAddressIndex?: number\n\t): Promise<number> {\n\t\ttry {\n\t\t\tconst tx = new Transaction();\n\t\t\tconst moduleName = IotaSmartContractUtils.getModuleName(namespace);\n\n\t\t\ttx.moveCall({\n\t\t\t\ttarget: `${packageId}::${moduleName}::get_current_version`,\n\t\t\t\targuments: []\n\t\t\t});\n\n\t\t\tconst controllerAddress = await IotaSmartContractUtils.getPackageControllerAddress(\n\t\t\t\tvaultConnector,\n\t\t\t\tconfig,\n\t\t\t\tidentity,\n\t\t\t\taccountAddressIndex,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\tconst result = await client.devInspectTransactionBlock({\n\t\t\t\tsender: controllerAddress,\n\t\t\t\ttransactionBlock: tx\n\t\t\t});\n\n\t\t\tif (\n\t\t\t\tIs.arrayValue(result.results) &&\n\t\t\t\tIs.object(result.results[0]) &&\n\t\t\t\tIs.arrayValue<Uint8Array>(result.results[0].returnValues)\n\t\t\t) {\n\t\t\t\tconst versionBytes = result.results[0].returnValues[0];\n\n\t\t\t\t// Convert to Uint8Array if it's a regular array\n\t\t\t\tconst byteData = versionBytes[0];\n\t\t\t\tif (!Is.arrayValue(byteData) && !Is.uint8Array(byteData)) {\n\t\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"invalidVersionData\");\n\t\t\t\t}\n\n\t\t\t\t// Convert to Uint8Array for BCS parsing\n\t\t\t\tconst uint8Data = Is.uint8Array(byteData) ? byteData : new Uint8Array(byteData);\n\n\t\t\t\t// The version is returned as a u64, decode it from bytes using BCS\n\t\t\t\t// IOTA Move contracts return data in BCS format\n\t\t\t\tconst version = Number(bcs.u64().parse(uint8Data));\n\t\t\t\treturn version;\n\t\t\t}\n\n\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"getCurrentContractVersionNoData\", {\n\t\t\t\tresultExists: Is.arrayValue(result.results),\n\t\t\t\tresultLength: Is.arrayValue(result.results) ? result.results.length : 0,\n\t\t\t\thasReturnValues: Is.arrayValue(result.results?.[0]?.returnValues)\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"getCurrentContractVersionFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Validate that an object version is compatible with the current contract.\n\t * @param config The IOTA configuration.\n\t * @param client The IOTA client instance.\n\t * @param vaultConnector The vault connector for key management.\n\t * @param namespace The contract namespace (e.g., \"nft\", \"verifiable_storage\").\n\t * @param packageId The deployed package ID for the contract.\n\t * @param identity The identity for version checking.\n\t * @param objectId The object ID to validate.\n\t * @param versionExtractor Function to extract version from object content.\n\t * @param accountAddressIndex Optional account address index for the controller.\n\t * @param walletAddressIndex Optional wallet address index for the controller.\n\t * @returns True if the object version is compatible, false otherwise.\n\t */\n\tpublic static async validateObjectVersion<T>(\n\t\tconfig: IIotaConfig,\n\t\tclient: IotaClient,\n\t\tvaultConnector: IVaultConnector,\n\t\tnamespace: string,\n\t\tpackageId: string,\n\t\tidentity: string,\n\t\tobjectId: string,\n\t\tversionExtractor: (content: T) => number,\n\t\taccountAddressIndex?: number,\n\t\twalletAddressIndex?: number\n\t): Promise<boolean> {\n\t\ttry {\n\t\t\t// Get current contract version\n\t\t\tconst currentVersion = await IotaSmartContractUtils.getCurrentContractVersion(\n\t\t\t\tconfig,\n\t\t\t\tclient,\n\t\t\t\tvaultConnector,\n\t\t\t\tnamespace,\n\t\t\t\tpackageId,\n\t\t\t\tidentity,\n\t\t\t\taccountAddressIndex,\n\t\t\t\twalletAddressIndex\n\t\t\t);\n\n\t\t\t// Get object version\n\t\t\tconst objectResponse = await client.getObject({\n\t\t\t\tid: objectId,\n\t\t\t\toptions: {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t\tshowType: true\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!objectResponse.data?.content) {\n\t\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"objectNotReadable\", {\n\t\t\t\t\tobjectId\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst content = objectResponse.data.content;\n\t\t\tif (content.dataType === \"moveObject\" && Is.objectValue(content.fields)) {\n\t\t\t\tconst objectVersion = versionExtractor(content as T);\n\t\t\t\treturn objectVersion <= currentVersion;\n\t\t\t}\n\n\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"objectInvalidFormat\", {\n\t\t\t\tobjectId,\n\t\t\t\tcontent\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"validateObjectVersionFailed\",\n\t\t\t\t{ objectId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the module name for a given namespace.\n\t * @param namespace The contract namespace.\n\t * @returns The module name in snake_case format.\n\t * @internal\n\t */\n\tprivate static getModuleName(namespace: string): string {\n\t\t// Convert namespace to snake_case for module name\n\t\treturn StringHelper.snakeCase(namespace);\n\t}\n\n\t/**\n\t * Get the package controller address for transactions.\n\t * @param vaultConnector The vault connector to use.\n\t * @param config The IOTA configuration.\n\t * @param identity The identity to use.\n\t * @param accountAddressIndex Optional account address index to use.\n\t * @param walletAddressIndex Optional address index to use.\n\t * @returns The controller address.\n\t * @internal\n\t */\n\tprivate static async getPackageControllerAddress(\n\t\tvaultConnector: IVaultConnector,\n\t\tconfig: IIotaConfig,\n\t\tidentity: string,\n\t\taccountAddressIndex?: number,\n\t\twalletAddressIndex?: number\n\t): Promise<string> {\n\t\tconst address = await Iota.getAddress(\n\t\t\tvaultConnector,\n\t\t\tconfig,\n\t\t\tidentity,\n\t\t\taccountAddressIndex ?? 0,\n\t\t\twalletAddressIndex ?? 0\n\t\t);\n\t\treturn address;\n\t}\n\n\t/**\n\t * Get contract object IDs (AdminCap and MigrationState) from deployment config with fallback discovery.\n\t * @param client The IOTA client instance.\n\t * @param namespace The contract namespace.\n\t * @param network The network name.\n\t * @param deploymentConfig The deployment configuration.\n\t * @param packageId The package ID.\n\t * @param adminAddress The admin address for object discovery.\n\t * @returns Object containing adminCapId and migrationStateId.\n\t * @internal\n\t */\n\tprivate static async getContractObjectIds(\n\t\tclient: IotaClient,\n\t\tnamespace: string,\n\t\tnetwork: NetworkTypes,\n\t\tdeploymentConfig: ISmartContractDeployments,\n\t\tpackageId: string,\n\t\tadminAddress: string\n\t): Promise<{ adminCapId: string; migrationStateId: string }> {\n\t\ttry {\n\t\t\t// First try to load from deployment JSON\n\t\t\tconst networkConfig = deploymentConfig[network];\n\t\t\tif (Is.objectValue(networkConfig)) {\n\t\t\t\tconst migrationStateId = networkConfig.migrationStateId;\n\n\t\t\t\t// AdminCap must be discovered from blockchain (not stored in JSON)\n\t\t\t\tconst adminCapId = await IotaSmartContractUtils.discoverAdminCap(\n\t\t\t\t\tclient,\n\t\t\t\t\tpackageId,\n\t\t\t\t\tnamespace,\n\t\t\t\t\tadminAddress\n\t\t\t\t);\n\n\t\t\t\tif (Is.stringValue(migrationStateId) && Is.stringValue(adminCapId)) {\n\t\t\t\t\treturn { adminCapId, migrationStateId };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fallback: discover both from blockchain\n\t\t\treturn await IotaSmartContractUtils.discoverContractObjectsFromBlockchain(\n\t\t\t\tclient,\n\t\t\t\tpackageId,\n\t\t\t\tnamespace,\n\t\t\t\tadminAddress\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tIotaSmartContractUtils.CLASS_NAME,\n\t\t\t\t\"getContractObjectIdsFailed\",\n\t\t\t\t{ namespace, network, packageId },\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Discover AdminCap object from the blockchain.\n\t * @param client The IOTA client instance.\n\t * @param packageId The package ID.\n\t * @param namespace The contract namespace.\n\t * @param adminAddress The admin address.\n\t * @returns The AdminCap object ID.\n\t * @internal\n\t */\n\tprivate static async discoverAdminCap(\n\t\tclient: IotaClient,\n\t\tpackageId: string,\n\t\tnamespace: string,\n\t\tadminAddress: string\n\t): Promise<string> {\n\t\tconst adminCapType = `${packageId}::${IotaSmartContractUtils.getModuleName(namespace)}::AdminCap`;\n\n\t\tconst adminCapObjects = await client.getOwnedObjects({\n\t\t\towner: adminAddress,\n\t\t\tfilter: {\n\t\t\t\tStructType: adminCapType\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowContent: true,\n\t\t\t\tshowType: true\n\t\t\t}\n\t\t});\n\n\t\tif (Is.arrayValue(adminCapObjects.data) && adminCapObjects.data.length > 0) {\n\t\t\tconst adminCapObject = adminCapObjects.data[0];\n\t\t\tif (Is.stringValue(adminCapObject.data?.objectId)) {\n\t\t\t\treturn adminCapObject.data.objectId;\n\t\t\t}\n\t\t}\n\n\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"adminCapNotFound\", {\n\t\t\tadminCapType,\n\t\t\tadminAddress\n\t\t});\n\t}\n\n\t/**\n\t * Discover contract objects from blockchain as fallback.\n\t * @param client The IOTA client instance.\n\t * @param packageId The package ID.\n\t * @param namespace The contract namespace.\n\t * @param adminAddress The admin address.\n\t * @returns Object containing adminCapId and migrationStateId.\n\t * @internal\n\t */\n\tprivate static async discoverContractObjectsFromBlockchain(\n\t\tclient: IotaClient,\n\t\tpackageId: string,\n\t\tnamespace: string,\n\t\tadminAddress: string\n\t): Promise<{ adminCapId: string; migrationStateId: string }> {\n\t\t// Discover AdminCap\n\t\tconst adminCapId = await IotaSmartContractUtils.discoverAdminCap(\n\t\t\tclient,\n\t\t\tpackageId,\n\t\t\tnamespace,\n\t\t\tadminAddress\n\t\t);\n\n\t\t// Discover MigrationState through transaction history\n\t\tconst migrationStateType = `${packageId}::${IotaSmartContractUtils.getModuleName(namespace)}::MigrationState`;\n\n\t\tconst transactions = await client.queryTransactionBlocks({\n\t\t\tfilter: {\n\t\t\t\tFromAddress: adminAddress\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowObjectChanges: true,\n\t\t\t\tshowEffects: true\n\t\t\t},\n\t\t\tlimit: 20,\n\t\t\torder: \"descending\"\n\t\t});\n\n\t\t// Look for MigrationState object creation in transaction history\n\t\tlet migrationStateId: string | undefined;\n\t\tfor (const tx of transactions.data) {\n\t\t\tconst objectChanges = tx.objectChanges;\n\t\t\tif (Is.arrayValue(objectChanges)) {\n\t\t\t\tfor (const change of objectChanges) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(change.type === \"created\" || change.type === \"mutated\") &&\n\t\t\t\t\t\t\"objectType\" in change &&\n\t\t\t\t\t\tchange.objectType === migrationStateType\n\t\t\t\t\t) {\n\t\t\t\t\t\tmigrationStateId = change.objectId;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (migrationStateId) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!migrationStateId) {\n\t\t\tthrow new GeneralError(IotaSmartContractUtils.CLASS_NAME, \"migrationStateNotFound\", {\n\t\t\t\tmigrationStateType,\n\t\t\t\tadminAddress\n\t\t\t});\n\t\t}\n\n\t\treturn { adminCapId, migrationStateId };\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IAdminCapFields.js","sourceRoot":"","sources":["../../../src/models/IAdminCapFields.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Generic interface representing the storage fields of an AdminCap object.\n */\nexport interface IAdminCapFields {\n\t/**\n\t * The ID of the AdminCap object.\n\t */\n\tid: {\n\t\t/**\n\t\t * The ID of the AdminCap object.\n\t\t */\n\t\tid: string; // UID is an object with an 'id' field\n\t};\n}\n"]}
1
+ {"version":3,"file":"IAdminCapFields.js","sourceRoot":"","sources":["../../../src/models/IAdminCapFields.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Generic interface representing the storage fields of an AdminCap object.\n */\nexport interface IAdminCapFields {\n\t/**\n\t * The UID wrapper of the AdminCap object.\n\t */\n\tid: {\n\t\t/**\n\t\t * The hex string ID of the AdminCap object.\n\t\t */\n\t\tid: string;\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IGasStationExecuteResponse.js","sourceRoot":"","sources":["../../../src/models/IGasStationExecuteResponse.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Interface for the gas station execute transaction response.\n */\nexport interface IGasStationExecuteResponse {\n\t/**\n\t * The transaction effects from the IOTA network.\n\t * This contains the full IOTA transaction effects object.\n\t */\n\teffects: {\n\t\t/**\n\t\t * Additional effects data from the IOTA network.\n\t\t * This includes messageVersion, status, executedEpoch, gasUsed, etc.\n\t\t */\n\t\t[key: string]: unknown;\n\n\t\t/**\n\t\t * The transaction digest.\n\t\t */\n\t\ttransactionDigest: string;\n\t};\n\n\t/**\n\t * Error message if the request failed.\n\t */\n\terror?: string | null;\n}\n"]}
1
+ {"version":3,"file":"IGasStationExecuteResponse.js","sourceRoot":"","sources":["../../../src/models/IGasStationExecuteResponse.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Interface for the gas station execute transaction response.\n */\nexport interface IGasStationExecuteResponse {\n\t/**\n\t * The transaction effects from the IOTA network.\n\t */\n\teffects: {\n\t\t/**\n\t\t * Additional fields from the IOTA network effects object.\n\t\t */\n\t\t[key: string]: unknown;\n\n\t\t/**\n\t\t * The transaction digest.\n\t\t */\n\t\ttransactionDigest: string;\n\t};\n\n\t/**\n\t * Error message if the request failed.\n\t */\n\terror?: string | null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IIotaConfig.js","sourceRoot":"","sources":["../../../src/models/IIotaConfig.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IotaClientOptions } from \"@iota/iota-sdk/client\";\nimport type { IGasStationConfig } from \"./IGasStationConfig.js\";\n\n/**\n * Configuration for IOTA.\n */\nexport interface IIotaConfig {\n\t/**\n\t * The configuration for the client.\n\t */\n\tclientOptions: IotaClientOptions;\n\n\t/**\n\t * The network the operations are being performed on.\n\t */\n\tnetwork: string;\n\n\t/**\n\t * The id of the entry in the vault containing the mnemonic.\n\t * @default mnemonic\n\t */\n\tvaultMnemonicId?: string;\n\n\t/**\n\t * The id of the entry in the vault containing the seed.\n\t * @default seed\n\t */\n\tvaultSeedId?: string;\n\n\t/**\n\t * The coin type.\n\t * @default IOTA 4218\n\t */\n\tcoinType?: number;\n\n\t/**\n\t * The maximum range to scan for addresses.\n\t * @default 1000\n\t */\n\tmaxAddressScanRange?: number;\n\n\t/**\n\t * The length of time to wait for the inclusion of a transaction in seconds.\n\t * @default 60\n\t */\n\tinclusionTimeoutSeconds?: number;\n\n\t/**\n\t * Gas station configuration for sponsored transactions.\n\t * If provided, transactions will be processed through the gas station.\n\t */\n\tgasStation?: IGasStationConfig;\n\n\t/**\n\t * The default gas budget for all transactions (including sponsored and direct).\n\t * @default 50000000\n\t */\n\tgasBudget?: number;\n\n\t/**\n\t * Enable cost logging for transactions.\n\t * @default false\n\t */\n\tenableCostLogging?: boolean;\n}\n"]}
1
+ {"version":3,"file":"IIotaConfig.js","sourceRoot":"","sources":["../../../src/models/IIotaConfig.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IotaClientOptions } from \"@iota/iota-sdk/client\";\nimport type { IGasStationConfig } from \"./IGasStationConfig.js\";\n\n/**\n * Configuration for IOTA.\n */\nexport interface IIotaConfig {\n\t/**\n\t * The configuration for the client.\n\t */\n\tclientOptions: IotaClientOptions;\n\n\t/**\n\t * The network the operations are being performed on.\n\t */\n\tnetwork: string;\n\n\t/**\n\t * The id of the entry in the vault containing the mnemonic.\n\t * @default mnemonic\n\t */\n\tvaultMnemonicId?: string;\n\n\t/**\n\t * The id of the entry in the vault containing the seed.\n\t * @default seed\n\t */\n\tvaultSeedId?: string;\n\n\t/**\n\t * The coin type.\n\t * @default IOTA 4218\n\t */\n\tcoinType?: number;\n\n\t/**\n\t * The maximum range to scan for addresses.\n\t * @default 1000\n\t */\n\tmaxAddressScanRange?: number;\n\n\t/**\n\t * The length of time to wait for the inclusion of a transaction in seconds.\n\t * @default 60\n\t */\n\tinclusionTimeoutSeconds?: number;\n\n\t/**\n\t * Gas station configuration for sponsored transactions.\n\t * If provided, transactions will be processed through the gas station.\n\t */\n\tgasStation?: IGasStationConfig;\n\n\t/**\n\t * The default gas budget for all transactions (including sponsored and direct).\n\t * @default 50000000\n\t */\n\tgasBudget?: number;\n\n\t/**\n\t * The default gas reservation duration in seconds for all transactions (including sponsored and direct).\n\t * @default 60\n\t */\n\tgasReservationDuration?: number;\n\n\t/**\n\t * Enable cost logging for transactions.\n\t * @default false\n\t */\n\tenableCostLogging?: boolean;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IIotaControllerCapInfo.js","sourceRoot":"","sources":["../../../src/models/IIotaControllerCapInfo.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * On-chain object IDs needed to call mint_with_identity() on the NFT Move contract.\n */\nexport interface IIotaControllerCapInfo {\n\t/**\n\t * The on-chain Object ID of the Identity Move object (hex string, e.g. \"0x...\").\n\t * Used as the Identity argument in mint_with_identity().\n\t */\n\tidentityObjectId: string;\n\n\t/**\n\t * The on-chain Object ID of the ControllerToken Move object (hex string, e.g. \"0x...\").\n\t * Proves that the controller address controls identityObjectId.\n\t * Used as the ControllerCap argument in mint_with_identity().\n\t */\n\tcontrollerCapObjectId: string;\n}\n"]}
1
+ {"version":3,"file":"IIotaControllerCapInfo.js","sourceRoot":"","sources":["../../../src/models/IIotaControllerCapInfo.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * On-chain object IDs for an identity and its associated controller token.\n */\nexport interface IIotaControllerCapInfo {\n\t/**\n\t * The on-chain object ID of the Identity Move object (hex string, e.g. \"0x...\").\n\t */\n\tidentityObjectId: string;\n\n\t/**\n\t * The on-chain object ID of the ControllerToken Move object (hex string, e.g. \"0x...\").\n\t */\n\tcontrollerCapObjectId: string;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IIotaResponseOptions.js","sourceRoot":"","sources":["../../../src/models/IIotaResponseOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IotaTransactionBlockResponseOptions } from \"@iota/iota-sdk/client\";\n\n/**\n * Configuration for IOTA.\n */\nexport interface IIotaResponseOptions extends IotaTransactionBlockResponseOptions {\n\t/**\n\t * Wait for confirmation of the transaction.\n\t * @default true\n\t */\n\twaitForConfirmation?: boolean;\n\n\t/**\n\t * Dry run the transaction with this label, if not set no dry run will occur.\n\t */\n\tdryRunLabel?: string;\n}\n"]}
1
+ {"version":3,"file":"IIotaResponseOptions.js","sourceRoot":"","sources":["../../../src/models/IIotaResponseOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IotaTransactionBlockResponseOptions } from \"@iota/iota-sdk/client\";\n\n/**\n * Options for controlling transaction execution and response behaviour.\n */\nexport interface IIotaResponseOptions extends IotaTransactionBlockResponseOptions {\n\t/**\n\t * Wait for confirmation of the transaction.\n\t * @default true\n\t */\n\twaitForConfirmation?: boolean;\n\n\t/**\n\t * Dry run the transaction with this label, if not set no dry run will occur.\n\t */\n\tdryRunLabel?: string;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IMigrationStateFields.js","sourceRoot":"","sources":["../../../src/models/IMigrationStateFields.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Generic interface representing the storage fields of a MigrationState object.\n */\nexport interface IMigrationStateFields {\n\t/**\n\t * The ID of the MigrationState object.\n\t */\n\tid: {\n\t\t/**\n\t\t * The ID of the MigrationState object.\n\t\t */\n\t\tid: string; // UID is an object with an 'id' field\n\t};\n\n\t/**\n\t * Whether migration is currently enabled.\n\t */\n\tenabled: boolean;\n}\n"]}
1
+ {"version":3,"file":"IMigrationStateFields.js","sourceRoot":"","sources":["../../../src/models/IMigrationStateFields.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Generic interface representing the storage fields of a MigrationState object.\n */\nexport interface IMigrationStateFields {\n\t/**\n\t * The UID wrapper of the MigrationState object.\n\t */\n\tid: {\n\t\t/**\n\t\t * The hex string ID of the MigrationState object.\n\t\t */\n\t\tid: string;\n\t};\n\n\t/**\n\t * Whether migration is currently enabled.\n\t */\n\tenabled: boolean;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ISmartContractObject.js","sourceRoot":"","sources":["../../../src/models/ISmartContractObject.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Base interface for all smart contract objects with versioning support.\n */\nexport interface ISmartContractObject {\n\t/**\n\t * The ID of the smart contract object.\n\t */\n\tid: {\n\t\t/**\n\t\t * The ID of the smart contract object.\n\t\t */\n\t\tid: string; // UID is an object with an 'id' field\n\t};\n\n\t/**\n\t * The version of the contract that created this object.\n\t */\n\tversion: string;\n}\n"]}
1
+ {"version":3,"file":"ISmartContractObject.js","sourceRoot":"","sources":["../../../src/models/ISmartContractObject.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Base interface for all smart contract objects with versioning support.\n */\nexport interface ISmartContractObject {\n\t/**\n\t * The UID wrapper of the smart contract object.\n\t */\n\tid: {\n\t\t/**\n\t\t * The hex string ID of the smart contract object.\n\t\t */\n\t\tid: string;\n\t};\n\n\t/**\n\t * The version of the contract that created this object.\n\t */\n\tversion: string;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ITransactionSigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITransactionSigner.js","sourceRoot":"","sources":["../../../src/models/ITransactionSigner.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { PublicKey } from \"@iota/iota-sdk/cryptography\";\n\n/**\n * Interface for a transaction signer backed by a secure key store.\n */\nexport interface ITransactionSigner {\n\t/**\n\t * Sign the BCS-encoded transaction data and return a serialized IOTA signature string.\n\t * @param txDataBcs The raw transaction bytes to sign.\n\t * @returns The serialized signature string (scheme flag + signature + public key, base64-encoded).\n\t */\n\tsign(txDataBcs: Uint8Array): Promise<string>;\n\n\t/**\n\t * Get the public key for this signer.\n\t * @returns The public key.\n\t */\n\tpublicKey(): Promise<PublicKey>;\n\n\t/**\n\t * Get the IOTA-formatted public key bytes (scheme flag byte followed by the raw key bytes).\n\t * @returns The IOTA public key bytes.\n\t */\n\tiotaPublicKeyBytes(): Promise<Uint8Array>;\n\n\t/**\n\t * Get the key identifier for this signer.\n\t * @returns The key identifier.\n\t */\n\tkeyId(): string;\n}\n"]}
@@ -0,0 +1,71 @@
1
+ import { GeneralError } from "@twin.org/core";
2
+ /**
3
+ * JwkStorage implementation that delegates the sign operation to the vault connector,
4
+ * keeping the private key inside the vault at all times.
5
+ */
6
+ export class VaultJwkStorage {
7
+ /**
8
+ * Runtime name for the class.
9
+ */
10
+ static CLASS_NAME = "VaultJwkStorage";
11
+ /**
12
+ * The vault connector used to perform signing.
13
+ * @internal
14
+ */
15
+ _vaultConnector;
16
+ /**
17
+ * The vault key name to use when signing.
18
+ * @internal
19
+ */
20
+ _keyName;
21
+ /**
22
+ * Create a new VaultJwkStorage.
23
+ * @param vaultConnector The vault connector used to perform signing operations.
24
+ * @param keyName The name of the key in the vault to use for signing.
25
+ */
26
+ constructor(vaultConnector, keyName) {
27
+ this._vaultConnector = vaultConnector;
28
+ this._keyName = keyName;
29
+ }
30
+ /**
31
+ * Sign data by delegating to the vault connector.
32
+ * @param keyId The key identifier (unused; the vault key name is used directly).
33
+ * @param data The data to sign.
34
+ * @param publicKey The public key JWK (unused; the vault connector handles key lookup).
35
+ * @returns The raw signature bytes.
36
+ */
37
+ async sign(keyId, data, publicKey) {
38
+ return this._vaultConnector.sign(this._keyName, data);
39
+ }
40
+ /**
41
+ * Accept a JWK entry and return the vault key name as the stable key identifier.
42
+ * @param jwk The JWK to register.
43
+ * @returns The key identifier.
44
+ */
45
+ async insert(jwk) {
46
+ return this._keyName;
47
+ }
48
+ /**
49
+ * Check whether the given key identifier is managed by this storage.
50
+ * @param keyId The key identifier to check.
51
+ * @returns True if the key exists in this storage.
52
+ */
53
+ async exists(keyId) {
54
+ return keyId === this._keyName;
55
+ }
56
+ /**
57
+ * Key generation is not supported; keys are managed entirely by the vault.
58
+ * @param keyType The key type requested.
59
+ * @param algorithm The JWS algorithm requested.
60
+ * @returns Never returns.
61
+ */
62
+ async generate(keyType, algorithm) {
63
+ throw new GeneralError(VaultJwkStorage.CLASS_NAME, "generateNotSupported");
64
+ }
65
+ /**
66
+ * Deletion is a no-op; keys are managed by the vault.
67
+ * @param keyId The key identifier to delete.
68
+ */
69
+ async delete(keyId) { }
70
+ }
71
+ //# sourceMappingURL=vaultJwkStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vaultJwkStorage.js","sourceRoot":"","sources":["../../src/vaultJwkStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C;;;GAGG;AACH,MAAM,OAAO,eAAe;IAC3B;;OAEG;IACI,MAAM,CAAU,UAAU,qBAAqC;IAEtE;;;OAGG;IACc,eAAe,CAAkB;IAElD;;;OAGG;IACc,QAAQ,CAAS;IAElC;;;;OAIG;IACH,YAAY,cAA+B,EAAE,OAAe;QAC3D,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,IAAgB,EAAE,SAAc;QAChE,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,MAAM,CAAC,GAAQ;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,MAAM,CAAC,KAAa;QAChC,OAAO,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,SAAuB;QAC7D,MAAM,IAAI,YAAY,CAAC,eAAe,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;IAC5E,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAM,CAAC,KAAa,IAAkB,CAAC","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { Jwk, JwkStorage, JwsAlgorithm } from \"@iota/identity-wasm/node/index.js\";\nimport { GeneralError } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IVaultConnector } from \"@twin.org/vault-models\";\n\n/**\n * JwkStorage implementation that delegates the sign operation to the vault connector,\n * keeping the private key inside the vault at all times.\n */\nexport class VaultJwkStorage implements JwkStorage {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<VaultJwkStorage>();\n\n\t/**\n\t * The vault connector used to perform signing.\n\t * @internal\n\t */\n\tprivate readonly _vaultConnector: IVaultConnector;\n\n\t/**\n\t * The vault key name to use when signing.\n\t * @internal\n\t */\n\tprivate readonly _keyName: string;\n\n\t/**\n\t * Create a new VaultJwkStorage.\n\t * @param vaultConnector The vault connector used to perform signing operations.\n\t * @param keyName The name of the key in the vault to use for signing.\n\t */\n\tconstructor(vaultConnector: IVaultConnector, keyName: string) {\n\t\tthis._vaultConnector = vaultConnector;\n\t\tthis._keyName = keyName;\n\t}\n\n\t/**\n\t * Sign data by delegating to the vault connector.\n\t * @param keyId The key identifier (unused; the vault key name is used directly).\n\t * @param data The data to sign.\n\t * @param publicKey The public key JWK (unused; the vault connector handles key lookup).\n\t * @returns The raw signature bytes.\n\t */\n\tpublic async sign(keyId: string, data: Uint8Array, publicKey: Jwk): Promise<Uint8Array> {\n\t\treturn this._vaultConnector.sign(this._keyName, data);\n\t}\n\n\t/**\n\t * Accept a JWK entry and return the vault key name as the stable key identifier.\n\t * @param jwk The JWK to register.\n\t * @returns The key identifier.\n\t */\n\tpublic async insert(jwk: Jwk): Promise<string> {\n\t\treturn this._keyName;\n\t}\n\n\t/**\n\t * Check whether the given key identifier is managed by this storage.\n\t * @param keyId The key identifier to check.\n\t * @returns True if the key exists in this storage.\n\t */\n\tpublic async exists(keyId: string): Promise<boolean> {\n\t\treturn keyId === this._keyName;\n\t}\n\n\t/**\n\t * Key generation is not supported; keys are managed entirely by the vault.\n\t * @param keyType The key type requested.\n\t * @param algorithm The JWS algorithm requested.\n\t * @returns Never returns.\n\t */\n\tpublic async generate(keyType: string, algorithm: JwsAlgorithm): Promise<never> {\n\t\tthrow new GeneralError(VaultJwkStorage.CLASS_NAME, \"generateNotSupported\");\n\t}\n\n\t/**\n\t * Deletion is a no-op; keys are managed by the vault.\n\t * @param keyId The key identifier to delete.\n\t */\n\tpublic async delete(keyId: string): Promise<void> {}\n}\n"]}
@@ -0,0 +1,49 @@
1
+ // Copyright 2026 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { Jwk, KeyIdMemStore, Storage, StorageSigner } from "@iota/identity-wasm/node/index.js";
4
+ import { Base64Url, Guards } from "@twin.org/core";
5
+ import { Iota } from "./iota.js";
6
+ import { VaultJwkStorage } from "./vaultJwkStorage.js";
7
+ /**
8
+ * Factory that creates a vault-backed StorageSigner for IOTA Identity operations.
9
+ * The private key never leaves the vault — only the raw signing operation is delegated.
10
+ *
11
+ * The returned StorageSigner is a genuine WASM object, satisfying the internal validation
12
+ * that IdentityClient.create() performs on the signer's iotaPublicKeyBytes() path.
13
+ */
14
+ export class VaultJwtSigner {
15
+ /**
16
+ * Runtime name for the class.
17
+ */
18
+ static CLASS_NAME = "VaultJwtSigner";
19
+ /**
20
+ * Create a StorageSigner whose cryptographic operations are backed by the vault connector.
21
+ * @param vaultConnector The vault connector.
22
+ * @param config The configuration.
23
+ * @param identity The identity of the user to access the vault keys.
24
+ * @param accountIndex The account index.
25
+ * @param addressIndex The address index within the account.
26
+ * @returns A StorageSigner backed by the vault for the specified key.
27
+ */
28
+ static async create(vaultConnector, config, identity, accountIndex, addressIndex) {
29
+ Guards.object(VaultJwtSigner.CLASS_NAME, "vaultConnector", vaultConnector);
30
+ Guards.object(VaultJwtSigner.CLASS_NAME, "config", config);
31
+ Guards.stringValue(VaultJwtSigner.CLASS_NAME, "identity", identity);
32
+ Guards.integer(VaultJwtSigner.CLASS_NAME, "accountIndex", accountIndex);
33
+ Guards.integer(VaultJwtSigner.CLASS_NAME, "addressIndex", addressIndex);
34
+ const transactionSigner = await Iota.getTransactionSigner(vaultConnector, config, identity, accountIndex, addressIndex);
35
+ const keyName = transactionSigner.keyId();
36
+ const publicKey = await transactionSigner.publicKey();
37
+ const publicJwk = new Jwk({
38
+ kty: "OKP" /* JwkType.Okp */,
39
+ crv: "Ed25519",
40
+ alg: "EdDSA" /* JwsAlgorithm.EdDSA */,
41
+ x: Base64Url.encode(publicKey.toRawBytes())
42
+ });
43
+ const vaultJwkStorage = new VaultJwkStorage(vaultConnector, keyName);
44
+ const keyId = await vaultJwkStorage.insert(publicJwk);
45
+ const storage = new Storage(vaultJwkStorage, new KeyIdMemStore());
46
+ return new StorageSigner(storage, keyId, publicJwk);
47
+ }
48
+ }
49
+ //# sourceMappingURL=vaultJwtSigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vaultJwtSigner.js","sourceRoot":"","sources":["../../src/vaultJwtSigner.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EACN,GAAG,EAGH,aAAa,EACb,OAAO,EACP,aAAa,EACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAC1B;;OAEG;IACI,MAAM,CAAU,UAAU,oBAAoC;IAErE;;;;;;;;OAQG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACzB,cAA+B,EAC/B,MAAmB,EACnB,QAAgB,EAChB,YAAoB,EACpB,YAAoB;QAEpB,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,oBAA0B,cAAc,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,CAAc,cAAc,CAAC,UAAU,YAAkB,MAAM,CAAC,CAAC;QAC9E,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,UAAU,cAAoB,QAAQ,CAAC,CAAC;QAC1E,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,kBAAwB,YAAY,CAAC,CAAC;QAC9E,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,kBAAwB,YAAY,CAAC,CAAC;QAE9E,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CACxD,cAAc,EACd,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,YAAY,CACZ,CAAC;QAEF,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAEtD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;YACzB,GAAG,yBAAa;YAChB,GAAG,EAAE,SAAS;YACd,GAAG,kCAAoB;YACvB,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,eAAe,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;QAElE,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tJwk,\n\tJwkType,\n\tJwsAlgorithm,\n\tKeyIdMemStore,\n\tStorage,\n\tStorageSigner\n} from \"@iota/identity-wasm/node/index.js\";\nimport { Base64Url, Guards } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IVaultConnector } from \"@twin.org/vault-models\";\nimport { Iota } from \"./iota.js\";\nimport type { IIotaConfig } from \"./models/IIotaConfig.js\";\nimport { VaultJwkStorage } from \"./vaultJwkStorage.js\";\n\n/**\n * Factory that creates a vault-backed StorageSigner for IOTA Identity operations.\n * The private key never leaves the vault — only the raw signing operation is delegated.\n *\n * The returned StorageSigner is a genuine WASM object, satisfying the internal validation\n * that IdentityClient.create() performs on the signer's iotaPublicKeyBytes() path.\n */\nexport class VaultJwtSigner {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<VaultJwtSigner>();\n\n\t/**\n\t * Create a StorageSigner whose cryptographic operations are backed by the vault connector.\n\t * @param vaultConnector The vault connector.\n\t * @param config The configuration.\n\t * @param identity The identity of the user to access the vault keys.\n\t * @param accountIndex The account index.\n\t * @param addressIndex The address index within the account.\n\t * @returns A StorageSigner backed by the vault for the specified key.\n\t */\n\tpublic static async create(\n\t\tvaultConnector: IVaultConnector,\n\t\tconfig: IIotaConfig,\n\t\tidentity: string,\n\t\taccountIndex: number,\n\t\taddressIndex: number\n\t): Promise<StorageSigner> {\n\t\tGuards.object(VaultJwtSigner.CLASS_NAME, nameof(vaultConnector), vaultConnector);\n\t\tGuards.object<IIotaConfig>(VaultJwtSigner.CLASS_NAME, nameof(config), config);\n\t\tGuards.stringValue(VaultJwtSigner.CLASS_NAME, nameof(identity), identity);\n\t\tGuards.integer(VaultJwtSigner.CLASS_NAME, nameof(accountIndex), accountIndex);\n\t\tGuards.integer(VaultJwtSigner.CLASS_NAME, nameof(addressIndex), addressIndex);\n\n\t\tconst transactionSigner = await Iota.getTransactionSigner(\n\t\t\tvaultConnector,\n\t\t\tconfig,\n\t\t\tidentity,\n\t\t\taccountIndex,\n\t\t\taddressIndex\n\t\t);\n\n\t\tconst keyName = transactionSigner.keyId();\n\t\tconst publicKey = await transactionSigner.publicKey();\n\n\t\tconst publicJwk = new Jwk({\n\t\t\tkty: JwkType.Okp,\n\t\t\tcrv: \"Ed25519\",\n\t\t\talg: JwsAlgorithm.EdDSA,\n\t\t\tx: Base64Url.encode(publicKey.toRawBytes())\n\t\t});\n\n\t\tconst vaultJwkStorage = new VaultJwkStorage(vaultConnector, keyName);\n\t\tconst keyId = await vaultJwkStorage.insert(publicJwk);\n\t\tconst storage = new Storage(vaultJwkStorage, new KeyIdMemStore());\n\n\t\treturn new StorageSigner(storage, keyId, publicJwk);\n\t}\n}\n"]}
@@ -0,0 +1,60 @@
1
+ // Copyright 2026 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { Signer } from "@iota/iota-sdk/cryptography";
4
+ import { Ed25519PublicKey } from "@iota/iota-sdk/keypairs/ed25519";
5
+ /**
6
+ * A signer that delegates all signing to the vault connector, ensuring the private key
7
+ * is never exposed to application code.
8
+ */
9
+ export class VaultSigner extends Signer {
10
+ /**
11
+ * The vault connector used to perform signing.
12
+ * @internal
13
+ */
14
+ _vaultConnector;
15
+ /**
16
+ * The vault key name to use when signing.
17
+ * @internal
18
+ */
19
+ _keyName;
20
+ /**
21
+ * The public key for this signer.
22
+ * @internal
23
+ */
24
+ _publicKey;
25
+ /**
26
+ * Create a new VaultSigner.
27
+ * @param vaultConnector The vault connector used to perform signing operations.
28
+ * @param keyName The name of the key in the vault to use for signing.
29
+ * @param publicKey The public key bytes corresponding to the vault key.
30
+ */
31
+ constructor(vaultConnector, keyName, publicKey) {
32
+ super();
33
+ this._vaultConnector = vaultConnector;
34
+ this._keyName = keyName;
35
+ this._publicKey = new Ed25519PublicKey(publicKey);
36
+ }
37
+ /**
38
+ * Get the key scheme.
39
+ * @returns The signature scheme.
40
+ */
41
+ getKeyScheme() {
42
+ return "ED25519";
43
+ }
44
+ /**
45
+ * Get the public key.
46
+ * @returns The Ed25519 public key.
47
+ */
48
+ getPublicKey() {
49
+ return this._publicKey;
50
+ }
51
+ /**
52
+ * Sign the provided bytes via the vault connector.
53
+ * @param bytes The bytes to sign.
54
+ * @returns The raw Ed25519 signature bytes.
55
+ */
56
+ async sign(bytes) {
57
+ return this._vaultConnector.sign(this._keyName, bytes);
58
+ }
59
+ }
60
+ //# sourceMappingURL=vaultSigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vaultSigner.js","sourceRoot":"","sources":["../../src/vaultSigner.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,MAAM,EAAwB,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,MAAM;IACtC;;;OAGG;IACc,eAAe,CAAkB;IAElD;;;OAGG;IACc,QAAQ,CAAS;IAElC;;;OAGG;IACc,UAAU,CAAmB;IAE9C;;;;;OAKG;IACH,YAAY,cAA+B,EAAE,OAAe,EAAE,SAAqB;QAClF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACI,YAAY;QAClB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,YAAY;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAI,CAAC,KAAiB;QAClC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;CACD","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Signer, type SignatureScheme } from \"@iota/iota-sdk/cryptography\";\nimport { Ed25519PublicKey } from \"@iota/iota-sdk/keypairs/ed25519\";\nimport type { IVaultConnector } from \"@twin.org/vault-models\";\n\n/**\n * A signer that delegates all signing to the vault connector, ensuring the private key\n * is never exposed to application code.\n */\nexport class VaultSigner extends Signer {\n\t/**\n\t * The vault connector used to perform signing.\n\t * @internal\n\t */\n\tprivate readonly _vaultConnector: IVaultConnector;\n\n\t/**\n\t * The vault key name to use when signing.\n\t * @internal\n\t */\n\tprivate readonly _keyName: string;\n\n\t/**\n\t * The public key for this signer.\n\t * @internal\n\t */\n\tprivate readonly _publicKey: Ed25519PublicKey;\n\n\t/**\n\t * Create a new VaultSigner.\n\t * @param vaultConnector The vault connector used to perform signing operations.\n\t * @param keyName The name of the key in the vault to use for signing.\n\t * @param publicKey The public key bytes corresponding to the vault key.\n\t */\n\tconstructor(vaultConnector: IVaultConnector, keyName: string, publicKey: Uint8Array) {\n\t\tsuper();\n\t\tthis._vaultConnector = vaultConnector;\n\t\tthis._keyName = keyName;\n\t\tthis._publicKey = new Ed25519PublicKey(publicKey);\n\t}\n\n\t/**\n\t * Get the key scheme.\n\t * @returns The signature scheme.\n\t */\n\tpublic getKeyScheme(): SignatureScheme {\n\t\treturn \"ED25519\";\n\t}\n\n\t/**\n\t * Get the public key.\n\t * @returns The Ed25519 public key.\n\t */\n\tpublic getPublicKey(): Ed25519PublicKey {\n\t\treturn this._publicKey;\n\t}\n\n\t/**\n\t * Sign the provided bytes via the vault connector.\n\t * @param bytes The bytes to sign.\n\t * @returns The raw Ed25519 signature bytes.\n\t */\n\tpublic async sign(bytes: Uint8Array): Promise<Uint8Array> {\n\t\treturn this._vaultConnector.sign(this._keyName, bytes);\n\t}\n}\n"]}
@@ -0,0 +1,74 @@
1
+ // Copyright 2026 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { Signer, toSerializedSignature } from "@iota/iota-sdk/cryptography";
4
+ import { Ed25519PublicKey } from "@iota/iota-sdk/keypairs/ed25519";
5
+ /**
6
+ * A transaction signer that delegates all signing operations to the vault connector,
7
+ * ensuring the private key is never exposed to application code.
8
+ */
9
+ export class VaultTransactionSigner {
10
+ /**
11
+ * The vault connector used to perform signing.
12
+ * @internal
13
+ */
14
+ _vaultConnector;
15
+ /**
16
+ * The vault key name to use when signing.
17
+ * @internal
18
+ */
19
+ _keyName;
20
+ /**
21
+ * The public key for this signer.
22
+ * @internal
23
+ */
24
+ _publicKey;
25
+ /**
26
+ * Create a new VaultTransactionSigner.
27
+ * @param vaultConnector The vault connector used to perform signing operations.
28
+ * @param keyName The name of the key in the vault to use for signing.
29
+ * @param publicKey The public key bytes corresponding to the vault key.
30
+ */
31
+ constructor(vaultConnector, keyName, publicKey) {
32
+ this._vaultConnector = vaultConnector;
33
+ this._keyName = keyName;
34
+ this._publicKey = new Ed25519PublicKey(publicKey);
35
+ }
36
+ /**
37
+ * Sign the BCS-encoded transaction data.
38
+ * Applies the TransactionData intent, hashes the result, signs via the vault,
39
+ * and returns a serialized IOTA signature string.
40
+ * @param txDataBcs The raw transaction bytes to sign.
41
+ * @returns The serialized signature string.
42
+ */
43
+ async sign(txDataBcs) {
44
+ const digest = Signer.signingDigest(txDataBcs, "TransactionData");
45
+ const rawSignature = await this._vaultConnector.sign(this._keyName, digest);
46
+ return toSerializedSignature({
47
+ signature: rawSignature,
48
+ signatureScheme: "ED25519",
49
+ publicKey: this._publicKey
50
+ });
51
+ }
52
+ /**
53
+ * Get the public key for this signer.
54
+ * @returns The Ed25519 public key.
55
+ */
56
+ async publicKey() {
57
+ return this._publicKey;
58
+ }
59
+ /**
60
+ * Get the IOTA-formatted public key bytes (scheme flag byte followed by the raw key bytes).
61
+ * @returns The IOTA public key bytes.
62
+ */
63
+ async iotaPublicKeyBytes() {
64
+ return this._publicKey.toIotaBytes();
65
+ }
66
+ /**
67
+ * Get the vault key name used by this signer.
68
+ * @returns The key name.
69
+ */
70
+ keyId() {
71
+ return this._keyName;
72
+ }
73
+ }
74
+ //# sourceMappingURL=vaultTransactionSigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vaultTransactionSigner.js","sourceRoot":"","sources":["../../src/vaultTransactionSigner.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAkB,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAInE;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAClC;;;OAGG;IACc,eAAe,CAAkB;IAElD;;;OAGG;IACc,QAAQ,CAAS;IAElC;;;OAGG;IACc,UAAU,CAAmB;IAE9C;;;;;OAKG;IACH,YAAY,cAA+B,EAAE,OAAe,EAAE,SAAqB;QAClF,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,IAAI,CAAC,SAAqB;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5E,OAAO,qBAAqB,CAAC;YAC5B,SAAS,EAAE,YAAY;YACvB,eAAe,EAAE,SAAS;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;SAC1B,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,SAAS;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,kBAAkB;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACI,KAAK;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;CACD","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Signer, toSerializedSignature, type PublicKey } from \"@iota/iota-sdk/cryptography\";\nimport { Ed25519PublicKey } from \"@iota/iota-sdk/keypairs/ed25519\";\nimport type { IVaultConnector } from \"@twin.org/vault-models\";\nimport type { ITransactionSigner } from \"./models/ITransactionSigner.js\";\n\n/**\n * A transaction signer that delegates all signing operations to the vault connector,\n * ensuring the private key is never exposed to application code.\n */\nexport class VaultTransactionSigner implements ITransactionSigner {\n\t/**\n\t * The vault connector used to perform signing.\n\t * @internal\n\t */\n\tprivate readonly _vaultConnector: IVaultConnector;\n\n\t/**\n\t * The vault key name to use when signing.\n\t * @internal\n\t */\n\tprivate readonly _keyName: string;\n\n\t/**\n\t * The public key for this signer.\n\t * @internal\n\t */\n\tprivate readonly _publicKey: Ed25519PublicKey;\n\n\t/**\n\t * Create a new VaultTransactionSigner.\n\t * @param vaultConnector The vault connector used to perform signing operations.\n\t * @param keyName The name of the key in the vault to use for signing.\n\t * @param publicKey The public key bytes corresponding to the vault key.\n\t */\n\tconstructor(vaultConnector: IVaultConnector, keyName: string, publicKey: Uint8Array) {\n\t\tthis._vaultConnector = vaultConnector;\n\t\tthis._keyName = keyName;\n\t\tthis._publicKey = new Ed25519PublicKey(publicKey);\n\t}\n\n\t/**\n\t * Sign the BCS-encoded transaction data.\n\t * Applies the TransactionData intent, hashes the result, signs via the vault,\n\t * and returns a serialized IOTA signature string.\n\t * @param txDataBcs The raw transaction bytes to sign.\n\t * @returns The serialized signature string.\n\t */\n\tpublic async sign(txDataBcs: Uint8Array): Promise<string> {\n\t\tconst digest = Signer.signingDigest(txDataBcs, \"TransactionData\");\n\t\tconst rawSignature = await this._vaultConnector.sign(this._keyName, digest);\n\t\treturn toSerializedSignature({\n\t\t\tsignature: rawSignature,\n\t\t\tsignatureScheme: \"ED25519\",\n\t\t\tpublicKey: this._publicKey\n\t\t});\n\t}\n\n\t/**\n\t * Get the public key for this signer.\n\t * @returns The Ed25519 public key.\n\t */\n\tpublic async publicKey(): Promise<PublicKey> {\n\t\treturn this._publicKey;\n\t}\n\n\t/**\n\t * Get the IOTA-formatted public key bytes (scheme flag byte followed by the raw key bytes).\n\t * @returns The IOTA public key bytes.\n\t */\n\tpublic async iotaPublicKeyBytes(): Promise<Uint8Array> {\n\t\treturn this._publicKey.toIotaBytes();\n\t}\n\n\t/**\n\t * Get the vault key name used by this signer.\n\t * @returns The key name.\n\t */\n\tpublic keyId(): string {\n\t\treturn this._keyName;\n\t}\n}\n"]}
@@ -9,13 +9,17 @@ export * from "./models/IGasStationExecuteResponse.js";
9
9
  export * from "./models/IGasStationReserveGasResponse.js";
10
10
  export * from "./models/IGasStationReserveGasResult.js";
11
11
  export * from "./models/IIotaClient.js";
12
- export * from "./models/IIotaControllerCapInfo.js";
13
- export * from "./models/IIotaTransaction.js";
14
- export * from "./models/IIotaTransactionBlockResponse.js";
15
12
  export * from "./models/IIotaConfig.js";
13
+ export * from "./models/IIotaControllerCapInfo.js";
16
14
  export * from "./models/IIotaDryRun.js";
17
15
  export * from "./models/IIotaResponseOptions.js";
16
+ export * from "./models/IIotaTransaction.js";
17
+ export * from "./models/IIotaTransactionBlockResponse.js";
18
+ export * from "./models/ITransactionSigner.js";
18
19
  export * from "./models/IMigrationStateFields.js";
19
20
  export * from "./models/ISmartContractDeployments.js";
20
21
  export * from "./models/ISmartContractObject.js";
21
22
  export * from "./models/networkTypes.js";
23
+ export * from "./vaultJwtSigner.js";
24
+ export * from "./vaultSigner.js";
25
+ export * from "./vaultTransactionSigner.js";