An implementation of Saudi Arabia ZATCA's E-Invoicing requirements, processes, and standards in TypeScript.

Overview

v0.1.0 (experimental)



An implementation of Saudi Arabia ZATCA's E-Invoicing requirements, processes, and standards in TypeScript.

Read the documentation PDFs or Systems Developers for more details.

GitHub license

Dependencies

If you plan on using the built in EGS module to generate keys, and CSR. The EGS module in the package is dependent on OpenSSL being installed in the system it's running on. It's being used to generate an ECDSA key pair using the secp256k1 curve. also to generate and sign a CSR.

All other parts of the package will work fine without OpenSSL. (meaning it supports react-native and other frameworks)

Supports

All tha main futures required to on-board a new EGS. Create, sign, and report a simplified tax invoice are currently supported.

  • EGS (E-Invoice Generation System).
    • Creation/on-boarding (Compliance and Production x.509 CSIDs).
    • Cryptographic stamps generation.
  • Simplified Tax Invoice.
    • Creation.
    • Signing.
    • Compliance checking.
    • Reporting.

Installation

npm install zatca-xml-js

Usage

View full example at examples

import {
    EGS, EGSUnitInfo,
    ZATCASimplifiedTaxInvoice,
} from "zatca-xml-js";


// New Invoice and EGS Unit
const invoice: ZATCASimplifiedTaxInvoice = {/*...*/};
const egsunit: EGSUnitInfo = {/*...*/};

// Init EGS unit
const egs = new EGS(egsunit);
// New Keys & CSR for the EGS
await egs.generateNewKeysAndCSR(false);
// Issue a new compliance cert for the EGS
const compliance_rid = await egs.issueComplianceCertificate("123345");
// Sign invoice
const {signed_invoice_string, invoice_hash} = egs.signInvoice(invoice);
// Check invoice compliance
await egs.checkInvoiceCompliance(signed_invoice_string, invoice_hash);
// Issue production certificate
await egs.issueProductionCertificate(compliance_rid);
// Report invoice
await egs.reportInvoice(signed_invoice_string, invoice_hash);

Implementation

  • General implementation (More details)
    • KSA Rules & Business
    • UBL 2.1 Spec
    • ISO EN16931
    • UN/CEFACT Code List 1001
    • ISO 3166
    • ISO 4217:2015
    • UN/CEFACT Code List 5305, D.16B
  • Security standards (More details)
    • NCA National Cryptographic Standards (NCS - 1 : 2020)
    • NCDC Digital Signing Policy (Version 1.1: 2020)
    • ETSI EN 319 102-1
    • ETSI EN 319 132-1
    • ETSI EN 319 142-1
    • W3C XML-Signature Syntax and Processing
    • ETSI EN 319 122-1
    • IETF RFC 5035 (2007)
    • RFC 5280
    • ISO 32000-1
    • IETF RFC 5652 (2009)
    • RFP6749
    • NIST SP 56A

Notice of Non-Affiliation and Disclaimer

zatca-xml-js is not affiliated, associated, authorized, endorsed by, or in any way officially connected with ZATCA (Zakat, Tax and Customs Authority), or any of its subsidiaries or its affiliates. The official ZATCA website can be found at https://zatca.gov.sa.

Contribution

All contributions are appreciated.

Roadmap

  • CSIDs renewal, revoking.
  • Populating templates using a template engine instead of replace
  • Getting ZATCA to hopefully minify the XMLs before hashing ?

I'm not planning on supporting Tax Invoices (Not simplified ones). If any one wants to tackle that part.

Comments
  • Incorrect XML hashing

    Incorrect XML hashing

    Hello. Thank you for this detailed project. I've been having issues with Phase 2 QR, getting the following errors in ZATCA's XML Web validator :

    category : QR_CODE_ERROR
    code :publicKey
    message : public key of the certificate does not match with qr code certificate
    
    category : QR_CODE_ERROR
    code :hashedXml
    message : hashedXml does not match with qr code hashedXml
    
    category : QR_CODE_ERROR
    code :certificate signature
    message : certificate signature value in the invoice doesn't match the certificate signature value in tag 9 of the QR code
    

    Let's take the hashedXml error first : I believe that ZATCA requires the XML to be hashed into SHA256 binary object before converting to base64, however the function "getInvoiceHash(invoice_xml)" takes the plain SHA256 and convert directly to base64. could that be the reason for the HashedXml error ?

    good first issue 
    opened by HaimenToshi 19
  • Worked, How do I get PIH (previous invoice hash)?

    Worked, How do I get PIH (previous invoice hash)?

    I have pretty much the same example as you. When I run checkInvoiceCompliance or reportInvoice I get Request failed with status code 400.

    One more question, do I store PIH in a DB or how do you get it?

    opened by sudo-sand 6
  • Signing Invoice

    Signing Invoice

    fie path : signing/index.js line No: 144 /**

    • Removes header and footer from private key string.
    • @param privatek_key_string ec-secp256k1 private key string.
    • @returns String base64 encoded private key body. */ const cleanUpPrivateKeyString = (certificate_string) => { return certificate_string.replace("-----BEGIN EC PRIVATE KEY-----\n", "").replace("-----END EC PRIVATE KEY-----", "").trim();

    }; this above function is not returning the trim certificate as it is not matching -----BEGIN EC PRIVATE KEY-----\n because of the that additional /n . Hence the process is getting out of the execution.

    windows 
    opened by asim009 4
  • Calculation Error In rounding amount

    Calculation Error In rounding amount

    @wes4m sample JSON { "uuid":"6f4d20e0-6bfe-4a80-9389-7dabe6620f12", "custom_id":"EGS1-886431145", "model":"IOS", "CRN_number":"454634645645654", "VAT_name":"Wesam Alzahir", "VAT_number":"301121971500003", "location":{ "city":"Khobar", "city_subdivision":"West", "street":"King Fahahd st", "plot_identification":"0000", "building":"0000", "postal_zone":"31952" }, "branch_name":"My Branch Name", "branch_industry":"Food", "invoice_counter_number":"1", "invoice_serial_number":"EGS1-886431145-1", "issue_date":"2022-03-13", "issue_time":"14:40:40", "previous_invoice_hash":"NWZlY2ViNjZmZmM4NmYzOGQ5NTI3ODZjNmQ2OTZjNzljMmRiYzIzOWRkNGU5MWI0NjcyOWQ3M2EyN2ZiNTdlOQ==", "line_items":[ { "id":"1", "name":"TEST NAME", "quantity":5, "tax_exclusive_price":10, "VAT_percent":0.15, "other_taxes":[ { "percent_amount":1 } ], "discounts":[ { "amount":0, "reason":"A discount" }, { "amount":0, "reason":"A second discount" } ] } ] }

    Below is the xml generated from the sample json
    cac:TaxTotal <cbc:TaxAmount currencyID="SAR">57.50</cbc:TaxAmount> cac:TaxSubtotal <cbc:TaxableAmount currencyID="SAR">50.00</cbc:TaxableAmount> <cbc:TaxAmount currencyID="SAR">7.50</cbc:TaxAmount> cac:TaxCategory <cbc:ID schemeAgencyID="6" schemeID="UN/ECE 5305">S</cbc:ID> cbc:Percent15.00</cbc:Percent> cac:TaxScheme <cbc:ID schemeAgencyID="6" schemeID="UN/ECE 5153">VAT</cbc:ID> </cac:TaxScheme> </cac:TaxCategory> </cac:TaxSubtotal> cac:TaxSubtotal <cbc:TaxableAmount currencyID="SAR">50.00</cbc:TaxableAmount> <cbc:TaxAmount currencyID="SAR">50.00</cbc:TaxAmount> cac:TaxCategory <cbc:ID schemeAgencyID="6" schemeID="UN/ECE 5305">S</cbc:ID> cbc:Percent100.00</cbc:Percent> cac:TaxScheme <cbc:ID schemeAgencyID="6" schemeID="UN/ECE 5153">VAT</cbc:ID> </cac:TaxScheme> </cac:TaxCategory> </cac:TaxSubtotal> </cac:TaxTotal> cac:TaxTotal <cbc:TaxAmount currencyID="SAR">57.50</cbc:TaxAmount> </cac:TaxTotal> cac:LegalMonetaryTotal <cbc:LineExtensionAmount currencyID="SAR">50.00</cbc:LineExtensionAmount> <cbc:TaxExclusiveAmount currencyID="SAR">50.00</cbc:TaxExclusiveAmount> <cbc:TaxInclusiveAmount currencyID="SAR">107.5</cbc:TaxInclusiveAmount> ?? On what basic this value is coming <cbc:AllowanceTotalAmount currencyID="SAR">0</cbc:AllowanceTotalAmount> <cbc:PrepaidAmount currencyID="SAR">0</cbc:PrepaidAmount> <cbc:PayableAmount currencyID="SAR">107.5</cbc:PayableAmount>--?? </cac:LegalMonetaryTotal> cac:InvoiceLine cbc:ID1</cbc:ID> <cbc:InvoicedQuantity unitCode="PCE">5</cbc:InvoicedQuantity> <cbc:LineExtensionAmount currencyID="SAR">50.00</cbc:LineExtensionAmount> cac:TaxTotal <cbc:TaxAmount currencyID="SAR">57.50</cbc:TaxAmount> <cbc:RoundingAmount currencyID="SAR">107.50</cbc:RoundingAmount> ???? </cac:TaxTotal> cac:Item cbc:NameTEST NAME</cbc:Name> cac:ClassifiedTaxCategory cbc:IDS</cbc:ID> cbc:Percent15.00</cbc:Percent> cac:TaxScheme cbc:IDVAT</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> cac:ClassifiedTaxCategory cbc:IDS</cbc:ID> cbc:Percent100.00</cbc:Percent> cac:TaxScheme cbc:IDVAT</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cac:Item> cac:Price <cbc:PriceAmount currencyID="SAR">10</cbc:PriceAmount> cac:AllowanceCharge cbc:ChargeIndicatorfalse</cbc:ChargeIndicator> cbc:AllowanceChargeReasonA discount</cbc:AllowanceChargeReason> <cbc:Amount currencyID="SAR">0.00</cbc:Amount> </cac:AllowanceCharge> cac:AllowanceCharge cbc:ChargeIndicatorfalse</cbc:ChargeIndicator> cbc:AllowanceChargeReasonA second discount</cbc:AllowanceChargeReason> <cbc:Amount currencyID="SAR">0.00</cbc:Amount> </cac:AllowanceCharge> </cac:Price> </cac:InvoiceLine> Correct me if I am wrong I think there is miscalculation, I have mention the spots in bold in the above xml which show the miscalculation. Kindly help me to understand on that basis the value 107.50 is calculated and what should be the value inside cbc:RoundingAmount

         <cac:TaxTotal>
            <cbc:TaxAmount currencyID="SAR">57.50</cbc:TaxAmount>
            _**<cbc:RoundingAmount currencyID="SAR">??</cbc:RoundingAmount>**_     ????
        </cac:TaxTotal>
    
    opened by asim009 2
  • Invoice Compliance Check include egs_uuid which is wrong

    Invoice Compliance Check include egs_uuid which is wrong

    I'm requesting ZATCA invoice compliance check API with UUID generated for my device, But the invoiceXML is using another generated UUID, So the API return the following error:

    "errorMessages": [
          {
            "type": "ERROR",
            "code": "INVOICE_UUID_VALIDATION",
            "category": "MISSING_UUID_IN_INVOICE",
            "message": "UUID provided in the invoice doesn't match UUID in the provided Request",
            "status": "ERROR"
          },
    

    Just a question now: Do we add a unique UUID per each invoice, or it's only 1 UUID per each EGS generating invoices ?

    opened by marwan2 2
  • Can't validate generated XML through the sandbox portal

    Can't validate generated XML through the sandbox portal

    Hey, first of all thanks for your tremendous efforts, I was trying the library out and it works great, the compliance API succeeds. However, I can't seem to be able to write the generated XML to a file then upload that to the sandbox portal validator.

    Errors: image

    Code used to write to file:

    fs.writeFile(__dirname + '/tmp/test.xml', signed_invoice_string, {
                flag: "w"
              }, function(err) {
                if (err) {
                  return console.log(err);
                }
                console.log("The file was saved!");
    });
    

    Validator link: https://sandbox.zatca.gov.sa/TestXML

    opened by AbdelrahmanManz 1
  • Custom certs generating path

    Custom certs generating path

    fixed wrong tag error and also fixed error in generating private key and CSR files because it was throwing error on them due to there being no tmp folder but still looking for an alternative to XML dom library due to its critical vulnerability
    hope that I have helped develop this library. Thanks

    opened by shadiallouh 1
  • v0.1.9 Fixes

    v0.1.9 Fixes

    • [x] Reverting windows OpenSSL trailing PEM key \r issue. I have tested this with multiple windows devices. And it was causing issues because the OpenSSL version did not add a \r as expected. So this seems like a rare issue that happened on one device thus I'm reverting it. If you have this issue then modify the lib manually.

    • [x] Adding custom TEMP_FOLDER through environment vars.

    • [x] Support for other languages in seller_name (UTF-8).

    enhancement release 
    opened by wes4m 0
  • Secp256k1 js

    Secp256k1 js

    Hello,

    I'm not a crypto expert so this is a humble attempt to replace openssl with js

    • I've deleted csr_template.ts file since csr config is not a template now, this can be reverted if you prefer to

    • in sign I had to replace crypto createSign with jsrsasign sign method as the current solution couldn't parse privatekey generated by jsrsasign most likely due to the new line added being \r\n not \n anyway this can be reverted if we use a another library to create keys, I tried ecdsa-secp256r1 and it worked without any modification to the original signing functions

    • @fidm/x509 module can be replaced with jsrsasign - no need for 2 deps

    • sorry for some of the unrelated changes, it's just my editor removing extra white spaces, maybe we should use a code formatter :stuck_out_tongue_closed_eyes:

    enhancement 
    opened by mamod 0
  • Invoice sub-types disscussion

    Invoice sub-types disscussion

    Hey @wes4m, Just want to discuss few things. So, in this repo are we doing only simplified tax invoice? If yes, please suggest me on how we can post below transactions. ● For Tax Invoice, code is 380 and subtype is 01. ex. <cbc:InvoiceTypeCode name=”010000”>380</cbc:InvoiceTypeCode> ● For Simplified Tax Invoice, code is 380 and subtype is 02. ex. <cbc:InvoiceTypeCode name=”020000”>380</cbc:InvoiceTypeCode> ● For tax invoice debit note, code is 383 and subtype is 01. ex. <cbc:InvoiceTypeCode name=”010000”>383</cbc:InvoiceTypeCode> ● For simplified debit note, code is 383 and subtype is 02. ex. <cbc:InvoiceTypeCode name=”020000”>383</cbc:InvoiceTypeCode> ● For tax invoice credit note, code is 381 and subtype is 01. ex. <cbc:InvoiceTypeCode name=”010000”>381</cbc:InvoiceTypeCode> ● For simplified credit note, code is 381 and subtype is 02. ex. <cbc:InvoiceTypeCode name=”020000”>381</cbc:InvoiceTypeCode> ● For self-billed invoice, code is 389 and subtype is 01. ex. <cbc:InvoiceTypeCode name=”010000”>389</cbc:InvoiceTypeCode>

    opened by asim009 11
  • NEW VERSION OF SANDBOX (ISSUES AFTER THAT)

    NEW VERSION OF SANDBOX (ISSUES AFTER THAT)

    @wes4m I have been working on this package since very long time and everything was good and running fine. Yesterday, I think zatca has updated the sandbox because of the there was no service available till today. Below message was in response everytime when I hit the API.

    <html>
          <head><title>503 Service Temporarily Unavailable</title></head>
          <body>
              <center><h1>503 Service Temporarily Unavailable</h1></center>
              <hr><center>nginx</center>
          </body>
    </html>
    

    Now that the server is up and running again. I tried to execute the same request and I am facing below errors

    {
      "infoMessages": [
          {
              "type": "INFO",
              "code": "XSD_ZATCA_VALID",
              "category": "XSD validation",
              "message": "Complied with UBL 2.1 standards in line with ZATCA specifications",
              "status": "PASS"
          }
      ],
      "warningMessages": [],
      "errorMessages": [
          {
              "type": "ERROR",
              "code": "GENERAL",
              "category": "BUSINESS_RULES",
              "message": "Unable to execute Business Rules validation",
              "status": "ERROR"
          },
          {
              "type": "ERROR",
              "code": "BR-KSA-EN16931-11",
              "category": "KSA",
              "message": "Invoice line net amount (BT-131) must equal (Invoiced quantity (BT-130) * (Item net price (BT-146) / item price base quantity (BT-149))-))- Sum of invoice line allowance amount (BT-136)",
              "status": "ERROR"
          },
          {
              "type": "ERROR",
              "code": "BR-KSA-EN16931-06",
              "category": "KSA",
              "message": "Charge on price level (BG-29) is NOT allowed. Only value 'false' allowed.",
              "status": "ERROR"
          },
          {
              "type": "ERROR",
              "code": "BR-KSA-EN16931-06",
              "category": "KSA",
              "message": "Charge on price level (BG-29) is NOT allowed. Only value 'false' allowed.",
              "status": "ERROR"
          }
      ],
      "status": "ERROR"
    }
    

    Don't understand what went wrong. After some research I see that it is related to lineitem Discount

    "discounts": [
        { "amount": 2, "reason": "A discount" },
        { "amount": 2, "reason": "A second discount" }
    ]
    

    I think there is some miscalculation while calculating the discounts or some new features they have updated in this publish Strange is that when I don't pass any discount the Invoice is getting reported.

    bug 
    opened by asim009 34
  • Only Sandbox environment is available

    Only Sandbox environment is available

    Currently the only environment available is Sandbox, in case we want to move to production environment there is no way of doing that:

    const settings = {
        API_VERSION: "V2",
        SANDBOX_BASEURL: "https://gw-apic-gov.gazt.gov.sa/e-invoicing/developer-portal",
        PRODUCTION_BASEURL: "TODO"
    };
    
    enhancement 
    opened by adriantoro26 0
Releases(v0.1.9)
  • v0.1.9(Dec 9, 2022)

    What's Changed

    • update TLV length calc by @jayaganeshk in https://github.com/wes4m/zatca-xml-js/pull/21
    • v0.1.9 Fixes by @wes4m in https://github.com/wes4m/zatca-xml-js/pull/20

    New Contributors

    • @jayaganeshk made their first contribution in https://github.com/wes4m/zatca-xml-js/pull/21

    Full Changelog: https://github.com/wes4m/zatca-xml-js/compare/v0.1.8...v0.1.9

    Source code(tar.gz)
    Source code(zip)
  • v0.1.8(Oct 18, 2022)

    Full Changelog: https://github.com/wes4m/zatca-xml-js/compare/v0.1.4...v0.1.8

    • KSA and BR rules for decimal points and totals rounding.
    • Rounding fixes.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.4(Oct 18, 2022)

    What's Changed

    • Experimental release v0.1.4 release by @wes4m in https://github.com/wes4m/zatca-xml-js/pull/12

    Full Changelog: https://github.com/wes4m/zatca-xml-js/compare/v0.1.3...v0.1.4

    Source code(tar.gz)
    Source code(zip)
  • v0.1.3(Oct 18, 2022)

    What's Changed

    • Windows \r\n fix by @wes4m in https://github.com/wes4m/zatca-xml-js/pull/10
    • Experimental release v0.1.3 release by @wes4m in https://github.com/wes4m/zatca-xml-js/pull/11

    Full Changelog: https://github.com/wes4m/zatca-xml-js/compare/v0.1.2...v0.1.3

    Source code(tar.gz)
    Source code(zip)
  • v0.1.2(Sep 25, 2022)

    What's Changed

    • Experimental release v0.1.2 release by @wes4m in https://github.com/wes4m/zatca-xml-js/pull/7
      • Logger added.
      • Phase one QR generator added (for backwards compatibility).
      • Minor refactors.

    Full Changelog: https://github.com/wes4m/zatca-xml-js/compare/v0.1.1...v0.1.2

    Source code(tar.gz)
    Source code(zip)
  • v0.1.1(Sep 23, 2022)

    What's Changed

    • Readme examples path fix by @wes4m in https://github.com/wes4m/zatca-xml-js/pull/2
    • version fix by @wes4m in https://github.com/wes4m/zatca-xml-js/pull/3
    • Experimental release v0.1.1 release by @wes4m in https://github.com/wes4m/zatca-xml-js/pull/5

    Full Changelog: https://github.com/wes4m/zatca-xml-js/compare/v0.10...v0.1.1

    Source code(tar.gz)
    Source code(zip)
  • v0.10(Sep 16, 2022)

Owner
wes4m
wes4m
Save time by managing bills & expenses, invoicing & easy reconciliation all in one app. Generate clear dynamic statements and get your reports, the way you like them

expense-manager-app (Opensource Expense Tracking App built with React) ?? Save time by managing bills & expenses, invoicing & easy reconciliation all

Muhammad Awais 3 Oct 12, 2022
Shikhar 4 Oct 9, 2022
Reinforcement learning using Markov Decision Processes. For JS, written in C++.

Pavlov.js About Pavlov.js uses Markov Decision Processes to implement reinforcement learning. It is written in C++ and compiled to JavaScript. For mor

Nathan Epstein 503 Dec 14, 2022
Parallel/concurrent async work, optionally using multiple threads or processes

parallel-park Parallel/concurrent async work, optionally using multiple processes Usage parallel-park exports two functions: runJobs and inChildProces

Lily Scott 10 Mar 1, 2022
An easy-to-read, quick reference for JS best practices, accepted coding standards, and links around the Web

Feel free to contribute! Where? http://www.jstherightway.org Why? Today we have a bunch of websites running JavaScript. I think we need a place to put

BrazilJS 8.5k Jan 1, 2023
JavaScript library of crypto standards.

crypto-js JavaScript library of crypto standards. Node.js (Install) Requirements: Node.js npm (Node.js package manager) npm install crypto-js Usage ES

Brix 13.8k Jan 1, 2023
Fast & Robust Front-End Micro-framework based on modern standards

Chat on gitter Hello slim.js - your declarative web components library import { Slim } from 'slim-js'; import { tag, template } from 'slim-js/decorato

slim.js 942 Dec 30, 2022
🐬 A simplified implementation of TypeScript's type system written in TypeScript's type system

?? HypeScript Introduction This is a simplified implementation of TypeScript's type system that's written in TypeScript's type annotations. This means

Ronen Amiel 1.8k Dec 20, 2022
Charm implementation in JavaScript (TypeScript)

charm.js A tiny, self-contained cryptography library, implementing authenticated encryption and keyed hashing. Any number of hashing and authenticated

Frank Denis 12 Nov 2, 2022
Implementation of original Lisp as described in Paul Graham's article "The Roots of Lisp". In Typescript

Roots of Lisp This is the implementation of original Lisp from 1960 as described in Paul Graham's article How to use Building If you just want to run

Serhii Dolia 7 Oct 28, 2022
A TypeScript implementation of High-Performance Polynomial Root Finding for Graphics (Yuksel 2022)

Nomial Nomial is a TypeScript implementation of Cem Yuksel's extremely fast, robust, and simple root finding algorithm presented in the paper "High-Pe

Peter Boyer 10 Aug 3, 2022
Typescript implementation of the shopif-app-template-node

Shopify App Template - Node This is a template for building a Shopify app using Node and React. It contains the basics for building a Shopify app. Rat

Kai Spencer 9 Dec 21, 2022
A quotaless, partially limitless, and fast Node.js Multiplayer Piano server implementation that efficiently makes use of the protocol and uWebSockets.js

speedymppserver A quotaless, partially limitless, and fast Node.js Multiplayer Piano server implementation that efficiently makes use of the protocol

Lapis 4 Oct 14, 2022
:books: The definitive guide to TypeScript and possibly the best TypeScript book :book:. Free and Open Source 🌹

TypeScript Deep Dive I've been looking at the issues that turn up commonly when people start using TypeScript. This is based on the lessons from Stack

Basarat Ali Syed 18.7k Jan 4, 2023
This project is a boilerplate for Next and TypeScript projects. This template was built with Vite, TypeScript and Stitches.

Awesome Template Stitches — NextJS, TypeScript, Stitches and Design Tokens Summary About this template Avaliale scripts Other scripts available Main t

Diego Silva 14 Dec 29, 2022
An implementation for FIWARE Orion and Cygnus on AWS.

FIWARE: Orion and Cygnus on AWS This guide will help you to deploy Fiware's Orion and Cygnus components into a serverless architecture. What does this

AWS Samples 6 Sep 21, 2022
ParkyDB - block based, linkable and verifiable document database -- javascript reference implementation

Ancon ParkyDB A data mesh database using Web 3.0 technology Note: Requires Node v17.7.2 and up for development More about data mesh architecture Block

Ancon Protocol 6 Aug 16, 2022
An implementation of ERC1155D, a record setter for minting and transfer gas efficiency.

ERC1155D An implementation of ERC1155D, a record setter for minting and transfer gas efficiency. This contract is in alpha stage and has not been audi

null 72 Dec 26, 2022
Simple Library implemented using HTML, CSS and JavaScript. This is a simple implementation of JavaScript Modules of ES6.

Awesome-books A single page project with the porpuse of storing books' titles and authors. Built With CSS, HTML & Javascript. How to run in your local

Saadat Ali 7 Feb 21, 2022