# HGF Workshop Tutorial - Cheatsheet
1. Prepare project
- clone,
- build,
- explain, client, server, why docker
2. Initialize agent
- copy env,
- create new agent instance, label, logger, wallet, endpoints, transports
- check hello endpoint
3. Make a connection
- start UI
- show invitation with localhost
- ngrok or IP
- make a connection impl
- config update: auto accept?
4. Issue a credential
- config update: ledger
- create a public DID
- connect to the ledger
- register definition
- issue credential
5. Request proof
## Section 1: Agent initialization
```ts
// TODO Section 1: Agent Initialization (agent config and instance)
const agent = new Agent(
{
label: 'Jakub`s amazing cloud agent.',
logger: new ConsoleLogger(LogLevel.debug),
walletConfig: {
id: 'jakubs-cloud-agent-wallet',
key: process.env.WALLET_KEY || '',
},
endpoints: process.env.AGENT_ENDPOINTS?.split(','),
},
agentDependencies
)
const app = createApp(agent)
agent.registerInboundTransport(
new HttpInboundTransport({ app, port: Number(process.env.PORT) })
)
agent.registerOutboundTransport(new HttpOutboundTransport())
await agent.initialize()
```
## Section 2: Create an invitation
Config Update
```ts
autoAcceptConnections: true,
```
Implementation
```ts
// TODO Section 2: Create an invitation
app.get(
'/invitation',
asyncHandler(async (req, res) => {
const outOfBandRecord = await agent.oob.createInvitation()
const { outOfBandInvitation } = outOfBandRecord
res.send(outOfBandInvitation.toUrl({ domain: 'https://example.com/ssi' }))
})
)
```
## Section 3: Issue a credential
Create public DID
Register public DID
[GreenLight Ledger Indy Network](http://greenlight.bcovrin.vonx.io/)
### Register a credential definition
Config Update
```ts
publicDidSeed: process.env.PUBLIC_DID_SEED,
indyLedgers: [ledgers.bcovrin_greenlight],
```
Implementation
```ts
app.get(
'/register-definition',
asyncHandler(async (req, res) => {
// TODO 3. Register a credential definition
const schemaId = repository.getSchemaId()
if (!schemaId) throw new Error('Schema ID is missing.')
const schema = await agent.ledger.getSchema(schemaId)
const definitionTemplate: CredentialDefinitionTemplate = {
schema,
signatureType: 'CL',
supportRevocation: false,
tag: 'default',
}
const definition = await agent.ledger.registerCredentialDefinition(
definitionTemplate
)
repository.saveCredentialDefinitionId(definition.id)
res.status(200).json({ definition })
})
)
```
### Issue a credential
```ts
app.get(
'/issue-credential/:connectionId',
asyncHandler(async (req, res) => {
// TODO 4 Issue a credential
const connectionId = req.params.connectionId
console.log('connectionId', connectionId)
const credentialDefinitionId = repository.getCredentialDefinitionId()
if (!credentialDefinitionId) {
throw new Error('Credential definition is missing.')
}
const credentialPreview = V1CredentialPreview.fromRecord({
Name: 'John',
Surname: 'Doe',
'Date of Birth': '19911911',
'Event Name': 'Hyperledger Global Forum',
'Event Year': '2022',
})
const credentialExchangeRecord = await agent.credentials.offerCredential({
comment:
'This credentials allows the holder to enter the Hyperledger Global Forum conference.',
connectionId,
credentialFormats: {
indy: {
attributes: credentialPreview.attributes,
credentialDefinitionId,
},
},
protocolVersion: 'v1',
autoAcceptCredential: AutoAcceptCredential.ContentApproved,
})
res.status(200).json({ credentialExchangeRecord })
})
)
```
## Section 4: Request a proof
```ts
app.get(
'/request-proof/:connectionId',
asyncHandler(async (req, res) => {
// TODO 5. Request a proof
const connectionId = req.params.connectionId
const credentialDefinitionId = repository.getCredentialDefinitionId()
if (!credentialDefinitionId) {
throw new Error('Credential definition is missing.')
}
const attributes = {
Surname: new ProofAttributeInfo({
name: 'Surname',
restrictions: [
new AttributeFilter({
credentialDefinitionId,
}),
],
}),
'Event Name': new ProofAttributeInfo({
name: 'Event Name',
restrictions: [
new AttributeFilter({
credentialDefinitionId,
}),
],
}),
}
const predicates = {
'Date of Birth': new ProofPredicateInfo({
name: 'Date of Birth',
predicateType: PredicateType.LessThanOrEqualTo,
predicateValue: 20000101,
restrictions: [
new AttributeFilter({
credentialDefinitionId,
}),
],
}),
'Event Year': new ProofPredicateInfo({
name: 'Event Year',
predicateType: PredicateType.GreaterThanOrEqualTo,
predicateValue: 2022,
restrictions: [
new AttributeFilter({
credentialDefinitionId,
}),
],
}),
}
const proofRecord = await agent.proofs.requestProof(
connectionId,
{
name: 'Hyperledger Entrance Check',
requestedAttributes: attributes,
requestedPredicates: predicates,
},
{
autoAcceptProof: AutoAcceptProof.ContentApproved,
}
)
res.status(200).json({ proofRecord })
})
)
```