---
# System prepended metadata

title: 'Actual credential Obejct from:'

---

## Update Martin:

# Actual credential Obejct from:
`normalizeCredential(${data}.signature)` in `signJWT(...)`

```
{
    "credentialSubject": {
        "type": "SocialMediaPosting",
        "author": {
            "id": "did:ethr:0xf89b67B4FebbB1a6237232bd54611ED0fd17A1bd",
            "image": "https://www.gravatar.com/avatar/4ad4a6c0979055233c763a1d5453e83e?s=200&d=retro",
            "name": "did:ethr:0xf89b67B4FebbB1a6237232bd54611ED0fd17A1bd"
        },
        "headline": "",
        "articleBody": "1234",
        "id": "http://localhost:3332/posts/SdlC4EAGN"
    },
    "issuer": {
        "id": "did:ethr:0xf89b67B4FebbB1a6237232bd54611ED0fd17A1bd"
    },
    "id": "http://localhost:3332/posts/SdlC4EAGN",
    "type": [
        "VerifiableCredential",
        "VerifiableSocialPosting"
    ],
    "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://www.w3id.org/veramolabs/socialmedia/context/v1"
    ],
    "issuanceDate": "2021-03-15T18:18:21.000Z",
    "proof": {
        "type": "JwtProof2020",
        "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJ2YyI6eyJjcmVkZW50aWFsU3ViamVjdCI6eyJ0eXBlIjoiU29jaWFsTWVkaWFQb3N0aW5nIiwiYXV0aG9yIjp7ImlkIjoiZGlkOmV0aHI6MHhmODliNjdCNEZlYmJCMWE2MjM3MjMyYmQ1NDYxMUVEMGZkMTdBMWJkIiwiaW1hZ2UiOiJodHRwczovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLzRhZDRhNmMwOTc5MDU1MjMzYzc2M2ExZDU0NTNlODNlP3M9MjAwJmQ9cmV0cm8iLCJuYW1lIjoiZGlkOmV0aHI6MHhmODliNjdCNEZlYmJCMWE2MjM3MjMyYmQ1NDYxMUVEMGZkMTdBMWJkIn0sImhlYWRsaW5lIjoiIiwiYXJ0aWNsZUJvZHkiOiIxMjM0In0sIkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly93d3cudzNpZC5vcmcvdmVyYW1vbGFicy9zb2NpYWxtZWRpYS9jb250ZXh0L3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJWZXJpZmlhYmxlU29jaWFsUG9zdGluZyJdfSwic3ViIjoiaHR0cDovL2xvY2FsaG9zdDozMzMyL3Bvc3RzL1NkbEM0RUFHTiIsImp0aSI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzMzMi9wb3N0cy9TZGxDNEVBR04iLCJuYmYiOjE2MTU4MzIzMDEsImlzcyI6ImRpZDpldGhyOjB4Zjg5YjY3QjRGZWJiQjFhNjIzNzIzMmJkNTQ2MTFFRDBmZDE3QTFiZCJ9.signature"
    }
}
```
Differences:
- `proof` property is added by `normalizeCredential` from dummy `signature`
- `issuer.id` vs `issuer`
- Some fields from example missing (thumbnail e.g.)


````
    const credential = {
      "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://www.w3id.org/veramolabs/socialmedia/context/v1"
      ],
      "type": [
        "VerifiableCredential",
        "VerifableSocialMediaPosting"
      ],
      "id": "https://example.org/post/1234",
      "issuer": "did:example:aadsfewfweasdfsfad",
      "issuanceDate": "2010-01-01T19:23:24Z",
      "credentialSubject": {
        // might contain reply tweet URL
        "id": "https://example.org/post/1234",
        "type": "SocialMediaPosting",
        "author": {
          "id": "did:nft:ebfeb1f712ebc6f1c276e12ec21",
          "type": "Person",
          "thumbnail": "https://google.com",
          "image": "https://google.com",
          "name": "cryptopunk"
        },
        "headline": "punks are aliens",
        "articleBody": "waffles for zoomers"
      },
      "credentialSchema": {
        "id": "https://www.w3id.org/veramolabs/socialmedia/context/v1/eip712.json",
        "type": "Eip712SchemaValidator2021"
      }
    };

    // TODO: normalize one should get eip712 schema from credentialSchema URI
    const eip712Schema = {
      VerifiableCredential: [
        { name: '@context', type: 'string[]' },
        { name: 'type', type: 'string[]' },
        { name: 'id', type: 'string' },
        { name: 'issuer', type: 'string' },
        { name: 'issuanceDate', type: 'string' },
        { name: 'credentialSubject', type: 'CredentialSubject' },
        { name: 'credentialSchema', type: 'CredentialSchema' }
      ],
      CredentialSchema: [
        { name: 'id', type: 'string' },
        { name: 'type', type: 'string' },
      ],
      CredentialSubject: [
        { name: 'type', type: 'string' },
        { name: 'id', type: 'string' },
        { name: 'headline', type: 'string' },
        { name: 'articleBody', type: 'string' },          
        { name: 'author', type: 'Person' }
      ],
      Person: [
        { name: 'type', type: 'string' },
        { name: 'id', type: 'string' },
        { name: 'thumbnail', type: 'string' },
        { name: 'image', type: 'string' },
        { name: 'name', type: 'string' }
      ]
    };

    // TODO: normalize credential using JCS

    const data = JSON.stringify({
      types: {
        EIP712Domain: [
          { name: 'name', type: 'string' },
          { name: 'version', type: 'string' },
          { name: 'chainId', type: 'uint256' },
          { name: 'salt', type: 'bytes32' },
        ],
        ... eip712Schema
      },
      domain: {
        name: 'Sign Tweet',
        version: '2',
        chainId: 4,
        salt: '0xf2d857f4a3edcb9b78b4d503bfe733db1e3f6cdc2b7971ee739626c97e86a558',
      },
      primaryType: 'VerifiableCredential',
      message: {
        ... credential
      }
    });

    const signer = walletAddress;
    const params = [signer, data];

    web3.currentProvider.sendAsync(
      {
        method: 'eth_signTypedData_v4',
        params,
        from: signer,
        jsonrpc: '2.0',
        id: new Date().getTime(),
      },
      (error, response) => {
        if (error) {
          return setErrorMsg(error.message);
        } else if (response && response.error) {
          const errMsg = response.error.message.substring(0, 70).concat('...');
          return setErrorMsg(errMsg);
        } else {
          const result = response && response.result;

          const signature = result && result.substring(2);
          const r = signature && '0x' + signature.substring(0, 64);
          const s = signature && '0x' + signature.substring(64, 128);
          const v = signature && parseInt(signature.substring(128, 130), 16);
          const signatures = {
            signature,
            r,
            s,
            v,
          };

          setSuccessMsg(`Successfully signed data!! ${signature}`);
          setData({ signatures, ...JSON.parse(data) });
        }
      }
    );
  };
```