@0xpolygonid/js-sdk 1.28.0 → 1.29.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 (48) hide show
  1. package/README.md +1 -1
  2. package/dist/browser/esm/index.js +1288 -405
  3. package/dist/browser/esm/index.js.map +1 -1
  4. package/dist/browser/umd/index.js +24155 -23269
  5. package/dist/browser/umd/index.js.map +1 -1
  6. package/dist/node/cjs/iden3comm/constants.js +3 -1
  7. package/dist/node/cjs/iden3comm/handlers/common.js +63 -1
  8. package/dist/node/cjs/iden3comm/handlers/contract-request.js +64 -7
  9. package/dist/node/cjs/iden3comm/handlers/index.js +1 -0
  10. package/dist/node/cjs/iden3comm/handlers/problem-report.js +55 -0
  11. package/dist/node/cjs/iden3comm/types/index.js +1 -0
  12. package/dist/node/cjs/iden3comm/types/protocol/contract-request.js +6 -0
  13. package/dist/node/cjs/iden3comm/types/protocol/problem-report.js +2 -0
  14. package/dist/node/cjs/iden3comm/utils/contract-request.utils.js +16 -1
  15. package/dist/node/cjs/proof/proof-service.js +26 -0
  16. package/dist/node/cjs/schema-processor/jsonld/cache.js +15 -0
  17. package/dist/node/cjs/storage/blockchain/onchain-zkp-verifier.js +107 -16
  18. package/dist/node/cjs/storage/blockchain/state.js +5 -6
  19. package/dist/node/cjs/verifiable/constants.js +5 -2
  20. package/dist/node/esm/iden3comm/constants.js +3 -1
  21. package/dist/node/esm/iden3comm/handlers/common.js +62 -2
  22. package/dist/node/esm/iden3comm/handlers/contract-request.js +66 -9
  23. package/dist/node/esm/iden3comm/handlers/index.js +1 -0
  24. package/dist/node/esm/iden3comm/handlers/problem-report.js +28 -0
  25. package/dist/node/esm/iden3comm/types/index.js +1 -0
  26. package/dist/node/esm/iden3comm/types/protocol/contract-request.js +5 -1
  27. package/dist/node/esm/iden3comm/types/protocol/problem-report.js +1 -0
  28. package/dist/node/esm/iden3comm/utils/contract-request.utils.js +14 -1
  29. package/dist/node/esm/proof/proof-service.js +26 -0
  30. package/dist/node/esm/schema-processor/jsonld/cache.js +15 -0
  31. package/dist/node/esm/storage/blockchain/onchain-zkp-verifier.js +107 -16
  32. package/dist/node/esm/storage/blockchain/state.js +5 -6
  33. package/dist/node/esm/verifiable/constants.js +5 -2
  34. package/dist/types/iden3comm/constants.d.ts +1 -0
  35. package/dist/types/iden3comm/handlers/common.d.ts +16 -1
  36. package/dist/types/iden3comm/handlers/contract-request.d.ts +3 -1
  37. package/dist/types/iden3comm/handlers/index.d.ts +1 -0
  38. package/dist/types/iden3comm/handlers/problem-report.d.ts +17 -0
  39. package/dist/types/iden3comm/types/index.d.ts +1 -0
  40. package/dist/types/iden3comm/types/protocol/auth.d.ts +8 -0
  41. package/dist/types/iden3comm/types/protocol/contract-request.d.ts +12 -0
  42. package/dist/types/iden3comm/types/protocol/problem-report.d.ts +16 -0
  43. package/dist/types/iden3comm/utils/contract-request.utils.d.ts +7 -0
  44. package/dist/types/proof/proof-service.d.ts +14 -2
  45. package/dist/types/storage/blockchain/onchain-zkp-verifier.d.ts +10 -3
  46. package/dist/types/storage/interfaces/onchain-zkp-verifier.d.ts +18 -1
  47. package/dist/types/verifiable/constants.d.ts +3 -0
  48. package/package.json +3 -2
@@ -23,7 +23,9 @@ exports.VerifiableConstants = Object.freeze({
23
23
  IDEN3_DISPLAY_METHOD: 'https://schema.iden3.io/core/jsonld/displayMethod.jsonld',
24
24
  // JSONLDSchemaW3CCredential2018 is a schema for context with VerifiableCredential type
25
25
  W3C_CREDENTIAL_2018: 'https://www.w3.org/2018/credentials/v1',
26
- W3C_VC_DOCUMENT_2018: `{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","VerifiableCredential":{"@id":"https://www.w3.org/2018/credentials#VerifiableCredential","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","credentialSchema":{"@id":"cred:credentialSchema","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","JsonSchemaValidator2018":"cred:JsonSchemaValidator2018"}},"credentialStatus":{"@id":"cred:credentialStatus","@type":"@id"},"credentialSubject":{"@id":"cred:credentialSubject","@type":"@id"},"evidence":{"@id":"cred:evidence","@type":"@id"},"expirationDate":{"@id":"cred:expirationDate","@type":"xsd:dateTime"},"holder":{"@id":"cred:holder","@type":"@id"},"issued":{"@id":"cred:issued","@type":"xsd:dateTime"},"issuer":{"@id":"cred:issuer","@type":"@id"},"issuanceDate":{"@id":"cred:issuanceDate","@type":"xsd:dateTime"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"},"refreshService":{"@id":"cred:refreshService","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","ManualRefreshService2018":"cred:ManualRefreshService2018"}},"termsOfUse":{"@id":"cred:termsOfUse","@type":"@id"},"validFrom":{"@id":"cred:validFrom","@type":"xsd:dateTime"},"validUntil":{"@id":"cred:validUntil","@type":"xsd:dateTime"}}},"VerifiablePresentation":{"@id":"https://www.w3.org/2018/credentials#VerifiablePresentation","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","sec":"https://w3id.org/security#","holder":{"@id":"cred:holder","@type":"@id"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"},"verifiableCredential":{"@id":"cred:verifiableCredential","@type":"@id","@container":"@graph"}}},"EcdsaSecp256k1Signature2019":{"@id":"https://w3id.org/security#EcdsaSecp256k1Signature2019","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"EcdsaSecp256r1Signature2019":{"@id":"https://w3id.org/security#EcdsaSecp256r1Signature2019","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"Ed25519Signature2018":{"@id":"https://w3id.org/security#Ed25519Signature2018","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"RsaSignature2018":{"@id":"https://w3id.org/security#RsaSignature2018","@context":{"@version":1.1,"@protected":true,"challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"proof":{"@id":"https://w3id.org/security#proof","@type":"@id","@container":"@graph"}}}`
26
+ W3C_VC_DOCUMENT_2018: `{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","VerifiableCredential":{"@id":"https://www.w3.org/2018/credentials#VerifiableCredential","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","credentialSchema":{"@id":"cred:credentialSchema","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","JsonSchemaValidator2018":"cred:JsonSchemaValidator2018"}},"credentialStatus":{"@id":"cred:credentialStatus","@type":"@id"},"credentialSubject":{"@id":"cred:credentialSubject","@type":"@id"},"evidence":{"@id":"cred:evidence","@type":"@id"},"expirationDate":{"@id":"cred:expirationDate","@type":"xsd:dateTime"},"holder":{"@id":"cred:holder","@type":"@id"},"issued":{"@id":"cred:issued","@type":"xsd:dateTime"},"issuer":{"@id":"cred:issuer","@type":"@id"},"issuanceDate":{"@id":"cred:issuanceDate","@type":"xsd:dateTime"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"},"refreshService":{"@id":"cred:refreshService","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","ManualRefreshService2018":"cred:ManualRefreshService2018"}},"termsOfUse":{"@id":"cred:termsOfUse","@type":"@id"},"validFrom":{"@id":"cred:validFrom","@type":"xsd:dateTime"},"validUntil":{"@id":"cred:validUntil","@type":"xsd:dateTime"}}},"VerifiablePresentation":{"@id":"https://www.w3.org/2018/credentials#VerifiablePresentation","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","cred":"https://www.w3.org/2018/credentials#","sec":"https://w3id.org/security#","holder":{"@id":"cred:holder","@type":"@id"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"},"verifiableCredential":{"@id":"cred:verifiableCredential","@type":"@id","@container":"@graph"}}},"EcdsaSecp256k1Signature2019":{"@id":"https://w3id.org/security#EcdsaSecp256k1Signature2019","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"EcdsaSecp256r1Signature2019":{"@id":"https://w3id.org/security#EcdsaSecp256r1Signature2019","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"Ed25519Signature2018":{"@id":"https://w3id.org/security#Ed25519Signature2018","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","xsd":"http://www.w3.org/2001/XMLSchema#","challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"RsaSignature2018":{"@id":"https://w3id.org/security#RsaSignature2018","@context":{"@version":1.1,"@protected":true,"challenge":"sec:challenge","created":{"@id":"http://purl.org/dc/terms/created","@type":"xsd:dateTime"},"domain":"sec:domain","expires":{"@id":"sec:expiration","@type":"xsd:dateTime"},"jws":"sec:jws","nonce":"sec:nonce","proofPurpose":{"@id":"sec:proofPurpose","@type":"@vocab","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","assertionMethod":{"@id":"sec:assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"sec:authenticationMethod","@type":"@id","@container":"@set"}}},"proofValue":"sec:proofValue","verificationMethod":{"@id":"sec:verificationMethod","@type":"@id"}}},"proof":{"@id":"https://w3id.org/security#proof","@type":"@id","@container":"@graph"}}}`,
27
+ IDEN3_PROOFS_DEFINITION_DOCUMENT: `{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","Iden3SparseMerkleTreeProof":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3SparseMerkleTreeProof","@context":{"@version":1.1,"@protected":true,"@propagate":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","@vocab":"https://schema.iden3.io/core/vocab/Iden3SparseMerkleTreeProof.md#","xsd":"http://www.w3.org/2001/XMLSchema#","mtp":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#SparseMerkleTreeProof","@type":"SparseMerkleTreeProof"},"coreClaim":{"@id":"coreClaim","@type":"xsd:string"},"issuerData":{"@id":"issuerData","@context":{"@version":1.1,"state":{"@id":"state","@context":{"txId":{"@id":"txId","@type":"xsd:string"},"blockTimestamp":{"@id":"blockTimestamp","@type":"xsd:integer"},"blockNumber":{"@id":"blockNumber","@type":"xsd:integer"},"rootOfRoots":{"@id":"rootOfRoots","@type":"xsd:string"},"claimsTreeRoot":{"@id":"claimsTreeRoot","@type":"xsd:string"},"revocationTreeRoot":{"@id":"revocationTreeRoot","@type":"xsd:string"},"authCoreClaim":{"@id":"authCoreClaim","@type":"xsd:string"},"value":{"@id":"value","@type":"xsd:string"}}}}}}},"SparseMerkleTreeProof":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#SparseMerkleTreeProof","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","sec":"https://w3id.org/security#","smt-proof-vocab":"https://schema.iden3.io/core/vocab/SparseMerkleTreeProof.md#","xsd":"http://www.w3.org/2001/XMLSchema#","existence":{"@id":"smt-proof-vocab:existence","@type":"xsd:boolean"},"revocationNonce":{"@id":"smt-proof-vocab:revocationNonce","@type":"xsd:number"},"siblings":{"@id":"smt-proof-vocab:siblings","@container":"@list"},"nodeAux":"@nest","hIndex":{"@id":"smt-proof-vocab:hIndex","@nest":"nodeAux","@type":"xsd:string"},"hValue":{"@id":"smt-proof-vocab:hValue","@nest":"nodeAux","@type":"xsd:string"}}},"BJJSignature2021":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#BJJSignature2021","@context":{"@version":1.1,"@protected":true,"id":"@id","@vocab":"https://schema.iden3.io/core/vocab/BJJSignature2021.md#","@propagate":true,"type":"@type","xsd":"http://www.w3.org/2001/XMLSchema#","coreClaim":{"@id":"coreClaim","@type":"xsd:string"},"issuerData":{"@id":"issuerData","@context":{"@version":1.1,"authCoreClaim":{"@id":"authCoreClaim","@type":"xsd:string"},"mtp":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#SparseMerkleTreeProof","@type":"SparseMerkleTreeProof"},"revocationStatus":{"@id":"revocationStatus","@type":"@id"},"state":{"@id":"state","@context":{"@version":1.1,"rootOfRoots":{"@id":"rootOfRoots","@type":"xsd:string"},"claimsTreeRoot":{"@id":"claimsTreeRoot","@type":"xsd:string"},"revocationTreeRoot":{"@id":"revocationTreeRoot","@type":"xsd:string"},"value":{"@id":"value","@type":"xsd:string"}}}}},"signature":{"@id":"signature","@type":"https://w3id.org/security#multibase"},"domain":"https://w3id.org/security#domain","creator":{"@id":"creator","@type":"http://www.w3.org/2001/XMLSchema#string"},"challenge":"https://w3id.org/security#challenge","created":{"@id":"created","@type":"http://www.w3.org/2001/XMLSchema#dateTime"},"expires":{"@id":"https://w3id.org/security#expiration","@type":"http://www.w3.org/2001/XMLSchema#dateTime"},"nonce":"https://w3id.org/security#nonce","proofPurpose":{"@id":"https://w3id.org/security#proofPurpose","@type":"@vocab","@context":{"@protected":true,"id":"@id","type":"@type","assertionMethod":{"@id":"https://w3id.org/security#assertionMethod","@type":"@id","@container":"@set"},"authentication":{"@id":"https://w3id.org/security#authenticationMethod","@type":"@id","@container":"@set"},"capabilityInvocation":{"@id":"https://w3id.org/security#capabilityInvocationMethod","@type":"@id","@container":"@set"},"capabilityDelegation":{"@id":"https://w3id.org/security#capabilityDelegationMethod","@type":"@id","@container":"@set"},"keyAgreement":{"@id":"https://w3id.org/security#keyAgreementMethod","@type":"@id","@container":"@set"}}},"proofValue":{"@id":"https://w3id.org/security#proofValue","@type":"https://w3id.org/security#multibase"},"verificationMethod":{"@id":"https://w3id.org/security#verificationMethod","@type":"@id"}}},"Iden3ReverseSparseMerkleTreeProof":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3ReverseSparseMerkleTreeProof","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","iden3-reverse-sparse-merkle-tree-proof-vocab":"https://schema.iden3.io/core/vocab/Iden3ReverseSparseMerkleTreeProof.md#","revocationNonce":"iden3-reverse-sparse-merkle-tree-proof-vocab:revocationNonce","statusIssuer":{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type"},"@id":"iden3-reverse-sparse-merkle-tree-proof-vocab:statusIssuer"}}},"Iden3commRevocationStatusV1.0":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3commRevocationStatusV1.0","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","iden3-comm-revocation-statusV1.0-vocab":"https://schema.iden3.io/core/vocab/Iden3commRevocationStatusV1.0.md#","revocationNonce":"iden3-comm-revocation-statusV1.0-vocab:revocationNonce","statusIssuer":{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type"},"@id":"iden3-comm-revocation-statusV1.0-vocab:statusIssuer"}}},"Iden3OnchainSparseMerkleTreeProof2023":{"@id":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3OnchainSparseMerkleTreeProof2023","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","iden3-onchain-sparse-merkle-tree-proof-2023-vocab":"https://schema.iden3.io/core/vocab/Iden3OnchainSparseMerkleTreeProof2023.md#","revocationNonce":"iden3-onchain-sparse-merkle-tree-proof-2023-vocab:revocationNonce","statusIssuer":{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type"},"@id":"iden3-onchain-sparse-merkle-tree-proof-2023-vocab:statusIssuer"}}},"JsonSchema2023":"https://www.w3.org/ns/credentials#JsonSchema2023","Iden3RefreshService2023":"https://schema.iden3.io/core/jsonld/iden3proofs.jsonld#Iden3RefreshService2023"}}`,
28
+ IDEN3_DISPLAY_METHOD_DEFINITION_DOCUMENT: `{"@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","displayMethod":{"@id":"https://schema.iden3.io/core/vocab/displayMethod.md#displayMethod","@type":"@id","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","Iden3BasicDisplayMethodV1":"https://schema.iden3.io/core/vocab/displayMethod.md#Iden3BasicDisplayMethodV1"}}}}`
27
29
  },
28
30
  // JsonSchema2023 JSON schema for verification of Iden3Credential
29
31
  JSON_SCHEMA_VALIDATOR: 'JsonSchema2023',
@@ -38,7 +40,8 @@ exports.VerifiableConstants = Object.freeze({
38
40
  AUTH_BJJ_CREDENTIAL_SCHEMA_JSON_URL: 'https://schema.iden3.io/core/json/auth.json',
39
41
  AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD_URL: 'https://schema.iden3.io/core/jsonld/auth.jsonld',
40
42
  AUTH_BJJ_CREDENTIAL_TYPE: 'AuthBJJCredential',
41
- AUTH_BJJ_CREDENTIAL_SCHEMA_JSON: `{"$schema":"http://json-schema.org/draft-07/schema#","$metadata":{"uris":{"jsonLdContext":"https://schema.iden3.io/core/jsonld/auth.jsonld","jsonSchema":"https://schema.iden3.io/core/json/auth.json"},"serialization":{"indexDataSlotA":"x","indexDataSlotB":"y"}},"type":"object","required":["@context","id","type","issuanceDate","credentialSubject","credentialSchema","credentialStatus","issuer"],"properties":{"@context":{"type":["string","array","object"]},"id":{"type":"string"},"type":{"type":["string","array"],"items":{"type":"string"}},"issuer":{"type":["string","object"],"format":"uri","required":["id"],"properties":{"id":{"type":"string","format":"uri"}}},"issuanceDate":{"type":"string","format":"date-time"},"expirationDate":{"type":"string","format":"date-time"},"credentialSchema":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string","format":"uri"},"type":{"type":"string"}}},"credentialSubject":{"type":"object","required":["x","y"],"properties":{"id":{"title":"Credential Subject ID","type":"string","format":"uri"},"x":{"type":"string"},"y":{"type":"string"}}}}}`
43
+ AUTH_BJJ_CREDENTIAL_SCHEMA_JSON: `{"$schema":"http://json-schema.org/draft-07/schema#","$metadata":{"uris":{"jsonLdContext":"https://schema.iden3.io/core/jsonld/auth.jsonld","jsonSchema":"https://schema.iden3.io/core/json/auth.json"},"serialization":{"indexDataSlotA":"x","indexDataSlotB":"y"}},"type":"object","required":["@context","id","type","issuanceDate","credentialSubject","credentialSchema","credentialStatus","issuer"],"properties":{"@context":{"type":["string","array","object"]},"id":{"type":"string"},"type":{"type":["string","array"],"items":{"type":"string"}},"issuer":{"type":["string","object"],"format":"uri","required":["id"],"properties":{"id":{"type":"string","format":"uri"}}},"issuanceDate":{"type":"string","format":"date-time"},"expirationDate":{"type":"string","format":"date-time"},"credentialSchema":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string","format":"uri"},"type":{"type":"string"}}},"credentialSubject":{"type":"object","required":["x","y"],"properties":{"id":{"title":"Credential Subject ID","type":"string","format":"uri"},"x":{"type":"string"},"y":{"type":"string"}}}}}`,
44
+ AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD: `{"@context":[{"@version":1.1,"@protected":true,"id":"@id","type":"@type","AuthBJJCredential":{"@id":"https://schema.iden3.io/core/jsonld/auth.jsonld#AuthBJJCredential","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","iden3_serialization":"iden3:v1:slotIndexA=x&slotIndexB=y","xsd":"http://www.w3.org/2001/XMLSchema#","auth-vocab":"https://schema.iden3.io/core/vocab/auth.md#","x":{"@id":"auth-vocab:x","@type":"xsd:positiveInteger"},"y":{"@id":"auth-vocab:y","@type":"xsd:positiveInteger"}}},"Iden3StateInfo2023":{"@id":"https://schema.iden3.io/core/jsonld/auth.jsonld#Iden3StateInfo2023","@context":{"@version":1.1,"@protected":true,"id":"@id","type":"@type","xsd":"http://www.w3.org/2001/XMLSchema#","@vocab":"https://schema.iden3.io/core/vocab/state-info.md#","@propagate":true,"stateContractAddress":{"@id":"stateContractAddress","@type":"xsd:string"},"published":{"@id":"published","@type":"xsd:boolean"},"info":{"@id":"info","@type":"@id","@context":{"@protected":true,"id":{"@id":"id","@type":"xsd:string"},"state":{"@id":"state","@type":"xsd:string"},"replacedByState":{"@id":"replacedByState","@type":"xsd:string"},"createdAtTimestamp":{"@id":"createdAtTimestamp","@type":"xsd:string"},"replacedAtTimestamp":{"@id":"replacedAtTimestamp","@type":"xsd:string"},"createdAtBlock":{"@id":"createdAtBlock","@type":"xsd:string"},"replacedAtBlock":{"@id":"replacedAtBlock","@type":"xsd:string"}}},"global":{"@id":"global","@type":"@id","@context":{"@protected":true,"sec":"https://w3id.org/security#","root":{"@id":"root","@type":"xsd:string"},"replacedByRoot":{"@id":"replacedByRoot","@type":"xsd:string"},"createdAtTimestamp":{"@id":"createdAtTimestamp","@type":"xsd:string"},"replacedAtTimestamp":{"@id":"replacedAtTimestamp","@type":"xsd:string"},"createdAtBlock":{"@id":"createdAtBlock","@type":"xsd:string"},"replacedAtBlock":{"@id":"replacedAtBlock","@type":"xsd:string"},"proof":{"@id":"sec:proof","@type":"@id","@container":"@graph"}}}}}}]}`
42
45
  }
43
46
  });
44
47
  /**
@@ -47,7 +47,9 @@ export const PROTOCOL_MESSAGE_TYPE = Object.freeze({
47
47
  // DiscoveryProtocolQueriesMessageType is type for didcomm discovery protocol queries
48
48
  DISCOVERY_PROTOCOL_QUERIES_MESSAGE_TYPE: `${DIDCOMM_PROTOCOL}discover-features/2.0/queries`,
49
49
  // DiscoveryProtocolDiscloseMessageType is type for didcomm discovery protocol disclose
50
- DISCOVERY_PROTOCOL_DISCLOSE_MESSAGE_TYPE: `${DIDCOMM_PROTOCOL}discover-features/2.0/disclose`
50
+ DISCOVERY_PROTOCOL_DISCLOSE_MESSAGE_TYPE: `${DIDCOMM_PROTOCOL}discover-features/2.0/disclose`,
51
+ // ProblemReportMessageType is type for didcomm problem report
52
+ PROBLEM_REPORT_MESSAGE_TYPE: `${DIDCOMM_PROTOCOL}report-problem/2.0/problem-report`
51
53
  });
52
54
  /**
53
55
  * Media types for iden3 comm communication protocol
@@ -1,6 +1,10 @@
1
1
  import { getRandomBytes } from '@iden3/js-crypto';
2
- import { mergeObjects } from '../../utils';
3
- import { getUnixTimestamp } from '@iden3/js-iden3-core';
2
+ import { AuthMethod } from '../types';
3
+ import { bytesToHex, mergeObjects } from '../../utils';
4
+ import { BytesHelper, DID, getUnixTimestamp } from '@iden3/js-iden3-core';
5
+ import { CircuitId } from '../../circuits';
6
+ import { AcceptJwsAlgorithms, defaultAcceptProfile, MediaType } from '../constants';
7
+ import { packZkpProof, prepareZkpProof } from '../utils';
4
8
  /**
5
9
  * Groups the ZeroKnowledgeProofRequest objects based on their groupId.
6
10
  * Returns a Map where the key is the groupId and the value is an object containing the query and linkNonce.
@@ -80,6 +84,59 @@ export const processZeroKnowledgeProofRequests = async (to, requests, from, proo
80
84
  }
81
85
  return zkpResponses;
82
86
  };
87
+ /**
88
+ * Processes auth proof requests.
89
+ *
90
+ * @param to - The identifier of the recipient.
91
+ * @param proofService - The proof service.
92
+ * @param opts - Additional options for processing the requests.
93
+ * @returns A promise that resolves to an auth proof response.
94
+ */
95
+ export const processProofAuth = async (to, proofService, opts) => {
96
+ if (!opts.acceptProfile) {
97
+ opts.acceptProfile = defaultAcceptProfile;
98
+ }
99
+ if (!opts.skipRevocation) {
100
+ opts.skipRevocation = true;
101
+ }
102
+ switch (opts.acceptProfile.env) {
103
+ case MediaType.ZKPMessage:
104
+ if (!opts.acceptProfile.circuits) {
105
+ throw new Error('Circuit not specified in accept profile');
106
+ }
107
+ for (const circuitId of opts.acceptProfile.circuits) {
108
+ if (!opts.supportedCircuits.includes(circuitId)) {
109
+ throw new Error(`Circuit ${circuitId} is not supported`);
110
+ }
111
+ const zkpRes = await proofService.generateAuthProof(circuitId, to, { challenge: opts.challenge, skipRevocation: opts.skipRevocation });
112
+ switch (circuitId) {
113
+ case CircuitId.AuthV2: {
114
+ const preparedZkpProof = prepareZkpProof(zkpRes.proof);
115
+ const zkProofEncoded = packZkpProof(zkpRes.pub_signals, preparedZkpProof.a, preparedZkpProof.b, preparedZkpProof.c);
116
+ return {
117
+ authMethod: AuthMethod.AUTHV2,
118
+ proof: zkProofEncoded
119
+ };
120
+ }
121
+ }
122
+ }
123
+ throw new Error(`Auth method is not supported`);
124
+ case MediaType.SignedMessage:
125
+ if (!opts.acceptProfile.alg || opts.acceptProfile.alg.length === 0) {
126
+ throw new Error('Algorithm not specified');
127
+ }
128
+ if (opts.acceptProfile.alg[0] === AcceptJwsAlgorithms.ES256KR) {
129
+ const ethIdProof = packEthIdentityProof(to);
130
+ return {
131
+ authMethod: AuthMethod.ETH_IDENTITY,
132
+ proof: ethIdProof
133
+ };
134
+ }
135
+ throw new Error(`Algorithm ${opts.acceptProfile.alg[0]} not supported`);
136
+ default:
137
+ throw new Error('Accept env not supported');
138
+ }
139
+ };
83
140
  /**
84
141
  * Verifies that the expires_time field of a message is not in the past. Throws an error if it is.
85
142
  *
@@ -90,3 +147,6 @@ export const verifyExpiresTime = (message) => {
90
147
  throw new Error('Message expired');
91
148
  }
92
149
  };
150
+ export const packEthIdentityProof = (did) => {
151
+ return `0x${bytesToHex(BytesHelper.intToBytes(DID.idFromDID(did).bigInt()))}`;
152
+ };
@@ -1,9 +1,10 @@
1
1
  import { CircuitId } from '../../circuits/models';
2
- import { PROTOCOL_MESSAGE_TYPE } from '../constants';
2
+ import { defaultAcceptProfile, PROTOCOL_MESSAGE_TYPE, ProtocolVersion } from '../constants';
3
3
  import { DID, ChainIds, getUnixTimestamp } from '@iden3/js-iden3-core';
4
4
  import { FunctionSignatures } from '../../storage';
5
- import { processZeroKnowledgeProofRequests, verifyExpiresTime } from './common';
5
+ import { processProofAuth, processZeroKnowledgeProofRequests, verifyExpiresTime } from './common';
6
6
  import { AbstractMessageHandler } from './message-handler';
7
+ import { parseAcceptProfile } from '../utils';
7
8
  /**
8
9
  *
9
10
  * Allows to process ContractInvokeRequest protocol message
@@ -19,6 +20,7 @@ export class ContractRequestHandler extends AbstractMessageHandler {
19
20
  * @param {IPackageManager} _packerMgr - package manager to unpack message envelope
20
21
  * @param {IProofService} _proofService - proof service to verify zk proofs
21
22
  * @param {IOnChainZKPVerifier} _zkpVerifier - zkp verifier to submit response
23
+ * @param {IOnChainVerifierMultiQuery} _verifierMultiQuery - verifier multi-query to submit response
22
24
  *
23
25
  */
24
26
  constructor(_packerMgr, _proofService, _zkpVerifier) {
@@ -30,7 +32,12 @@ export class ContractRequestHandler extends AbstractMessageHandler {
30
32
  CircuitId.AuthV2,
31
33
  CircuitId.AtomicQueryMTPV2OnChain,
32
34
  CircuitId.AtomicQuerySigV2OnChain,
33
- CircuitId.AtomicQueryV3OnChain
35
+ CircuitId.AtomicQueryV3OnChain,
36
+ // Now we support off-chain circuits on-chain
37
+ // TODO: We need to create validators for them
38
+ CircuitId.AuthV2,
39
+ CircuitId.AtomicQueryV3,
40
+ CircuitId.LinkedMultiQuery10
34
41
  ];
35
42
  }
36
43
  async handle(message, ctx) {
@@ -66,19 +73,64 @@ export class ContractRequestHandler extends AbstractMessageHandler {
66
73
  });
67
74
  const methodId = message.body.transaction_data.method_id.replace('0x', '');
68
75
  switch (methodId) {
69
- case FunctionSignatures.SubmitZKPResponseV2:
70
- return this._zkpVerifier.submitZKPResponseV2(ethSigner, message.body.transaction_data, zkpResponses);
76
+ case FunctionSignatures.SubmitZKPResponseV2: {
77
+ const txHashZkpResponsesMap = await this._zkpVerifier.submitZKPResponseV2(ethSigner, message.body.transaction_data, zkpResponses);
78
+ const response = new Map();
79
+ for (const [txHash, zkpResponses] of txHashZkpResponsesMap) {
80
+ response.set(txHash, { responses: zkpResponses });
81
+ }
82
+ return response;
83
+ }
71
84
  case FunctionSignatures.SubmitZKPResponseV1: {
72
85
  const txHashZkpResponseMap = await this._zkpVerifier.submitZKPResponse(ethSigner, message.body.transaction_data, zkpResponses);
73
86
  const response = new Map();
74
87
  for (const [txHash, zkpResponse] of txHashZkpResponseMap) {
75
- response.set(txHash, [zkpResponse]);
88
+ response.set(txHash, { responses: [zkpResponse] });
76
89
  }
77
90
  return response;
78
91
  }
92
+ case FunctionSignatures.SubmitResponse: {
93
+ // We need to
94
+ // 1. Generate auth proof from message.body.accept -> authResponse
95
+ // 2. Generate proofs for each query in scope -> zkpResponses
96
+ // Build auth response from accept
97
+ if (!message.to) {
98
+ throw new Error(`failed message. empty 'to' field`);
99
+ }
100
+ // Get first supported accept profile and pass it to processProofAuth
101
+ const acceptProfile = this.getFirstSupportedProfile(PROTOCOL_MESSAGE_TYPE.CONTRACT_INVOKE_REQUEST_MESSAGE_TYPE, message.body.accept);
102
+ const identifier = DID.parse(message.to);
103
+ const authResponse = await processProofAuth(identifier, this._proofService, {
104
+ supportedCircuits: this._supportedCircuits,
105
+ acceptProfile,
106
+ challenge: challenge,
107
+ skipRevocation: true
108
+ });
109
+ return this._zkpVerifier.submitResponse(ethSigner, message.body.transaction_data, authResponse, zkpResponses);
110
+ }
79
111
  default:
80
- throw new Error(`Not supported method id. Only '${FunctionSignatures.SubmitZKPResponseV1} and ${FunctionSignatures.SubmitZKPResponseV2} are supported.'`);
112
+ throw new Error(`Not supported method id. Only '${FunctionSignatures.SubmitZKPResponseV1}, ${FunctionSignatures.SubmitZKPResponseV2} and ${FunctionSignatures.SubmitResponse} are supported.'`);
113
+ }
114
+ }
115
+ getFirstSupportedProfile(responseType, profile) {
116
+ if (profile?.length) {
117
+ for (const acceptProfileString of profile) {
118
+ // 1. check protocol version
119
+ const acceptProfile = parseAcceptProfile(acceptProfileString);
120
+ const responseTypeVersion = Number(responseType.split('/').at(-2));
121
+ if (acceptProfile.protocolVersion !== ProtocolVersion.V1 ||
122
+ (acceptProfile.protocolVersion === ProtocolVersion.V1 &&
123
+ (responseTypeVersion < 1 || responseTypeVersion >= 2))) {
124
+ continue;
125
+ }
126
+ // 2. check packer support
127
+ if (this._packerMgr.isProfileSupported(acceptProfile.env, acceptProfileString)) {
128
+ return acceptProfile;
129
+ }
130
+ }
81
131
  }
132
+ // if we don't have supported profiles, we use default
133
+ return defaultAcceptProfile;
82
134
  }
83
135
  /**
84
136
  * unpacks contract-invoke request
@@ -100,7 +152,7 @@ export class ContractRequestHandler extends AbstractMessageHandler {
100
152
  * @private
101
153
  * @beta
102
154
  * @param {ContractInvokeRequest} request - ContractInvokeRequest
103
- * @param { Map<string, ZeroKnowledgeProofResponse[]>} responses - map tx hash to array of ZeroKnowledgeProofResponses
155
+ * @param { Map<string, ZeroKnowledgeInvokeResponse>} responses - map tx hash to array of ZeroKnowledgeInvokeResponse
104
156
  * @returns `Promise<ContractInvokeResponse>`
105
157
  */
106
158
  async createContractInvokeResponse(request, txHashToZkpResponseMap) {
@@ -117,12 +169,17 @@ export class ContractRequestHandler extends AbstractMessageHandler {
117
169
  created_time: getUnixTimestamp(new Date())
118
170
  };
119
171
  for (const [txHash, zkpResponses] of txHashToZkpResponseMap) {
120
- for (const zkpResponse of zkpResponses) {
172
+ for (const zkpResponse of zkpResponses.responses) {
121
173
  contractInvokeResponse.body.scope.push({
122
174
  txHash,
123
175
  ...zkpResponse
124
176
  });
125
177
  }
178
+ contractInvokeResponse.body = {
179
+ ...contractInvokeResponse.body,
180
+ crossChainProofs: zkpResponses.crossChainProofs ?? [],
181
+ authProofs: zkpResponses.authProofs ?? []
182
+ };
126
183
  }
127
184
  return contractInvokeResponse;
128
185
  }
@@ -8,3 +8,4 @@ export * from './credential-proposal';
8
8
  export * from './message-handler';
9
9
  export * from './payment';
10
10
  export * from './discovery-protocol';
11
+ export * from './problem-report';
@@ -0,0 +1,28 @@
1
+ import * as uuid from 'uuid';
2
+ import { MediaType, PROTOCOL_MESSAGE_TYPE } from '../constants';
3
+ /**
4
+ * @beta
5
+ * createProblemReportMessage is a function to create didcomm protocol problem report message
6
+ * @param pthid - parent thread id
7
+ * @param code - problem report code
8
+ * @param opts - problem report options
9
+ * @returns `ProblemReportMessage`
10
+ */
11
+ export function createProblemReportMessage(pthid, code, opts) {
12
+ const uuidv4 = uuid.v4();
13
+ return {
14
+ id: uuidv4,
15
+ pthid: pthid,
16
+ typ: MediaType.PlainMessage,
17
+ type: PROTOCOL_MESSAGE_TYPE.PROBLEM_REPORT_MESSAGE_TYPE,
18
+ ack: opts?.ack,
19
+ body: {
20
+ code: code,
21
+ comment: opts?.comment,
22
+ args: opts?.args,
23
+ escalate_to: opts?.escalate_to
24
+ },
25
+ from: opts?.from,
26
+ to: opts?.to
27
+ };
28
+ }
@@ -8,6 +8,7 @@ export * from './protocol/proposal-request';
8
8
  export * from './protocol/payment';
9
9
  export * from './protocol/accept-profile';
10
10
  export * from './protocol/discovery-protocol';
11
+ export * from './protocol/problem-report';
11
12
  export * from './packer';
12
13
  export * from './models';
13
14
  export * from './packageManager';
@@ -1 +1,5 @@
1
- export {};
1
+ export var AuthMethod;
2
+ (function (AuthMethod) {
3
+ AuthMethod["AUTHV2"] = "authV2";
4
+ AuthMethod["ETH_IDENTITY"] = "ethIdentity";
5
+ })(AuthMethod || (AuthMethod = {}));
@@ -1,4 +1,4 @@
1
- import { keccak256 } from 'ethers';
1
+ import { ethers, keccak256 } from 'ethers';
2
2
  import { byteEncoder, hexToBytes, isEthereumIdentity } from '../../utils';
3
3
  import { CircuitId } from '../../circuits';
4
4
  import { Hex } from '@iden3/js-crypto';
@@ -52,3 +52,16 @@ export async function prepareAuthV2ZeroKnowledgeResponse(address, senderDid, pro
52
52
  }
53
53
  ];
54
54
  }
55
+ export const packZkpProof = (inputs, a, b, c) => {
56
+ return new ethers.AbiCoder().encode(['uint256[] inputs', 'uint256[2]', 'uint256[2][2]', 'uint256[2]'], [inputs, a, b, c]);
57
+ };
58
+ export const prepareZkpProof = (proof) => {
59
+ return {
60
+ a: proof.pi_a.slice(0, 2),
61
+ b: [
62
+ [proof.pi_b[0][1], proof.pi_b[0][0]],
63
+ [proof.pi_b[1][1], proof.pi_b[1][0]]
64
+ ],
65
+ c: proof.pi_c.slice(0, 2)
66
+ };
67
+ };
@@ -128,6 +128,32 @@ export class ProofService {
128
128
  pub_signals
129
129
  };
130
130
  }
131
+ /** {@inheritdoc IProofService.generateAuthProof} */
132
+ async generateAuthProof(circuitId, identifier, opts) {
133
+ if (!opts) {
134
+ opts = {
135
+ skipRevocation: false,
136
+ challenge: 0n
137
+ };
138
+ }
139
+ let zkProof;
140
+ switch (circuitId) {
141
+ case CircuitId.AuthV2:
142
+ {
143
+ const challenge = opts.challenge
144
+ ? BytesHelper.intToBytes(opts.challenge).reverse()
145
+ : new Uint8Array(32);
146
+ zkProof = await this.generateAuthV2Proof(challenge, identifier);
147
+ }
148
+ return {
149
+ circuitId: circuitId,
150
+ proof: zkProof.proof,
151
+ pub_signals: zkProof.pub_signals
152
+ };
153
+ default:
154
+ throw new Error(`CircuitId ${circuitId} is not supported`);
155
+ }
156
+ }
131
157
  /** {@inheritdoc IProofService.transitState} */
132
158
  async transitState(did, oldTreeState, isOldStateGenesis, stateStorage, // for compatibility with previous versions we leave this parameter
133
159
  ethSigner) {
@@ -7,12 +7,27 @@ import { VerifiableConstants } from '../../verifiable';
7
7
  * @returns Promise<DocumentLoader>
8
8
  */
9
9
  const doc = JSON.parse(VerifiableConstants.JSONLD_SCHEMA.W3C_VC_DOCUMENT_2018);
10
+ const docIden3Proofs = JSON.parse(VerifiableConstants.JSONLD_SCHEMA.IDEN3_PROOFS_DEFINITION_DOCUMENT);
11
+ const docIden3DisplayMethod = JSON.parse(VerifiableConstants.JSONLD_SCHEMA.IDEN3_DISPLAY_METHOD_DEFINITION_DOCUMENT);
12
+ const docIden3AuthBJJ = JSON.parse(VerifiableConstants.AUTH.AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD);
10
13
  export const cacheLoader = (opts) => {
11
14
  const cache = new Map();
12
15
  cache.set(VerifiableConstants.JSONLD_SCHEMA.W3C_CREDENTIAL_2018, {
13
16
  document: doc,
14
17
  documentUrl: VerifiableConstants.JSONLD_SCHEMA.W3C_CREDENTIAL_2018
15
18
  });
19
+ cache.set(VerifiableConstants.JSONLD_SCHEMA.IDEN3_CREDENTIAL, {
20
+ document: docIden3Proofs,
21
+ documentUrl: VerifiableConstants.JSONLD_SCHEMA.IDEN3_PROOFS_DEFINITION_DOCUMENT
22
+ });
23
+ cache.set(VerifiableConstants.JSONLD_SCHEMA.IDEN3_DISPLAY_METHOD, {
24
+ document: docIden3DisplayMethod,
25
+ documentUrl: VerifiableConstants.JSONLD_SCHEMA.IDEN3_DISPLAY_METHOD_DEFINITION_DOCUMENT
26
+ });
27
+ cache.set(VerifiableConstants.AUTH.AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD_URL, {
28
+ document: docIden3AuthBJJ,
29
+ documentUrl: VerifiableConstants.AUTH.AUTH_BJJ_CREDENTIAL_SCHEMA_JSONLD
30
+ });
16
31
  return async (url) => {
17
32
  let remoteDoc = cache.get(url);
18
33
  if (remoteDoc) {
@@ -1,11 +1,14 @@
1
1
  import { JsonRpcProvider, Contract, ethers } from 'ethers';
2
2
  import abi from './abi/ZkpVerifier.json';
3
+ //import { UniversalVerifier } from '@iden3/universal-verifier-v2-abi';
4
+ import { IVerifierABI } from '@iden3/universal-verifier-v2-abi';
3
5
  import { TransactionService } from '../../blockchain';
4
6
  import { chainIDfromDID, DID, Id } from '@iden3/js-iden3-core';
5
7
  import { AtomicQueryMTPV2OnChainPubSignals, AtomicQuerySigV2OnChainPubSignals, AtomicQueryV3OnChainPubSignals, AuthV2PubSignals, CircuitId } from '../../circuits';
6
8
  import { byteEncoder, DIDDocumentSignature, resolveDidDocument } from '../../utils';
7
9
  import { poseidon } from '@iden3/js-crypto';
8
10
  import { Hash } from '@iden3/js-merkletree';
11
+ import { packZkpProof, prepareZkpProof } from '../../iden3comm/utils';
9
12
  const maxGasLimit = 10000000n;
10
13
  /**
11
14
  * Supported function signature for SubmitZKPResponse
@@ -20,6 +23,8 @@ export var FunctionSignatures;
20
23
  FunctionSignatures["SubmitZKPResponseV1"] = "b68967e2";
21
24
  //function submitZKPResponseV2(tuple[](uint64 requestId,bytes zkProof,bytes data),bytes crossChainProof)
22
25
  FunctionSignatures["SubmitZKPResponseV2"] = "ade09fcd";
26
+ //function submitResponse(tuple(string authMethod,bytes proof),tuple(uint256 requestId,bytes proof,bytes metadata)[],bytes crossChainProof)
27
+ FunctionSignatures["SubmitResponse"] = "06c86a91";
23
28
  })(FunctionSignatures || (FunctionSignatures = {}));
24
29
  /**
25
30
  * OnChainZKPVerifier is a class that allows to interact with the OnChainZKPVerifier contract
@@ -45,16 +50,8 @@ export class OnChainZKPVerifier {
45
50
  }
46
51
  const requestID = zkProofResponse.id;
47
52
  const inputs = zkProofResponse.pub_signals;
48
- const payload = [
49
- requestID,
50
- inputs,
51
- zkProofResponse.proof.pi_a.slice(0, 2),
52
- [
53
- [zkProofResponse.proof.pi_b[0][1], zkProofResponse.proof.pi_b[0][0]],
54
- [zkProofResponse.proof.pi_b[1][1], zkProofResponse.proof.pi_b[1][0]]
55
- ],
56
- zkProofResponse.proof.pi_c.slice(0, 2)
57
- ];
53
+ const preparedZkpProof = prepareZkpProof(zkProofResponse.proof);
54
+ const payload = [requestID, inputs, preparedZkpProof.a, preparedZkpProof.b, preparedZkpProof.c];
58
55
  return payload;
59
56
  }
60
57
  /**
@@ -152,6 +149,80 @@ export class OnChainZKPVerifier {
152
149
  const { txnHash } = await transactionService.sendTransactionRequest(ethSigner, request);
153
150
  return new Map().set(txnHash, zkProofResponses);
154
151
  }
152
+ /**
153
+ * {@inheritDoc IOnChainVerifierMultiQuery.submitResponse}
154
+ */
155
+ async submitResponse(ethSigner, txData, authResponse, responses) {
156
+ const chainConfig = this._configs.find((i) => i.chainId == txData.chain_id);
157
+ if (!chainConfig) {
158
+ throw new Error(`config for chain id ${txData.chain_id} was not found`);
159
+ }
160
+ if (txData.method_id.replace('0x', '') !== FunctionSignatures.SubmitResponse) {
161
+ throw new Error(`submitResponse function doesn't implement requested method id. Only '0x${FunctionSignatures.SubmitResponse}' is supported.`);
162
+ }
163
+ if (!this._opts?.didResolverUrl) {
164
+ throw new Error(`did resolver url required for crosschain verification`);
165
+ }
166
+ const provider = new JsonRpcProvider(chainConfig.url, chainConfig.chainId);
167
+ ethSigner = ethSigner.connect(provider);
168
+ const txDataArgs = await this.prepareTxArgsSubmit(txData, authResponse, responses);
169
+ const feeData = await provider.getFeeData();
170
+ const maxFeePerGas = chainConfig.maxFeePerGas
171
+ ? BigInt(chainConfig.maxFeePerGas)
172
+ : feeData.maxFeePerGas;
173
+ const maxPriorityFeePerGas = chainConfig.maxPriorityFeePerGas
174
+ ? BigInt(chainConfig.maxPriorityFeePerGas)
175
+ : feeData.maxPriorityFeePerGas;
176
+ const verifierContract = new Contract(txData.contract_address, IVerifierABI);
177
+ const txRequestData = await verifierContract.submitResponse.populateTransaction(...txDataArgs);
178
+ const request = {
179
+ to: txData.contract_address,
180
+ data: txRequestData.data,
181
+ maxFeePerGas,
182
+ maxPriorityFeePerGas
183
+ };
184
+ let gasLimit;
185
+ try {
186
+ gasLimit = await ethSigner.estimateGas(request);
187
+ }
188
+ catch (e) {
189
+ gasLimit = maxGasLimit;
190
+ }
191
+ request.gasLimit = gasLimit;
192
+ const transactionService = new TransactionService(provider);
193
+ const { txnHash } = await transactionService.sendTransactionRequest(ethSigner, request);
194
+ // return multiple responses for all the responses (single and grouped)
195
+ return new Map().set(txnHash, {
196
+ responses: responses,
197
+ authProofs: [authResponse],
198
+ crossChainProofs: [txDataArgs[2]]
199
+ });
200
+ }
201
+ static async prepareTxArgsSubmit(resolverUrl, txData, authResponse, responses) {
202
+ if (txData.method_id.replace('0x', '') !== FunctionSignatures.SubmitResponse) {
203
+ throw new Error(`submit cross chain doesn't implement requested method id. Only '0x${FunctionSignatures.SubmitResponse}' is supported.`);
204
+ }
205
+ const gistUpdateArr = [];
206
+ const stateUpdateArr = [];
207
+ const payloadResponses = [];
208
+ // Process all the responses
209
+ for (const zkProof of responses) {
210
+ const { requestID, zkProofEncoded, metadata } = await this._processProof(zkProof);
211
+ payloadResponses.push({
212
+ requestId: requestID,
213
+ proof: zkProofEncoded,
214
+ metadata: metadata
215
+ });
216
+ }
217
+ const crossChainProofs = this.packCrossChainProofs(gistUpdateArr, stateUpdateArr);
218
+ return [authResponse, payloadResponses, crossChainProofs];
219
+ }
220
+ async prepareTxArgsSubmit(txData, authResponse, responses) {
221
+ if (!this._opts?.didResolverUrl) {
222
+ throw new Error(`did resolver url required for crosschain verification`);
223
+ }
224
+ return OnChainZKPVerifier.prepareTxArgsSubmit(this._opts.didResolverUrl, txData, authResponse, responses);
225
+ }
155
226
  static getCrossChainResolvers(source, txDataChainId, type, didResolverUrl) {
156
227
  return [
157
228
  ...new Set(source.map((info) => JSON.stringify({
@@ -193,10 +264,8 @@ export class OnChainZKPVerifier {
193
264
  });
194
265
  continue;
195
266
  }
196
- const zkProofEncoded = this.packZkpProof(inputs, zkProof.proof.pi_a.slice(0, 2), [
197
- [zkProof.proof.pi_b[0][1], zkProof.proof.pi_b[0][0]],
198
- [zkProof.proof.pi_b[1][1], zkProof.proof.pi_b[1][0]]
199
- ], zkProof.proof.pi_c.slice(0, 2));
267
+ const preparedZkpProof = prepareZkpProof(zkProof.proof);
268
+ const zkProofEncoded = packZkpProof(inputs, preparedZkpProof.a, preparedZkpProof.b, preparedZkpProof.c);
200
269
  const stateInfo = this.getOnChainGistRootStatePubSignals(proofCircuitId, inputs);
201
270
  const chainId = txData.chain_id;
202
271
  const gistUpdateResolutions = this.getCrossChainResolvers(stateInfo.gists, chainId, 'gist', resolverUrl);
@@ -239,8 +308,30 @@ export class OnChainZKPVerifier {
239
308
  }
240
309
  return OnChainZKPVerifier.prepareTxArgsSubmitV2(this._opts.didResolverUrl, txData, zkProofResponses);
241
310
  }
242
- static packZkpProof(inputs, a, b, c) {
243
- return new ethers.AbiCoder().encode(['uint256[] inputs', 'uint256[2]', 'uint256[2][2]', 'uint256[2]'], [inputs, a, b, c]);
311
+ static async _processProof(zkProof) {
312
+ const requestID = zkProof.id;
313
+ const inputs = zkProof.pub_signals;
314
+ if (!this._supportedCircuits.includes(zkProof.circuitId)) {
315
+ throw new Error(`Circuit ${zkProof.circuitId} not supported by OnChainZKPVerifier`);
316
+ }
317
+ const preparedZkpProof = prepareZkpProof(zkProof.proof);
318
+ const zkProofEncoded = packZkpProof(inputs, preparedZkpProof.a, preparedZkpProof.b, preparedZkpProof.c);
319
+ const metadataArr = [];
320
+ if (zkProof.vp) {
321
+ for (const key in zkProof.vp.verifiableCredential.credentialSubject) {
322
+ if (key === '@type') {
323
+ continue;
324
+ }
325
+ const metadataValue = poseidon.hashBytes(byteEncoder.encode(JSON.stringify(zkProof.vp.verifiableCredential.credentialSubject[key])));
326
+ const bytesValue = byteEncoder.encode(metadataValue.toString());
327
+ metadataArr.push({
328
+ key,
329
+ value: bytesValue
330
+ });
331
+ }
332
+ }
333
+ const metadata = metadataArr.length ? this.packMetadatas(metadataArr) : '0x';
334
+ return { requestID, zkProofEncoded, metadata };
244
335
  }
245
336
  static packCrossChainProofs(gistUpdateArr, stateUpdateArr) {
246
337
  const proofs = [];