UNPKG

zk-trace-sdk

Version:

Sdk for integrating ZK trace into supplychain managment systems

2 lines (1 loc) 26.9 kB
import*as e from"fs";import{readFileSync as t}from"fs";import{resolve as n,dirname as r}from"path";import{initialize as a}from"zokrates-js";import i from"keccak256";import{ethers as s}from"ethers";import o from"seedrandom";import p from"isomorphic-unfetch";import{Web3Storage as y}from"web3.storage";import{CarReader as u}from"@ipld/car/reader";import{Readable as d}from"readable-stream";import*as l from"multiformats/block";import{sha256 as c}from"multiformats/hashes/sha2";import*as m from"multiformats/codecs/raw";import*as f from"@ipld/dag-json";import*as g from"@ipld/dag-cbor";import{CarWriter as b}from"@ipld/car/writer";import{MerkleTree as h}from"merkletreejs";import w from"crypto-js";import v from"axios";import{customAlphabet as T}from"nanoid";function A(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then(function(e){return{value:e,done:t}})}return A=function(e){this.s=e,this.n=e.next},A.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var n=this.s.return;return void 0===n?Promise.resolve({value:e,done:!0}):t(n.apply(this.s,arguments))},throw:function(e){var n=this.s.return;return void 0===n?Promise.reject(e):t(n.apply(this.s,arguments))}},new A(e)}function k(){return k=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},k.apply(this,arguments)}class P{constructor(e){var t=this;this.nodeEndpoint=void 0,this.web3storageApiKey=void 0,this.factoryAddress=void 0,this.apikey=void 0,this.baseUrl=void 0,this.traceHubAddress=void 0,this.getFeeData=async function(){const e=await t.getProvider(),n=await e.getFeeData();return{maxFeePerGas:n.maxFeePerGas,maxPriorityFeePerGas:n.maxPriorityFeePerGas,gasLimit:5e6}},this.nodeEndpoint=e.nodeEndpoint||"http://127.0.0.1:8545",this.baseUrl=e.baseUri||"http://localhost:5000/",this.apikey=e.apikey,this.web3storageApiKey=e.web3storageApiKey,this.factoryAddress=e.factoryAddress||"0x610178da211fef7d417bc0e6fed39f05609ad788",this.traceHubAddress=e.traceHubAddress||"0x8A791620dd6260079BF849Dc5567aDC3F2FdC318"}invoke(e,t){const n=`${this.baseUrl}${e}`,r=k({},t,{headers:{"content-type":"application/json",apiKey:this.apikey}});return p(n,r).then(e=>{if(200===e.status)return e.json();throw new Error("call failed")})}getWeb3StorageKey(){return this.web3storageApiKey}async getProvider(){return new s.providers.JsonRpcProvider(this.nodeEndpoint)}getFactoryAddress(){return this.factoryAddress}getTraceHubAddress(){return this.traceHubAddress}}class M extends P{constructor(...t){var n;super(...t),n=this,this.initilizeWeb3Storage=async function(){try{return new y({token:n.getWeb3StorageKey()})}catch(e){throw console.error(e),new Error("Failed to initilize web3Storage")}},this.uploadCarToIPFS=async function(t){try{const r=await n.initilizeWeb3Storage(),a=e.createReadStream(`./cars/${t}.car`),i=await u.fromIterable(a);return await r.putCar(i,{name:`${t}.car`,decoders:[g]})}catch(e){throw console.error(e),new Error("Upload trace details failed")}},this.readData=async function(e){let t;try{return await v.get(`https://ipfs.io/api/v0/dag/get/${e}`).then(e=>{t=e.data.data}).catch(e=>{throw new Error(e)}),t}catch(e){throw console.error(e),new Error("read trace data failed")}},this.utf8Encoder=new TextEncoder,this.utf8Decoder=new TextDecoder,this.createBlock=async function(e){const t=[];try{const n=await l.encode({value:{data:e},hasher:c,codec:g});return t.push(n),{blocks:t,roots:[n.cid]}}catch(e){throw console.error(e),new Error("IPLD block creation failed")}},this.write=async function(t,n,r){try{e.existsSync("./cars")||e.mkdirSync("./cars");const{writer:a,out:i}=b.create(t);d.from(i).pipe(e.createWriteStream(`cars/${r}.car`));for(const e of n)await a.put(e),await a.close();return i}catch(e){throw console.error(e),new Error("Writing IPLD block failed")}},this.readCar=async function(t){const r={[m.code]:m,[f.code]:f,[g.code]:g},a={[c.code]:c};try{const d=e.createReadStream(t),c=await u.fromIterable(d),m=[];let f,g;var i,s=!1,o=!1;try{for(var p,y=function(e){var t,n,r,a=2;for("undefined"!=typeof Symbol&&(n=Symbol.asyncIterator,r=Symbol.iterator);a--;){if(n&&null!=(t=e[n]))return t.call(e);if(r&&null!=(t=e[r]))return new A(t.call(e));n="@@asyncIterator",r="@@iterator"}throw new TypeError("Object is not async iterable")}(c.blocks());s=!(p=await y.next()).done;s=!1){const{cid:e,bytes:t}=p.value;{const i=await l.create({cid:e,bytes:t,codec:r[e.code],hasher:a[e.multihash.code]});m.push(i);const s=i.value instanceof Uint8Array?n.utf8Decoder.decode(i.value):i.value;f=JSON.parse(JSON.stringify(s.data)),g=e.toString()}}}catch(e){o=!0,i=e}finally{try{s&&null!=y.return&&await y.return()}finally{if(o)throw i}}return{blockCid:g,data:f}}catch(e){throw console.error(e),new Error("Read Car File Failed")}},this.updatPreviousBlockCid=(e,t)=>{try{let n=e;return n.previousBlockCid=t,n}catch(e){throw console.error(e),new Error("Failed to update previous block ID")}},this.updateCar1=async function(e,t,r){let a;try{const i=n.updatPreviousBlockCid(e,r),{blocks:s,roots:o}=await n.createBlock(i);return await n.write(o,s,t),a=await n.uploadCarToIPFS(t),a}catch(e){throw console.error(e),new Error("Car File Update Failed")}},this.writeCar=async function(e,t){let r;try{const{blocks:a,roots:i}=await n.createBlock(e);return await n.write(i,a,t),r=await n.uploadCarToIPFS(t),{message:"ok",cid:r}}catch(e){console.error(e)}},this.buff2Hex=e=>"0x"+e.toString("hex"),this.getMerkelTree=async function(e){try{const t=e.map(e=>n.buff2Hex(i(e))),r=new h(t,i,{sortPairs:!0}),a=n.buff2Hex(r.getRoot());return{tree:r,root:a}}catch(e){throw console.error(e),new Error("getMerkelTree Failed")}},this.getleave=e=>this.buff2Hex(i(e)),this.verifyMerkelProof=async function(e,t,r){try{const{tree:a,root:i}=await n.getMerkelTree(r),s=n.getleave(t);return a.verify(e,s,i)}catch(e){throw console.error(e),new Error("merkel Proof Verification failed")}},this.createProof=async function(e,t){try{const r=n.getleave(e);return await n.getMerkelProof1(r,t)}catch(e){console.error(e)}}}async readCid(e){return this.invoke(`storage/readData/${e}`)}async readCarData(e){return this.invoke(`storage/createCar/${e}`)}async createCar(e,t){return this.invoke(`storage/createCar/${t}`,{method:"POST",body:JSON.stringify(e)})}async uploadCar(e){return this.invoke(`storage/uploadCar/${e}`,{method:"POST"})}async updateCar(e,t){return this.invoke(`storage/createCar/${t}`,{method:"PUT",body:JSON.stringify(e)})}async getMerkelProof(e,t){return this.invoke(`storage/getMerkelProof/${e}/${t}`,{method:"GET"})}async getMerkelProof1(e,t){try{const{tree:n}=await this.getMerkelTree(t);return n.getHexProof(e)}catch(e){throw console.error(e),new Error("Failed to get merkel proof")}}async encryptData(e,t){return w.AES.encrypt(JSON.stringify(e),t).toString()}async decryptData(e,t){const n=await this.readData(e),r=w.AES.decrypt(n.encryptedData,t);return JSON.parse(r.toString(w.enc.Utf8))}}class S extends M{constructor(...e){super(...e),this.rootFromPath="../circuit",this.rootToPath="sdk/circuit/root.zok"}async randomNumber(e){try{let t=[];for(let n=0;n<4;n++){const n=o(e,{entropy:!0});t.push(Math.abs(n.int32()).toString())}return t}catch(e){console.error(e)}}async getNullifier(e){try{const t=o(e,{entropy:!1});return Math.abs(t.int32())}catch(e){console.error(e)}}async fileSystemResolver(e,a){try{const i=n(r(n(e)),a);return t(i).toString()}catch(e){console.error(e)}}async getSource(e,t){try{return await this.fileSystemResolver(e,t)}catch(e){console.error(e)}}async getZokrateProvider(){try{return await a()}catch(e){console.error(e)}}async getArtifacts(e){try{return(await this.getZokrateProvider()).compile(e)}catch(e){console.error(e)}}async getPreImage(e){try{const t=await this.randomNumber(e),n=await this.getZokrateProvider(),r=await this.getSource("../circuit","sdk/circuit/preImage.zok"),a=await this.getArtifacts(r),{output:i}=n.computeWitness(a,t);return{params:t,preImage:JSON.parse(i)}}catch(e){throw console.error(e),new Error("ZK preImage Error")}}async generateZkProof(e,t){try{const n=s.utils.defaultAbiCoder,r=await this.getProvider(),a=t.params,o=t.preImage,p=parseInt(Math.round((new Date).getTime()/1e3).toString()),y=await this.getNullifier(e),u=await this.getZokrateProvider(),d=await this.getSource(this.rootFromPath,this.rootToPath),l=await this.getArtifacts(d),c=await r.getBlockNumber(),m=this.buff2Hex(i(n.encode(["uint","uint","uint","string"],[y,p,c,e]))),f=[...a,...o],{witness:g}=u.computeWitness(l,f),b=u.setup(l.program),h=u.generateProof(l.program,g,b.pk),w=b.vk;return{message:"ok",details:{proofBuffer:JSON.stringify(h),verifierKeyBuffer:JSON.stringify(w),nullifier:m}}}catch(e){throw console.error(e),new Error("generate zk proof error")}}async verifyZkProof(e){try{const t=e.verifierKeyBuffer,n=JSON.parse(e.proofBuffer),r=JSON.parse(t),a=(await this.getZokrateProvider()).verify(r,n);return a?{message:"Ok",isVerified:a}:{message:"invalid Proof Provided",isVerified:a}}catch(e){throw console.error(e),new Error("Verify Zk Proof error")}}}const x=[{inputs:[{internalType:"address",name:"_traceHub",type:"address"},{internalType:"address",name:"_traceAgreementImplementation",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"uint256",name:"time",type:"uint256"},{indexed:!0,internalType:"address",name:"agreementAddress",type:"address"},{indexed:!0,internalType:"uint256",name:"id",type:"uint256"}],name:"AgreementCreated",type:"event"},{inputs:[{internalType:"address",name:"agreementAddress",type:"address"}],name:"getAgreementDetais",outputs:[{components:[{internalType:"bytes32",name:"verifierRoot",type:"bytes32"},{internalType:"bytes32[]",name:"nullifiers",type:"bytes32[]"},{internalType:"string",name:"agreementUri",type:"string"},{internalType:"uint256",name:"agreementId",type:"uint256"}],internalType:"struct TraceAgreementFactory.TraceAgreementDetails",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[],name:"getFactoryAddress",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"agreementAddress",type:"address"}],name:"getId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"id",type:"uint256"}],name:"getTraceAddress",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_verifierRoot",type:"bytes32"},{internalType:"bytes32[]",name:"_nullifiers",type:"bytes32[]"},{internalType:"string",name:"agreementUri",type:"string"},{internalType:"address",name:"_traceAgreement",type:"address"},{internalType:"string",name:"enKey",type:"string"}],name:"initilizeAgreement",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"traceAdmin",type:"address"},{internalType:"address",name:"_supplier",type:"address"},{internalType:"uint256",name:"dataAvailiblity",type:"uint256"}],name:"newTraceAgreement",outputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"traceHub",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"}],D=[{inputs:[{internalType:"address",name:"hubAdmin",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"newDefaultAdmin",type:"address"}],name:"DeafultAdminChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bool",name:"accepted",type:"bool"}],name:"ProposalAccepted",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:!0,internalType:"bytes32",name:"previousAdminRole",type:"bytes32"},{indexed:!0,internalType:"bytes32",name:"newAdminRole",type:"bytes32"}],name:"RoleAdminChanged",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"hubAdmin",type:"address"}],name:"RoleGranted",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"sender",type:"address"}],name:"RoleGranted",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"hubAdmin",type:"address"}],name:"RoleRevoked",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:!0,internalType:"address",name:"account",type:"address"},{indexed:!0,internalType:"address",name:"sender",type:"address"}],name:"RoleRevoked",type:"event"},{inputs:[],name:"DEFAULT_ADMIN_ROLE",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"HUB_ADMIN",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"traceAddress",type:"address"}],name:"acceptProposal",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_traceFactory",type:"address"}],name:"addFactory",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newDeafultAdmin",type:"address"}],name:"changeDeafultAdmin",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"addr",type:"address"}],name:"checkDeafultAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"hubAdmin",type:"address"}],name:"checkHubAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"traceAddress",type:"address"},{internalType:"bytes32",name:"nullifier",type:"bytes32"}],name:"checkNullExist",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"}],name:"checkNullLength",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"},{internalType:"bytes32",name:"_nullifier",type:"bytes32"}],name:"checkNullifier",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"traceAddress",type:"address"}],name:"checkSupplierApproved",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"}],name:"getAgreementDetails",outputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"}],name:"getAgreementId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getAgreementLog",outputs:[{components:[{internalType:"address",name:"traceAgreementContract",type:"address"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"uint256",name:"createdAt",type:"uint256"},{internalType:"string",name:"uri",type:"string"},{internalType:"bytes32[]",name:"nullifiers",type:"bytes32[]"},{internalType:"string",name:"encryptionKey",type:"string"}],internalType:"struct TraceHub.Agreement[]",name:"",type:"tuple[]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"}],name:"getAgreementUri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"}],name:"getEncryptionKey",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"}],name:"getRoleAdmin",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"id",type:"uint256"}],name:"getTraceAddress",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"hubAdmin",type:"address"}],name:"grantAdminRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"grantRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"hasRole",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"traceAddress",type:"address"},{internalType:"bytes32",name:"nullifier",type:"bytes32"}],name:"initiateAgreement",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"addr",type:"address"}],name:"removeRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"renounceRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"revokeRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"},{internalType:"string",name:"agreementUri",type:"string"},{internalType:"bytes32[]",name:"_nullifiers",type:"bytes32[]"},{internalType:"uint256",name:"id",type:"uint256"},{internalType:"string",name:"enKey",type:"string"}],name:"updatAgreementLog",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"},{internalType:"string",name:"agreementUri",type:"string"}],name:"updatAgreementUri",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_traceAgreement",type:"address"},{internalType:"bytes32",name:"_nullifier",type:"bytes32"}],name:"updateNullifier",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"traceAddress",type:"address"},{internalType:"bytes32",name:"nullifier",type:"bytes32"}],name:"zkProof",outputs:[],stateMutability:"nonpayable",type:"function"}],E=[{anonymous:!1,inputs:[{indexed:!0,internalType:"uint256",name:"signCount",type:"uint256"},{indexed:!0,internalType:"bool",name:"verified",type:"bool"}],name:"Verified",type:"event"},{inputs:[],name:"activate",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_traceAdmin",type:"address"},{internalType:"address",name:"_supplier",type:"address"},{internalType:"address",name:"_factoryAddress",type:"address"},{internalType:"address",name:"_traceHub",type:"address"},{internalType:"uint256",name:"_dataAvailibality",type:"uint256"}],name:"addTraceAdmin",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"checkIsInitilized",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"checkState",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getAgreementId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getAgreementUri",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"getDataAvailibality",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getEncryptionKey",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"getSupplier",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"getTraceAdmin",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_verifierRoot",type:"bytes32"},{internalType:"bytes32[]",name:"_nullifiers",type:"bytes32[]"},{internalType:"string",name:"_agreementUri",type:"string"},{internalType:"string",name:"enKey",type:"string"}],name:"initilize",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"status",outputs:[{internalType:"enum TraceAgreement.AgreementStatus",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"traceHub",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"string",name:"_agreementUri",type:"string"}],name:"updateAgreementUri",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32[]",name:"_proof",type:"bytes32[]"},{internalType:"bytes32",name:"nullifier",type:"bytes32"},{internalType:"bytes32",name:"leaf",type:"bytes32"}],name:"verifyByOrder",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}];class C extends S{async createTraceAgreement(e,t,n,r){try{const a=await this.getFeeData(),i=new s.Contract(this.getFactoryAddress(),x,r);let o=[];const p=await i.newTraceAgreement(e,t,n,a),y=await p.wait();if(1!=y.status)return void console.log("Creation Failed");for(let e of y.events)o.push(e.event);const u=await y.events[0].args.agreementAddress,d=await y.events[0].args.id;return{message:"ok",transactionHash:y.transactionHash,details:{agreementAddress:u,agreementId:d.toString()}}}catch(e){throw console.error(e),new Error("Create Trace Agreement failed")}}async acceptProposal(e,t){try{const n=await this.getFeeData();let r=[];const a=new s.Contract(this.getTraceHubAddress(),D,t),i=await a.acceptProposal(e,n),o=await i.wait();if(1!=o.status)return void console.log("verification failed");for(let e of o.events)r.push(e.event);return await o.events[0].args.accepted}catch(e){throw console.error(e),new Error("Accept proposal error")}}async initilizeAgreement(e,t,n,r){try{const a=await this.getFeeData(),o=[],p=s.utils.defaultAbiCoder,y=await this.getProvider(),u=parseInt(Math.round((new Date).getTime()/1e3).toString()),d=await y.getBlockNumber(),l=new s.Contract(t,E,r);if(1==await l.checkIsInitilized())return void console.log("Trace Agreement already initilized");const c=await l.getDataAvailibality(),m=(await this.getVerifiersDetails(e)).details,f=this.buff2Hex(i(p.encode(["uint","uint"],[u,d]))),g=T(f,32)();let b;"1"===c.toString()?b=g:"2"===c.toString()&&(b=""),b=g;const h=await this.getPreImage(t),w=p.encode(["string"],[JSON.stringify(h)]),v={traceAddress:t,verifiersRoot:m.verifiersRoot,verifiers:e,txDetails:n,previousBlockCid:""},A={encryptedData:await this.encryptData(v,g)},k=await this.writeCar(A,t),P=await l.initilize(m.verifiersRoot,m.nullifiers,k.cid,b,a),M=await P.wait();if(1!=M.status)return void console.log("initilization failed");for(let t=0;t<e.length;t++)o.push({verifier:e[t],nullifier:m.nullifiers[t]});return{message:"ok",transactionHash:M.transactionHash,verificationDetails:o,packedProofDetails:w,encryptionKey:g,cid:k.cid}}catch(e){throw console.error(e),new Error(e)}}async createZkProof(e,t,n){try{const r=await this.getFeeData(),a=s.utils.defaultAbiCoder.decode(["string"],t),i=JSON.parse(a[0]),o=await this.generateZkProof(e,i),p=new s.Contract(this.getTraceHubAddress(),D,n);if(!await p.checkSupplierApproved(e))return void console.log("Supplier has not approved");const y=await p.zkProof(e,o.details.nullifier,r);return 1!=(await y.wait()).status?void console.log("verification failed"):o.details}catch(e){throw console.error(e),new Error("create ZK proof error")}}async activateTraceAgreement(e,t,n){try{const r=await this.getFeeData(),a=new s.Contract(this.getTraceHubAddress(),D,n);if(!await a.checkNullExist(e,t.nullifier))return void console.log("Invalid Nullifier");if("Ok"!=(await this.verifyZkProof({proofBuffer:t.proofBuffer,verifierKeyBuffer:t.verifierKeyBuffer})).message)return void console.log("Invalid ZK Proof Provided");const i=await a.initiateAgreement(e,t.nullifier,r),o=await i.wait();return 1!=o.status?void console.log("failed to initiate"):{message:"ok",transactionHash:o.transactionHash}}catch(e){throw console.error(e),new Error("Trace agreement activation error")}}async verifyByOrder(e,t,n,r){try{const a=await this.getFeeData(),i=new s.Contract(e,E,r),o=await i.getAgreementUri(),p=(await this.decryptData(o,n)).verifiers,y=await this.createProof(r.address,p),u=this.getleave(r.address);let d=[];const l=await i.verifyByOrder(y,t,u,a),c=await l.wait();if(1!=c.status)return void console.log("verification failed");for(let e of c.events)d.push(e.event);return{message:"ok",details:{verifiedCount:await c.events[0].args.signCount,verified:await c.events[0].args.verified}}}catch(e){throw console.error(e),new Error("ZKTrace Verification Error")}}async getVerifiersDetails(e){var t=this;try{let n=[];const r=s.utils.defaultAbiCoder,{root:a}=await this.getMerkelTree(e),o=parseInt(Math.round((new Date).getTime()/1e3).toString());return e.forEach(async function(e){const a=await t.getNullifier(e);n.push(t.buff2Hex(i(r.encode(["uint","uint"],[a,o]))))}),{message:"ok",details:{verifiersRoot:a,nullifiers:n}}}catch(e){throw console.error(e),new Error("get verifier details error")}}async getVerifiersProof(e){try{const t=[];for(let n=0;n<e.length;n++){const r=await this.createProof(e[n],e),a={verifier:e[n],merkelProof:await r};t.push(a)}return t}catch(e){throw console.error(e),new Error("get verifier proof error")}}async encryptionDetails(e){try{const t=await this.getProvider(),n=new s.Contract(e,E,t);return{encryptionKey:await n.getEncryptionKey(),cid:await n.getAgreementUri()}}catch(e){console.error(e)}}}class F extends C{}var I;I=F,[C].forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(t=>{Object.defineProperty(I.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t)||Object.create(null))})});export{F as default};