@algorandfoundation/asa-metadata-registry-sdk 1.0.0-beta.8 → 1.0.0-beta.9

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 (145) hide show
  1. package/README.md +58 -15
  2. package/dist/cjs/algod.d.ts +14 -11
  3. package/dist/cjs/algod.js +35 -42
  4. package/dist/cjs/algod.js.map +1 -1
  5. package/dist/cjs/bitmasks.js +1 -1
  6. package/dist/cjs/bitmasks.js.map +1 -1
  7. package/dist/cjs/codec.d.ts +35 -11
  8. package/dist/cjs/codec.js +122 -180
  9. package/dist/cjs/codec.js.map +1 -1
  10. package/dist/cjs/constants.d.ts +9 -9
  11. package/dist/cjs/constants.js +26 -18
  12. package/dist/cjs/constants.js.map +1 -1
  13. package/dist/cjs/deployments.d.ts +13 -1
  14. package/dist/cjs/deployments.js +47 -5
  15. package/dist/cjs/deployments.js.map +1 -1
  16. package/dist/cjs/errors.d.ts +7 -1
  17. package/dist/cjs/errors.js +10 -2
  18. package/dist/cjs/errors.js.map +1 -1
  19. package/dist/cjs/generated/AsaMetadataRegistry.d.ts +538 -1102
  20. package/dist/cjs/generated/AsaMetadataRegistry.js +151 -89
  21. package/dist/cjs/generated/AsaMetadataRegistry.js.map +1 -1
  22. package/dist/cjs/generated/index.d.ts +5 -1
  23. package/dist/cjs/generated/index.js +5 -1
  24. package/dist/cjs/generated/index.js.map +1 -1
  25. package/dist/cjs/hashing.d.ts +5 -5
  26. package/dist/cjs/hashing.js +42 -38
  27. package/dist/cjs/hashing.js.map +1 -1
  28. package/dist/cjs/index.d.ts +33 -33
  29. package/dist/cjs/index.js +33 -33
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/internal/avm.d.ts +8 -2
  32. package/dist/cjs/internal/avm.js +41 -16
  33. package/dist/cjs/internal/avm.js.map +1 -1
  34. package/dist/cjs/internal/base64.d.ts +7 -0
  35. package/dist/cjs/internal/base64.js +17 -0
  36. package/dist/cjs/internal/base64.js.map +1 -0
  37. package/dist/cjs/internal/bytes.js +2 -2
  38. package/dist/cjs/internal/bytes.js.map +1 -1
  39. package/dist/cjs/internal/http.d.ts +2 -0
  40. package/dist/cjs/internal/http.js +27 -0
  41. package/dist/cjs/internal/http.js.map +1 -0
  42. package/dist/cjs/internal/json.d.ts +73 -0
  43. package/dist/cjs/internal/json.js +279 -0
  44. package/dist/cjs/internal/json.js.map +1 -0
  45. package/dist/cjs/internal/writer.d.ts +20 -5
  46. package/dist/cjs/internal/writer.js +105 -8
  47. package/dist/cjs/internal/writer.js.map +1 -1
  48. package/dist/cjs/migrate.d.ts +28 -10
  49. package/dist/cjs/migrate.js +86 -37
  50. package/dist/cjs/migrate.js.map +1 -1
  51. package/dist/cjs/models.d.ts +25 -5
  52. package/dist/cjs/models.js +151 -105
  53. package/dist/cjs/models.js.map +1 -1
  54. package/dist/cjs/package.json +3 -0
  55. package/dist/cjs/read/avm.d.ts +24 -9
  56. package/dist/cjs/read/avm.js +85 -67
  57. package/dist/cjs/read/avm.js.map +1 -1
  58. package/dist/cjs/read/box.d.ts +34 -16
  59. package/dist/cjs/read/box.js +136 -71
  60. package/dist/cjs/read/box.js.map +1 -1
  61. package/dist/cjs/read/reader.d.ts +70 -18
  62. package/dist/cjs/read/reader.js +229 -82
  63. package/dist/cjs/read/reader.js.map +1 -1
  64. package/dist/cjs/registry.d.ts +19 -5
  65. package/dist/cjs/registry.js +67 -24
  66. package/dist/cjs/registry.js.map +1 -1
  67. package/dist/cjs/validation.d.ts +18 -4
  68. package/dist/cjs/validation.js +90 -52
  69. package/dist/cjs/validation.js.map +1 -1
  70. package/dist/cjs/write/writer.d.ts +40 -13
  71. package/dist/cjs/write/writer.js +276 -168
  72. package/dist/cjs/write/writer.js.map +1 -1
  73. package/dist/esm/algod.d.ts +14 -11
  74. package/dist/esm/algod.js +22 -29
  75. package/dist/esm/algod.js.map +1 -1
  76. package/dist/esm/bitmasks.js +1 -1
  77. package/dist/esm/bitmasks.js.map +1 -1
  78. package/dist/esm/codec.d.ts +35 -11
  79. package/dist/esm/codec.js +117 -175
  80. package/dist/esm/codec.js.map +1 -1
  81. package/dist/esm/constants.d.ts +9 -9
  82. package/dist/esm/constants.js +24 -16
  83. package/dist/esm/constants.js.map +1 -1
  84. package/dist/esm/deployments.d.ts +13 -1
  85. package/dist/esm/deployments.js +41 -2
  86. package/dist/esm/deployments.js.map +1 -1
  87. package/dist/esm/errors.d.ts +7 -1
  88. package/dist/esm/errors.js +7 -1
  89. package/dist/esm/errors.js.map +1 -1
  90. package/dist/esm/generated/AsaMetadataRegistry.d.ts +538 -1102
  91. package/dist/esm/generated/AsaMetadataRegistry.js +150 -90
  92. package/dist/esm/generated/AsaMetadataRegistry.js.map +1 -1
  93. package/dist/esm/generated/index.d.ts +5 -1
  94. package/dist/esm/generated/index.js +5 -1
  95. package/dist/esm/generated/index.js.map +1 -1
  96. package/dist/esm/hashing.d.ts +5 -5
  97. package/dist/esm/hashing.js +33 -29
  98. package/dist/esm/hashing.js.map +1 -1
  99. package/dist/esm/index.d.ts +33 -33
  100. package/dist/esm/index.js +33 -33
  101. package/dist/esm/index.js.map +1 -1
  102. package/dist/esm/internal/avm.d.ts +8 -2
  103. package/dist/esm/internal/avm.js +33 -10
  104. package/dist/esm/internal/avm.js.map +1 -1
  105. package/dist/esm/internal/base64.d.ts +7 -0
  106. package/dist/esm/internal/base64.js +13 -0
  107. package/dist/esm/internal/base64.js.map +1 -0
  108. package/dist/esm/internal/bytes.js +1 -1
  109. package/dist/esm/internal/bytes.js.map +1 -1
  110. package/dist/esm/internal/http.d.ts +2 -0
  111. package/dist/esm/internal/http.js +23 -0
  112. package/dist/esm/internal/http.js.map +1 -0
  113. package/dist/esm/internal/json.d.ts +73 -0
  114. package/dist/esm/internal/json.js +269 -0
  115. package/dist/esm/internal/json.js.map +1 -0
  116. package/dist/esm/internal/writer.d.ts +20 -5
  117. package/dist/esm/internal/writer.js +65 -5
  118. package/dist/esm/internal/writer.js.map +1 -1
  119. package/dist/esm/migrate.d.ts +28 -10
  120. package/dist/esm/migrate.js +79 -30
  121. package/dist/esm/migrate.js.map +1 -1
  122. package/dist/esm/models.d.ts +25 -5
  123. package/dist/esm/models.js +80 -35
  124. package/dist/esm/models.js.map +1 -1
  125. package/dist/esm/package.json +3 -0
  126. package/dist/esm/read/avm.d.ts +24 -9
  127. package/dist/esm/read/avm.js +36 -18
  128. package/dist/esm/read/avm.js.map +1 -1
  129. package/dist/esm/read/box.d.ts +34 -16
  130. package/dist/esm/read/box.js +130 -65
  131. package/dist/esm/read/box.js.map +1 -1
  132. package/dist/esm/read/reader.d.ts +70 -18
  133. package/dist/esm/read/reader.js +210 -63
  134. package/dist/esm/read/reader.js.map +1 -1
  135. package/dist/esm/registry.d.ts +19 -5
  136. package/dist/esm/registry.js +60 -17
  137. package/dist/esm/registry.js.map +1 -1
  138. package/dist/esm/validation.d.ts +18 -4
  139. package/dist/esm/validation.js +69 -31
  140. package/dist/esm/validation.js.map +1 -1
  141. package/dist/esm/write/writer.d.ts +40 -13
  142. package/dist/esm/write/writer.js +248 -140
  143. package/dist/esm/write/writer.js.map +1 -1
  144. package/package.json +37 -25
  145. package/src/generated/avm/AsaMetadataRegistry.client.ts +373 -0
package/README.md CHANGED
@@ -1,28 +1,71 @@
1
- # asa-metadata-registry-ts
1
+ # ASA Metadata Registry TypeScript SDK
2
2
 
3
- ASA Metadata Registry TypeScript SDK
3
+ [![npm](https://img.shields.io/npm/v/@algorandfoundation/asa-metadata-registry-sdk)](https://www.npmjs.com/package/@algorandfoundation/asa-metadata-registry-sdk)
4
+ [![Release](https://github.com/algorandfoundation/asa-metadata-registry-ts/actions/workflows/release.yml/badge.svg?branch=main)](https://github.com/algorandfoundation/asa-metadata-registry-ts/actions/workflows/release.yml)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
4
6
 
5
- ## Devs
7
+ TypeScript SDK for the [ARC-89](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0089.md) ASA Metadata
8
+ Registry, the singleton Algorand application that stores ASA metadata on-chain. It is a port of the
9
+ [reference Python SDK](https://github.com/algorandfoundation/arc89) v1.0.0 with full feature parity.
6
10
 
7
- ### Dependencies
11
+ - **Read** metadata straight from the box (one Algod request) or through AVM simulation, so you get exactly what a
12
+ smart contract gets.
13
+ - **Write** metadata: create, replace (in full or one byte range) and delete it, and set flags and immutability.
14
+ Large payloads are split into chunks for you.
15
+ - **Migrate** legacy ARC-3, ARC-19 and ARC-69 ASAs, and build and parse ARC-90 URIs.
16
+ - **Call the registry from contracts** with the Algorand TypeScript client at `/avm`.
8
17
 
9
- Node: 22.17.0 (see `.nvmrc`)
18
+ Built on [AlgoKit Utils](https://github.com/algorandfoundation/algokit-utils-ts) v9 and
19
+ [algosdk](https://github.com/algorand/js-algorand-sdk) v3 (consensus v42 / AVM 13).
20
+
21
+ The registry is deployed on TestNet (app ID `772968354`). MainNet is not deployed yet, so `forNetwork('mainnet')` throws
22
+ until it is.
23
+
24
+ ## Install
25
+
26
+ The package has no runtime dependencies. Install the peer dependencies alongside it:
10
27
 
11
28
  ```sh
12
- git submodule update --init --recursive
13
- pnpm install
14
- pnpm exec husky
29
+ pnpm add @algorandfoundation/asa-metadata-registry-sdk @algorandfoundation/algokit-utils algosdk
15
30
  ```
16
31
 
17
- > `ignore-scripts=true` is set in `.npmrc` to block postinstall scripts from running on install. This means husky won't set up git hooks automatically and should be manually executed after cloning.
32
+ Requires Node.js 22.17 or later.
18
33
 
19
- ### Code Quality
34
+ ## Quick start
20
35
 
21
- ```sh
22
- pnpm run format
23
- pnpm run lint
36
+ Read an ASA's metadata from TestNet:
37
+
38
+ ```ts
39
+ import { AlgorandClient } from '@algorandfoundation/algokit-utils'
40
+ import { AsaMetadataRegistry } from '@algorandfoundation/asa-metadata-registry-sdk'
41
+
42
+ const algod = AlgorandClient.testNet().client.algod
43
+ const registry = AsaMetadataRegistry.forNetwork('testnet', { algod })
44
+
45
+ const record = await registry.read.getAssetMetadata({ assetId: 772968365n })
46
+ console.log(record.json) // { name: 'Cusma #2', description: 'Cusma autograph #2', ... }
24
47
  ```
25
48
 
26
- This project uses **Husky** and **lint-staged** to automatically lint and format staged files before they are committed.
49
+ Writes need an app client signed by the ASA manager. See the cookbook for the full setup.
50
+
51
+ ## Documentation
52
+
53
+ - [Cookbook](./docs/cookbook.md): tested recipes for every main feature, on TestNet and LocalNet.
54
+ - [SDK reference](./.claude/skills/using-asa-metadata-registry/reference.md): every signature, model, flag and error.
55
+ - [Parity contract](./docs/PARITY_CONTRACT.md): how the API maps to the Python SDK.
56
+ - [ARC-89 specification](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0089.md).
57
+
58
+ ### Agent skill
59
+
60
+ [`.claude/skills/using-asa-metadata-registry`](./.claude/skills/using-asa-metadata-registry) is an
61
+ [agent skill](https://code.claude.com/docs/en/skills) that teaches coding agents how to use this SDK. To use it in your
62
+ own project, copy the folder into the project's `.claude/skills/` folder (or into `~/.claude/skills/` for all your
63
+ projects).
64
+
65
+ ## Contributing
66
+
67
+ See [CONTRIBUTING.md](./CONTRIBUTING.md) for the development setup, tests, generated clients and dependency policy.
68
+
69
+ ## License
27
70
 
28
- See [CONTRIBUTING.md](./CONTRIBUTING.md) for dependency policy and lockfile rules.
71
+ [MIT](./LICENSE)
@@ -2,35 +2,36 @@
2
2
  * Algod helpers (ARC-89 box reads).
3
3
  *
4
4
  * Ported from `asa_metadata_registry/algod.py`.
5
- * Uses the minimal Algod subset for box reads and ASA params.
5
+ * Uses the minimal algosdk Algod client subset for box reads, ASA params and network identity.
6
6
  */
7
- import type { AlgodClient, Box, Asset } from '@algorandfoundation/algokit-utils/algod-client';
8
- import { Arc90Uri } from './codec';
9
- import { AssetMetadataBox, AssetMetadataRecord, RegistryParameters } from './models';
10
- export type AlgodClientSubset = Pick<AlgodClient, 'applicationBoxByName' | 'assetById'>;
7
+ import type { Algodv2, modelsv2 } from 'algosdk';
8
+ import { Arc90Uri } from './codec.js';
9
+ import { AssetMetadataBox, AssetMetadataRecord, RegistryParameters } from './models.js';
10
+ /** The algosdk `Algodv2` methods required by {@link AlgodBoxReader}. */
11
+ export type AlgodClientSubset = Pick<Algodv2, 'getApplicationBoxByName' | 'getAssetByID' | 'getTransactionParams'>;
11
12
  /**
12
13
  * Read ARC-89 metadata by directly reading the registry application box via Algod.
13
14
  *
14
15
  * This avoids transactions entirely and is usually the fastest read path.
15
16
  *
16
17
  * Required Algod methods:
17
- * - getApplicationBoxByName
18
- * - getAssetByID (for URI resolution)
18
+ * - `getApplicationBoxByName` (box reads)
19
+ * - `getAssetByID` (ASA existence and params)
20
+ * - `getTransactionParams` (network genesis hash)
19
21
  */
20
22
  export declare class AlgodBoxReader {
21
23
  readonly algod: AlgodClientSubset;
22
24
  constructor(algod: AlgodClientSubset);
23
25
  /**
24
- * Fetch a box by name.
26
+ * Fetch a raw box value.
25
27
  * @throws {BoxNotFoundError} If the box does not exist.
26
28
  */
27
29
  getBoxValue(args: {
28
30
  appId: bigint | number;
29
31
  boxName: Uint8Array;
30
- }): Promise<Box>;
32
+ }): Promise<Uint8Array>;
31
33
  /**
32
34
  * Return the parsed metadata box, or null if the box doesn't exist.
33
- * @throws {BoxNotFoundError} If the box does not exist.
34
35
  */
35
36
  tryGetMetadataBox(args: {
36
37
  appId: bigint | number;
@@ -57,11 +58,13 @@ export declare class AlgodBoxReader {
57
58
  assetId: bigint | number;
58
59
  params?: RegistryParameters;
59
60
  }): Promise<AssetMetadataRecord>;
61
+ /** Genesis hash (base64) of the connected network, or null if unavailable. */
62
+ getGenesisHashB64(): Promise<string | null>;
60
63
  /**
61
64
  * Fetch ASA info from Algod.
62
65
  * @throws {AsaNotFoundError} If the ASA does not exist.
63
66
  */
64
- getAssetInfo(assetId: bigint | number): Promise<Asset>;
67
+ getAssetInfo(assetId: bigint | number): Promise<modelsv2.Asset>;
65
68
  /**
66
69
  * Return the ASA's URL as a string, or null if missing.
67
70
  * @param assetId - The ASA ID whose URL field should be retrieved.
package/dist/cjs/algod.js CHANGED
@@ -3,36 +3,24 @@
3
3
  * Algod helpers (ARC-89 box reads).
4
4
  *
5
5
  * Ported from `asa_metadata_registry/algod.py`.
6
- * Uses the minimal Algod subset for box reads and ASA params.
6
+ * Uses the minimal algosdk Algod client subset for box reads, ASA params and network identity.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.AlgodBoxReader = void 0;
10
- const codec_1 = require("./codec");
11
- const numbers_1 = require("./internal/numbers");
12
- const errors_1 = require("./errors");
13
- const models_1 = require("./models");
14
- const asErrorMessage = (e) => {
15
- if (e instanceof Error)
16
- return e.message;
17
- try {
18
- return String(e);
19
- }
20
- catch {
21
- return '';
22
- }
23
- };
24
- const looksNotFound = (e) => {
25
- const msg = asErrorMessage(e).toLowerCase();
26
- return msg.includes('404') || msg.includes('not found') || msg.includes('does not exist');
27
- };
10
+ const codec_js_1 = require("./codec.js");
11
+ const http_js_1 = require("./internal/http.js");
12
+ const numbers_js_1 = require("./internal/numbers.js");
13
+ const errors_js_1 = require("./errors.js");
14
+ const models_js_1 = require("./models.js");
28
15
  /**
29
16
  * Read ARC-89 metadata by directly reading the registry application box via Algod.
30
17
  *
31
18
  * This avoids transactions entirely and is usually the fastest read path.
32
19
  *
33
20
  * Required Algod methods:
34
- * - getApplicationBoxByName
35
- * - getAssetByID (for URI resolution)
21
+ * - `getApplicationBoxByName` (box reads)
22
+ * - `getAssetByID` (ASA existence and params)
23
+ * - `getTransactionParams` (network genesis hash)
36
24
  */
37
25
  class AlgodBoxReader {
38
26
  algod;
@@ -40,37 +28,36 @@ class AlgodBoxReader {
40
28
  this.algod = algod;
41
29
  }
42
30
  /**
43
- * Fetch a box by name.
31
+ * Fetch a raw box value.
44
32
  * @throws {BoxNotFoundError} If the box does not exist.
45
33
  */
46
34
  async getBoxValue(args) {
47
- const appId = (0, numbers_1.toBigInt)(args.appId);
35
+ const appId = (0, numbers_js_1.toBigInt)(args.appId);
48
36
  try {
49
- return await this.algod.applicationBoxByName(appId, args.boxName);
37
+ const box = await this.algod.getApplicationBoxByName(appId, args.boxName).do();
38
+ return box.value;
50
39
  }
51
40
  catch (e) {
52
- if (looksNotFound(e))
53
- throw new errors_1.BoxNotFoundError('Box not found', { cause: e });
41
+ if ((0, http_js_1.isNotFoundError)(e))
42
+ throw new errors_js_1.BoxNotFoundError('Box not found', { cause: e });
54
43
  throw e;
55
44
  }
56
45
  }
57
46
  /**
58
47
  * Return the parsed metadata box, or null if the box doesn't exist.
59
- * @throws {BoxNotFoundError} If the box does not exist.
60
48
  */
61
49
  async tryGetMetadataBox(args) {
62
50
  let value;
63
51
  try {
64
- const box = await this.getBoxValue({ appId: args.appId, boxName: (0, codec_1.assetIdToBoxName)(args.assetId) });
65
- value = box.value;
52
+ value = await this.getBoxValue({ appId: args.appId, boxName: (0, codec_js_1.assetIdToBoxName)(args.assetId) });
66
53
  }
67
54
  catch (e) {
68
- if (e instanceof errors_1.BoxNotFoundError)
55
+ if (e instanceof errors_js_1.BoxNotFoundError)
69
56
  return null;
70
57
  throw e;
71
58
  }
72
- const p = args.params ?? (0, models_1.getDefaultRegistryParams)();
73
- return models_1.AssetMetadataBox.parse({
59
+ const p = args.params ?? (0, models_js_1.getDefaultRegistryParams)();
60
+ return models_js_1.AssetMetadataBox.parse({
74
61
  assetId: args.assetId,
75
62
  value,
76
63
  headerSize: p.headerSize,
@@ -84,7 +71,7 @@ class AlgodBoxReader {
84
71
  async getMetadataBox(args) {
85
72
  const box = await this.tryGetMetadataBox(args);
86
73
  if (!box)
87
- throw new errors_1.BoxNotFoundError('Metadata box not found');
74
+ throw new errors_js_1.BoxNotFoundError('Metadata box not found');
88
75
  return box;
89
76
  }
90
77
  /**
@@ -95,7 +82,7 @@ class AlgodBoxReader {
95
82
  */
96
83
  async getAssetMetadataRecord(args) {
97
84
  const box = await this.getMetadataBox(args);
98
- return new models_1.AssetMetadataRecord({
85
+ return new models_js_1.AssetMetadataRecord({
99
86
  appId: args.appId,
100
87
  assetId: args.assetId,
101
88
  header: box.header,
@@ -105,18 +92,24 @@ class AlgodBoxReader {
105
92
  // ---------------------------------------------------------------------
106
93
  // ASA lookups (optional)
107
94
  // ---------------------------------------------------------------------
95
+ /** Genesis hash (base64) of the connected network, or null if unavailable. */
96
+ async getGenesisHashB64() {
97
+ const params = await this.algod.getTransactionParams().do();
98
+ const gh = params.genesisHash;
99
+ return gh instanceof Uint8Array && gh.length > 0 ? (0, codec_js_1.b64Encode)(gh) : null;
100
+ }
108
101
  /**
109
102
  * Fetch ASA info from Algod.
110
103
  * @throws {AsaNotFoundError} If the ASA does not exist.
111
104
  */
112
105
  async getAssetInfo(assetId) {
113
- const id = (0, numbers_1.toBigInt)(assetId);
106
+ const id = (0, numbers_js_1.toBigInt)(assetId);
114
107
  try {
115
- return await this.algod.assetById(id);
108
+ return await this.algod.getAssetByID(id).do();
116
109
  }
117
110
  catch (e) {
118
- if (looksNotFound(e))
119
- throw new errors_1.AsaNotFoundError(`ASA ${id} not found`, { cause: e });
111
+ if ((0, http_js_1.isNotFoundError)(e))
112
+ throw new errors_js_1.AsaNotFoundError(`ASA ${id} not found`, { cause: e });
120
113
  throw e;
121
114
  }
122
115
  }
@@ -140,14 +133,14 @@ class AlgodBoxReader {
140
133
  async resolveMetadataUriFromAsset(args) {
141
134
  const url = await this.getAssetUrl(args.assetId);
142
135
  if (!url) {
143
- throw new errors_1.InvalidArc90UriError('ASA has no url field; cannot resolve ARC-89 metadata URI');
136
+ throw new errors_js_1.InvalidArc90UriError('ASA has no url field; cannot resolve ARC-89 metadata URI');
144
137
  }
145
138
  try {
146
- const full = (0, codec_1.completePartialAssetUrl)(url, args.assetId);
147
- return codec_1.Arc90Uri.parse(full);
139
+ const full = (0, codec_js_1.completePartialAssetUrl)(url, args.assetId);
140
+ return codec_js_1.Arc90Uri.parse(full);
148
141
  }
149
142
  catch (e) {
150
- throw new errors_1.InvalidArc90UriError('Failed to resolve ARC-89 URI from ASA url', { cause: e });
143
+ throw new errors_js_1.InvalidArc90UriError('Failed to resolve ARC-89 URI from ASA url', { cause: e });
151
144
  }
152
145
  }
153
146
  }
@@ -1 +1 @@
1
- {"version":3,"file":"algod.js","sourceRoot":"","sources":["../../src/algod.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,mCAA6E;AAC7E,gDAA6C;AAC7C,qCAAmF;AACnF,qCAA8G;AAE9G,MAAM,cAAc,GAAG,CAAC,CAAU,EAAU,EAAE;IAC5C,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,CAAC,CAAC,OAAO,CAAA;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,CAAU,EAAW,EAAE;IAC5C,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAC3C,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;AAC3F,CAAC,CAAA;AAID;;;;;;;;GAQG;AACH,MAAa,cAAc;IACT,KAAK,CAAmB;IAExC,YAAY,KAAwB;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,IAAqD;QACrE,MAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAElC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACnE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,aAAa,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,yBAAgB,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC/E,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,IAIvB;QACC,IAAI,KAAiB,CAAA;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAA,wBAAgB,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAClG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAA;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,yBAAgB;gBAAE,OAAO,IAAI,CAAA;YAC9C,MAAM,CAAC,CAAA;QACT,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAA,iCAAwB,GAAE,CAAA;QACnD,OAAO,yBAAgB,CAAC,KAAK,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK;YACL,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,eAAe,EAAE,CAAC,CAAC,eAAe;SACnC,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,IAIpB;QACC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,yBAAgB,CAAC,wBAAwB,CAAC,CAAA;QAC9D,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,sBAAsB,CAAC,IAI5B;QACC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC3C,OAAO,IAAI,4BAAmB,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAA;IACJ,CAAC;IAED,wEAAwE;IACxE,yBAAyB;IACzB,wEAAwE;IAExE;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,OAAwB;QACzC,MAAM,EAAE,GAAG,IAAA,kBAAQ,EAAC,OAAO,CAAC,CAAA;QAE5B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,aAAa,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,yBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YACrF,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,CAAA;QACrC,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACzC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,2BAA2B,CAAC,IAAkC;QAClE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAChD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,6BAAoB,CAAC,0DAA0D,CAAC,CAAA;QAC5F,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAA,+BAAuB,EAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YACvD,OAAO,gBAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,6BAAoB,CAAC,2CAA2C,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3F,CAAC;IACH,CAAC;CACF;AArID,wCAqIC"}
1
+ {"version":3,"file":"algod.js","sourceRoot":"","sources":["../../src/algod.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.MASK_IRR_IMMUTABLE = exports.MASK_IRR_RESERVED_6 = exports.MASK_IRR_RESERVED_5 = exports.MASK_IRR_RESERVED_4 = exports.MASK_IRR_RESERVED_3 = exports.MASK_IRR_ARC54 = exports.MASK_IRR_ARC89 = exports.MASK_IRR_ARC3 = exports.MASK_REV_RESERVED_7 = exports.MASK_REV_RESERVED_6 = exports.MASK_REV_RESERVED_5 = exports.MASK_REV_RESERVED_4 = exports.MASK_REV_RESERVED_3 = exports.MASK_REV_NTT = exports.MASK_REV_ARC62 = exports.MASK_REV_ARC20 = exports.MASK_ID_SHORT = void 0;
37
- const flags = __importStar(require("./flags"));
37
+ const flags = __importStar(require("./flags.js"));
38
38
  /**
39
39
  * Derived bitmasks for ASA Metadata Registry flags (ported from Python `bitmasks.py`).
40
40
  */
@@ -1 +1 @@
1
- {"version":3,"file":"bitmasks.js","sourceRoot":"","sources":["../../src/bitmasks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAgC;AAEhC;;GAEG;AAEH,kFAAkF;AACrE,QAAA,aAAa,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAA;AAEhD,qDAAqD;AACxC,QAAA,cAAc,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACzC,QAAA,cAAc,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACzC,QAAA,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAA;AACrC,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AAEhE,uDAAuD;AAC1C,QAAA,aAAa,GAAG,CAAC,IAAI,KAAK,CAAC,YAAY,CAAA;AACvC,QAAA,cAAc,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACzC,QAAA,cAAc,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACzC,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,kBAAkB,GAAG,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAA"}
1
+ {"version":3,"file":"bitmasks.js","sourceRoot":"","sources":["../../src/bitmasks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAmC;AAEnC;;GAEG;AAEH,kFAAkF;AACrE,QAAA,aAAa,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAA;AAEhD,qDAAqD;AACxC,QAAA,cAAc,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACzC,QAAA,cAAc,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACzC,QAAA,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAA;AACrC,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AAEhE,uDAAuD;AAC1C,QAAA,aAAa,GAAG,CAAC,IAAI,KAAK,CAAC,YAAY,CAAA;AACvC,QAAA,cAAc,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACzC,QAAA,cAAc,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAA;AACzC,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,mBAAmB,GAAG,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAA;AACnD,QAAA,kBAAkB,GAAG,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAA"}
@@ -11,19 +11,19 @@ export declare const boxNameToAssetId: (boxName: Uint8Array) => bigint;
11
11
  export declare const b64Encode: (data: Uint8Array) => string;
12
12
  /** Standard base64 decode (accepts padding). */
13
13
  export declare const b64Decode: (dataB64: string) => Uint8Array;
14
- /** URL-safe base64, per ARC-90 examples (padding preserved to match Python SDK). */
14
+ /** Canonical unpadded URL-safe base64. */
15
15
  export declare const b64UrlEncode: (data: Uint8Array) => string;
16
- /** URL-safe base64 decode. */
16
+ /**
17
+ * Decode canonical unpadded URL-safe base64.
18
+ *
19
+ * @throws {Error} If the input has padding, characters outside the URL-safe alphabet, or is not
20
+ * the canonical encoding of the decoded bytes (e.g. non-zero trailing bits).
21
+ */
17
22
  export declare const b64UrlDecode: (dataB64Url: string) => Uint8Array;
18
23
  /**
19
- * Represents the ARC-90 compliance fragment '#arc<A>+<B>+...'.
20
- *
21
- * Per ARC-90:
22
- * - Format: #arc<A>+<B>+<C> where A, B, C are decimal numbers
23
- * - First entry has 'arc' prefix, subsequent entries are bare numbers
24
- * - No leading zeros allowed
25
- * - Special case: ARC-3 must be sole entry (#arc3)
26
- * - Order is not enforced (clients MUST accept any order)
24
+ * The ARC-90 compliance fragment '#arc<A>+<B>+...': unpadded decimal ARC numbers in
25
+ * strictly ascending order, 'arc' literal on the first entry only, ARC-3 sole entry.
26
+ * Non-compliant fragments parse as empty (ignored), as ARC-90 requires.
27
27
  */
28
28
  export declare class Arc90Compliance {
29
29
  readonly arcs: readonly number[];
@@ -36,8 +36,12 @@ export declare class Arc90Compliance {
36
36
  *
37
37
  * ARC-89 uses URIs of the form:
38
38
  * algorand://<netauth>/app/<app_id>?box=<base64url_box_name>#arc<A>+<B>...
39
+ *
40
+ * The URI can be *partial* (Asset URL field), where the `box` query parameter exists
41
+ * but has an empty value; the SDK can complete it given an Asset ID.
39
42
  */
40
43
  export declare class Arc90Uri {
44
+ /** Network authority; examples: "net:testnet", "gh:<base64url>", null (mainnet / unspecified). */
41
45
  readonly netauth: string | null;
42
46
  readonly appId: bigint;
43
47
  readonly boxName: Uint8Array | null;
@@ -51,13 +55,33 @@ export declare class Arc90Uri {
51
55
  get assetId(): bigint | null;
52
56
  get isPartial(): boolean;
53
57
  withAssetId(assetId: bigint | number): Arc90Uri;
54
- /** Render the URI using ARC-89 conventions (base64url for box query parameter). */
58
+ /** Render the URI (canonical unpadded base64url box value). */
55
59
  toUri(): string;
56
60
  /** The Algod `/box?name=` query parameter expects standard base64 (with padding). */
57
61
  toAlgodBoxNameB64(): string;
62
+ /**
63
+ * Parse an ARC-89 Asset Metadata URI, with the exact shape the registry enforces:
64
+ *
65
+ * algorand://[<netauth>/]app/<app_id>?box=<base64url>[#arc<A>+<B>...]
66
+ *
67
+ * where <netauth> is `net:<label>` or `gh:<base64url>` (absent on MainNet), <app_id>
68
+ * is an unpadded decimal, `box` is the only query parameter and its value is empty
69
+ * (partial URI) or the canonical unpadded base64url of the 8-byte Asset ID.
70
+ */
58
71
  static parse(uri: string): Arc90Uri;
59
72
  }
60
73
  /**
61
74
  * Complete an ARC-89 partial Asset URL (Asset Params `url`) into a full Asset Metadata URI.
75
+ *
76
+ * The partial URL is expected to include the registry app reference and `box=` query key, but
77
+ * not the box value itself.
78
+ *
79
+ * Example (partial):
80
+ * algorand://net:testnet/app/772968354?box=#arc89
81
+ *
82
+ * Output (complete):
83
+ * algorand://net:testnet/app/772968354?box=<base64url(asset_id_bytes)>#arc89
84
+ *
85
+ * @throws {InvalidArc90UriError} If the Asset URL is not an ARC-89 partial URI (non-empty box value).
62
86
  */
63
87
  export declare const completePartialAssetUrl: (assetUrl: string, assetId: bigint | number) => string;