@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.
- package/README.md +58 -15
- package/dist/cjs/algod.d.ts +14 -11
- package/dist/cjs/algod.js +35 -42
- package/dist/cjs/algod.js.map +1 -1
- package/dist/cjs/bitmasks.js +1 -1
- package/dist/cjs/bitmasks.js.map +1 -1
- package/dist/cjs/codec.d.ts +35 -11
- package/dist/cjs/codec.js +122 -180
- package/dist/cjs/codec.js.map +1 -1
- package/dist/cjs/constants.d.ts +9 -9
- package/dist/cjs/constants.js +26 -18
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/deployments.d.ts +13 -1
- package/dist/cjs/deployments.js +47 -5
- package/dist/cjs/deployments.js.map +1 -1
- package/dist/cjs/errors.d.ts +7 -1
- package/dist/cjs/errors.js +10 -2
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/generated/AsaMetadataRegistry.d.ts +538 -1102
- package/dist/cjs/generated/AsaMetadataRegistry.js +151 -89
- package/dist/cjs/generated/AsaMetadataRegistry.js.map +1 -1
- package/dist/cjs/generated/index.d.ts +5 -1
- package/dist/cjs/generated/index.js +5 -1
- package/dist/cjs/generated/index.js.map +1 -1
- package/dist/cjs/hashing.d.ts +5 -5
- package/dist/cjs/hashing.js +42 -38
- package/dist/cjs/hashing.js.map +1 -1
- package/dist/cjs/index.d.ts +33 -33
- package/dist/cjs/index.js +33 -33
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/avm.d.ts +8 -2
- package/dist/cjs/internal/avm.js +41 -16
- package/dist/cjs/internal/avm.js.map +1 -1
- package/dist/cjs/internal/base64.d.ts +7 -0
- package/dist/cjs/internal/base64.js +17 -0
- package/dist/cjs/internal/base64.js.map +1 -0
- package/dist/cjs/internal/bytes.js +2 -2
- package/dist/cjs/internal/bytes.js.map +1 -1
- package/dist/cjs/internal/http.d.ts +2 -0
- package/dist/cjs/internal/http.js +27 -0
- package/dist/cjs/internal/http.js.map +1 -0
- package/dist/cjs/internal/json.d.ts +73 -0
- package/dist/cjs/internal/json.js +279 -0
- package/dist/cjs/internal/json.js.map +1 -0
- package/dist/cjs/internal/writer.d.ts +20 -5
- package/dist/cjs/internal/writer.js +105 -8
- package/dist/cjs/internal/writer.js.map +1 -1
- package/dist/cjs/migrate.d.ts +28 -10
- package/dist/cjs/migrate.js +86 -37
- package/dist/cjs/migrate.js.map +1 -1
- package/dist/cjs/models.d.ts +25 -5
- package/dist/cjs/models.js +151 -105
- package/dist/cjs/models.js.map +1 -1
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/read/avm.d.ts +24 -9
- package/dist/cjs/read/avm.js +85 -67
- package/dist/cjs/read/avm.js.map +1 -1
- package/dist/cjs/read/box.d.ts +34 -16
- package/dist/cjs/read/box.js +136 -71
- package/dist/cjs/read/box.js.map +1 -1
- package/dist/cjs/read/reader.d.ts +70 -18
- package/dist/cjs/read/reader.js +229 -82
- package/dist/cjs/read/reader.js.map +1 -1
- package/dist/cjs/registry.d.ts +19 -5
- package/dist/cjs/registry.js +67 -24
- package/dist/cjs/registry.js.map +1 -1
- package/dist/cjs/validation.d.ts +18 -4
- package/dist/cjs/validation.js +90 -52
- package/dist/cjs/validation.js.map +1 -1
- package/dist/cjs/write/writer.d.ts +40 -13
- package/dist/cjs/write/writer.js +276 -168
- package/dist/cjs/write/writer.js.map +1 -1
- package/dist/esm/algod.d.ts +14 -11
- package/dist/esm/algod.js +22 -29
- package/dist/esm/algod.js.map +1 -1
- package/dist/esm/bitmasks.js +1 -1
- package/dist/esm/bitmasks.js.map +1 -1
- package/dist/esm/codec.d.ts +35 -11
- package/dist/esm/codec.js +117 -175
- package/dist/esm/codec.js.map +1 -1
- package/dist/esm/constants.d.ts +9 -9
- package/dist/esm/constants.js +24 -16
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/deployments.d.ts +13 -1
- package/dist/esm/deployments.js +41 -2
- package/dist/esm/deployments.js.map +1 -1
- package/dist/esm/errors.d.ts +7 -1
- package/dist/esm/errors.js +7 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/generated/AsaMetadataRegistry.d.ts +538 -1102
- package/dist/esm/generated/AsaMetadataRegistry.js +150 -90
- package/dist/esm/generated/AsaMetadataRegistry.js.map +1 -1
- package/dist/esm/generated/index.d.ts +5 -1
- package/dist/esm/generated/index.js +5 -1
- package/dist/esm/generated/index.js.map +1 -1
- package/dist/esm/hashing.d.ts +5 -5
- package/dist/esm/hashing.js +33 -29
- package/dist/esm/hashing.js.map +1 -1
- package/dist/esm/index.d.ts +33 -33
- package/dist/esm/index.js +33 -33
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/avm.d.ts +8 -2
- package/dist/esm/internal/avm.js +33 -10
- package/dist/esm/internal/avm.js.map +1 -1
- package/dist/esm/internal/base64.d.ts +7 -0
- package/dist/esm/internal/base64.js +13 -0
- package/dist/esm/internal/base64.js.map +1 -0
- package/dist/esm/internal/bytes.js +1 -1
- package/dist/esm/internal/bytes.js.map +1 -1
- package/dist/esm/internal/http.d.ts +2 -0
- package/dist/esm/internal/http.js +23 -0
- package/dist/esm/internal/http.js.map +1 -0
- package/dist/esm/internal/json.d.ts +73 -0
- package/dist/esm/internal/json.js +269 -0
- package/dist/esm/internal/json.js.map +1 -0
- package/dist/esm/internal/writer.d.ts +20 -5
- package/dist/esm/internal/writer.js +65 -5
- package/dist/esm/internal/writer.js.map +1 -1
- package/dist/esm/migrate.d.ts +28 -10
- package/dist/esm/migrate.js +79 -30
- package/dist/esm/migrate.js.map +1 -1
- package/dist/esm/models.d.ts +25 -5
- package/dist/esm/models.js +80 -35
- package/dist/esm/models.js.map +1 -1
- package/dist/esm/package.json +3 -0
- package/dist/esm/read/avm.d.ts +24 -9
- package/dist/esm/read/avm.js +36 -18
- package/dist/esm/read/avm.js.map +1 -1
- package/dist/esm/read/box.d.ts +34 -16
- package/dist/esm/read/box.js +130 -65
- package/dist/esm/read/box.js.map +1 -1
- package/dist/esm/read/reader.d.ts +70 -18
- package/dist/esm/read/reader.js +210 -63
- package/dist/esm/read/reader.js.map +1 -1
- package/dist/esm/registry.d.ts +19 -5
- package/dist/esm/registry.js +60 -17
- package/dist/esm/registry.js.map +1 -1
- package/dist/esm/validation.d.ts +18 -4
- package/dist/esm/validation.js +69 -31
- package/dist/esm/validation.js.map +1 -1
- package/dist/esm/write/writer.d.ts +40 -13
- package/dist/esm/write/writer.js +248 -140
- package/dist/esm/write/writer.js.map +1 -1
- package/package.json +37 -25
- package/src/generated/avm/AsaMetadataRegistry.client.ts +373 -0
package/README.md
CHANGED
|
@@ -1,28 +1,71 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ASA Metadata Registry TypeScript SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@algorandfoundation/asa-metadata-registry-sdk)
|
|
4
|
+
[](https://github.com/algorandfoundation/asa-metadata-registry-ts/actions/workflows/release.yml)
|
|
5
|
+
[](./LICENSE)
|
|
4
6
|
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
13
|
-
pnpm install
|
|
14
|
-
pnpm exec husky
|
|
29
|
+
pnpm add @algorandfoundation/asa-metadata-registry-sdk @algorandfoundation/algokit-utils algosdk
|
|
15
30
|
```
|
|
16
31
|
|
|
17
|
-
|
|
32
|
+
Requires Node.js 22.17 or later.
|
|
18
33
|
|
|
19
|
-
|
|
34
|
+
## Quick start
|
|
20
35
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
71
|
+
[MIT](./LICENSE)
|
package/dist/cjs/algod.d.ts
CHANGED
|
@@ -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
|
|
5
|
+
* Uses the minimal algosdk Algod client subset for box reads, ASA params and network identity.
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
8
|
-
import { Arc90Uri } from './codec';
|
|
9
|
-
import { AssetMetadataBox, AssetMetadataRecord, RegistryParameters } from './models';
|
|
10
|
-
|
|
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 (
|
|
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
|
|
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<
|
|
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
|
|
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
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
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 (
|
|
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
|
|
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,
|
|
35
|
+
const appId = (0, numbers_js_1.toBigInt)(args.appId);
|
|
48
36
|
try {
|
|
49
|
-
|
|
37
|
+
const box = await this.algod.getApplicationBoxByName(appId, args.boxName).do();
|
|
38
|
+
return box.value;
|
|
50
39
|
}
|
|
51
40
|
catch (e) {
|
|
52
|
-
if (
|
|
53
|
-
throw new
|
|
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
|
-
|
|
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
|
|
55
|
+
if (e instanceof errors_js_1.BoxNotFoundError)
|
|
69
56
|
return null;
|
|
70
57
|
throw e;
|
|
71
58
|
}
|
|
72
|
-
const p = args.params ?? (0,
|
|
73
|
-
return
|
|
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
|
|
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
|
|
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,
|
|
106
|
+
const id = (0, numbers_js_1.toBigInt)(assetId);
|
|
114
107
|
try {
|
|
115
|
-
return await this.algod.
|
|
108
|
+
return await this.algod.getAssetByID(id).do();
|
|
116
109
|
}
|
|
117
110
|
catch (e) {
|
|
118
|
-
if (
|
|
119
|
-
throw new
|
|
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
|
|
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,
|
|
147
|
-
return
|
|
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
|
|
143
|
+
throw new errors_js_1.InvalidArc90UriError('Failed to resolve ARC-89 URI from ASA url', { cause: e });
|
|
151
144
|
}
|
|
152
145
|
}
|
|
153
146
|
}
|
package/dist/cjs/algod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algod.js","sourceRoot":"","sources":["../../src/algod.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,
|
|
1
|
+
{"version":3,"file":"algod.js","sourceRoot":"","sources":["../../src/algod.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/bitmasks.js
CHANGED
|
@@ -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
|
*/
|
package/dist/cjs/bitmasks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitmasks.js","sourceRoot":"","sources":["../../src/bitmasks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA
|
|
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"}
|
package/dist/cjs/codec.d.ts
CHANGED
|
@@ -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
|
|
14
|
+
/** Canonical unpadded URL-safe base64. */
|
|
15
15
|
export declare const b64UrlEncode: (data: Uint8Array) => string;
|
|
16
|
-
/**
|
|
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
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
|
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;
|