@taquito/tzip12 11.1.0 → 11.2.0-beta-RC.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/README.md +29 -27
- package/dist/lib/composer.js +5 -4
- package/dist/lib/composer.js.map +1 -1
- package/dist/lib/tzip12-contract-abstraction.js +118 -241
- package/dist/lib/tzip12-contract-abstraction.js.map +1 -1
- package/dist/lib/tzip12-errors.js +12 -15
- package/dist/lib/tzip12-errors.js.map +1 -1
- package/dist/lib/tzip12-extension.js +6 -7
- package/dist/lib/tzip12-extension.js.map +1 -1
- package/dist/lib/version.js +2 -4
- package/dist/lib/version.js.map +1 -1
- package/dist/taquito-tzip12.es6.js +253 -0
- package/dist/taquito-tzip12.es6.js.map +1 -0
- package/dist/taquito-tzip12.umd.js +142 -272
- package/dist/taquito-tzip12.umd.js.map +1 -1
- package/dist/types/composer.d.ts +1 -1
- package/dist/types/tzip12-errors.d.ts +4 -6
- package/package.json +23 -24
- package/dist/taquito-tzip12.es5.js +0 -383
- package/dist/taquito-tzip12.es5.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,43 +1,48 @@
|
|
|
1
|
-
# Taquito
|
|
1
|
+
# Taquito TZIP-012 package
|
|
2
|
+
*Documentation can be found [here](https://tezostaquito.io/docs/tzip12)*
|
|
3
|
+
*TypeDoc style documentation is available on-line [here](https://tezostaquito.io/typedoc/modules/_taquito_tzip12.html)*
|
|
2
4
|
|
|
3
|
-
`@taquito/tzip12` is an npm package that provides developers with
|
|
4
|
-
## How to use the tzip12 package
|
|
5
|
+
`@taquito/tzip12` is an npm package that provides developers with TZIP-12 functionality for Taquito. The package allows retrieving metadata associated with tokens of FA2 contracts.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
## General Information
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
There are two scenarios to obtain the metadata of a token:
|
|
10
|
+
1. The metadata can be obtained from executing an off-chain view named `token_metadata` present in the contract metadata
|
|
11
|
+
2. or from a big map named `token_metadata` in the contract storage.
|
|
12
|
+
|
|
13
|
+
The `getTokenMetadata` method of the `Tzip12ContractAbstraction` class will find the token metadata with precedence for the off-chain view, if there is one, as specified in the standard. Please refer to the following link for complete documentation on [TZIP-012#Token Metadata](https://gitlab.com/tezos/tzip/-/blob/master/proposals/tzip-12/tzip-12.md#token-metadata).
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
The package can be used to extend the well-known Taquito contract abstraction. The `@taquito/tzip12` and the `@taquito/taquito` packages need to be installed as follows:
|
|
18
|
+
```
|
|
19
|
+
npm i --save @taquito/tzip12
|
|
20
|
+
npm i --save @taquito/taquito
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
**Create an instance of the `Tzip12Module` and add it as an extension to the `TezosToolkit`**
|
|
9
26
|
|
|
10
|
-
The constructor of the `Tzip12Module` takes an optional `MetadataProvider` as a parameter. When none is passed, the default `MetadataProvider` of Taquito is instantiated, and the default handlers (`HttpHandler,` `IpfsHandler,` and `TezosStorageHandler`) are used.
|
|
27
|
+
The constructor of the `Tzip12Module` takes an optional `MetadataProvider` as a parameter. When none is passed, the default `MetadataProvider` of Taquito is instantiated, and the default handlers (`HttpHandler,` `IpfsHandler,` and `TezosStorageHandler`) are used. The `MetadataProvider` can be customized by the user if needed.
|
|
28
|
+
|
|
29
|
+
**Use the `tzip12` function to extend a contract abstraction**
|
|
11
30
|
|
|
12
31
|
```ts
|
|
13
32
|
import { TezosToolkit } from '@taquito/taquito';
|
|
14
33
|
import { Tzip12Module } from '@taquito/tzip12';
|
|
34
|
+
import { tzip12 } from '@taquito/tzip12';
|
|
15
35
|
|
|
16
36
|
const Tezos = new TezosToolkit('https://YOUR_PREFERRED_RPC_URL');
|
|
17
37
|
Tezos.addExtension(new Tzip12Module());
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
2. **Use the `tzip12` function to extend a contract abstraction**
|
|
21
|
-
|
|
22
|
-
```js
|
|
23
|
-
import { tzip12 } from '@taquito/tzip12';
|
|
24
38
|
|
|
25
39
|
const contract = await Tezos.contract.at("contractAddress", tzip12)
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
3. **Get the token metadata**
|
|
29
40
|
|
|
30
|
-
|
|
41
|
+
// get the token metadata
|
|
31
42
|
await contract.tzip12().getTokenMetadata(1);
|
|
32
43
|
```
|
|
33
44
|
|
|
34
|
-
|
|
35
|
-
1. They can be obtained from executing an off-chain view named `token_metadata` present in the contract metadata
|
|
36
|
-
2. or from a big map named `token_metadata` in the contract storage.
|
|
37
|
-
|
|
38
|
-
The `getTokenMetadata` method of the `Tzip12ContractAbstraction` class will find the token metadata with precedence for the off-chain view, if there is one, as specified in the standard.
|
|
39
|
-
|
|
40
|
-
The `getTokenMetadata` method returns an object matching this interface :
|
|
45
|
+
The `getTokenMetadata` method takes a number as a parameter that represents the token_id and returns an object matching this interface:
|
|
41
46
|
```
|
|
42
47
|
interface TokenMetadata {
|
|
43
48
|
token_id: number,
|
|
@@ -47,13 +52,10 @@ interface TokenMetadata {
|
|
|
47
52
|
}
|
|
48
53
|
```
|
|
49
54
|
|
|
55
|
+
## Additional info
|
|
50
56
|
|
|
51
57
|
See the top-level [https://github.com/ecadlabs/taquito](https://github.com/ecadlabs/taquito) file for details on reporting issues, contributing and versioning.
|
|
52
58
|
|
|
53
|
-
## API Documentation
|
|
54
|
-
|
|
55
|
-
TypeDoc style documentation is available on-line [here](https://tezostaquito.io/typedoc/modules/_taquito_tzip12.html)
|
|
56
|
-
|
|
57
59
|
## Disclaimer
|
|
58
60
|
|
|
59
61
|
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/dist/lib/composer.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.tzip12 = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const tzip12_contract_abstraction_1 = require("./tzip12-contract-abstraction");
|
|
5
|
+
const ABSTRACTION_KEY = Symbol('Tzip12ContractAbstractionObjectKey');
|
|
6
6
|
function tzip12(abs, context) {
|
|
7
7
|
return Object.assign(abs, {
|
|
8
8
|
// namespace tzip12
|
|
9
|
-
tzip12
|
|
9
|
+
tzip12() {
|
|
10
10
|
if (!this[ABSTRACTION_KEY]) {
|
|
11
11
|
this[ABSTRACTION_KEY] = new tzip12_contract_abstraction_1.Tzip12ContractAbstraction(this, context);
|
|
12
12
|
}
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
13
14
|
return this[ABSTRACTION_KEY];
|
|
14
|
-
}
|
|
15
|
+
},
|
|
15
16
|
});
|
|
16
17
|
}
|
|
17
18
|
exports.tzip12 = tzip12;
|
package/dist/lib/composer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.js","sourceRoot":"","sources":["../../src/composer.ts"],"names":[],"mappings":";;;AACA
|
|
1
|
+
{"version":3,"file":"composer.js","sourceRoot":"","sources":["../../src/composer.ts"],"names":[],"mappings":";;;AACA,+EAA0E;AAG1E,MAAM,eAAe,GAAG,MAAM,CAAC,oCAAoC,CAAC,CAAC;AAErE,SAAgB,MAAM,CACpB,GAAM,EACN,OAAgB;IAEhB,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACxB,mBAAmB;QACnB,MAAM;YAKJ,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;gBAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,uDAAyB,CAAC,IAAI,EAAE,OAA0B,CAAC,CAAC;aACzF;YAED,oEAAoE;YACpE,OAAO,IAAI,CAAC,eAAe,CAAE,CAAC;QAChC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAnBD,wBAmBC"}
|
|
@@ -8,62 +8,27 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
var __values = (this && this.__values) || function(o) {
|
|
39
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
40
|
-
if (m) return m.call(o);
|
|
41
|
-
if (o && typeof o.length === "number") return {
|
|
42
|
-
next: function () {
|
|
43
|
-
if (o && i >= o.length) o = void 0;
|
|
44
|
-
return { value: o && o[i++], done: !o };
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
48
|
-
};
|
|
49
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
12
|
exports.Tzip12ContractAbstraction = void 0;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
13
|
+
const michelson_encoder_1 = require("@taquito/michelson-encoder");
|
|
14
|
+
const tzip16_1 = require("@taquito/tzip16");
|
|
15
|
+
const tzip12_errors_1 = require("./tzip12-errors");
|
|
16
|
+
const tokenMetadataBigMapType = {
|
|
55
17
|
prim: 'big_map',
|
|
56
18
|
args: [
|
|
57
19
|
{ prim: 'nat' },
|
|
58
|
-
{
|
|
20
|
+
{
|
|
21
|
+
prim: 'pair',
|
|
22
|
+
args: [
|
|
59
23
|
{ prim: 'nat', annots: ['%token_id'] },
|
|
60
|
-
{ prim:
|
|
61
|
-
]
|
|
24
|
+
{ prim: 'map', args: [{ prim: 'string' }, { prim: 'bytes' }], annots: ['%token_info'] },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
62
27
|
],
|
|
63
|
-
annots: ['%token_metadata']
|
|
28
|
+
annots: ['%token_metadata'],
|
|
64
29
|
};
|
|
65
|
-
|
|
66
|
-
|
|
30
|
+
class Tzip12ContractAbstraction {
|
|
31
|
+
constructor(contractAbstraction, context) {
|
|
67
32
|
this.contractAbstraction = contractAbstraction;
|
|
68
33
|
this.context = context;
|
|
69
34
|
this._tzip16ContractAbstraction = new tzip16_1.Tzip16ContractAbstraction(this.contractAbstraction, this.context);
|
|
@@ -73,51 +38,35 @@ var Tzip12ContractAbstraction = /** @class */ (function () {
|
|
|
73
38
|
* @returns An object containing the metadata, the uri, an optional integrity check result and an optional sha256 hash
|
|
74
39
|
* or `Undefined` if the contract has no metadata (non-compliant with Tzip-016)
|
|
75
40
|
*/
|
|
76
|
-
|
|
77
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
contractMetadata = _a.sent();
|
|
86
|
-
return [2 /*return*/, contractMetadata.metadata];
|
|
87
|
-
case 2:
|
|
88
|
-
err_1 = _a.sent();
|
|
89
|
-
return [3 /*break*/, 3];
|
|
90
|
-
case 3: return [2 /*return*/];
|
|
91
|
-
}
|
|
92
|
-
});
|
|
41
|
+
getContractMetadata() {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
try {
|
|
44
|
+
const contractMetadata = yield this._tzip16ContractAbstraction.getMetadata();
|
|
45
|
+
return contractMetadata.metadata;
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
// The contract is not compliant with Tzip-016. There is no contract metadata.
|
|
49
|
+
}
|
|
93
50
|
});
|
|
94
|
-
}
|
|
51
|
+
}
|
|
95
52
|
/**
|
|
96
53
|
* @description The Tzip-016 "interfaces" field MUST be present in the contract metadata. It should contain "TZIP-012[version-info]"
|
|
97
54
|
* @returns True if "interfaces" field is present and contains "TZIP-012", false otherwise
|
|
98
55
|
*/
|
|
99
|
-
|
|
56
|
+
isTzip12Compliant() {
|
|
100
57
|
var _a;
|
|
101
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
tzip12Interface = (_a = metadata.interfaces) === null || _a === void 0 ? void 0 : _a.filter(function (x) {
|
|
112
|
-
return x.substring(0, 8) === "TZIP-012";
|
|
113
|
-
});
|
|
114
|
-
isCompliant = (tzip12Interface && tzip12Interface.length !== 0) ? true : false;
|
|
115
|
-
}
|
|
116
|
-
return [2 /*return*/, isCompliant];
|
|
117
|
-
}
|
|
118
|
-
});
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
let isCompliant = false;
|
|
60
|
+
const metadata = yield this.getContractMetadata();
|
|
61
|
+
if (metadata) {
|
|
62
|
+
const tzip12Interface = (_a = metadata.interfaces) === null || _a === void 0 ? void 0 : _a.filter((x) => {
|
|
63
|
+
return x.substring(0, 8) === 'TZIP-012';
|
|
64
|
+
});
|
|
65
|
+
isCompliant = tzip12Interface && tzip12Interface.length !== 0 ? true : false;
|
|
66
|
+
}
|
|
67
|
+
return isCompliant;
|
|
119
68
|
});
|
|
120
|
-
}
|
|
69
|
+
}
|
|
121
70
|
/**
|
|
122
71
|
* @description Fetches the token metadata for a specified token ID.
|
|
123
72
|
* The function first tries to find a `token_metadata` view in the contract metadata and to execute it with the token ID.
|
|
@@ -125,187 +74,115 @@ var Tzip12ContractAbstraction = /** @class */ (function () {
|
|
|
125
74
|
* @param tokenId The ID of the token for which we want to retrieve token metadata
|
|
126
75
|
* @returns An object of type `TokenMetadata`
|
|
127
76
|
*/
|
|
128
|
-
|
|
129
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
130
|
-
|
|
131
|
-
return
|
|
132
|
-
switch (_a.label) {
|
|
133
|
-
case 0: return [4 /*yield*/, this.retrieveTokenMetadataFromView(tokenId)];
|
|
134
|
-
case 1:
|
|
135
|
-
tokenMetadata = _a.sent();
|
|
136
|
-
return [2 /*return*/, (!tokenMetadata) ? this.retrieveTokenMetadataFromBigMap(tokenId) : tokenMetadata];
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
};
|
|
141
|
-
Tzip12ContractAbstraction.prototype.retrieveTokenMetadataFromView = function (tokenId) {
|
|
142
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
143
|
-
var views;
|
|
144
|
-
return __generator(this, function (_a) {
|
|
145
|
-
switch (_a.label) {
|
|
146
|
-
case 0: return [4 /*yield*/, this.getContractMetadata()];
|
|
147
|
-
case 1:
|
|
148
|
-
if (!_a.sent()) return [3 /*break*/, 3];
|
|
149
|
-
return [4 /*yield*/, this._tzip16ContractAbstraction.metadataViews()];
|
|
150
|
-
case 2:
|
|
151
|
-
views = _a.sent();
|
|
152
|
-
if (views && this.hasTokenMetadataView(views)) {
|
|
153
|
-
return [2 /*return*/, this.executeTokenMetadataView(views['token_metadata'](), tokenId)];
|
|
154
|
-
}
|
|
155
|
-
_a.label = 3;
|
|
156
|
-
case 3: return [2 /*return*/];
|
|
157
|
-
}
|
|
158
|
-
});
|
|
77
|
+
getTokenMetadata(tokenId) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
const tokenMetadata = yield this.retrieveTokenMetadataFromView(tokenId);
|
|
80
|
+
return !tokenMetadata ? this.retrieveTokenMetadataFromBigMap(tokenId) : tokenMetadata;
|
|
159
81
|
});
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
return true;
|
|
82
|
+
}
|
|
83
|
+
retrieveTokenMetadataFromView(tokenId) {
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
if (yield this.getContractMetadata()) {
|
|
86
|
+
const views = yield this._tzip16ContractAbstraction.metadataViews();
|
|
87
|
+
if (views && this.hasTokenMetadataView(views)) {
|
|
88
|
+
return this.executeTokenMetadataView(views['token_metadata'](), tokenId);
|
|
168
89
|
}
|
|
169
90
|
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
hasTokenMetadataView(views) {
|
|
94
|
+
for (const view of Object.keys(views)) {
|
|
95
|
+
if (view === 'token_metadata') {
|
|
96
|
+
return true;
|
|
175
97
|
}
|
|
176
|
-
finally { if (e_1) throw e_1.error; }
|
|
177
98
|
}
|
|
178
99
|
return false;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
tokenMetadata = _a.sent();
|
|
190
|
-
return [3 /*break*/, 3];
|
|
191
|
-
case 2:
|
|
192
|
-
err_2 = _a.sent();
|
|
193
|
-
throw new tzip12_errors_1.TokenIdNotFound(tokenId);
|
|
194
|
-
case 3:
|
|
195
|
-
tokenMap = Object.values(tokenMetadata)[1];
|
|
196
|
-
if (!michelson_encoder_1.MichelsonMap.isMichelsonMap(tokenMap)) {
|
|
197
|
-
throw new tzip12_errors_1.TokenMetadataNotFound(this.contractAbstraction.address);
|
|
198
|
-
}
|
|
199
|
-
return [4 /*yield*/, this.fetchTokenMetadataFromUri(tokenMap)];
|
|
200
|
-
case 4:
|
|
201
|
-
metadataFromUri = _a.sent();
|
|
202
|
-
return [2 /*return*/, this.formatMetadataToken(tokenId, tokenMap, metadataFromUri)];
|
|
203
|
-
}
|
|
204
|
-
});
|
|
100
|
+
}
|
|
101
|
+
executeTokenMetadataView(tokenMetadataView, tokenId) {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
const tokenMetadata = yield tokenMetadataView.executeView(tokenId);
|
|
104
|
+
const tokenMap = Object.values(tokenMetadata)[1];
|
|
105
|
+
if (!michelson_encoder_1.MichelsonMap.isMichelsonMap(tokenMap)) {
|
|
106
|
+
throw new tzip12_errors_1.TokenMetadataNotFound(this.contractAbstraction.address);
|
|
107
|
+
}
|
|
108
|
+
const metadataFromUri = yield this.fetchTokenMetadataFromUri(tokenMap);
|
|
109
|
+
return this.formatMetadataToken(tokenId, tokenMap, metadataFromUri);
|
|
205
110
|
});
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
if (!uri) return [3 /*break*/, 4];
|
|
215
|
-
_a.label = 1;
|
|
216
|
-
case 1:
|
|
217
|
-
_a.trys.push([1, 3, , 4]);
|
|
218
|
-
return [4 /*yield*/, this.context.metadataProvider.provideMetadata(this.contractAbstraction, tzip16_1.bytes2Char(uri), this.context)];
|
|
219
|
-
case 2:
|
|
220
|
-
metadataFromUri = _a.sent();
|
|
221
|
-
return [2 /*return*/, metadataFromUri.metadata];
|
|
222
|
-
case 3:
|
|
223
|
-
e_2 = _a.sent();
|
|
224
|
-
if (e_2.name === 'InvalidUri') {
|
|
225
|
-
console.warn("The URI " + tzip16_1.bytes2Char(uri) + " is present in the token metadata, but is invalid.");
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
throw e_2;
|
|
229
|
-
}
|
|
230
|
-
return [3 /*break*/, 4];
|
|
231
|
-
case 4: return [2 /*return*/];
|
|
111
|
+
}
|
|
112
|
+
fetchTokenMetadataFromUri(tokenMetadata) {
|
|
113
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
const uri = tokenMetadata.get('');
|
|
115
|
+
if (uri) {
|
|
116
|
+
try {
|
|
117
|
+
const metadataFromUri = yield this.context.metadataProvider.provideMetadata(this.contractAbstraction, tzip16_1.bytes2Char(uri), this.context);
|
|
118
|
+
return metadataFromUri.metadata;
|
|
232
119
|
}
|
|
233
|
-
|
|
120
|
+
catch (e) {
|
|
121
|
+
if (e.name === 'InvalidUri') {
|
|
122
|
+
console.warn(`The URI ${tzip16_1.bytes2Char(uri)} is present in the token metadata, but is invalid.`);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw e;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
234
129
|
});
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
'token_id': tokenId
|
|
130
|
+
}
|
|
131
|
+
formatMetadataToken(tokenId, metadataTokenMap, metadataFromUri) {
|
|
132
|
+
const tokenMetadataDecoded = {
|
|
133
|
+
token_id: tokenId,
|
|
240
134
|
};
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
else if (!(keyTokenMetadata === '')) {
|
|
248
|
-
Object.assign(tokenMetadataDecoded, (_c = {}, _c[keyTokenMetadata] = tzip16_1.bytes2Char(metadataTokenMap.get(keyTokenMetadata)), _c));
|
|
249
|
-
}
|
|
135
|
+
for (const keyTokenMetadata of metadataTokenMap.keys()) {
|
|
136
|
+
if (keyTokenMetadata === 'decimals') {
|
|
137
|
+
Object.assign(tokenMetadataDecoded, {
|
|
138
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
139
|
+
[keyTokenMetadata]: Number(tzip16_1.bytes2Char(metadataTokenMap.get(keyTokenMetadata))),
|
|
140
|
+
});
|
|
250
141
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
142
|
+
else if (!(keyTokenMetadata === '')) {
|
|
143
|
+
Object.assign(tokenMetadataDecoded, {
|
|
144
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
145
|
+
[keyTokenMetadata]: tzip16_1.bytes2Char(metadataTokenMap.get(keyTokenMetadata)),
|
|
146
|
+
});
|
|
256
147
|
}
|
|
257
|
-
finally { if (e_3) throw e_3.error; }
|
|
258
148
|
}
|
|
259
149
|
// if an URI is present, add the fetched properties to the object
|
|
260
150
|
// if a property is in the URI and the map, prevalence is accorded to value from the URI
|
|
261
151
|
if (metadataFromUri) {
|
|
262
|
-
for (
|
|
263
|
-
Object.assign(tokenMetadataDecoded,
|
|
152
|
+
for (const property in metadataFromUri) {
|
|
153
|
+
Object.assign(tokenMetadataDecoded, { [property]: metadataFromUri[property] });
|
|
264
154
|
}
|
|
265
155
|
}
|
|
266
156
|
if (!('decimals' in tokenMetadataDecoded)) {
|
|
267
157
|
throw new tzip12_errors_1.InvalidTokenMetadata();
|
|
268
158
|
}
|
|
269
159
|
return tokenMetadataDecoded;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
throw new tzip12_errors_1.TokenIdNotFound(tokenId);
|
|
288
|
-
case 4:
|
|
289
|
-
michelsonMap = pairNatMap['token_info'];
|
|
290
|
-
if (!michelson_encoder_1.MichelsonMap.isMichelsonMap(michelsonMap)) {
|
|
291
|
-
throw new tzip12_errors_1.TokenIdNotFound(tokenId);
|
|
292
|
-
}
|
|
293
|
-
return [4 /*yield*/, this.fetchTokenMetadataFromUri(michelsonMap)];
|
|
294
|
-
case 5:
|
|
295
|
-
metadataFromUri = _a.sent();
|
|
296
|
-
return [2 /*return*/, this.formatMetadataToken(tokenId, michelsonMap, metadataFromUri)];
|
|
297
|
-
}
|
|
298
|
-
});
|
|
160
|
+
}
|
|
161
|
+
retrieveTokenMetadataFromBigMap(tokenId) {
|
|
162
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
163
|
+
const bigmapTokenMetadataId = this.findTokenMetadataBigMap();
|
|
164
|
+
let pairNatMap;
|
|
165
|
+
try {
|
|
166
|
+
pairNatMap = yield this.context.contract.getBigMapKeyByID(bigmapTokenMetadataId['int'].toString(), tokenId.toString(), new michelson_encoder_1.Schema(tokenMetadataBigMapType));
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
throw new tzip12_errors_1.TokenIdNotFound(tokenId);
|
|
170
|
+
}
|
|
171
|
+
const michelsonMap = pairNatMap['token_info'];
|
|
172
|
+
if (!michelson_encoder_1.MichelsonMap.isMichelsonMap(michelsonMap)) {
|
|
173
|
+
throw new tzip12_errors_1.TokenIdNotFound(tokenId);
|
|
174
|
+
}
|
|
175
|
+
const metadataFromUri = yield this.fetchTokenMetadataFromUri(michelsonMap);
|
|
176
|
+
return this.formatMetadataToken(tokenId, michelsonMap, metadataFromUri);
|
|
299
177
|
});
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
|
|
178
|
+
}
|
|
179
|
+
findTokenMetadataBigMap() {
|
|
180
|
+
const tokenMetadataBigMapId = this.contractAbstraction.schema.FindFirstInTopLevelPair(this.contractAbstraction.script.storage, tokenMetadataBigMapType);
|
|
303
181
|
if (!tokenMetadataBigMapId) {
|
|
304
182
|
throw new tzip12_errors_1.TokenMetadataNotFound(this.contractAbstraction.address);
|
|
305
183
|
}
|
|
306
184
|
return tokenMetadataBigMapId;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
}());
|
|
185
|
+
}
|
|
186
|
+
}
|
|
310
187
|
exports.Tzip12ContractAbstraction = Tzip12ContractAbstraction;
|
|
311
188
|
//# sourceMappingURL=tzip12-contract-abstraction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tzip12-contract-abstraction.js","sourceRoot":"","sources":["../../src/tzip12-contract-abstraction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tzip12-contract-abstraction.js","sourceRoot":"","sources":["../../src/tzip12-contract-abstraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.InvalidTokenMetadata = exports.TokenIdNotFound = exports.TokenMetadataNotFound = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
class TokenMetadataNotFound extends Error {
|
|
5
|
+
constructor(address) {
|
|
6
|
+
super(`No token metadata was found for the contract: ${address}`);
|
|
6
7
|
this.address = address;
|
|
7
8
|
this.name = 'TokenMetadataNotFound';
|
|
8
|
-
this.message = "No token metadata was found for the contract: " + address;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
}());
|
|
10
|
+
}
|
|
12
11
|
exports.TokenMetadataNotFound = TokenMetadataNotFound;
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
class TokenIdNotFound extends Error {
|
|
13
|
+
constructor(tokenId) {
|
|
14
|
+
super(`Could not find token metadata for the token ID: ${tokenId}`);
|
|
15
15
|
this.tokenId = tokenId;
|
|
16
16
|
this.name = 'TokenIdNotFound';
|
|
17
|
-
this.message = "Could not find token metadata for the token ID: " + tokenId;
|
|
18
17
|
}
|
|
19
|
-
|
|
20
|
-
}());
|
|
18
|
+
}
|
|
21
19
|
exports.TokenIdNotFound = TokenIdNotFound;
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
class InvalidTokenMetadata extends Error {
|
|
21
|
+
constructor() {
|
|
22
|
+
super('Non-compliance with the TZIP-012 standard. The required property `decimals` is missing.');
|
|
24
23
|
this.name = 'InvalidTokenMetadata';
|
|
25
|
-
this.message = 'Non-compliance with the TZIP-012 standard. The required property `decimals` is missing.';
|
|
26
24
|
}
|
|
27
|
-
|
|
28
|
-
}());
|
|
25
|
+
}
|
|
29
26
|
exports.InvalidTokenMetadata = InvalidTokenMetadata;
|
|
30
27
|
//# sourceMappingURL=tzip12-errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tzip12-errors.js","sourceRoot":"","sources":["../../src/tzip12-errors.ts"],"names":[],"mappings":";;;AAAA;
|
|
1
|
+
{"version":3,"file":"tzip12-errors.js","sourceRoot":"","sources":["../../src/tzip12-errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,qBAAsB,SAAQ,KAAK;IAG9C,YAAmB,OAAe;QAChC,KAAK,CAAC,iDAAiD,OAAO,EAAE,CAAC,CAAC;QADjD,YAAO,GAAP,OAAO,CAAQ;QAFlC,SAAI,GAAG,uBAAuB,CAAC;IAI/B,CAAC;CACF;AAND,sDAMC;AAED,MAAa,eAAgB,SAAQ,KAAK;IAGxC,YAAmB,OAAe;QAChC,KAAK,CAAC,mDAAmD,OAAO,EAAE,CAAC,CAAC;QADnD,YAAO,GAAP,OAAO,CAAQ;QAFlC,SAAI,GAAG,iBAAiB,CAAC;IAIzB,CAAC;CACF;AAND,0CAMC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAG7C;QACE,KAAK,CACH,yFAAyF,CAC1F,CAAC;QALJ,SAAI,GAAG,sBAAsB,CAAC;IAM9B,CAAC;CACF;AARD,oDAQC"}
|