From f14640958487454f71d4977eebb3b7554f733aa1 Mon Sep 17 00:00:00 2001 From: Raphael Flechtner Date: Mon, 22 Jul 2024 17:56:17 +0200 Subject: [PATCH 1/5] refactor: move did helpers interfaces to types --- .../src/blockchain/Blockchain.ts | 14 +++--------- packages/sdk-js/src/DidHelpers/checkResult.ts | 9 ++++++-- packages/sdk-js/src/DidHelpers/common.ts | 6 ++--- .../sdk-js/src/DidHelpers/createDid.spec.ts | 5 ++--- packages/sdk-js/src/DidHelpers/createDid.ts | 15 +++++++------ .../sdk-js/src/DidHelpers/deactivateDid.ts | 2 +- .../sdk-js/src/DidHelpers/selectSigner.ts | 8 ++++--- packages/sdk-js/src/DidHelpers/service.ts | 9 ++++++-- .../sdk-js/src/DidHelpers/transact.spec.ts | 7 ++++-- packages/sdk-js/src/DidHelpers/transact.ts | 10 ++++++--- .../src/DidHelpers/verificationMethod.ts | 10 ++++----- packages/sdk-js/src/DidHelpers/w3names.ts | 2 +- .../interfaces.ts => types/src/DidHelpers.ts} | 22 +++++++++---------- packages/types/src/Imported.ts | 3 +++ packages/types/src/Signers.ts | 7 ++++++ packages/types/src/index.ts | 1 + tests/integration/utils.ts | 5 +++-- tests/testUtils/TestUtils.ts | 3 ++- 18 files changed, 79 insertions(+), 59 deletions(-) rename packages/{sdk-js/src/DidHelpers/interfaces.ts => types/src/DidHelpers.ts} (89%) diff --git a/packages/chain-helpers/src/blockchain/Blockchain.ts b/packages/chain-helpers/src/blockchain/Blockchain.ts index c22e90e56..73128db21 100644 --- a/packages/chain-helpers/src/blockchain/Blockchain.ts +++ b/packages/chain-helpers/src/blockchain/Blockchain.ts @@ -5,25 +5,22 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { ApiPromise } from '@polkadot/api' +import { ApiPromise, SubmittableResult } from '@polkadot/api' import type { TxWithEvent } from '@polkadot/api-derive/types' import type { Vec } from '@polkadot/types' import type { Call, Extrinsic } from '@polkadot/types/interfaces' import type { AnyNumber, IMethod } from '@polkadot/types/types' import type { BN } from '@polkadot/util' + // eslint-disable-next-line @typescript-eslint/no-unused-vars -- doing this instead of import '@kiltprotocol/augment-api' to avoid creating an import at runtime import type * as _ from '@kiltprotocol/augment-api' import type { ISubmittableResult, KeyringPair, - KiltAddress, - SignerInterface, SubmittableExtrinsic, SubscriptionPromise, + TransactionSigner, } from '@kiltprotocol/types' - -import { SubmittableResult } from '@polkadot/api' - import { ConfigService } from '@kiltprotocol/config' import { SDKErrors, Signers } from '@kiltprotocol/utils' @@ -170,11 +167,6 @@ export async function submitSignedTx( export const dispatchTx = submitSignedTx -export type TransactionSigner = SignerInterface< - 'Ecrecover-Secp256k1-Blake2b' | 'Sr25519' | 'Ed25519', - KiltAddress -> - /** * Signs a SubmittableExtrinsic. * diff --git a/packages/sdk-js/src/DidHelpers/checkResult.ts b/packages/sdk-js/src/DidHelpers/checkResult.ts index c71e8d5fd..8e99ae83d 100644 --- a/packages/sdk-js/src/DidHelpers/checkResult.ts +++ b/packages/sdk-js/src/DidHelpers/checkResult.ts @@ -12,13 +12,18 @@ import type { ApiPromise } from '@polkadot/api' import type { SubmittableResultValue } from '@polkadot/api/types' import type { BlockNumber } from '@polkadot/types/interfaces' import { u8aToHex, u8aToU8a } from '@polkadot/util' + import type { FrameSystemEventRecord as EventRecord, SpRuntimeDispatchError, } from '@kiltprotocol/augment-api' import { resolver as DidResolver, signersForDid } from '@kiltprotocol/did' -import type { Did, HexString } from '@kiltprotocol/types' -import type { SharedArguments, TransactionResult } from './interfaces.js' +import type { + Did, + HexString, + SharedArguments, + TransactionResult, +} from '@kiltprotocol/types' function mapError(err: SpRuntimeDispatchError, api: ApiPromise): Error { if (err.isModule) { diff --git a/packages/sdk-js/src/DidHelpers/common.ts b/packages/sdk-js/src/DidHelpers/common.ts index bcf2ceced..653a4dc46 100644 --- a/packages/sdk-js/src/DidHelpers/common.ts +++ b/packages/sdk-js/src/DidHelpers/common.ts @@ -12,10 +12,10 @@ import { Blockchain } from '@kiltprotocol/chain-helpers' import { multibaseKeyToDidKey } from '@kiltprotocol/did' import type { - AcceptedPublicKeyEncodings, + DidHelpersAcceptedPublicKeyEncodings, SharedArguments, TransactionHandlers, -} from './interfaces.js' +} from '@kiltprotocol/types' export async function submitImpl( getSubmittable: TransactionHandlers['getSubmittable'], @@ -40,7 +40,7 @@ export async function submitImpl( return submittable.checkResult(result) } -export function convertPublicKey(pk: AcceptedPublicKeyEncodings): { +export function convertPublicKey(pk: DidHelpersAcceptedPublicKeyEncodings): { publicKey: Uint8Array type: string } { diff --git a/packages/sdk-js/src/DidHelpers/createDid.spec.ts b/packages/sdk-js/src/DidHelpers/createDid.spec.ts index 3949d1e75..9055b9e32 100644 --- a/packages/sdk-js/src/DidHelpers/createDid.spec.ts +++ b/packages/sdk-js/src/DidHelpers/createDid.spec.ts @@ -5,17 +5,16 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { KiltKeyringPair } from '@kiltprotocol/types' +import { resolver } from '@kiltprotocol/did' +import type { KiltKeyringPair, TransactionResult } from '@kiltprotocol/types' import { Crypto } from '@kiltprotocol/utils' import { SubmittableResult } from '@polkadot/api' -import { resolver } from '@kiltprotocol/did' import { ApiMocks, createLocalDemoFullDidFromKeypair, } from '../../../../tests/testUtils/index.js' import { ConfigService } from '../index.js' import { createDid } from './createDid.js' -import { TransactionResult } from './interfaces.js' const mockedApi = ApiMocks.createAugmentedApi() jest.mock('@kiltprotocol/did', () => { diff --git a/packages/sdk-js/src/DidHelpers/createDid.ts b/packages/sdk-js/src/DidHelpers/createDid.ts index 285fd5472..c5f63d76d 100644 --- a/packages/sdk-js/src/DidHelpers/createDid.ts +++ b/packages/sdk-js/src/DidHelpers/createDid.ts @@ -12,16 +12,17 @@ import { type NewDidVerificationKey, signingMethodTypes, } from '@kiltprotocol/did' -import type { KiltAddress, SignerInterface } from '@kiltprotocol/types' +import type { + DidHelpersAcceptedPublicKeyEncodings, + KiltAddress, + SharedArguments, + SignerInterface, + TransactionHandlers, +} from '@kiltprotocol/types' import { Crypto, Signers } from '@kiltprotocol/utils' import { checkResultImpl } from './checkResult.js' import { convertPublicKey, submitImpl } from './common.js' -import type { - AcceptedPublicKeyEncodings, - SharedArguments, - TransactionHandlers, -} from './interfaces.js' function implementsSignerInterface(input: any): input is SignerInterface { return 'algorithm' in input && 'id' in input && 'sign' in input @@ -36,7 +37,7 @@ function implementsSignerInterface(input: any): input is SignerInterface { */ export function createDid( options: Omit & { - fromPublicKey: AcceptedPublicKeyEncodings + fromPublicKey: DidHelpersAcceptedPublicKeyEncodings } ): TransactionHandlers { const getSubmittable: TransactionHandlers['getSubmittable'] = async ( diff --git a/packages/sdk-js/src/DidHelpers/deactivateDid.ts b/packages/sdk-js/src/DidHelpers/deactivateDid.ts index 1b684059f..a35fb0546 100644 --- a/packages/sdk-js/src/DidHelpers/deactivateDid.ts +++ b/packages/sdk-js/src/DidHelpers/deactivateDid.ts @@ -5,7 +5,7 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { SharedArguments, TransactionHandlers } from './interfaces.js' +import type { SharedArguments, TransactionHandlers } from '@kiltprotocol/types' import { transactInternal } from './transact.js' /** diff --git a/packages/sdk-js/src/DidHelpers/selectSigner.ts b/packages/sdk-js/src/DidHelpers/selectSigner.ts index 7f83b1ff6..2cf7efe44 100644 --- a/packages/sdk-js/src/DidHelpers/selectSigner.ts +++ b/packages/sdk-js/src/DidHelpers/selectSigner.ts @@ -6,11 +6,13 @@ */ import { signersForDid } from '@kiltprotocol/did' -import type { DidUrl, SignerInterface } from '@kiltprotocol/types' +import type { + DidUrl, + SignerInterface, + SharedArguments, +} from '@kiltprotocol/types' import { Signers } from '@kiltprotocol/utils' -import type { SharedArguments } from './interfaces.js' - /** * Selects and returns a DID signer for a given purpose and algorithm. * diff --git a/packages/sdk-js/src/DidHelpers/service.ts b/packages/sdk-js/src/DidHelpers/service.ts index f6e346a26..95b07563e 100644 --- a/packages/sdk-js/src/DidHelpers/service.ts +++ b/packages/sdk-js/src/DidHelpers/service.ts @@ -6,8 +6,13 @@ */ import { serviceToChain, urlFragmentToChain } from '@kiltprotocol/did' -import type { DidUrl, Service, UriFragment } from '@kiltprotocol/types' -import { SharedArguments, TransactionHandlers } from './interfaces.js' +import type { + DidUrl, + Service, + SharedArguments, + TransactionHandlers, + UriFragment, +} from '@kiltprotocol/types' import { transactInternal } from './transact.js' /** diff --git a/packages/sdk-js/src/DidHelpers/transact.spec.ts b/packages/sdk-js/src/DidHelpers/transact.spec.ts index 378eb1f27..da9d3cdb5 100644 --- a/packages/sdk-js/src/DidHelpers/transact.spec.ts +++ b/packages/sdk-js/src/DidHelpers/transact.spec.ts @@ -6,7 +6,11 @@ */ import { authorizeTx, resolver } from '@kiltprotocol/did' -import type { DidDocument, KiltKeyringPair } from '@kiltprotocol/types' +import type { + DidDocument, + KiltKeyringPair, + TransactionResult, +} from '@kiltprotocol/types' import { Crypto } from '@kiltprotocol/utils' import { SubmittableResult } from '@polkadot/api' @@ -16,7 +20,6 @@ import { } from '../../../../tests/testUtils/index.js' import { makeAttestationCreatedEvents } from '../../../../tests/testUtils/testData.js' import { ConfigService } from '../index.js' -import { TransactionResult } from './interfaces.js' import { transact } from './transact.js' jest.mock('@kiltprotocol/did', () => { diff --git a/packages/sdk-js/src/DidHelpers/transact.ts b/packages/sdk-js/src/DidHelpers/transact.ts index 393f32bf7..ad0474043 100644 --- a/packages/sdk-js/src/DidHelpers/transact.ts +++ b/packages/sdk-js/src/DidHelpers/transact.ts @@ -9,11 +9,15 @@ import type { Extrinsic } from '@polkadot/types/interfaces' import { Blockchain } from '@kiltprotocol/chain-helpers' import { authorizeTx, signersForDid } from '@kiltprotocol/did' -import type { KiltAddress, SubmittableExtrinsic } from '@kiltprotocol/types' +import type { + KiltAddress, + SharedArguments, + SubmittableExtrinsic, + TransactionHandlers, +} from '@kiltprotocol/types' -import { submitImpl } from './common.js' -import type { SharedArguments, TransactionHandlers } from './interfaces.js' import { checkResultImpl } from './checkResult.js' +import { submitImpl } from './common.js' /** * Instructs a transaction (state transition) as this DID (with this DID as the origin). diff --git a/packages/sdk-js/src/DidHelpers/verificationMethod.ts b/packages/sdk-js/src/DidHelpers/verificationMethod.ts index 252d52a1b..686c399b7 100644 --- a/packages/sdk-js/src/DidHelpers/verificationMethod.ts +++ b/packages/sdk-js/src/DidHelpers/verificationMethod.ts @@ -15,14 +15,12 @@ import type { DidUrl, SubmittableExtrinsic, VerificationRelationship, + DidHelpersAcceptedPublicKeyEncodings, + SharedArguments, + TransactionHandlers, } from '@kiltprotocol/types' import { convertPublicKey } from './common.js' -import type { - AcceptedPublicKeyEncodings, - SharedArguments, - TransactionHandlers, -} from './interfaces.js' import { transactInternal } from './transact.js' /** @@ -36,7 +34,7 @@ import { transactInternal } from './transact.js' */ export function setVerificationMethod( options: SharedArguments & { - publicKey: AcceptedPublicKeyEncodings + publicKey: DidHelpersAcceptedPublicKeyEncodings relationship: VerificationRelationship } ): TransactionHandlers { diff --git a/packages/sdk-js/src/DidHelpers/w3names.ts b/packages/sdk-js/src/DidHelpers/w3names.ts index 5feeed056..fee5a416c 100644 --- a/packages/sdk-js/src/DidHelpers/w3names.ts +++ b/packages/sdk-js/src/DidHelpers/w3names.ts @@ -5,7 +5,7 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { SharedArguments, TransactionHandlers } from './interfaces.js' +import type { SharedArguments, TransactionHandlers } from '@kiltprotocol/types' import { transactInternal } from './transact.js' /** diff --git a/packages/sdk-js/src/DidHelpers/interfaces.ts b/packages/types/src/DidHelpers.ts similarity index 89% rename from packages/sdk-js/src/DidHelpers/interfaces.ts rename to packages/types/src/DidHelpers.ts index 4c91ad866..3e78176ef 100644 --- a/packages/sdk-js/src/DidHelpers/interfaces.ts +++ b/packages/types/src/DidHelpers.ts @@ -5,17 +5,15 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { ApiPromise } from '@polkadot/api' -import type { SubmittableResultValue } from '@polkadot/api/types' -import type { GenericEvent } from '@polkadot/types' - -import type { Blockchain } from '@kiltprotocol/chain-helpers' +import type { DidDocument } from './Did' import type { - DidDocument, + ApiPromise, + GenericEvent, HexString, KeyringPair, - SignerInterface, -} from '@kiltprotocol/types' + SubmittableResultValue, +} from './Imported' +import type { SignerInterface, TransactionSigner } from './Signers' export interface TransactionResult { status: 'confirmed' | 'failed' | 'rejected' | 'unknown' @@ -94,7 +92,7 @@ type Base58Btc = string /** Multibase encoding of a public- or private key including multicodec variant flag. */ export type KeyMultibaseEncoded = `z${Base58Btc}` -export type AcceptedSigners = +export type DidHelpersAcceptedSigners = | SignerInterface | KeyringPair | { @@ -105,8 +103,8 @@ export type AcceptedSigners = export type SharedArguments = { didDocument: DidDocument api: ApiPromise - signers: AcceptedSigners[] - submitter: KeyringPair | Blockchain.TransactionSigner + signers: DidHelpersAcceptedSigners[] + submitter: KeyringPair | TransactionSigner } type PublicKeyAndType = { @@ -114,7 +112,7 @@ type PublicKeyAndType = { type: KeyringPair['type'] | 'x25519' } -export type AcceptedPublicKeyEncodings = +export type DidHelpersAcceptedPublicKeyEncodings = | KeyMultibaseEncoded | { publicKeyMultibase: KeyMultibaseEncoded } | PublicKeyAndType // interface allows KeyringPair too diff --git a/packages/types/src/Imported.ts b/packages/types/src/Imported.ts index 1d46e3095..012d72d3e 100644 --- a/packages/types/src/Imported.ts +++ b/packages/types/src/Imported.ts @@ -15,3 +15,6 @@ export type { HexString } from '@polkadot/util/types' export type { Prefix } from '@polkadot/util-crypto/address/types' export type { SubmittableExtrinsic } from '@polkadot/api/promise/types' export type { KeyringPair } from '@polkadot/keyring/types' +export type { ApiPromise } from '@polkadot/api' +export type { SubmittableResultValue } from '@polkadot/api/types' +export type { GenericEvent } from '@polkadot/types' diff --git a/packages/types/src/Signers.ts b/packages/types/src/Signers.ts index cbfe18add..c74b863db 100644 --- a/packages/types/src/Signers.ts +++ b/packages/types/src/Signers.ts @@ -5,6 +5,8 @@ * found in the LICENSE file in the root directory of this source tree. */ +import type { KiltAddress } from './Address' + export type SignerInterface< Alg extends string = string, Id extends string = string @@ -13,3 +15,8 @@ export type SignerInterface< id: Id sign: (input: { data: Uint8Array }) => Promise } + +export type TransactionSigner = SignerInterface< + 'Ecrecover-Secp256k1-Blake2b' | 'Sr25519' | 'Ed25519', + KiltAddress +> diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 446592fa1..190b35f81 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -26,3 +26,4 @@ export * from './DidResolver.js' export * from './PublicCredential.js' export * from './Imported.js' export * from './Signers.js' +export * from './DidHelpers.js' diff --git a/tests/integration/utils.ts b/tests/integration/utils.ts index 6a20a9ffc..c718a7e0d 100644 --- a/tests/integration/utils.ts +++ b/tests/integration/utils.ts @@ -24,6 +24,7 @@ import type { KiltKeyringPair, SubmittableExtrinsic, SubscriptionPromise, + TransactionSigner, } from '@kiltprotocol/types' import { Crypto } from '@kiltprotocol/utils' @@ -155,7 +156,7 @@ export const nftNameCType = CType.fromProperties('NFT collection name', { // Submits resolving when IS_IN_BLOCK export async function submitTx( extrinsic: SubmittableExtrinsic, - submitter: KeyringPair | Blockchain.TransactionSigner, + submitter: KeyringPair | TransactionSigner, resolveOn?: SubscriptionPromise.ResultEvaluator ): Promise { await Blockchain.signAndSubmitTx(extrinsic, submitter, { @@ -164,7 +165,7 @@ export async function submitTx( } export async function endowAccounts( - faucet: KeyringPair | Blockchain.TransactionSigner, + faucet: KeyringPair | TransactionSigner, addresses: string[], resolveOn?: SubscriptionPromise.ResultEvaluator ): Promise { diff --git a/tests/testUtils/TestUtils.ts b/tests/testUtils/TestUtils.ts index 0e1609695..9d9eb4ebc 100644 --- a/tests/testUtils/TestUtils.ts +++ b/tests/testUtils/TestUtils.ts @@ -16,6 +16,7 @@ import type { KiltKeyringPair, SignerInterface, SubmittableExtrinsic, + TransactionSigner, UriFragment, VerificationMethod, VerificationRelationship, @@ -422,7 +423,7 @@ export async function getStoreTxFromDidDocument( // It takes the auth key from the light DID and use it as attestation and delegation key as well. export async function createFullDidFromLightDid( - payer: KiltKeyringPair | Blockchain.TransactionSigner, + payer: KiltKeyringPair | TransactionSigner, lightDidForId: DidDocument, signer: StoreDidCallback ): Promise { From f8913d6b68d6f0047484420da650c22d940948db Mon Sep 17 00:00:00 2001 From: Raphael Flechtner Date: Mon, 22 Jul 2024 18:17:09 +0200 Subject: [PATCH 2/5] refactor: make sure issuer/holder functions can work with did helpers --- .../src/V1/KiltAttestationProofV1.ts | 203 +++++++++--------- packages/credentials/src/holder.ts | 9 +- packages/credentials/src/interfaces.ts | 23 +- packages/credentials/src/issuer.ts | 14 +- .../src/suites/KiltAttestationProofV1.spec.ts | 24 +-- .../src/suites/KiltAttestationProofV1.ts | 6 +- tests/bundle/bundle-test.ts | 10 +- tests/integration/didHelpers.spec.ts | 36 +++- 8 files changed, 186 insertions(+), 139 deletions(-) diff --git a/packages/credentials/src/V1/KiltAttestationProofV1.ts b/packages/credentials/src/V1/KiltAttestationProofV1.ts index 3dc4995c2..04b866ea8 100644 --- a/packages/credentials/src/V1/KiltAttestationProofV1.ts +++ b/packages/credentials/src/V1/KiltAttestationProofV1.ts @@ -5,7 +5,17 @@ * found in the LICENSE file in the root directory of this source tree. */ +import type { ApiPromise } from '@polkadot/api' +import type { QueryableStorageEntry } from '@polkadot/api/types' +import type { Option, u64, Vec } from '@polkadot/types' +import type { + AccountId, + Extrinsic, + Hash, +} from '@polkadot/types/interfaces/types.js' +import type { IEventData } from '@polkadot/types/types' import { + hexToU8a, stringToU8a, u8aCmp, u8aConcatStrict, @@ -19,40 +29,35 @@ import { encodeAddress, randomAsU8a, } from '@polkadot/util-crypto' -import type { ApiPromise } from '@polkadot/api' -import type { QueryableStorageEntry } from '@polkadot/api/types' -import type { Option, u64, Vec } from '@polkadot/types' -import type { - AccountId, - EventRecord, - Extrinsic, - Hash, -} from '@polkadot/types/interfaces/types.js' -import type { IEventData } from '@polkadot/types/types' +import type { + FrameSystemEventRecord, + RuntimeCommonAuthorizationAuthorizationId, +} from '@kiltprotocol/augment-api' +import { Blockchain } from '@kiltprotocol/chain-helpers' +import { ConfigService } from '@kiltprotocol/config' import { authorizeTx, + fromChain, getFullDid, + signersForDid, validateDid, - fromChain, } from '@kiltprotocol/did' -import { JsonSchema, SDKErrors, Caip19, Signers } from '@kiltprotocol/utils' -import { ConfigService } from '@kiltprotocol/config' -import { Blockchain } from '@kiltprotocol/chain-helpers' import type { - FrameSystemEventRecord, - RuntimeCommonAuthorizationAuthorizationId, -} from '@kiltprotocol/augment-api' -import type { - DidDocument, Did, + DidDocument, + HexString, ICType, IDelegationNode, KiltAddress, - SignerInterface, + SharedArguments, + TransactionResult, } from '@kiltprotocol/types' -import * as CType from '../ctype/index.js' +import { Caip19, JsonSchema, SDKErrors, Signers } from '@kiltprotocol/utils' +import { CTypeLoader } from '../ctype/CTypeLoader.js' +import * as CType from '../ctype/index.js' +import { HolderOptions } from '../interfaces.js' import { DEFAULT_CREDENTIAL_CONTEXTS, validateStructure as validateCredentialStructure, @@ -60,26 +65,25 @@ import { } from './KiltCredentialV1.js' import { fromGenesisAndRootHash } from './KiltRevocationStatusV1.js' import { - jsonLdExpandCredentialSubject, - ExpandedContents, - delegationIdFromAttesterDelegation, - getDelegationNodeIdForCredential, assertMatchingConnection, credentialIdFromRootHash, credentialIdToRootHash, - KILT_CREDENTIAL_IRI_PREFIX, + delegationIdFromAttesterDelegation, + ExpandedContents, + getDelegationNodeIdForCredential, + jsonLdExpandCredentialSubject, KILT_ATTESTER_DELEGATION_V1_TYPE, KILT_ATTESTER_LEGITIMATION_V1_TYPE, + KILT_CREDENTIAL_IRI_PREFIX, spiritnetGenesisHash, } from './common.js' +import { KiltRevocationStatusV1 } from './index.js' import type { CredentialSubject, KiltAttestationProofV1, KiltAttesterLegitimationV1, KiltCredentialV1, } from './types.js' -import { CTypeLoader } from '../ctype/CTypeLoader.js' -import { KiltRevocationStatusV1 } from './index.js' export type Interface = KiltAttestationProofV1 @@ -659,42 +663,55 @@ export function finalizeProof( } } -export interface TransactionResult { - status: 'InBlock' | 'Finalized' - includedAt: { blockHash: Uint8Array; blockHeight?: BigInt; blockTime?: Date } - events?: EventRecord[] +interface SimplifiedTransactionResult { + block: { hash: HexString } } -type CustomHandlers = { - authorizeTx: (tx: Extrinsic) => Promise - submitTx: (tx: Extrinsic) => Promise -} -type SignersAndSubmitter = { - submitterAccount: KiltAddress - signers: readonly SignerInterface[] -} -export type IssueOpts = - | (CustomHandlers & Partial) - | (Partial & SignersAndSubmitter) - -async function defaultTxSubmit( - tx: Extrinsic, - submitterAccount: KiltAddress, - signers: readonly SignerInterface[], - api: ApiPromise -): Promise { - const extrinsic = api.tx(tx) - const signed = extrinsic.isSigned - ? extrinsic - : await extrinsic.signAsync(submitterAccount, { - signer: Signers.getPolkadotSigner(signers), - }) - const result = await Blockchain.submitSignedTx(signed, { +export type IssueOpts = { + submitter: + | KiltAddress + | (( + args: Pick & { + call: Extrinsic + } + ) => Promise) +} & Pick + +async function defaultTxSubmit({ + didDocument, + call, + signers, + submitter, +}: Omit & { + call: Extrinsic + submitter: KiltAddress +}): Promise { + let extrinsic = await authorizeTx( + didDocument, + call, + await signersForDid(didDocument, ...signers), + submitter + ) + + if (!extrinsic.isSigned) { + const accountSigners = ( + await Promise.all( + signers.map((keypair) => + 'algorithm' in keypair + ? [keypair] + : Signers.getSignersForKeypair({ keypair }) + ) + ) + ).flat() + extrinsic = await extrinsic.signAsync(submitter, { + signer: Signers.getPolkadotSigner(accountSigners), + }) + } + const result = await Blockchain.submitSignedTx(extrinsic, { resolveOn: Blockchain.IS_FINALIZED, }) const blockHash = result.status.asFinalized - const { events } = result - return { status: 'Finalized', includedAt: { blockHash }, events } + return { block: { hash: blockHash.toHex() } } } /** @@ -715,7 +732,7 @@ async function defaultTxSubmit( */ export async function issue( credential: Omit, - issuer: Did | DidDocument, + issuer: DidDocument, options: IssueOpts ): Promise { const updatedCredential = { @@ -726,47 +743,39 @@ export async function issue( const api = ConfigService.get('api') const call = api.tx.attestation.add(...callArgs) - const { - signers, - submitterAccount, - authorizeTx: customAuthorizeTx, - submitTx: customSubmitTx, - ...otherParams - } = options + const { signers, submitter } = options - if ( - !(customAuthorizeTx && customSubmitTx) && - !(signers && submitterAccount) - ) { - throw new Error( - '`signers` and `submitterAccount` are required options if authorizeTx or submitTx are not given' - ) + const args: Pick & { + call: Extrinsic + } = { + didDocument: issuer, + signers, + api, + call, } - - /* eslint-disable @typescript-eslint/no-non-null-assertion -- we've checked the appropriate combination of parameters above, but typescript does not follow */ - const didSigned = customAuthorizeTx - ? await customAuthorizeTx(call) - : await authorizeTx(issuer, call, signers!, submitterAccount!, otherParams) - - const transactionPromise = customSubmitTx - ? customSubmitTx(didSigned) - : defaultTxSubmit(didSigned, submitterAccount!, signers!, api) - /* eslint-enable @typescript-eslint/no-non-null-assertion */ - - const { - status, - includedAt: { blockHash, blockTime }, - } = await transactionPromise - - if (status !== 'Finalized' && status !== 'InBlock') { - throw new SDKErrors.SDKError( - `Unexpected transaction status ${status}; the transaction should be "InBlock" or "Finalized" for issuance to continue` - ) + const transactionPromise = + typeof submitter === 'function' + ? submitter(args) + : defaultTxSubmit({ + ...args, + submitter, + }) + + let result = await transactionPromise + if ('status' in result) { + if (result.status !== 'confirmed') { + throw new SDKErrors.SDKError( + `Unexpected transaction status ${result.status}; the transaction should be "confirmed" for issuance to continue` + ) + } + result = result.asConfirmed } - const timestamp = - blockTime ?? - new Date((await api.query.timestamp.now.at(blockHash)).toNumber()) + const blockHash = hexToU8a(result.block.hash) + + const timestamp = new Date( + (await (await api.at(blockHash)).query.timestamp.now()).toNumber() + ) return finalizeProof(updatedCredential, proof, { blockHash, timestamp, diff --git a/packages/credentials/src/holder.ts b/packages/credentials/src/holder.ts index ef981f433..73cdf026e 100644 --- a/packages/credentials/src/holder.ts +++ b/packages/credentials/src/holder.ts @@ -10,6 +10,7 @@ import type { CryptoSuite } from '@kiltprotocol/jcs-data-integrity-proofs-common import { Did } from '@kiltprotocol/types' import { SDKErrors } from '@kiltprotocol/utils' +import { signersForDid } from '@kiltprotocol/did' import { KiltAttestationProofV1, KiltCredentialV1 } from './V1/index.js' import { VerifiableCredential, VerifiablePresentation } from './V1/types.js' @@ -159,13 +160,13 @@ export async function createPresentation( now?: Date } = {} ): Promise { - const { did, didDocument, signers } = holder + const { didDocument, signers } = holder const { validFrom, validUntil, verifier } = presentationOptions const { proofPurpose, proofType, challenge, domain, now } = proofOptions let presentation = await Presentation.create({ credentials, - holder: did, + holder: didDocument.id, validFrom: validFrom ?? now, validUntil, verifier, @@ -184,8 +185,8 @@ export async function createPresentation( presentation = await DataIntegrity.signWithDid({ document: presentation, - signerDid: didDocument ?? did, - signers, + signerDid: didDocument, + signers: await signersForDid(didDocument, ...signers), proofPurpose, challenge, domain, diff --git a/packages/credentials/src/interfaces.ts b/packages/credentials/src/interfaces.ts index b2033729a..8ad4a54dc 100644 --- a/packages/credentials/src/interfaces.ts +++ b/packages/credentials/src/interfaces.ts @@ -5,17 +5,28 @@ * found in the LICENSE file in the root directory of this source tree. */ -import type { SignerInterface } from '@kiltprotocol/jcs-data-integrity-proofs-common' -import type { Did, DidDocument } from '@kiltprotocol/types' -import type { Proof, VerifiableCredential } from './V1/types' +import type { + Base58BtcMultibaseString, + DidDocument, + KeyringPair, + SignerInterface, +} from '@kiltprotocol/types' + import type { IssueOpts } from './V1/KiltAttestationProofV1' +import type { Proof, VerifiableCredential } from './V1/types' export type SecuredDocument = { proof: Proof[] | Proof } export interface HolderOptions { - did: Did - didDocument?: DidDocument - signers: SignerInterface[] + didDocument: DidDocument + signers: Array< + | SignerInterface + | KeyringPair + | { + secretKeyMultibase: Base58BtcMultibaseString + publicKeyMultibase: Base58BtcMultibaseString + } + > } export type IssuerOptions = HolderOptions & IssueOpts diff --git a/packages/credentials/src/issuer.ts b/packages/credentials/src/issuer.ts index 02df23d72..88238a922 100644 --- a/packages/credentials/src/issuer.ts +++ b/packages/credentials/src/issuer.ts @@ -19,9 +19,6 @@ import type { IssuerOptions } from './interfaces.js' * Adding a `proof` to the document using the {@link issue} function to make the credential verifiable. * * @param arguments Object holding all arguments for credential creation. - * @param arguments.type A type string identifying the (sub-)type of Verifiable Credential to be created. - * This is added to the `type` field on the credential and determines the `credentialSchema` as well. - * Defaults to the type {@link KiltCredentialV1.CREDENTIAL_TYPE KiltCredentialV1} which, for the time being, is also the only type supported. * @param arguments.issuer The Decentralized Identifier (DID) of the identity acting as the authority issuing this credential. * @param arguments.credentialSubject An object containing key-value pairs that represent claims made about the subject of the credential. * @param arguments.credentialSubject.id The DID identifying the subject of the credential, about which claims are made (the remaining key-value pairs). @@ -29,20 +26,23 @@ import type { IssuerOptions } from './interfaces.js' * Each Kilt credential is based on exactly one of these subtypes. This argument is therefore mandatory and expects the schema definition of a CType. * @param arguments.cTypeDefinitions Some CTypes are themselves composed of definitions taken from other CTypes; in that case, these definitions need to be supplied here. * Alternatively, you can set a {@link CTypeLoader} function that takes care of fetching all required definitions. + * @param arguments.type A type string identifying the (sub-)type of Verifiable Credential to be created. + * This is added to the `type` field on the credential and determines the `credentialSchema` as well. + * Defaults to the type {@link KiltCredentialV1.CREDENTIAL_TYPE KiltCredentialV1} which, for the time being, is also the only type supported. * @returns A (potentially only partial) credential that is yet to be finalized and made verifiable with a proof. */ export async function createCredential({ - type, issuer, credentialSubject, cType, cTypeDefinitions, + type, }: { - type?: string issuer: Did credentialSubject: Record & { id: Did } cType: ICType cTypeDefinitions?: ICType[] | CTypeLoader + type?: string }): Promise { switch (type) { case undefined: @@ -120,11 +120,11 @@ export async function issue( switch (proofType) { case undefined: case KiltAttestationProofV1.PROOF_TYPE: { - const { didDocument, did } = issuer + const { didDocument } = issuer const cred = await KiltAttestationProofV1.issue( credential as KiltCredentialV1.Interface, - didDocument ?? did, + didDocument, issuer ) diff --git a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts index fff6928ef..542330a11 100644 --- a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts +++ b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts @@ -5,7 +5,7 @@ * found in the LICENSE file in the root directory of this source tree. */ -import { u8aEq } from '@polkadot/util' +import { u8aEq, u8aToHex } from '@polkadot/util' import { base58Decode } from '@polkadot/util-crypto' import { Ed25519Signature2020, @@ -133,6 +133,10 @@ jest .mocked(mockedApi.query.timestamp.now) .mockResolvedValue(mockedApi.createType('u64', timestamp.getTime()) as any) +// jest +// .mocked(mockedApi.query.timestamp.now.at) +// .mockResolvedValue(mockedApi.createType('u64', timestamp.getTime()) as any) + const emailCType: ICType = { $schema: 'http://kilt-protocol.org/draft-01/ctype#', properties: { @@ -455,20 +459,14 @@ describe('issuance', () => { } const transactionHandler: KiltAttestationProofV1.IssueOpts = { signers: [signer], - submitterAccount: attester, - submitTx: async () => { + submitter: async ({ call }) => { + txArgs = call.args return { - status: 'Finalized', - includedAt: { - blockHash, - blockTime: timestamp, + block: { + hash: u8aToHex(blockHash), }, } }, - authorizeTx: async (tx) => { - txArgs = tx.args - return tx - }, } beforeEach(() => { toBeSigned = { @@ -481,7 +479,7 @@ describe('issuance', () => { let newCred: Partial = await issuanceSuite.anchorCredential( { ...toBeSigned }, - issuer, + { id: issuer }, transactionHandler ) newCred = await vcjs.issue({ @@ -540,7 +538,7 @@ describe('issuance', () => { { ...toBeSigned, }, - issuer, + { id: issuer }, transactionHandler ) newCred = (await vcjs.issue({ diff --git a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.ts b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.ts index 7b6366dc6..d67aba6f4 100644 --- a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.ts +++ b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.ts @@ -15,11 +15,11 @@ import { ConfigService } from '@kiltprotocol/config' import { CType, KiltAttestationProofV1, + KiltCredentialV1, KiltRevocationStatusV1, Types, - KiltCredentialV1, } from '@kiltprotocol/credentials' -import type { DidDocument, Did, ICType } from '@kiltprotocol/types' +import type { DidDocument, ICType } from '@kiltprotocol/types' import { Caip2 } from '@kiltprotocol/utils' import type { DocumentLoader, JsonLdObj } from '../documentLoader.js' @@ -208,7 +208,7 @@ export class KiltAttestationV1Suite extends LinkedDataProof { */ public async anchorCredential( input: CredentialStub, - issuer: DidDocument | Did, + issuer: DidDocument, submissionOptions: Parameters['2'] ): Promise> { const { credentialSubject, type } = input diff --git a/tests/bundle/bundle-test.ts b/tests/bundle/bundle-test.ts index 7ecca615c..2c3370075 100644 --- a/tests/bundle/bundle-test.ts +++ b/tests/bundle/bundle-test.ts @@ -281,9 +281,9 @@ async function runAll() { } const issued = await Issuer.issue(credential, { - did: alice.id, - signers: [...(await aliceSign(alice)), payerSigner], - submitterAccount: payerSigner.id, + didDocument: alice, + signers: [...aliceSign(alice), payerSigner], + submitter: payerSigner.id, }) console.info('Credential issued') @@ -312,8 +312,8 @@ async function runAll() { const presentation = await Holder.createPresentation( [derived], { - did: bob.id, - signers: await bobSign(bob), + didDocument: bob, + signers: bobSign(bob), }, {}, { diff --git a/tests/integration/didHelpers.spec.ts b/tests/integration/didHelpers.spec.ts index 628734faa..5bb87c6b4 100644 --- a/tests/integration/didHelpers.spec.ts +++ b/tests/integration/didHelpers.spec.ts @@ -7,7 +7,7 @@ import type { ApiPromise } from '@polkadot/api' -import { CType } from '@kiltprotocol/credentials' +import { CType, Issuer, Verifier } from '@kiltprotocol/credentials' import { DidHelpers, disconnect } from '@kiltprotocol/sdk-js' import type { DidDocument, @@ -352,9 +352,10 @@ describe('transact', () => { ).asConfirmed.didDocument }) + const cType = CType.fromProperties('thing', { thang: { type: 'string' } }) + it('creates a ctype', async () => { - const ctype = CType.fromProperties('thing', { thang: { type: 'string' } }) - const serialized = CType.toChain(ctype) + const serialized = CType.toChain(cType) const call = api.tx.ctype.add(serialized) const result = await DidHelpers.transact({ @@ -368,7 +369,34 @@ describe('transact', () => { expect(result.status).toStrictEqual('confirmed') expect(result.asConfirmed.didDocument).toMatchObject(didDocument) - await expect(CType.verifyStored(ctype)).resolves.not.toThrow() + await expect(CType.verifyStored(cType)).resolves.not.toThrow() + }, 30_000) + + it('integrates with issue', async () => { + const unsigned = await Issuer.createCredential({ + issuer: didDocument.id, + credentialSubject: { id: didDocument.id, thang: 'thong' }, + cType, + }) + + const issued = await Issuer.issue(unsigned, { + didDocument, + signers: [keypair], + submitter: async (args) => + DidHelpers.transact({ + ...args, + submitter: paymentAccount, + expectedEvents: [ + { section: 'attestation', method: 'AttestationCreated' }, + ], + }).submit(), + }) + + expect(issued).toHaveProperty('proof', expect.any(Object)) + + await expect( + Verifier.verifyCredential({ credential: issued }) + ).resolves.toMatchObject({ verified: true }) }, 30_000) }) From 53d8134b94028ce774815073c3a50c3ef7ceaee4 Mon Sep 17 00:00:00 2001 From: Raphael Flechtner Date: Tue, 23 Jul 2024 16:24:37 +0200 Subject: [PATCH 3/5] chore: nitpicks --- .../jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts | 4 ---- tests/integration/didHelpers.spec.ts | 6 ++++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts index 542330a11..beae4dfe5 100644 --- a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts +++ b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts @@ -133,10 +133,6 @@ jest .mocked(mockedApi.query.timestamp.now) .mockResolvedValue(mockedApi.createType('u64', timestamp.getTime()) as any) -// jest -// .mocked(mockedApi.query.timestamp.now.at) -// .mockResolvedValue(mockedApi.createType('u64', timestamp.getTime()) as any) - const emailCType: ICType = { $schema: 'http://kilt-protocol.org/draft-01/ctype#', properties: { diff --git a/tests/integration/didHelpers.spec.ts b/tests/integration/didHelpers.spec.ts index 91c8c954a..1d7936b99 100644 --- a/tests/integration/didHelpers.spec.ts +++ b/tests/integration/didHelpers.spec.ts @@ -361,7 +361,9 @@ describe('transact', () => { ).asConfirmed.didDocument }) - const cType = CType.fromProperties('thing', { thang: { type: 'string' } }) + const cType = CType.fromProperties('thing', { + someProperty: { type: 'string' }, + }) it('creates a ctype', async () => { const serialized = CType.toChain(cType) @@ -384,7 +386,7 @@ describe('transact', () => { it('integrates with issue', async () => { const unsigned = await Issuer.createCredential({ issuer: didDocument.id, - credentialSubject: { id: didDocument.id, thang: 'thong' }, + credentialSubject: { id: didDocument.id, someProperty: 'someValue' }, cType, }) From 388b5c2f528dbde31d10254e02ec3c29718a8383 Mon Sep 17 00:00:00 2001 From: Raphael Flechtner Date: Tue, 23 Jul 2024 16:27:30 +0200 Subject: [PATCH 4/5] refactor!: move issuer options use them on lower-level issue too --- .../src/V1/KiltAttestationProofV1.ts | 48 ++++++------------- packages/credentials/src/interfaces.ts | 36 +++++++++----- packages/credentials/src/issuer.ts | 5 +- .../src/suites/KiltAttestationProofV1.spec.ts | 13 ++--- .../src/suites/KiltAttestationProofV1.ts | 11 ++--- 5 files changed, 49 insertions(+), 64 deletions(-) diff --git a/packages/credentials/src/V1/KiltAttestationProofV1.ts b/packages/credentials/src/V1/KiltAttestationProofV1.ts index 04b866ea8..9198e7069 100644 --- a/packages/credentials/src/V1/KiltAttestationProofV1.ts +++ b/packages/credentials/src/V1/KiltAttestationProofV1.ts @@ -45,19 +45,21 @@ import { } from '@kiltprotocol/did' import type { Did, - DidDocument, - HexString, ICType, IDelegationNode, KiltAddress, SharedArguments, - TransactionResult, } from '@kiltprotocol/types' import { Caip19, JsonSchema, SDKErrors, Signers } from '@kiltprotocol/utils' import { CTypeLoader } from '../ctype/CTypeLoader.js' import * as CType from '../ctype/index.js' -import { HolderOptions } from '../interfaces.js' +import { + IssuerOptions, + SimplifiedTransactionResult, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + SubmitOverride, +} from '../interfaces.js' import { DEFAULT_CREDENTIAL_CONTEXTS, validateStructure as validateCredentialStructure, @@ -663,20 +665,6 @@ export function finalizeProof( } } -interface SimplifiedTransactionResult { - block: { hash: HexString } -} - -export type IssueOpts = { - submitter: - | KiltAddress - | (( - args: Pick & { - call: Extrinsic - } - ) => Promise) -} & Pick - async function defaultTxSubmit({ didDocument, call, @@ -719,36 +707,30 @@ async function defaultTxSubmit({ * Creates a complete {@link KiltAttestationProofV1} for issuing a new credential. * * @param credential A {@link KiltCredentialV1} for which a proof shall be created. - * @param issuer The DID or DID Document of the DID acting as the issuer. - * @param options Additional parameters. - * @param options.signers An array of signer interfaces related to the issuer's keys. The function selects the appropriate handlers for all signatures required for issuance (e.g., authorizing the on-chain anchoring of the credential). - * This can be omitted if both a custom authorizeTx & submitTx are given. - * @param options.submitterAccount The account which counter-signs the transaction to cover the transaction fees. - * Can be omitted if both a custom authorizeTx & submitTx are given. - * @param options.authorizeTx Allows overriding the function that takes a transaction and adds authorization by signing it with keys associated with the issuer DID. - * @param options.submitTx Allows overriding the function that takes the DID-signed transaction and submits it to a blockchain node, tracking its inclusion in a block. - * It is expected to at least return the hash of the block at which the transaction was processed. + * @param issuer Parameters describing the credential issuer. + * @param issuer.didDocument The DID Document of the DID acting as the issuer. + * @param issuer.signers An array of signer interfaces related to the issuer's keys. The function selects the appropriate handlers for all signatures required for issuance (e.g., authorizing the on-chain anchoring of the credential). + * @param issuer.submitter Either the account which counter-signs the transaction to cover the transaction fees, + * _OR_ a user-provided implementation did-authorization and submitting logic following the {@link SubmitOverride} interface. * @returns The credential where `id`, `credentialStatus`, and `issuanceDate` have been updated based on the on-chain attestation record, containing a finalized proof. */ export async function issue( credential: Omit, - issuer: DidDocument, - options: IssueOpts + issuer: IssuerOptions ): Promise { + const { didDocument, signers, submitter } = issuer const updatedCredential = { ...credential, - issuer: typeof issuer === 'string' ? issuer : issuer.id, + issuer: didDocument.id, } const [proof, callArgs] = initializeProof(updatedCredential) const api = ConfigService.get('api') const call = api.tx.attestation.add(...callArgs) - const { signers, submitter } = options - const args: Pick & { call: Extrinsic } = { - didDocument: issuer, + didDocument, signers, api, call, diff --git a/packages/credentials/src/interfaces.ts b/packages/credentials/src/interfaces.ts index 8ad4a54dc..9494aec61 100644 --- a/packages/credentials/src/interfaces.ts +++ b/packages/credentials/src/interfaces.ts @@ -5,31 +5,41 @@ * found in the LICENSE file in the root directory of this source tree. */ +import type { Extrinsic } from '@polkadot/types/interfaces' + import type { - Base58BtcMultibaseString, DidDocument, - KeyringPair, - SignerInterface, + DidHelpersAcceptedSigners, + HexString, + KiltAddress, + SharedArguments, + TransactionResult, } from '@kiltprotocol/types' -import type { IssueOpts } from './V1/KiltAttestationProofV1' import type { Proof, VerifiableCredential } from './V1/types' export type SecuredDocument = { proof: Proof[] | Proof } export interface HolderOptions { didDocument: DidDocument - signers: Array< - | SignerInterface - | KeyringPair - | { - secretKeyMultibase: Base58BtcMultibaseString - publicKeyMultibase: Base58BtcMultibaseString - } - > + signers: DidHelpersAcceptedSigners[] +} + +export interface SimplifiedTransactionResult { + block: { hash: HexString } +} + +export type SubmitOverride = ( + args: Pick & { + call: Extrinsic + } +) => Promise + +interface SubmitterAddressOrOverride { + submitter: KiltAddress | SubmitOverride } -export type IssuerOptions = HolderOptions & IssueOpts +export type IssuerOptions = HolderOptions & SubmitterAddressOrOverride export interface VerificationResult { verified: boolean diff --git a/packages/credentials/src/issuer.ts b/packages/credentials/src/issuer.ts index 88238a922..e1107cfd5 100644 --- a/packages/credentials/src/issuer.ts +++ b/packages/credentials/src/issuer.ts @@ -13,6 +13,8 @@ import type { UnsignedVc, VerifiableCredential } from './V1/types.js' import type { CTypeLoader } from './ctype/index.js' import type { IssuerOptions } from './interfaces.js' +export type { IssuerOptions } + /** * Creates a new credential document as a basis for issuing a credential. * This document can be shown to users as a preview or be extended with additional properties before moving on to the second step of credential issuance: @@ -120,11 +122,8 @@ export async function issue( switch (proofType) { case undefined: case KiltAttestationProofV1.PROOF_TYPE: { - const { didDocument } = issuer - const cred = await KiltAttestationProofV1.issue( credential as KiltCredentialV1.Interface, - didDocument, issuer ) diff --git a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts index beae4dfe5..825b849a3 100644 --- a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts +++ b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts @@ -36,6 +36,7 @@ import { KiltCredentialV1, Types, W3C_CREDENTIAL_CONTEXT_URL, + type Issuer, } from '@kiltprotocol/credentials' import { @@ -453,7 +454,8 @@ describe('issuance', () => { algorithm: 'Sr25519', id: `${issuer}#1`, } - const transactionHandler: KiltAttestationProofV1.IssueOpts = { + const issuerOptions: Issuer.IssuerOptions = { + didDocument, signers: [signer], submitter: async ({ call }) => { txArgs = call.args @@ -473,11 +475,7 @@ describe('issuance', () => { it('issues a credential via vc-js', async () => { let newCred: Partial = - await issuanceSuite.anchorCredential( - { ...toBeSigned }, - { id: issuer }, - transactionHandler - ) + await issuanceSuite.anchorCredential({ ...toBeSigned }, issuerOptions) newCred = await vcjs.issue({ credential: newCred, suite: issuanceSuite, @@ -534,8 +532,7 @@ describe('issuance', () => { { ...toBeSigned, }, - { id: issuer }, - transactionHandler + issuerOptions ) newCred = (await vcjs.issue({ credential: { diff --git a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.ts b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.ts index d67aba6f4..783fbc4f5 100644 --- a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.ts +++ b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.ts @@ -19,7 +19,7 @@ import { KiltRevocationStatusV1, Types, } from '@kiltprotocol/credentials' -import type { DidDocument, ICType } from '@kiltprotocol/types' +import type { ICType } from '@kiltprotocol/types' import { Caip2 } from '@kiltprotocol/utils' import type { DocumentLoader, JsonLdObj } from '../documentLoader.js' @@ -201,15 +201,13 @@ export class KiltAttestationV1Suite extends LinkedDataProof { * You can then add a proof about the successful attestation to the credential using `createProof`. * * @param input A partial {@link KiltCredentialV1} `credentialSubject` is required. - * @param issuer The DID Document or, alternatively, the DID of the issuer. - * @param submissionOptions Authorization and submission handlers, or alternatively signers, to be passed to {@link KiltAttestationProofV1.issue | issue} for authorizing the on-chain anchoring of the credential with the issuer's signature. + * @param issuer Parameters describing the credential issuer, such as the issuer's `didDocument` and `signers`, to be passed to {@link KiltAttestationProofV1.issue | issue}. * * @returns A copy of the input updated to fit the {@link KiltCredentialV1} and to align with the attestation record (concerns, e.g., the `issuanceDate` which is set to the block time at which the credential was anchored). */ public async anchorCredential( input: CredentialStub, - issuer: DidDocument, - submissionOptions: Parameters['2'] + issuer: Parameters['1'] ): Promise> { const { credentialSubject, type } = input @@ -239,8 +237,7 @@ export class KiltAttestationV1Suite extends LinkedDataProof { const { proof, ...credential } = await KiltAttestationProofV1.issue( credentialStub, - issuer, - submissionOptions + issuer ) this.attestationInfo.set(credential.id, proof) From 806a4a0e5469af44ce8548439abc27f13fda13f0 Mon Sep 17 00:00:00 2001 From: Raphael Flechtner Date: Tue, 23 Jul 2024 18:14:18 +0200 Subject: [PATCH 5/5] test: fix unit tests --- .../src/suites/KiltAttestationProofV1.spec.ts | 37 ++++++++++--------- .../src/suites/Sr25519Signature2020.spec.ts | 4 +- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts index 825b849a3..35adb0514 100644 --- a/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts +++ b/packages/jsonld-suites/src/suites/KiltAttestationProofV1.spec.ts @@ -449,23 +449,23 @@ describe('issuance', () => { let toBeSigned: CredentialStub const { issuer } = attestedVc - const signer: SignerInterface<'Sr25519', DidUrl> = { - sign: async () => new Uint8Array(32), - algorithm: 'Sr25519', - id: `${issuer}#1`, - } - const issuerOptions: Issuer.IssuerOptions = { - didDocument, - signers: [signer], - submitter: async ({ call }) => { - txArgs = call.args - return { - block: { - hash: u8aToHex(blockHash), - }, - } + const signers: Array> = [ + { + sign: async () => new Uint8Array(32), + algorithm: 'Sr25519', + id: `${issuer}#1`, }, + ] + + const submitter: Issuer.IssuerOptions['submitter'] = async ({ call }) => { + txArgs = call.args + return { + block: { + hash: u8aToHex(blockHash), + }, + } } + beforeEach(() => { toBeSigned = { credentialSubject: attestedVc.credentialSubject, @@ -475,7 +475,10 @@ describe('issuance', () => { it('issues a credential via vc-js', async () => { let newCred: Partial = - await issuanceSuite.anchorCredential({ ...toBeSigned }, issuerOptions) + await issuanceSuite.anchorCredential( + { ...toBeSigned }, + { didDocument, signers, submitter } + ) newCred = await vcjs.issue({ credential: newCred, suite: issuanceSuite, @@ -532,7 +535,7 @@ describe('issuance', () => { { ...toBeSigned, }, - issuerOptions + { didDocument, signers, submitter } ) newCred = (await vcjs.issue({ credential: { diff --git a/packages/jsonld-suites/src/suites/Sr25519Signature2020.spec.ts b/packages/jsonld-suites/src/suites/Sr25519Signature2020.spec.ts index 8270f2b33..3ad8f540c 100644 --- a/packages/jsonld-suites/src/suites/Sr25519Signature2020.spec.ts +++ b/packages/jsonld-suites/src/suites/Sr25519Signature2020.spec.ts @@ -43,7 +43,7 @@ const documentLoader = combineDocumentLoaders([ export async function makeFakeDid() { const keypair = Crypto.makeKeypairFromUri('//Ingo', 'sr25519') - const id = ingosCredential.credentialSubject.id as KiltDid + const id = ingosCredential.issuer as KiltDid const didDocument: DidDocument = { id, authentication: [`${id}#authentication`], @@ -101,7 +101,7 @@ it('issues and verifies a signed credential', async () => { '@context': [W3C_CREDENTIAL_CONTEXT_URL] as any, type: ['VerifiableCredential'], credentialSubject: ingosCredential.credentialSubject, - issuer: ingosCredential.credentialSubject.id, + issuer: ingosCredential.issuer, } as Partial const verifiableCredential = await vcjs.issue({