@mrcointreautests/asa-metadata-registry-sdk 0.1.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.
- package/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/cjs/algod.d.ts +81 -0
- package/dist/cjs/algod.js +154 -0
- package/dist/cjs/algod.js.map +1 -0
- package/dist/cjs/bitmasks.d.ts +20 -0
- package/dist/cjs/bitmasks.js +61 -0
- package/dist/cjs/bitmasks.js.map +1 -0
- package/dist/cjs/codec.d.ts +63 -0
- package/dist/cjs/codec.js +353 -0
- package/dist/cjs/codec.js.map +1 -0
- package/dist/cjs/constants.d.ts +80 -0
- package/dist/cjs/constants.js +142 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/deployments.d.ts +24 -0
- package/dist/cjs/deployments.js +47 -0
- package/dist/cjs/deployments.js.map +1 -0
- package/dist/cjs/enums.d.ts +11 -0
- package/dist/cjs/enums.js +18 -0
- package/dist/cjs/enums.js.map +1 -0
- package/dist/cjs/errors.d.ts +73 -0
- package/dist/cjs/errors.js +94 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/flags.d.ts +25 -0
- package/dist/cjs/flags.js +35 -0
- package/dist/cjs/flags.js.map +1 -0
- package/dist/cjs/generated/AsaMetadataRegistry.d.ts +3995 -0
- package/dist/cjs/generated/AsaMetadataRegistry.js +2426 -0
- package/dist/cjs/generated/AsaMetadataRegistry.js.map +1 -0
- package/dist/cjs/generated/index.d.ts +7 -0
- package/dist/cjs/generated/index.js +24 -0
- package/dist/cjs/generated/index.js.map +1 -0
- package/dist/cjs/hashing.d.ts +47 -0
- package/dist/cjs/hashing.js +196 -0
- package/dist/cjs/hashing.js.map +1 -0
- package/dist/cjs/index.d.ts +38 -0
- package/dist/cjs/index.js +90 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/internal/avm.d.ts +8 -0
- package/dist/cjs/internal/avm.js +56 -0
- package/dist/cjs/internal/avm.js.map +1 -0
- package/dist/cjs/internal/bytes.d.ts +9 -0
- package/dist/cjs/internal/bytes.js +69 -0
- package/dist/cjs/internal/bytes.js.map +1 -0
- package/dist/cjs/internal/models.d.ts +25 -0
- package/dist/cjs/internal/models.js +50 -0
- package/dist/cjs/internal/models.js.map +1 -0
- package/dist/cjs/internal/numbers.d.ts +57 -0
- package/dist/cjs/internal/numbers.js +167 -0
- package/dist/cjs/internal/numbers.js.map +1 -0
- package/dist/cjs/internal/writer.d.ts +23 -0
- package/dist/cjs/internal/writer.js +61 -0
- package/dist/cjs/internal/writer.js.map +1 -0
- package/dist/cjs/migrate.d.ts +57 -0
- package/dist/cjs/migrate.js +147 -0
- package/dist/cjs/migrate.js.map +1 -0
- package/dist/cjs/models.d.ts +356 -0
- package/dist/cjs/models.js +866 -0
- package/dist/cjs/models.js.map +1 -0
- package/dist/cjs/read/avm.d.ts +120 -0
- package/dist/cjs/read/avm.js +203 -0
- package/dist/cjs/read/avm.js.map +1 -0
- package/dist/cjs/read/box.d.ts +95 -0
- package/dist/cjs/read/box.js +226 -0
- package/dist/cjs/read/box.js.map +1 -0
- package/dist/cjs/read/reader.d.ts +173 -0
- package/dist/cjs/read/reader.js +400 -0
- package/dist/cjs/read/reader.js.map +1 -0
- package/dist/cjs/registry.d.ts +76 -0
- package/dist/cjs/registry.js +131 -0
- package/dist/cjs/registry.js.map +1 -0
- package/dist/cjs/validation.d.ts +72 -0
- package/dist/cjs/validation.js +227 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/cjs/write/writer.d.ts +153 -0
- package/dist/cjs/write/writer.js +518 -0
- package/dist/cjs/write/writer.js.map +1 -0
- package/dist/esm/algod.d.ts +81 -0
- package/dist/esm/algod.js +150 -0
- package/dist/esm/algod.js.map +1 -0
- package/dist/esm/bitmasks.d.ts +20 -0
- package/dist/esm/bitmasks.js +25 -0
- package/dist/esm/bitmasks.js.map +1 -0
- package/dist/esm/codec.d.ts +63 -0
- package/dist/esm/codec.js +308 -0
- package/dist/esm/codec.js.map +1 -0
- package/dist/esm/constants.d.ts +80 -0
- package/dist/esm/constants.js +138 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/deployments.d.ts +24 -0
- package/dist/esm/deployments.js +43 -0
- package/dist/esm/deployments.js.map +1 -0
- package/dist/esm/enums.d.ts +11 -0
- package/dist/esm/enums.js +15 -0
- package/dist/esm/enums.js.map +1 -0
- package/dist/esm/errors.d.ts +73 -0
- package/dist/esm/errors.js +76 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/flags.d.ts +25 -0
- package/dist/esm/flags.js +32 -0
- package/dist/esm/flags.js.map +1 -0
- package/dist/esm/generated/AsaMetadataRegistry.d.ts +3995 -0
- package/dist/esm/generated/AsaMetadataRegistry.js +2413 -0
- package/dist/esm/generated/AsaMetadataRegistry.js.map +1 -0
- package/dist/esm/generated/index.d.ts +7 -0
- package/dist/esm/generated/index.js +8 -0
- package/dist/esm/generated/index.js.map +1 -0
- package/dist/esm/hashing.d.ts +47 -0
- package/dist/esm/hashing.js +153 -0
- package/dist/esm/hashing.js.map +1 -0
- package/dist/esm/index.d.ts +38 -0
- package/dist/esm/index.js +51 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/avm.d.ts +8 -0
- package/dist/esm/internal/avm.js +49 -0
- package/dist/esm/internal/avm.js.map +1 -0
- package/dist/esm/internal/bytes.d.ts +9 -0
- package/dist/esm/internal/bytes.js +62 -0
- package/dist/esm/internal/bytes.js.map +1 -0
- package/dist/esm/internal/models.d.ts +25 -0
- package/dist/esm/internal/models.js +43 -0
- package/dist/esm/internal/models.js.map +1 -0
- package/dist/esm/internal/numbers.d.ts +57 -0
- package/dist/esm/internal/numbers.js +155 -0
- package/dist/esm/internal/numbers.js.map +1 -0
- package/dist/esm/internal/writer.d.ts +23 -0
- package/dist/esm/internal/writer.js +53 -0
- package/dist/esm/internal/writer.js.map +1 -0
- package/dist/esm/migrate.d.ts +57 -0
- package/dist/esm/migrate.js +141 -0
- package/dist/esm/migrate.js.map +1 -0
- package/dist/esm/models.d.ts +356 -0
- package/dist/esm/models.js +816 -0
- package/dist/esm/models.js.map +1 -0
- package/dist/esm/read/avm.d.ts +120 -0
- package/dist/esm/read/avm.js +199 -0
- package/dist/esm/read/avm.js.map +1 -0
- package/dist/esm/read/box.d.ts +95 -0
- package/dist/esm/read/box.js +189 -0
- package/dist/esm/read/box.js.map +1 -0
- package/dist/esm/read/reader.d.ts +173 -0
- package/dist/esm/read/reader.js +396 -0
- package/dist/esm/read/reader.js.map +1 -0
- package/dist/esm/registry.d.ts +76 -0
- package/dist/esm/registry.js +126 -0
- package/dist/esm/registry.js.map +1 -0
- package/dist/esm/validation.d.ts +72 -0
- package/dist/esm/validation.js +215 -0
- package/dist/esm/validation.js.map +1 -0
- package/dist/esm/write/writer.d.ts +153 -0
- package/dist/esm/write/writer.js +481 -0
- package/dist/esm/write/writer.js.map +1 -0
- package/package.json +139 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 mrcointreau
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# asa-metadata-registry-ts
|
|
2
|
+
|
|
3
|
+
ASA Metadata Registry TypeScript SDK
|
|
4
|
+
|
|
5
|
+
## Devs
|
|
6
|
+
|
|
7
|
+
### Dependencies
|
|
8
|
+
|
|
9
|
+
Node: 22.17.0 (see `.nvmrc`)
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
git submodule update --init --recursive
|
|
13
|
+
pnpm install
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### Code Quality
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
pnpm run format
|
|
20
|
+
pnpm run lint
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
This project uses **Husky** and **lint-staged** to automatically lint and format staged files before they are committed.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Algod helpers (ARC-89 box reads).
|
|
3
|
+
*
|
|
4
|
+
* Ported from `asa_metadata_registry/algod.py`.
|
|
5
|
+
* Uses the minimal Algod subset for box reads and ASA params.
|
|
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'>;
|
|
11
|
+
/**
|
|
12
|
+
* Read ARC-89 metadata by directly reading the registry application box via Algod.
|
|
13
|
+
*
|
|
14
|
+
* This avoids transactions entirely and is usually the fastest read path.
|
|
15
|
+
*
|
|
16
|
+
* Required Algod methods:
|
|
17
|
+
* - getApplicationBoxByName
|
|
18
|
+
* - getAssetByID (for URI resolution)
|
|
19
|
+
*/
|
|
20
|
+
export declare class AlgodBoxReader {
|
|
21
|
+
readonly algod: AlgodClientSubset;
|
|
22
|
+
constructor(algod: AlgodClientSubset);
|
|
23
|
+
/**
|
|
24
|
+
* Fetch a box by name.
|
|
25
|
+
* @throws {BoxNotFoundError} If the box does not exist.
|
|
26
|
+
*/
|
|
27
|
+
getBoxValue(args: {
|
|
28
|
+
appId: bigint | number;
|
|
29
|
+
boxName: Uint8Array;
|
|
30
|
+
}): Promise<Box>;
|
|
31
|
+
/**
|
|
32
|
+
* Return the parsed metadata box, or null if the box doesn't exist.
|
|
33
|
+
* @throws {BoxNotFoundError} If the box does not exist.
|
|
34
|
+
*/
|
|
35
|
+
tryGetMetadataBox(args: {
|
|
36
|
+
appId: bigint | number;
|
|
37
|
+
assetId: bigint | number;
|
|
38
|
+
params?: RegistryParameters;
|
|
39
|
+
}): Promise<AssetMetadataBox | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Return the parsed metadata box, or throw if missing.
|
|
42
|
+
* @throws {BoxNotFoundError} If the box does not exist.
|
|
43
|
+
*/
|
|
44
|
+
getMetadataBox(args: {
|
|
45
|
+
appId: bigint | number;
|
|
46
|
+
assetId: bigint | number;
|
|
47
|
+
params?: RegistryParameters;
|
|
48
|
+
}): Promise<AssetMetadataBox>;
|
|
49
|
+
/**
|
|
50
|
+
* Retrieve the ARC-89 asset metadata box and return it as an AssetMetadataRecord.
|
|
51
|
+
* @param args - { appId, assetId, params }.
|
|
52
|
+
* @returns An AssetMetadataRecord containing the parsed header and body of the asset's metadata box.
|
|
53
|
+
* @throws {BoxNotFoundError} If the box does not exist.
|
|
54
|
+
*/
|
|
55
|
+
getAssetMetadataRecord(args: {
|
|
56
|
+
appId: bigint | number;
|
|
57
|
+
assetId: bigint | number;
|
|
58
|
+
params?: RegistryParameters;
|
|
59
|
+
}): Promise<AssetMetadataRecord>;
|
|
60
|
+
/**
|
|
61
|
+
* Fetch ASA info from Algod.
|
|
62
|
+
* @throws {AsaNotFoundError} If the ASA does not exist.
|
|
63
|
+
*/
|
|
64
|
+
getAssetInfo(assetId: bigint | number): Promise<Asset>;
|
|
65
|
+
/**
|
|
66
|
+
* Return the ASA's URL as a string, or null if missing.
|
|
67
|
+
* @param assetId - The ASA ID whose URL field should be retrieved.
|
|
68
|
+
* @returns The URL string from `info.params.url`, or null if missing.
|
|
69
|
+
* @throws {AsaNotFoundError} If the ASA does not exist.
|
|
70
|
+
*/
|
|
71
|
+
getAssetUrl(assetId: bigint | number): Promise<string | null>;
|
|
72
|
+
/**
|
|
73
|
+
* Resolve an ARC-89 Asset Metadata URI from the ASA's URL.
|
|
74
|
+
* @param args - { assetId }.
|
|
75
|
+
* @returns Parsed ARC-90 URI.
|
|
76
|
+
* @throws {InvalidArc90UriError} If the ASA has no URL or if the URL is not an ARC-89-compatible ARC-90 partial URI.
|
|
77
|
+
*/
|
|
78
|
+
resolveMetadataUriFromAsset(args: {
|
|
79
|
+
assetId: bigint | number;
|
|
80
|
+
}): Promise<Arc90Uri>;
|
|
81
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Algod helpers (ARC-89 box reads).
|
|
4
|
+
*
|
|
5
|
+
* Ported from `asa_metadata_registry/algod.py`.
|
|
6
|
+
* Uses the minimal Algod subset for box reads and ASA params.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
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
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Read ARC-89 metadata by directly reading the registry application box via Algod.
|
|
30
|
+
*
|
|
31
|
+
* This avoids transactions entirely and is usually the fastest read path.
|
|
32
|
+
*
|
|
33
|
+
* Required Algod methods:
|
|
34
|
+
* - getApplicationBoxByName
|
|
35
|
+
* - getAssetByID (for URI resolution)
|
|
36
|
+
*/
|
|
37
|
+
class AlgodBoxReader {
|
|
38
|
+
constructor(algod) {
|
|
39
|
+
this.algod = algod;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Fetch a box by name.
|
|
43
|
+
* @throws {BoxNotFoundError} If the box does not exist.
|
|
44
|
+
*/
|
|
45
|
+
async getBoxValue(args) {
|
|
46
|
+
const appId = (0, numbers_1.toBigInt)(args.appId);
|
|
47
|
+
try {
|
|
48
|
+
return await this.algod.applicationBoxByName(appId, args.boxName);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
if (looksNotFound(e))
|
|
52
|
+
throw new errors_1.BoxNotFoundError('Box not found', { cause: e });
|
|
53
|
+
throw e;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Return the parsed metadata box, or null if the box doesn't exist.
|
|
58
|
+
* @throws {BoxNotFoundError} If the box does not exist.
|
|
59
|
+
*/
|
|
60
|
+
async tryGetMetadataBox(args) {
|
|
61
|
+
let value;
|
|
62
|
+
try {
|
|
63
|
+
const box = await this.getBoxValue({ appId: args.appId, boxName: (0, codec_1.assetIdToBoxName)(args.assetId) });
|
|
64
|
+
value = box.value;
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
if (e instanceof errors_1.BoxNotFoundError)
|
|
68
|
+
return null;
|
|
69
|
+
throw e;
|
|
70
|
+
}
|
|
71
|
+
const p = args.params ?? (0, models_1.getDefaultRegistryParams)();
|
|
72
|
+
return models_1.AssetMetadataBox.parse({
|
|
73
|
+
assetId: args.assetId,
|
|
74
|
+
value,
|
|
75
|
+
headerSize: p.headerSize,
|
|
76
|
+
maxMetadataSize: p.maxMetadataSize,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Return the parsed metadata box, or throw if missing.
|
|
81
|
+
* @throws {BoxNotFoundError} If the box does not exist.
|
|
82
|
+
*/
|
|
83
|
+
async getMetadataBox(args) {
|
|
84
|
+
const box = await this.tryGetMetadataBox(args);
|
|
85
|
+
if (!box)
|
|
86
|
+
throw new errors_1.BoxNotFoundError('Metadata box not found');
|
|
87
|
+
return box;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Retrieve the ARC-89 asset metadata box and return it as an AssetMetadataRecord.
|
|
91
|
+
* @param args - { appId, assetId, params }.
|
|
92
|
+
* @returns An AssetMetadataRecord containing the parsed header and body of the asset's metadata box.
|
|
93
|
+
* @throws {BoxNotFoundError} If the box does not exist.
|
|
94
|
+
*/
|
|
95
|
+
async getAssetMetadataRecord(args) {
|
|
96
|
+
const box = await this.getMetadataBox(args);
|
|
97
|
+
return new models_1.AssetMetadataRecord({
|
|
98
|
+
appId: args.appId,
|
|
99
|
+
assetId: args.assetId,
|
|
100
|
+
header: box.header,
|
|
101
|
+
body: box.body,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// ---------------------------------------------------------------------
|
|
105
|
+
// ASA lookups (optional)
|
|
106
|
+
// ---------------------------------------------------------------------
|
|
107
|
+
/**
|
|
108
|
+
* Fetch ASA info from Algod.
|
|
109
|
+
* @throws {AsaNotFoundError} If the ASA does not exist.
|
|
110
|
+
*/
|
|
111
|
+
async getAssetInfo(assetId) {
|
|
112
|
+
const id = (0, numbers_1.toBigInt)(assetId);
|
|
113
|
+
try {
|
|
114
|
+
return await this.algod.assetById(id);
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
if (looksNotFound(e))
|
|
118
|
+
throw new errors_1.AsaNotFoundError(`ASA ${id} not found`, { cause: e });
|
|
119
|
+
throw e;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Return the ASA's URL as a string, or null if missing.
|
|
124
|
+
* @param assetId - The ASA ID whose URL field should be retrieved.
|
|
125
|
+
* @returns The URL string from `info.params.url`, or null if missing.
|
|
126
|
+
* @throws {AsaNotFoundError} If the ASA does not exist.
|
|
127
|
+
*/
|
|
128
|
+
async getAssetUrl(assetId) {
|
|
129
|
+
const info = await this.getAssetInfo(assetId);
|
|
130
|
+
const url = info?.params?.url ?? null;
|
|
131
|
+
return url == null ? null : String(url);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Resolve an ARC-89 Asset Metadata URI from the ASA's URL.
|
|
135
|
+
* @param args - { assetId }.
|
|
136
|
+
* @returns Parsed ARC-90 URI.
|
|
137
|
+
* @throws {InvalidArc90UriError} If the ASA has no URL or if the URL is not an ARC-89-compatible ARC-90 partial URI.
|
|
138
|
+
*/
|
|
139
|
+
async resolveMetadataUriFromAsset(args) {
|
|
140
|
+
const url = await this.getAssetUrl(args.assetId);
|
|
141
|
+
if (!url) {
|
|
142
|
+
throw new errors_1.InvalidArc90UriError('ASA has no url field; cannot resolve ARC-89 metadata URI');
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
const full = (0, codec_1.completePartialAssetUrl)(url, args.assetId);
|
|
146
|
+
return codec_1.Arc90Uri.parse(full);
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
throw new errors_1.InvalidArc90UriError('Failed to resolve ARC-89 URI from ASA url', { cause: e });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.AlgodBoxReader = AlgodBoxReader;
|
|
154
|
+
//# sourceMappingURL=algod.js.map
|
|
@@ -0,0 +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;IAGzB,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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derived bitmasks for ASA Metadata Registry flags (ported from Python `bitmasks.py`).
|
|
3
|
+
*/
|
|
4
|
+
export declare const MASK_ID_SHORT: number;
|
|
5
|
+
export declare const MASK_REV_ARC20: number;
|
|
6
|
+
export declare const MASK_REV_ARC62: number;
|
|
7
|
+
export declare const MASK_REV_NTT: number;
|
|
8
|
+
export declare const MASK_REV_RESERVED_3: number;
|
|
9
|
+
export declare const MASK_REV_RESERVED_4: number;
|
|
10
|
+
export declare const MASK_REV_RESERVED_5: number;
|
|
11
|
+
export declare const MASK_REV_RESERVED_6: number;
|
|
12
|
+
export declare const MASK_REV_RESERVED_7: number;
|
|
13
|
+
export declare const MASK_IRR_ARC3: number;
|
|
14
|
+
export declare const MASK_IRR_ARC89: number;
|
|
15
|
+
export declare const MASK_IRR_ARC54: number;
|
|
16
|
+
export declare const MASK_IRR_RESERVED_3: number;
|
|
17
|
+
export declare const MASK_IRR_RESERVED_4: number;
|
|
18
|
+
export declare const MASK_IRR_RESERVED_5: number;
|
|
19
|
+
export declare const MASK_IRR_RESERVED_6: number;
|
|
20
|
+
export declare const MASK_IRR_IMMUTABLE: number;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
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"));
|
|
38
|
+
/**
|
|
39
|
+
* Derived bitmasks for ASA Metadata Registry flags (ported from Python `bitmasks.py`).
|
|
40
|
+
*/
|
|
41
|
+
// Metadata Identifiers byte (set by the ASA Metadata Registry; clients just read)
|
|
42
|
+
exports.MASK_ID_SHORT = 1 << flags.ID_SHORT;
|
|
43
|
+
// Reversible Flags byte (set by ASA Manager Address)
|
|
44
|
+
exports.MASK_REV_ARC20 = 1 << flags.REV_FLG_ARC20;
|
|
45
|
+
exports.MASK_REV_ARC62 = 1 << flags.REV_FLG_ARC62;
|
|
46
|
+
exports.MASK_REV_NTT = 1 << flags.REV_FLG_NTT;
|
|
47
|
+
exports.MASK_REV_RESERVED_3 = 1 << flags.REV_FLG_RESERVED_3;
|
|
48
|
+
exports.MASK_REV_RESERVED_4 = 1 << flags.REV_FLG_RESERVED_4;
|
|
49
|
+
exports.MASK_REV_RESERVED_5 = 1 << flags.REV_FLG_RESERVED_5;
|
|
50
|
+
exports.MASK_REV_RESERVED_6 = 1 << flags.REV_FLG_RESERVED_6;
|
|
51
|
+
exports.MASK_REV_RESERVED_7 = 1 << flags.REV_FLG_RESERVED_7;
|
|
52
|
+
// Irreversible Flags byte (set by ASA Manager Address)
|
|
53
|
+
exports.MASK_IRR_ARC3 = 1 << flags.IRR_FLG_ARC3;
|
|
54
|
+
exports.MASK_IRR_ARC89 = 1 << flags.IRR_FLG_ARC89;
|
|
55
|
+
exports.MASK_IRR_ARC54 = 1 << flags.IRR_FLG_ARC54;
|
|
56
|
+
exports.MASK_IRR_RESERVED_3 = 1 << flags.IRR_FLG_RESERVED_3;
|
|
57
|
+
exports.MASK_IRR_RESERVED_4 = 1 << flags.IRR_FLG_RESERVED_4;
|
|
58
|
+
exports.MASK_IRR_RESERVED_5 = 1 << flags.IRR_FLG_RESERVED_5;
|
|
59
|
+
exports.MASK_IRR_RESERVED_6 = 1 << flags.IRR_FLG_RESERVED_6;
|
|
60
|
+
exports.MASK_IRR_IMMUTABLE = 1 << flags.IRR_FLG_IMMUTABLE;
|
|
61
|
+
//# sourceMappingURL=bitmasks.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ARC-89 / ARC-90 codec utilities.
|
|
3
|
+
*
|
|
4
|
+
* Ported from Python `asa_metadata_registry/codec.py`.
|
|
5
|
+
*/
|
|
6
|
+
/** Convert an Asset ID (uint64) into the ARC-89 box key bytes (8-byte big-endian). */
|
|
7
|
+
export declare const assetIdToBoxName: (assetId: bigint | number) => Uint8Array;
|
|
8
|
+
/** Convert an ARC-89 box key (8-byte big-endian) into an Asset ID (uint64). */
|
|
9
|
+
export declare const boxNameToAssetId: (boxName: Uint8Array) => bigint;
|
|
10
|
+
/** Standard base64 (with padding). */
|
|
11
|
+
export declare const b64Encode: (data: Uint8Array) => string;
|
|
12
|
+
/** Standard base64 decode (accepts padding). */
|
|
13
|
+
export declare const b64Decode: (dataB64: string) => Uint8Array;
|
|
14
|
+
/** URL-safe base64, per ARC-90 examples (padding preserved to match Python SDK). */
|
|
15
|
+
export declare const b64UrlEncode: (data: Uint8Array) => string;
|
|
16
|
+
/** URL-safe base64 decode. */
|
|
17
|
+
export declare const b64UrlDecode: (dataB64Url: string) => Uint8Array;
|
|
18
|
+
/**
|
|
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)
|
|
27
|
+
*/
|
|
28
|
+
export declare class Arc90Compliance {
|
|
29
|
+
readonly arcs: readonly number[];
|
|
30
|
+
constructor(arcs?: readonly number[]);
|
|
31
|
+
static parse(fragment?: string | null): Arc90Compliance;
|
|
32
|
+
toFragment(): string | null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parsed ARC-90 URI referencing an application box.
|
|
36
|
+
*
|
|
37
|
+
* ARC-89 uses URIs of the form:
|
|
38
|
+
* algorand://<netauth>/app/<app_id>?box=<base64url_box_name>#arc<A>+<B>...
|
|
39
|
+
*/
|
|
40
|
+
export declare class Arc90Uri {
|
|
41
|
+
readonly netauth: string | null;
|
|
42
|
+
readonly appId: bigint;
|
|
43
|
+
readonly boxName: Uint8Array | null;
|
|
44
|
+
readonly compliance: Arc90Compliance;
|
|
45
|
+
constructor(args: {
|
|
46
|
+
netauth: string | null;
|
|
47
|
+
appId: bigint | number;
|
|
48
|
+
boxName: Uint8Array | null;
|
|
49
|
+
compliance?: Arc90Compliance;
|
|
50
|
+
});
|
|
51
|
+
get assetId(): bigint | null;
|
|
52
|
+
get isPartial(): boolean;
|
|
53
|
+
withAssetId(assetId: bigint | number): Arc90Uri;
|
|
54
|
+
/** Render the URI using ARC-89 conventions (base64url for box query parameter). */
|
|
55
|
+
toUri(): string;
|
|
56
|
+
/** The Algod `/box?name=` query parameter expects standard base64 (with padding). */
|
|
57
|
+
toAlgodBoxNameB64(): string;
|
|
58
|
+
static parse(uri: string): Arc90Uri;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Complete an ARC-89 partial Asset URL (Asset Params `url`) into a full Asset Metadata URI.
|
|
62
|
+
*/
|
|
63
|
+
export declare const completePartialAssetUrl: (assetUrl: string, assetId: bigint | number) => string;
|