Skip to content

Commit 1634262

Browse files
feat: Present Proof v2 (WIP Accept Proposal)
Signed-off-by: NB Prasad Katkar <[email protected]>
1 parent ccb0329 commit 1634262

14 files changed

+327
-119
lines changed

packages/core/src/modules/proofs/PresentationExchangeRecord.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ export interface PresentationRecordTags {
1111
}
1212

1313
export enum PresentationRecordType {
14-
INDY,
15-
W3C,
14+
Indy = 'Indy',
15+
W3c = 'W3c',
1616
}
1717
export enum W3CFormatType {
18-
JSONLD,
18+
Jsonld = 'Jsonld',
1919
// others to follow
2020
}
2121

@@ -44,7 +44,7 @@ export interface PresentationExchangeRecord {
4444
role: ProofRole
4545

4646
// This value binds the PresentationExchangeRecord to the actual proof records.
47-
// Because we can have multiple proof record types (Indy & W3C), a proof
47+
// Because we can have multiple proof record types (Indy & W3c), a proof
4848
// record id alone doesn't tell us where to look for the proof.
4949
// Therefore we use the PresentationRecordBinding interface to specify the proof // record id, as well as the type.
5050
presentation: PresentationRecordBinding[]

packages/core/src/modules/proofs/ProofService.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ import type { ProofRecord } from './repository'
77
import type { ProofRequest, RetrievedCredentials } from './v1/models'
88
import type { ProofFormatService } from './v2/formats/ProofFormatService'
99
import type { V2ProposePresentationHandler } from './v2/handlers/V2ProposePresentationHandler'
10-
import type { ProofRequestAsResponse, ProofRequestsOptions, ProposeProofOptions } from './v2/interface'
10+
import type {
11+
CreateRequestOptions,
12+
ProofRequestAsResponse,
13+
ProofRequestsOptions,
14+
ProposeProofOptions,
15+
RequestProofOptions,
16+
} from './v2/interface'
1117

1218
import { ConsoleLogger, LogLevel } from '../../logger'
1319

@@ -16,10 +22,20 @@ const logger = new ConsoleLogger(LogLevel.debug)
1622
export abstract class ProofService {
1723
abstract getVersion(): ProofProtocolVersion
1824
abstract createProposal(proposal: ProposeProofOptions): Promise<{ proofRecord: ProofRecord; message: AgentMessage }>
25+
26+
abstract requestProof(
27+
requestProofOptions: RequestProofOptions
28+
): Promise<{ proofRecord: ProofRecord; message: AgentMessage }>
29+
30+
abstract createRequest(
31+
createRequestOptions: CreateRequestOptions
32+
): Promise<{ proofRecord: ProofRecord; message: AgentMessage }>
33+
1934
public getFormatService(presentationRecordType: PresentationRecordType): ProofFormatService {
2035
logger.debug(presentationRecordType.toString())
2136
throw Error('Not Implemented')
2237
}
38+
2339
abstract processProposal(messageContext: HandlerInboundMessage<V2ProposePresentationHandler>): Promise<ProofRecord>
2440

2541
abstract getById(proofRecordId: string): Promise<ProofRecord>

packages/core/src/modules/proofs/ProofsAPI.ts

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,23 @@ import type { ProofRecord } from './repository'
44
import type { RetrievedCredentials } from './v1/models'
55
import type {
66
AcceptProposalOptions,
7+
CreateRequestOptions,
78
ProofRequestAsResponse,
89
ProofRequestsOptions,
910
ProposeProofOptions,
11+
RequestProofOptions,
1012
} from './v2/interface'
1113

12-
import { Lifecycle, scoped } from 'tsyringe'
14+
import { inject, Lifecycle, scoped } from 'tsyringe'
1315

1416
import { AgentConfig } from '../../agent/AgentConfig'
1517
import { Dispatcher } from '../../agent/Dispatcher'
1618
import { EventEmitter } from '../../agent/EventEmitter'
1719
import { MessageSender } from '../../agent/MessageSender'
1820
import { createOutboundMessage } from '../../agent/helpers'
21+
import { InjectionSymbols } from '../../constants'
1922
import { AriesFrameworkError } from '../../error/AriesFrameworkError'
23+
import { Wallet } from '../../wallet/Wallet'
2024
import { ConnectionService } from '../connections/services/ConnectionService'
2125
import { IndyHolderService } from '../indy'
2226
import { MediationRecipientService } from '../routing'
@@ -29,11 +33,14 @@ import { ProofsModule } from './ProofsModule'
2933
import { ProofRepository } from './repository'
3034
import { V1LegacyProofService } from './v1/V1LegacyProofService'
3135
import { V1ProofService } from './v1/V1ProofService'
36+
import { ProofRequest } from './v1/models'
3237
import { ProofRole } from './v2/ProofRole'
3338
import { V2ProofService } from './v2/V2ProofService'
3439

3540
export interface ProofsAPI {
3641
proposeProof(proofOptions: ProposeProofOptions): Promise<PresentationExchangeRecord>
42+
acceptProposal(acceptProposalOptions: AcceptProposalOptions): Promise<ProofRecord>
43+
requestProof(requestProofOptions: RequestProofOptions): Promise<ProofRecord>
3744
getById(proofRecordId: string): Promise<ProofRecord>
3845
}
3946

@@ -51,6 +58,7 @@ export class ProofsAPI extends ProofsModule implements ProofsAPI {
5158
private v2Service: V2ProofService
5259
private serviceMap: { '1.0': V1ProofService; '2.0': V2ProofService }
5360
private indyHolderService: IndyHolderService
61+
private wallet: Wallet
5462

5563
public constructor(
5664
dispatcher: Dispatcher,
@@ -62,7 +70,8 @@ export class ProofsAPI extends ProofsModule implements ProofsAPI {
6270
v1ProofService: V1LegacyProofService,
6371
proofRepository: ProofRepository,
6472
eventEmitter: EventEmitter,
65-
indyHolderService: IndyHolderService
73+
indyHolderService: IndyHolderService,
74+
@inject(InjectionSymbols.Wallet) wallet: Wallet
6675
) {
6776
super(
6877
dispatcher,
@@ -82,6 +91,7 @@ export class ProofsAPI extends ProofsModule implements ProofsAPI {
8291
this.agntConfig = agentConfig
8392
this.proofResponseCoord = proofResponseCoordinator
8493
this.indyHolderService = indyHolderService
94+
this.wallet = wallet
8595
this.v1Service = new V1ProofService(this.v1ProofService, this.connService)
8696
this.v2Service = new V2ProofService(
8797
this.proofRepository,
@@ -90,6 +100,7 @@ export class ProofsAPI extends ProofsModule implements ProofsAPI {
90100
this.agntConfig,
91101
this.dispatcher,
92102
this.proofResponseCoord,
103+
this.wallet,
93104
this.indyHolderService
94105
)
95106

@@ -120,8 +131,8 @@ export class ProofsAPI extends ProofsModule implements ProofsAPI {
120131

121132
const recordBinding: PresentationRecordBinding = {
122133
presentationRecordType: proofOptions.proofFormats?.indy
123-
? PresentationRecordType.INDY
124-
: PresentationRecordType.W3C,
134+
? PresentationRecordType.Indy
135+
: PresentationRecordType.W3c,
125136
presentationRecordId: proofRecord.id,
126137
}
127138

@@ -139,7 +150,7 @@ export class ProofsAPI extends ProofsModule implements ProofsAPI {
139150
return presentationExchangeRecord
140151
}
141152

142-
public async acceptProof(acceptProposalOptions: AcceptProposalOptions): Promise<ProofRecord> {
153+
public async acceptProposal(acceptProposalOptions: AcceptProposalOptions): Promise<ProofRecord> {
143154
const version: ProofProtocolVersion = acceptProposalOptions.protocolVersion
144155

145156
const service: ProofService = this.getService(version)
@@ -208,6 +219,44 @@ export class ProofsAPI extends ProofsModule implements ProofsAPI {
208219
return service.getRequestedCredentialsForProofRequest(indyProofRequest, presentationPreview)
209220
}
210221

222+
public async requestProof(requestProofOptions: RequestProofOptions): Promise<ProofRecord> {
223+
const version: ProofProtocolVersion = requestProofOptions.protocolVersion
224+
225+
const { proofRequestOptions } = requestProofOptions
226+
227+
const service: ProofService = this.getService(version)
228+
229+
const connection = await this.connService.getById(requestProofOptions.connectionId)
230+
231+
const nonce = proofRequestOptions.nonce ?? (await this.generateProofRequestNonce())
232+
233+
const proofRequest = new ProofRequest({
234+
name: proofRequestOptions.name ?? 'proof-request',
235+
version: proofRequestOptions.name ?? '1.0',
236+
nonce,
237+
requestedAttributes: proofRequestOptions.requestedAttributes,
238+
requestedPredicates: proofRequestOptions.requestedPredicates,
239+
})
240+
241+
const createRequestOptions: CreateRequestOptions = {
242+
proofRequest,
243+
connectionRecord: connection,
244+
comment: requestProofOptions.comment,
245+
autoAcceptProof: requestProofOptions.autoAcceptProof,
246+
}
247+
248+
const { message, proofRecord } = await service.createRequest(createRequestOptions)
249+
250+
const outboundMessage = createOutboundMessage(connection, message)
251+
await this.msgSender.sendMessage(outboundMessage)
252+
253+
return proofRecord
254+
}
255+
256+
public async generateProofRequestNonce() {
257+
return this.wallet.generateNonce()
258+
}
259+
211260
/**
212261
* Retrieve a proof record by id
213262
*

packages/core/src/modules/proofs/ProofsModule.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export class ProofsModule {
6666
*
6767
*/
6868

69-
public async v1ProposeProof(
69+
public async oldProposeProof(
7070
connectionId: string,
7171
presentationProposal: PresentationPreview,
7272
config?: {
@@ -93,7 +93,7 @@ export class ProofsModule {
9393
* @returns Proof record associated with the presentation request
9494
*
9595
*/
96-
public async acceptProposal(
96+
public async oldAcceptProposal(
9797
proofRecordId: string,
9898
config?: {
9999
request?: {
@@ -144,7 +144,7 @@ export class ProofsModule {
144144
* @returns Proof record associated with the sent request message
145145
*
146146
*/
147-
public async requestProof(
147+
public async oldRequestProof(
148148
connectionId: string,
149149
proofRequestOptions: CreateProofRequestOptions,
150150
config?: ProofRequestConfig

packages/core/src/modules/proofs/v1/V1ProofService.ts

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ import type { HandlerInboundMessage } from '../../../agent/Handler'
33
import type { AutoAcceptProof } from '../ProofAutoAcceptType'
44
import type { ProofRecord } from '../repository/ProofRecord'
55
import type { V2ProposePresentationHandler } from '../v2/handlers/V2ProposePresentationHandler'
6-
import type { ProofRequestAsResponse, ProposeProofOptions } from '../v2/interface'
7-
import type { ProofRequest, ProofRequestOptions, RetrievedCredentials } from './models'
6+
import type {
7+
CreateRequestOptions,
8+
PresentationConfig,
9+
ProofRequestAsResponse,
10+
ProposeProofOptions,
11+
RequestProofOptions,
12+
} from '../v2/interface'
13+
import type { ProofRequestOptions, RetrievedCredentials } from './models'
814

915
import { Lifecycle, scoped } from 'tsyringe'
1016

@@ -15,6 +21,7 @@ import { ProofProtocolVersion } from '../ProofProtocolVersion'
1521
import { ProofService } from '../ProofService'
1622

1723
import { V1LegacyProofService } from './V1LegacyProofService'
24+
import { ProofRequest } from './models'
1825

1926
const logger = new ConsoleLogger(LogLevel.debug)
2027

@@ -25,6 +32,12 @@ const logger = new ConsoleLogger(LogLevel.debug)
2532
*/
2633
@scoped(Lifecycle.ContainerScoped)
2734
export class V1ProofService extends ProofService {
35+
createRequest(
36+
createRequestOptions: CreateRequestOptions
37+
): Promise<{ proofRecord: ProofRecord; message: AgentMessage }> {
38+
throw new Error('Method not implemented.')
39+
}
40+
2841
public createProofRequestFromProposal(
2942
presentationProposal: PresentationPreview,
3043
proofRequestOptions: ProofRequestOptions
@@ -69,8 +82,6 @@ export class V1ProofService extends ProofService {
6982
): Promise<{ proofRecord: ProofRecord; message: AgentMessage }> {
7083
// Assert
7184
const connection = await this.connectionService.getById(proposal.connectionId)
72-
73-
console.log('V1 proposal', proposal.proofFormats.indy)
7485

7586
let presentationProposal: PresentationPreview | undefined
7687
if (proposal?.proofFormats?.indy?.proofPreview?.attributes) {
@@ -85,7 +96,7 @@ export class V1ProofService extends ProofService {
8596
})
8697
}
8798

88-
const proposalConfig: PresentationProposalConfig = {
99+
const proposalConfig: PresentationConfig = {
89100
comment: proposal?.comment,
90101
autoAcceptProof: proposal?.autoAcceptProof,
91102
}
@@ -118,12 +129,42 @@ export class V1ProofService extends ProofService {
118129
return { proofRecord, message }
119130
}
120131

132+
public async requestProof(
133+
requestProofOptions: RequestProofOptions
134+
): Promise<{ proofRecord: ProofRecord; message: AgentMessage }> {
135+
const { connectionId, proofRequestOptions, comment, autoAcceptProof } = requestProofOptions
136+
137+
const connection = await this.connectionService.getById(connectionId)
138+
139+
const nonce = proofRequestOptions.nonce ?? (await this.legacyProofService.generateProofRequestNonce())
140+
141+
const proofRequest = new ProofRequest({
142+
name: proofRequestOptions.name ?? 'proof-request',
143+
version: proofRequestOptions.name ?? '1.0',
144+
nonce,
145+
requestedAttributes: proofRequestOptions.requestedAttributes,
146+
requestedPredicates: proofRequestOptions.requestedPredicates,
147+
})
148+
149+
const proposalConfig: PresentationConfig = {
150+
comment: comment,
151+
autoAcceptProof: autoAcceptProof,
152+
}
153+
154+
const { message, proofRecord } = await this.legacyProofService.createRequest(
155+
proofRequest,
156+
connection,
157+
proposalConfig
158+
)
159+
160+
return { proofRecord, message }
161+
}
162+
163+
public async generateProofRequestNonce() {
164+
return this.legacyProofService.generateProofRequestNonce()
165+
}
166+
121167
public async getById(proofRecordId: string): Promise<ProofRecord> {
122168
return this.legacyProofService.getById(proofRecordId)
123169
}
124170
}
125-
126-
interface PresentationProposalConfig {
127-
comment?: string
128-
autoAcceptProof?: AutoAcceptProof
129-
}

packages/core/src/modules/proofs/v2/ProofMessageBuilder.ts

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)