@trustvc/trustvc 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +217 -0
  2. package/dist/cjs/document-store/contract-interfaces.js +24 -0
  3. package/dist/cjs/document-store/deploy.js +49 -0
  4. package/dist/cjs/document-store/document-store-roles.js +38 -0
  5. package/dist/cjs/document-store/index.js +46 -0
  6. package/dist/cjs/document-store/issue.js +71 -0
  7. package/dist/cjs/document-store/revoke.js +71 -0
  8. package/dist/cjs/document-store/supportInterfaceIds.js +22 -0
  9. package/dist/cjs/document-store/tt-document-store-abi.js +231 -0
  10. package/dist/cjs/index.js +21 -0
  11. package/dist/cjs/open-cert/verify.js +4 -6
  12. package/dist/esm/document-store/contract-interfaces.js +22 -0
  13. package/dist/esm/document-store/deploy.js +47 -0
  14. package/dist/esm/document-store/document-store-roles.js +35 -0
  15. package/dist/esm/document-store/index.js +5 -0
  16. package/dist/esm/document-store/issue.js +69 -0
  17. package/dist/esm/document-store/revoke.js +69 -0
  18. package/dist/esm/document-store/supportInterfaceIds.js +20 -0
  19. package/dist/esm/document-store/tt-document-store-abi.js +229 -0
  20. package/dist/esm/index.js +1 -0
  21. package/dist/esm/open-cert/verify.js +4 -6
  22. package/dist/types/document-store/contract-interfaces.d.ts +14 -0
  23. package/dist/types/document-store/deploy.d.ts +29 -0
  24. package/dist/types/document-store/document-store-roles.d.ts +14 -0
  25. package/dist/types/document-store/index.d.ts +11 -0
  26. package/dist/types/document-store/issue.d.ts +32 -0
  27. package/dist/types/document-store/revoke.d.ts +32 -0
  28. package/dist/types/document-store/supportInterfaceIds.d.ts +16 -0
  29. package/dist/types/document-store/tt-document-store-abi.d.ts +388 -0
  30. package/dist/types/index.d.ts +4 -0
  31. package/dist/types/open-cert/verify.d.ts +6 -6
  32. package/package.json +2 -1
@@ -0,0 +1,231 @@
1
+ 'use strict';
2
+
3
+ const TT_DOCUMENT_STORE_ABI = [
4
+ // TODO: Replace with the actual full ABI
5
+ // Minimal ABI for issue function (0x0f75e81f)
6
+ {
7
+ inputs: [
8
+ { internalType: "string", name: "_name", type: "string" },
9
+ { internalType: "address", name: "owner", type: "address" }
10
+ ],
11
+ stateMutability: "nonpayable",
12
+ type: "constructor"
13
+ },
14
+ {
15
+ anonymous: false,
16
+ inputs: [{ indexed: true, internalType: "bytes32", name: "document", type: "bytes32" }],
17
+ name: "DocumentIssued",
18
+ type: "event"
19
+ },
20
+ {
21
+ anonymous: false,
22
+ inputs: [{ indexed: true, internalType: "bytes32", name: "document", type: "bytes32" }],
23
+ name: "DocumentRevoked",
24
+ type: "event"
25
+ },
26
+ {
27
+ anonymous: false,
28
+ inputs: [
29
+ { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" },
30
+ { indexed: true, internalType: "bytes32", name: "previousAdminRole", type: "bytes32" },
31
+ { indexed: true, internalType: "bytes32", name: "newAdminRole", type: "bytes32" }
32
+ ],
33
+ name: "RoleAdminChanged",
34
+ type: "event"
35
+ },
36
+ {
37
+ anonymous: false,
38
+ inputs: [
39
+ { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" },
40
+ { indexed: true, internalType: "address", name: "account", type: "address" },
41
+ { indexed: true, internalType: "address", name: "sender", type: "address" }
42
+ ],
43
+ name: "RoleGranted",
44
+ type: "event"
45
+ },
46
+ {
47
+ anonymous: false,
48
+ inputs: [
49
+ { indexed: true, internalType: "bytes32", name: "role", type: "bytes32" },
50
+ { indexed: true, internalType: "address", name: "account", type: "address" },
51
+ { indexed: true, internalType: "address", name: "sender", type: "address" }
52
+ ],
53
+ name: "RoleRevoked",
54
+ type: "event"
55
+ },
56
+ {
57
+ inputs: [],
58
+ name: "DEFAULT_ADMIN_ROLE",
59
+ outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }],
60
+ stateMutability: "view",
61
+ type: "function"
62
+ },
63
+ {
64
+ inputs: [],
65
+ name: "ISSUER_ROLE",
66
+ outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }],
67
+ stateMutability: "view",
68
+ type: "function"
69
+ },
70
+ {
71
+ inputs: [],
72
+ name: "REVOKER_ROLE",
73
+ outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }],
74
+ stateMutability: "view",
75
+ type: "function"
76
+ },
77
+ {
78
+ inputs: [{ internalType: "bytes32[]", name: "documents", type: "bytes32[]" }],
79
+ name: "bulkIssue",
80
+ outputs: [],
81
+ stateMutability: "nonpayable",
82
+ type: "function"
83
+ },
84
+ {
85
+ inputs: [{ internalType: "bytes32[]", name: "documents", type: "bytes32[]" }],
86
+ name: "bulkRevoke",
87
+ outputs: [],
88
+ stateMutability: "nonpayable",
89
+ type: "function"
90
+ },
91
+ {
92
+ inputs: [{ internalType: "bytes32", name: "", type: "bytes32" }],
93
+ name: "documentIssued",
94
+ outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
95
+ stateMutability: "view",
96
+ type: "function"
97
+ },
98
+ {
99
+ inputs: [{ internalType: "bytes32", name: "", type: "bytes32" }],
100
+ name: "documentRevoked",
101
+ outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
102
+ stateMutability: "view",
103
+ type: "function"
104
+ },
105
+ {
106
+ inputs: [{ internalType: "bytes32", name: "document", type: "bytes32" }],
107
+ name: "getIssuedBlock",
108
+ outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
109
+ stateMutability: "view",
110
+ type: "function"
111
+ },
112
+ {
113
+ inputs: [{ internalType: "bytes32", name: "role", type: "bytes32" }],
114
+ name: "getRoleAdmin",
115
+ outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }],
116
+ stateMutability: "view",
117
+ type: "function"
118
+ },
119
+ {
120
+ inputs: [
121
+ { internalType: "bytes32", name: "role", type: "bytes32" },
122
+ { internalType: "address", name: "account", type: "address" }
123
+ ],
124
+ name: "grantRole",
125
+ outputs: [],
126
+ stateMutability: "nonpayable",
127
+ type: "function"
128
+ },
129
+ {
130
+ inputs: [
131
+ { internalType: "bytes32", name: "role", type: "bytes32" },
132
+ { internalType: "address", name: "account", type: "address" }
133
+ ],
134
+ name: "hasRole",
135
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
136
+ stateMutability: "view",
137
+ type: "function"
138
+ },
139
+ {
140
+ inputs: [{ internalType: "bytes32", name: "document", type: "bytes32" }],
141
+ name: "isIssued",
142
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
143
+ stateMutability: "view",
144
+ type: "function"
145
+ },
146
+ {
147
+ inputs: [
148
+ { internalType: "bytes32", name: "document", type: "bytes32" },
149
+ { internalType: "uint256", name: "blockNumber", type: "uint256" }
150
+ ],
151
+ name: "isIssuedBefore",
152
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
153
+ stateMutability: "view",
154
+ type: "function"
155
+ },
156
+ {
157
+ inputs: [{ internalType: "bytes32", name: "document", type: "bytes32" }],
158
+ name: "isRevoked",
159
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
160
+ stateMutability: "view",
161
+ type: "function"
162
+ },
163
+ {
164
+ inputs: [
165
+ { internalType: "bytes32", name: "document", type: "bytes32" },
166
+ { internalType: "uint256", name: "blockNumber", type: "uint256" }
167
+ ],
168
+ name: "isRevokedBefore",
169
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
170
+ stateMutability: "view",
171
+ type: "function"
172
+ },
173
+ {
174
+ inputs: [{ internalType: "bytes32", name: "document", type: "bytes32" }],
175
+ name: "issue",
176
+ outputs: [],
177
+ stateMutability: "nonpayable",
178
+ type: "function"
179
+ },
180
+ {
181
+ inputs: [],
182
+ name: "name",
183
+ outputs: [{ internalType: "string", name: "", type: "string" }],
184
+ stateMutability: "view",
185
+ type: "function"
186
+ },
187
+ {
188
+ inputs: [
189
+ { internalType: "bytes32", name: "role", type: "bytes32" },
190
+ { internalType: "address", name: "account", type: "address" }
191
+ ],
192
+ name: "renounceRole",
193
+ outputs: [],
194
+ stateMutability: "nonpayable",
195
+ type: "function"
196
+ },
197
+ {
198
+ inputs: [{ internalType: "bytes32", name: "document", type: "bytes32" }],
199
+ name: "revoke",
200
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
201
+ stateMutability: "nonpayable",
202
+ type: "function"
203
+ },
204
+ {
205
+ inputs: [
206
+ { internalType: "bytes32", name: "role", type: "bytes32" },
207
+ { internalType: "address", name: "account", type: "address" }
208
+ ],
209
+ name: "revokeRole",
210
+ outputs: [],
211
+ stateMutability: "nonpayable",
212
+ type: "function"
213
+ },
214
+ {
215
+ inputs: [{ internalType: "bytes4", name: "interfaceId", type: "bytes4" }],
216
+ name: "supportsInterface",
217
+ outputs: [{ internalType: "bool", name: "", type: "bool" }],
218
+ stateMutability: "view",
219
+ type: "function"
220
+ },
221
+ {
222
+ inputs: [],
223
+ name: "version",
224
+ outputs: [{ internalType: "string", name: "", type: "string" }],
225
+ stateMutability: "view",
226
+ type: "function"
227
+ }
228
+ // Add other functions from the ABI here (name, isIssued, isRevoked, etc.)
229
+ ];
230
+
231
+ exports.TT_DOCUMENT_STORE_ABI = TT_DOCUMENT_STORE_ABI;
package/dist/cjs/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  var tokenRegistryV4 = require('./token-registry-v4');
4
4
  var tokenRegistryV5 = require('./token-registry-v5');
5
+ var documentStore = require('./document-store');
5
6
  var tokenRegistryFunctions = require('./token-registry-functions');
6
7
  var core = require('./core');
7
8
  var openAttestation = require('./open-attestation');
@@ -81,6 +82,26 @@ Object.defineProperty(exports, "v5Utils", {
81
82
  enumerable: true,
82
83
  get: function () { return tokenRegistryV5.v5Utils; }
83
84
  });
85
+ Object.defineProperty(exports, "DocumentStore__factory", {
86
+ enumerable: true,
87
+ get: function () { return documentStore.DocumentStore__factory; }
88
+ });
89
+ Object.defineProperty(exports, "TransferableDocumentStore__factory", {
90
+ enumerable: true,
91
+ get: function () { return documentStore.TransferableDocumentStore__factory; }
92
+ });
93
+ Object.defineProperty(exports, "deployDocumentStore", {
94
+ enumerable: true,
95
+ get: function () { return documentStore.deployDocumentStore; }
96
+ });
97
+ Object.defineProperty(exports, "documentStoreIssue", {
98
+ enumerable: true,
99
+ get: function () { return documentStore.documentStoreIssue; }
100
+ });
101
+ Object.defineProperty(exports, "documentStoreRevoke", {
102
+ enumerable: true,
103
+ get: function () { return documentStore.documentStoreRevoke; }
104
+ });
84
105
  Object.keys(tokenRegistryFunctions).forEach(function (k) {
85
106
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
86
107
  enumerable: true,
@@ -28,7 +28,7 @@ const OpencertsRegistryVerificationValidData = RegistryEntry.And(
28
28
  );
29
29
  const OpencertsRegistryVerificationInvalidData = runtypes.Record({
30
30
  value: runtypes.String,
31
- status: runtypes.Literal("INVALID"),
31
+ status: runtypes.Literal("SKIPPED"),
32
32
  reason: ttVerify.Reason
33
33
  });
34
34
  const OpencertsRegistryVerificationValidDataArray = runtypes.Array(
@@ -56,7 +56,7 @@ const storeToData = /* @__PURE__ */ __name((registry, store) => {
56
56
  }
57
57
  return {
58
58
  value: store,
59
- status: "INVALID",
59
+ status: "SKIPPED",
60
60
  reason: {
61
61
  code: 0 /* INVALID_IDENTITY */,
62
62
  codeString: OpencertsRegistryCode[0 /* INVALID_IDENTITY */],
@@ -121,8 +121,7 @@ const registryVerifier = {
121
121
  return {
122
122
  type,
123
123
  name,
124
- status: "INVALID",
125
- data,
124
+ status: "SKIPPED",
126
125
  reason: data.reason
127
126
  };
128
127
  }
@@ -136,8 +135,7 @@ const registryVerifier = {
136
135
  return {
137
136
  type,
138
137
  name,
139
- status: "INVALID",
140
- data: issuerFragments,
138
+ status: "SKIPPED",
141
139
  reason: invalidIssuer.reason
142
140
  };
143
141
  } else if (OpencertsRegistryVerificationValidDataArray.guard(issuerFragments)) {
@@ -0,0 +1,22 @@
1
+ import { IDocumentStore__factory, ITransferableDocumentStore__factory } from '@trustvc/document-store';
2
+
3
+ const IDocumentStoreInterface = IDocumentStore__factory.createInterface();
4
+ const ITransferableDocumentStoreInterface = ITransferableDocumentStore__factory.createInterface();
5
+ const IDocumentStoreFunctions = Object.values(IDocumentStoreInterface.fragments).filter((f) => f.type === "function").map((f) => f.format("sighash"));
6
+ const ITransferableDocumentStoreFunctions = Object.values(
7
+ ITransferableDocumentStoreInterface.fragments
8
+ ).filter((f) => f.type === "function").map((f) => f.format("sighash"));
9
+ const contractInterfaces = {
10
+ /**
11
+ * IDocumentStore interface functions
12
+ * Functions: isActive, isIssued, isRevoked, name, revoke
13
+ */
14
+ DocumentStore: IDocumentStoreFunctions,
15
+ /**
16
+ * ITransferableDocumentStore interface functions
17
+ * Functions: isActive, isIssued, isRevoked, issue, name, revoke
18
+ */
19
+ TransferableDocumentStore: ITransferableDocumentStoreFunctions
20
+ };
21
+
22
+ export { contractInterfaces };
@@ -0,0 +1,47 @@
1
+ import { TransferableDocumentStore__factory, DocumentStore__factory } from '@trustvc/document-store';
2
+ import { ContractFactory } from 'ethersV6';
3
+ import { ContractFactory as ContractFactory$1 } from 'ethers';
4
+ import { isV6EthersProvider } from '../utils/ethers';
5
+ import { getTxOptions } from '../token-registry-functions/utils';
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ const deployDocumentStore = /* @__PURE__ */ __name(async (storeName, owner, signer, options = {}) => {
10
+ if (!storeName) throw new Error("Store name is required");
11
+ if (!owner) throw new Error("Owner address is required");
12
+ if (!signer.provider) throw new Error("Provider is required");
13
+ const { chainId, maxFeePerGas, maxPriorityFeePerGas } = options;
14
+ const txOptions = await getTxOptions(signer, chainId, maxFeePerGas, maxPriorityFeePerGas);
15
+ const isV6 = isV6EthersProvider(signer.provider);
16
+ const DocumentStoreFactory = options.isTransferable ? TransferableDocumentStore__factory : DocumentStore__factory;
17
+ try {
18
+ if (isV6) {
19
+ const ContractFactory$1 = new ContractFactory(
20
+ DocumentStoreFactory.abi,
21
+ DocumentStoreFactory.bytecode,
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ signer
24
+ );
25
+ const contract = await ContractFactory$1.deploy(storeName, owner, txOptions);
26
+ const receipt = await contract.deploymentTransaction()?.wait();
27
+ return receipt;
28
+ } else {
29
+ const ContractFactory = new ContractFactory$1(
30
+ DocumentStoreFactory.abi,
31
+ DocumentStoreFactory.bytecode,
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ signer
34
+ );
35
+ const contract = await ContractFactory.deploy(storeName, owner, txOptions);
36
+ const receipt = await contract.deployTransaction.wait();
37
+ return receipt;
38
+ }
39
+ } catch (e) {
40
+ console.error("Deployment failed:", e);
41
+ throw new Error(
42
+ `Failed to deploy DocumentStore: ${e instanceof Error ? e.message : String(e)}`
43
+ );
44
+ }
45
+ }, "deployDocumentStore");
46
+
47
+ export { deployDocumentStore };
@@ -0,0 +1,35 @@
1
+ import { utils } from '@tradetrust-tt/tt-verify';
2
+ import { SUPPORTED_CHAINS } from '../utils';
3
+ import { getEthersContractFromProvider } from '../utils/ethers';
4
+ import { TT_DOCUMENT_STORE_ABI } from './tt-document-store-abi';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ const getRoleString = /* @__PURE__ */ __name(async (documentStoreAddress, role, options) => {
9
+ const { chainId } = options || {};
10
+ let provider = options?.provider;
11
+ if (!provider) {
12
+ if (!chainId) throw new Error("Either provider or chainId must be provided");
13
+ provider = utils.getProvider({ network: SUPPORTED_CHAINS[chainId].name });
14
+ }
15
+ const Contract = getEthersContractFromProvider(provider);
16
+ const documentStore = new Contract(
17
+ documentStoreAddress,
18
+ TT_DOCUMENT_STORE_ABI,
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ provider
21
+ );
22
+ switch (role) {
23
+ case "admin":
24
+ return await documentStore.DEFAULT_ADMIN_ROLE();
25
+ case "issuer":
26
+ return await documentStore.ISSUER_ROLE();
27
+ case "revoker":
28
+ return await documentStore.REVOKER_ROLE();
29
+ default:
30
+ throw new Error("Invalid role");
31
+ }
32
+ }, "getRoleString");
33
+ const rolesList = ["admin", "issuer", "revoker"];
34
+
35
+ export { getRoleString, rolesList };
@@ -0,0 +1,5 @@
1
+ export { IssueOptions, documentStoreIssue } from './issue';
2
+ export { RevokeOptions, documentStoreRevoke } from './revoke';
3
+ export { DeployOptions, deployDocumentStore } from './deploy';
4
+ export { supportInterfaceIds } from './supportInterfaceIds';
5
+ export { DocumentStore__factory, TransferableDocumentStore__factory } from '@trustvc/document-store';
@@ -0,0 +1,69 @@
1
+ import { TransferableDocumentStore__factory, DocumentStore__factory } from '@trustvc/document-store';
2
+ import { getEthersContractFromProvider, isV6EthersProvider } from '../utils/ethers';
3
+ import { getTxOptions } from '../token-registry-functions/utils';
4
+ import { checkSupportsInterface } from '../core';
5
+ import { supportInterfaceIds } from './supportInterfaceIds';
6
+ import { TT_DOCUMENT_STORE_ABI } from './tt-document-store-abi';
7
+
8
+ var __defProp = Object.defineProperty;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ const documentStoreIssue = /* @__PURE__ */ __name(async (documentStoreAddress, documentHash, signer, options = {}) => {
11
+ if (!documentStoreAddress) throw new Error("Document store address is required");
12
+ if (!signer.provider) throw new Error("Provider is required");
13
+ if (!documentHash) throw new Error("Document hash is required");
14
+ const { chainId, maxFeePerGas, maxPriorityFeePerGas, isTransferable } = options;
15
+ let isDocumentStore = !isTransferable;
16
+ let isTransferableDocumentStore = isTransferable;
17
+ let isTTDocumentStore = false;
18
+ if (isTransferable === void 0) {
19
+ [isDocumentStore, isTransferableDocumentStore] = await Promise.all([
20
+ checkSupportsInterface(
21
+ documentStoreAddress,
22
+ supportInterfaceIds.IDocumentStore,
23
+ signer.provider
24
+ ),
25
+ checkSupportsInterface(
26
+ documentStoreAddress,
27
+ supportInterfaceIds.ITransferableDocumentStore,
28
+ signer.provider
29
+ )
30
+ ]);
31
+ if (!isDocumentStore && !isTransferableDocumentStore) {
32
+ isTTDocumentStore = true;
33
+ }
34
+ }
35
+ if (!isDocumentStore && !isTransferableDocumentStore && !isTTDocumentStore) {
36
+ throw new Error(
37
+ "Contract does not support DocumentStore, TransferableDocumentStore, or TT Document Store interface"
38
+ );
39
+ }
40
+ const Contract = getEthersContractFromProvider(signer.provider);
41
+ let documentStoreAbi;
42
+ if (isTTDocumentStore) {
43
+ documentStoreAbi = TT_DOCUMENT_STORE_ABI;
44
+ } else {
45
+ const DocumentStoreFactory = isTransferableDocumentStore ? TransferableDocumentStore__factory : DocumentStore__factory;
46
+ documentStoreAbi = DocumentStoreFactory.abi;
47
+ }
48
+ const documentStoreContract = new Contract(
49
+ documentStoreAddress,
50
+ documentStoreAbi,
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ signer
53
+ );
54
+ try {
55
+ const isV6 = isV6EthersProvider(signer.provider);
56
+ if (isV6) {
57
+ await documentStoreContract.issue.staticCall(documentHash);
58
+ } else {
59
+ await documentStoreContract.callStatic.issue(documentHash);
60
+ }
61
+ } catch (e) {
62
+ console.error("callStatic failed:", e);
63
+ throw new Error("Pre-check (callStatic) for issue failed");
64
+ }
65
+ const txOptions = await getTxOptions(signer, chainId, maxFeePerGas, maxPriorityFeePerGas);
66
+ return await documentStoreContract.issue(documentHash, txOptions);
67
+ }, "documentStoreIssue");
68
+
69
+ export { documentStoreIssue };
@@ -0,0 +1,69 @@
1
+ import { TransferableDocumentStore__factory, DocumentStore__factory } from '@trustvc/document-store';
2
+ import { getEthersContractFromProvider, isV6EthersProvider } from '../utils/ethers';
3
+ import { getTxOptions } from '../token-registry-functions/utils';
4
+ import { checkSupportsInterface } from '../core';
5
+ import { supportInterfaceIds } from './supportInterfaceIds';
6
+ import { TT_DOCUMENT_STORE_ABI } from './tt-document-store-abi';
7
+
8
+ var __defProp = Object.defineProperty;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ const documentStoreRevoke = /* @__PURE__ */ __name(async (documentStoreAddress, documentHash, signer, options = {}) => {
11
+ if (!documentStoreAddress) throw new Error("Document store address is required");
12
+ if (!signer.provider) throw new Error("Provider is required");
13
+ if (!documentHash) throw new Error("Document hash is required");
14
+ const { chainId, maxFeePerGas, maxPriorityFeePerGas, isTransferable } = options;
15
+ let isDocumentStore = !isTransferable;
16
+ let isTransferableDocumentStore = isTransferable;
17
+ let isTTDocumentStore = false;
18
+ if (isTransferable === void 0) {
19
+ [isDocumentStore, isTransferableDocumentStore] = await Promise.all([
20
+ checkSupportsInterface(
21
+ documentStoreAddress,
22
+ supportInterfaceIds.IDocumentStore,
23
+ signer.provider
24
+ ),
25
+ checkSupportsInterface(
26
+ documentStoreAddress,
27
+ supportInterfaceIds.ITransferableDocumentStore,
28
+ signer.provider
29
+ )
30
+ ]);
31
+ if (!isDocumentStore && !isTransferableDocumentStore) {
32
+ isTTDocumentStore = true;
33
+ }
34
+ }
35
+ if (!isDocumentStore && !isTransferableDocumentStore && !isTTDocumentStore) {
36
+ throw new Error(
37
+ "Contract does not support DocumentStore, TransferableDocumentStore, or TT Document Store interface"
38
+ );
39
+ }
40
+ const Contract = getEthersContractFromProvider(signer.provider);
41
+ let documentStoreAbi;
42
+ if (isTTDocumentStore) {
43
+ documentStoreAbi = TT_DOCUMENT_STORE_ABI;
44
+ } else {
45
+ const DocumentStoreFactory = isTransferableDocumentStore ? TransferableDocumentStore__factory : DocumentStore__factory;
46
+ documentStoreAbi = DocumentStoreFactory.abi;
47
+ }
48
+ const documentStoreContract = new Contract(
49
+ documentStoreAddress,
50
+ documentStoreAbi,
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ signer
53
+ );
54
+ try {
55
+ const isV6 = isV6EthersProvider(signer.provider);
56
+ if (isV6) {
57
+ await documentStoreContract.revoke.staticCall(documentHash);
58
+ } else {
59
+ await documentStoreContract.callStatic.revoke(documentHash);
60
+ }
61
+ } catch (e) {
62
+ console.error("callStatic failed:", e);
63
+ throw new Error("Pre-check (callStatic) for revoke failed");
64
+ }
65
+ const txOptions = await getTxOptions(signer, chainId, maxFeePerGas, maxPriorityFeePerGas);
66
+ return await documentStoreContract.revoke(documentHash, txOptions);
67
+ }, "documentStoreRevoke");
68
+
69
+ export { documentStoreRevoke };
@@ -0,0 +1,20 @@
1
+ import { utils } from '@tradetrust-tt/token-registry-v5';
2
+ import { contractInterfaces } from './contract-interfaces';
3
+
4
+ const { computeInterfaceId } = utils;
5
+ const supportInterfaceIds = {
6
+ /**
7
+ * IDocumentStore interface ID
8
+ * Functions: isActive, isIssued, isRevoked, name, revoke
9
+ * Computed: 0xb9391097
10
+ */
11
+ IDocumentStore: computeInterfaceId(contractInterfaces.DocumentStore),
12
+ /**
13
+ * ITransferableDocumentStore interface ID
14
+ * Functions: isActive, isIssued, isRevoked, issue, name, revoke
15
+ * Computed: 0xc2cb4227
16
+ */
17
+ ITransferableDocumentStore: computeInterfaceId(contractInterfaces.TransferableDocumentStore)
18
+ };
19
+
20
+ export { supportInterfaceIds };