diff --git a/.eslintignore b/.eslintignore
index 76add87..40f6e36 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,2 +1,5 @@
node_modules
-dist
\ No newline at end of file
+dist
+**/__snapshots__/
+# **/*.test.ts
+# **/*.test.js
\ No newline at end of file
diff --git a/.eslintrc.json b/.eslintrc.json
index 66536ca..bc25ac5 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -13,6 +13,7 @@
"plugins": ["@typescript-eslint"],
"rules": {
"@typescript-eslint/no-unused-vars": "error",
- "@typescript-eslint/consistent-type-definitions": ["error", "type"]
+ "no-duplicate-imports": "error",
+ "@typescript-eslint/no-explicit-any": "warn"
}
}
diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml
index 39b6225..2abbd75 100644
--- a/.github/workflows/linters.yml
+++ b/.github/workflows/linters.yml
@@ -11,8 +11,8 @@ jobs:
name: Code Lint
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-node@v3
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
with:
node-version: 18.x
- run: npm ci --ignore-scripts
@@ -22,7 +22,7 @@ jobs:
name: Commit Lint
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Install Commit Lint Dependencies
run: npm install @commitlint/config-conventional
- uses: JulienKode/pull-request-name-linter-action@v0.5.0
diff --git a/.github/workflows/pull_requests.yml b/.github/workflows/pull_requests.yml
index 51e381b..4b281b0 100644
--- a/.github/workflows/pull_requests.yml
+++ b/.github/workflows/pull_requests.yml
@@ -23,7 +23,7 @@ jobs:
contents: read
pull-requests: write
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: reviewdog/action-eslint@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6847f8a..076e0d9 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,10 +1,7 @@
on:
push:
branches:
- - master
- main
- - beta
- - +([0-9])?(.{+([0-9]),x}).x
env:
NODE_ENV: ci
@@ -25,8 +22,8 @@ jobs:
runs-on: ubuntu-latest
needs: [tests, linters]
steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-node@v3
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
with:
node-version: 18.x
- run: npm ci
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 83d7744..09b8370 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -11,8 +11,8 @@ jobs:
name: Run Tests
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-node@v3
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
with:
node-version: 18.x
- run: npm ci
@@ -22,8 +22,8 @@ jobs:
name: Test Build
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-node@v3
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
with:
node-version: 18.x
- run: npm ci
diff --git a/.gitignore b/.gitignore
index b4e8a2c..30afb62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,4 +29,7 @@ Thumbs.db
.prettiercache
# TypeScript type declaration files
-*.d.ts
\ No newline at end of file
+*.d.ts
+
+# vitest reports
+coverage/
\ No newline at end of file
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..248daf1
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1,3 @@
+# .npmrc
+engine-strict=true
+
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000..3a3af3d
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1,2 @@
+lts/hydrogen
+
diff --git a/README.md b/README.md
index e071c6a..a5ccb61 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,81 @@
-## TradeTrust Core
+# TradeTrust Core
-Unified interface for interacting with TradeTrust's various services.
+Unified interface for interacting with TradeTrust's various services. This library contains a set of modules.
-## Getting Started
+| Module | Description |
+| ----------------- | ------------------------------------------------------ |
+| [Verify](#verify) | Verify TradeTrust issued document |
+| [Utils](#utils) | Provide utility methods for TradeTrust functionalities |
-To get started with this project, clone the repository and install the dependencies:
+## Installation
-### install
+```sh
+npm i @tradetrust-tt/tradetrust-core
+```
-Building the Project
-You can build the project using the following command:
-`npm i`
+## Verify
-#### build
+`verify` allows you to verify issued document programmatically. After verification, use `isValid` method to answer some questions:
-This will generate the necessary files in the dist directory.
-`npm run build`
+- Has the document been tampered with ?
+- Is the issuance state of the document valid ?
+- Is the document issuer identity valid ? (see [identity proof](https://docs.tradetrust.io/docs/topics/verifying-documents/issuer-identity))
-#### Running Tests
+Document can be either [verifiable document](https://docs.tradetrust.io/docs/tutorial/verifiable-documents/overview) or [transferrable record](https://docs.tradetrust.io/docs/tutorial/transferable-records/overview) which follows [TradeTrust document schema](https://docs.tradetrust.io/docs/topics/introduction/tradetrust-document-schema/)
-To run the tests, use the following command:
-`npm run test`
+```ts
+// verify document using network name
+import { verify, isValid } from '@tradetrust-tt/tradetrust-core/verify'
+let document = {
+ // your tradetrust document
+}
+const fragments = await verify(document, {
+ network: 'sepolia', // can also provide other networks such as homestead
+})
+console.log(isValid(fragments))
+```
-#### Linting
+```ts
+// verify document using provider
+import { ethers } from 'ethers'
+import { utils } from '@tradetrust-tt/tt-verify'
-To lint the project, use the following command:
-`npm run lint`
+const providerOptions = {
+ // modify your provider options accordingly
+ network: 'sepolia',
+ providerType: 'infura',
+ apiKey: 'abdfddsfe23232',
+}
+const provider = utils.generateProvider(providerOptions)
-#### lint fix
+let document = {
+ // your tradetrust document
+}
+const fragments = await verify(document, { provider })
+console.log(isValid(fragments))
+```
-To automatically fix linting errors, use the following command:
-`npm run lint-fix`
+For more information about building provider, visit [tt-verify repository](https://github.com/TradeTrust/tt-verify?tab=readme-ov-file#provider)
-#### Contributing
+## Utils
-We welcome contributions to the TradeTrust Core project. Please feel free to submit a pull request or open an issue.
+This module provides utility methods that supports the shared functionalities for other TradeTrust modules.
+
+#### InterpretFragments
+
+`interpretFragments` allows you to extract out the verified results from the fragments.
+
+```ts
+import {interpretFragments} from '@tradetrust-tt/tradetrust-core/utils`;
+
+const fragments = await verify(document, {
+ network: 'sepolia',
+});
+
+const {hasValid, issuedValid, identityValid} = interpretFragments(fragments);
+console.log({hasValid, issuedValid, identityValid});
+```
+
+## Contributing
+
+We welcome contributions to the TradeTrust core library. Please feel free to submit a pull request or open an issue.
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 0000000..507e1c9
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,8 @@
+module.exports = {
+ extends: ['@commitlint/config-conventional'],
+
+ // Add your own rules. See http://marionebl.github.io/commitlint
+ rules: {
+ 'body-max-line-length': [0], // disable
+ },
+}
diff --git a/coverage/base.css b/coverage/base.css
deleted file mode 100644
index f418035..0000000
--- a/coverage/base.css
+++ /dev/null
@@ -1,224 +0,0 @@
-body, html {
- margin:0; padding: 0;
- height: 100%;
-}
-body {
- font-family: Helvetica Neue, Helvetica, Arial;
- font-size: 14px;
- color:#333;
-}
-.small { font-size: 12px; }
-*, *:after, *:before {
- -webkit-box-sizing:border-box;
- -moz-box-sizing:border-box;
- box-sizing:border-box;
- }
-h1 { font-size: 20px; margin: 0;}
-h2 { font-size: 14px; }
-pre {
- font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
- margin: 0;
- padding: 0;
- -moz-tab-size: 2;
- -o-tab-size: 2;
- tab-size: 2;
-}
-a { color:#0074D9; text-decoration:none; }
-a:hover { text-decoration:underline; }
-.strong { font-weight: bold; }
-.space-top1 { padding: 10px 0 0 0; }
-.pad2y { padding: 20px 0; }
-.pad1y { padding: 10px 0; }
-.pad2x { padding: 0 20px; }
-.pad2 { padding: 20px; }
-.pad1 { padding: 10px; }
-.space-left2 { padding-left:55px; }
-.space-right2 { padding-right:20px; }
-.center { text-align:center; }
-.clearfix { display:block; }
-.clearfix:after {
- content:'';
- display:block;
- height:0;
- clear:both;
- visibility:hidden;
- }
-.fl { float: left; }
-@media only screen and (max-width:640px) {
- .col3 { width:100%; max-width:100%; }
- .hide-mobile { display:none!important; }
-}
-
-.quiet {
- color: #7f7f7f;
- color: rgba(0,0,0,0.5);
-}
-.quiet a { opacity: 0.7; }
-
-.fraction {
- font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
- font-size: 10px;
- color: #555;
- background: #E8E8E8;
- padding: 4px 5px;
- border-radius: 3px;
- vertical-align: middle;
-}
-
-div.path a:link, div.path a:visited { color: #333; }
-table.coverage {
- border-collapse: collapse;
- margin: 10px 0 0 0;
- padding: 0;
-}
-
-table.coverage td {
- margin: 0;
- padding: 0;
- vertical-align: top;
-}
-table.coverage td.line-count {
- text-align: right;
- padding: 0 5px 0 20px;
-}
-table.coverage td.line-coverage {
- text-align: right;
- padding-right: 10px;
- min-width:20px;
-}
-
-table.coverage td span.cline-any {
- display: inline-block;
- padding: 0 5px;
- width: 100%;
-}
-.missing-if-branch {
- display: inline-block;
- margin-right: 5px;
- border-radius: 3px;
- position: relative;
- padding: 0 4px;
- background: #333;
- color: yellow;
-}
-
-.skip-if-branch {
- display: none;
- margin-right: 10px;
- position: relative;
- padding: 0 4px;
- background: #ccc;
- color: white;
-}
-.missing-if-branch .typ, .skip-if-branch .typ {
- color: inherit !important;
-}
-.coverage-summary {
- border-collapse: collapse;
- width: 100%;
-}
-.coverage-summary tr { border-bottom: 1px solid #bbb; }
-.keyline-all { border: 1px solid #ddd; }
-.coverage-summary td, .coverage-summary th { padding: 10px; }
-.coverage-summary tbody { border: 1px solid #bbb; }
-.coverage-summary td { border-right: 1px solid #bbb; }
-.coverage-summary td:last-child { border-right: none; }
-.coverage-summary th {
- text-align: left;
- font-weight: normal;
- white-space: nowrap;
-}
-.coverage-summary th.file { border-right: none !important; }
-.coverage-summary th.pct { }
-.coverage-summary th.pic,
-.coverage-summary th.abs,
-.coverage-summary td.pct,
-.coverage-summary td.abs { text-align: right; }
-.coverage-summary td.file { white-space: nowrap; }
-.coverage-summary td.pic { min-width: 120px !important; }
-.coverage-summary tfoot td { }
-
-.coverage-summary .sorter {
- height: 10px;
- width: 7px;
- display: inline-block;
- margin-left: 0.5em;
- background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
-}
-.coverage-summary .sorted .sorter {
- background-position: 0 -20px;
-}
-.coverage-summary .sorted-desc .sorter {
- background-position: 0 -10px;
-}
-.status-line { height: 10px; }
-/* yellow */
-.cbranch-no { background: yellow !important; color: #111; }
-/* dark red */
-.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
-.low .chart { border:1px solid #C21F39 }
-.highlighted,
-.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
- background: #C21F39 !important;
-}
-/* medium red */
-.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
-/* light red */
-.low, .cline-no { background:#FCE1E5 }
-/* light green */
-.high, .cline-yes { background:rgb(230,245,208) }
-/* medium green */
-.cstat-yes { background:rgb(161,215,106) }
-/* dark green */
-.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
-.high .chart { border:1px solid rgb(77,146,33) }
-/* dark yellow (gold) */
-.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
-.medium .chart { border:1px solid #f9cd0b; }
-/* light yellow */
-.medium { background: #fff4c2; }
-
-.cstat-skip { background: #ddd; color: #111; }
-.fstat-skip { background: #ddd; color: #111 !important; }
-.cbranch-skip { background: #ddd !important; color: #111; }
-
-span.cline-neutral { background: #eaeaea; }
-
-.coverage-summary td.empty {
- opacity: .5;
- padding-top: 4px;
- padding-bottom: 4px;
- line-height: 1;
- color: #888;
-}
-
-.cover-fill, .cover-empty {
- display:inline-block;
- height: 12px;
-}
-.chart {
- line-height: 0;
-}
-.cover-empty {
- background: white;
-}
-.cover-full {
- border-right: none !important;
-}
-pre.prettyprint {
- border: none !important;
- padding: 0 !important;
- margin: 0 !important;
-}
-.com { color: #999 !important; }
-.ignore-none { color: #999; font-weight: normal; }
-
-.wrapper {
- min-height: 100%;
- height: auto !important;
- height: 100%;
- margin: 0 auto -48px;
-}
-.footer, .push {
- height: 48px;
-}
diff --git a/coverage/block-navigation.js b/coverage/block-navigation.js
deleted file mode 100644
index cc12130..0000000
--- a/coverage/block-navigation.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/* eslint-disable */
-var jumpToCode = (function init() {
- // Classes of code we would like to highlight in the file view
- var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
-
- // Elements to highlight in the file listing view
- var fileListingElements = ['td.pct.low'];
-
- // We don't want to select elements that are direct descendants of another match
- var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
-
- // Selecter that finds elements on the page to which we can jump
- var selector =
- fileListingElements.join(', ') +
- ', ' +
- notSelector +
- missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
-
- // The NodeList of matching elements
- var missingCoverageElements = document.querySelectorAll(selector);
-
- var currentIndex;
-
- function toggleClass(index) {
- missingCoverageElements
- .item(currentIndex)
- .classList.remove('highlighted');
- missingCoverageElements.item(index).classList.add('highlighted');
- }
-
- function makeCurrent(index) {
- toggleClass(index);
- currentIndex = index;
- missingCoverageElements.item(index).scrollIntoView({
- behavior: 'smooth',
- block: 'center',
- inline: 'center'
- });
- }
-
- function goToPrevious() {
- var nextIndex = 0;
- if (typeof currentIndex !== 'number' || currentIndex === 0) {
- nextIndex = missingCoverageElements.length - 1;
- } else if (missingCoverageElements.length > 1) {
- nextIndex = currentIndex - 1;
- }
-
- makeCurrent(nextIndex);
- }
-
- function goToNext() {
- var nextIndex = 0;
-
- if (
- typeof currentIndex === 'number' &&
- currentIndex < missingCoverageElements.length - 1
- ) {
- nextIndex = currentIndex + 1;
- }
-
- makeCurrent(nextIndex);
- }
-
- return function jump(event) {
- if (
- document.getElementById('fileSearch') === document.activeElement &&
- document.activeElement != null
- ) {
- // if we're currently focused on the search input, we don't want to navigate
- return;
- }
-
- switch (event.which) {
- case 78: // n
- case 74: // j
- goToNext();
- break;
- case 66: // b
- case 75: // k
- case 80: // p
- goToPrevious();
- break;
- }
- };
-})();
-window.addEventListener('keydown', jumpToCode);
diff --git a/coverage/clover.xml b/coverage/clover.xml
deleted file mode 100644
index 93a1aac..0000000
--- a/coverage/clover.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
- Press n or j to go to the next uncovered block, b, p or k for the previous block. -
- -