The simple agreement is the smallest complete agreement JSON artifact in these docs. Use it to inspect or adapt the full artifact shape before validating and deploying with the SDK.Documentation Index
Fetch the complete documentation index at: https://docs.shodai.network/llms.txt
Use this file to discover all available pages before exploring further.
When to use this example
Use this example when you want a complete agreement with minimal branching, or when you need a straightforward starting point for a genuinely linear workflow. For a broader lifecycle with more states, event types, and branching behavior, use Complex Agreement.What to notice before the canonical agreement JSON
Before reading the JSON, notice:- participant address variables marked with
subtype: "participant" - rendered
contentthat uses the same variables - a short set of lifecycle states
- inputs that correspond to signature and acceptance events
- transitions that move the agreement forward with minimal branching
Agreement lifecycle
The diagram below shows the states and transitions defined by this agreement’sexecution object. Use it to understand the workflow before reviewing the full JSON artifact.
Canonical agreement JSON
The following code block is the complete deployable agreement JSON for this example.simple-agreement.json
{
"metadata": {
"id": "did:example:mou-v1",
"templateId": "did:template:mou-v1",
"version": "1.0.0",
"createdAt": "2024-03-20T12:00:00Z",
"name": "Memorandum of Understanding",
"author": "Agreements Protocol",
"description": "Template for non-binding memorandum of understanding between two parties"
},
"variables": {
"partyAEthAddress": {
"type": "address",
"subtype": "participant",
"name": "Party A Address",
"description": "Ethereum address of the first party",
"validation": {
"required": true
}
},
"partyAName": {
"type": "string",
"name": "Party A Name",
"description": "Legal name of the first party",
"validation": {
"required": true,
"minLength": 1
}
},
"partyASignature": {
"type": "string",
"subtype": "signature",
"name": "Party A Signature",
"description": "Digital signature of the first party",
"validation": {
"required": true
}
},
"partyBEthAddress": {
"type": "address",
"subtype": "participant",
"name": "Party B Address",
"description": "Ethereum address of the second party",
"validation": {
"required": true
}
},
"partyBName": {
"type": "string",
"name": "Party B Name",
"description": "Legal name of the second party",
"validation": {
"required": true,
"minLength": 1
}
},
"partyBSignature": {
"type": "string",
"subtype": "signature",
"name": "Party B Signature",
"description": "Digital signature of the second party",
"validation": {
"required": true
}
},
"effectiveDate": {
"type": "dateTime",
"name": "Effective Date",
"description": "The date when this MOU becomes effective",
"validation": {
"required": true
}
},
"scope": {
"type": "string",
"name": "Scope of Cooperation",
"description": "The scope of cooperation between the parties",
"validation": {
"required": true
}
},
"termDuration": {
"type": "string",
"name": "Term Duration",
"description": "The duration of the agreement",
"validation": {
"required": true
}
}
},
"content": {
"type": "md",
"data": "# MEMORANDUM OF UNDERSTANDING\n\n**BETWEEN PARTY A:**\n\n<u>${variables.partyAName}</u> (Party A Name)\n\n<u>${variables.partyAEthAddress}</u> (Party A Address)\n\n**AND PARTY B:**\n\n<u>${variables.partyBName}</u> (Party B Name)\n\n<u>${variables.partyBEthAddress}</u> (Party B Address)\n\n**EFFECTIVE DATE:**\n\n<u>${variables.effectiveDate}</u> (Effective Date)\n\n## 1. INTRODUCTION\n\nThis Memorandum of Understanding (\"MOU\") is entered into by and between Party A and Party B (collectively referred to as the \"Parties\").\n\nThe purpose of this MOU is to identify the roles and responsibilities of each Party.\n\n## 2. SCOPE OF COOPERATION\n\n<u>${variables.scope}</u>\n(Scope)\n\n## 3. RESPONSIBILITIES\n - Maintain regular communication regarding the progress of collaborative activities.\n - Designate representatives to coordinate the implementation of this MOU.\n - Share relevant information and resources necessary for the successful implementation of this MOU.\n - Acknowledge the contribution of the other Party in all public communications related to activities conducted under this MOU.\n\n## 4. TERM AND TERMINATION\n\n4.1 This MOU shall become effective on the date of the last signature below and shall remain in effect for a period of ${variables.termDuration} unless terminated earlier.\n\n4.2 Either Party may terminate this MOU by providing written notice to the other Party.\n\n4.3 Termination of this MOU shall not affect the completion of any activities already in progress, unless otherwise agreed by the Parties.\n\n## 5. CONFIDENTIALITY\n\n5.1 During the course of this MOU, the Parties may share confidential and proprietary information with each other. Each Party agrees to maintain the confidentiality of all information designated as confidential by the disclosing Party and shall not disclose such information to any third party without the prior written consent of the disclosing Party.\n\n## 6. INTELLECTUAL PROPERTY\n\n6.1 This MOU does not transfer any intellectual property rights between the Parties.\n\n6.2 Each Party shall retain all rights, title, and interest in its own intellectual property.\n\n6.3 Any intellectual property created jointly by the Parties during the course of activities under this MOU shall be owned jointly by the Parties, with specific terms to be negotiated in good faith and documented in a separate written agreement.\n\n## 7. SIGNATURES\n\nIN WITNESS WHEREOF, the Parties have executed this Memorandum of Understanding as of the Effective Date.\n\n<u>${variables.partyASignature}</u>\n(Party A Signature)\n\n<u>${variables.partyBSignature}</u>\n(Party B Signature)\n\nBy signing, I confirm that I have read, understood, and agree to be legally bound by all terms of this agreement."
},
"execution": {
"states": {
"PENDING_PARTY_A_SIGNATURE": {
"name": "Pending Signature From A",
"description": "This state awaits until Party A supplies Party B's address, effective date, scope, duration, and their own name."
},
"PENDING_PARTY_B_SIGNATURE": {
"name": "Pending Signature From B",
"description": "This state awaits until Party B confirms their identity by supplying their name."
},
"PENDING_ACCEPTANCE": {
"name": "Pending Final Acceptance",
"description": "This state awaits Party A's final acceptance of Party B's data."
},
"ACCEPTED": {
"name": "Agreement Accepted",
"description": "The agreement has been accepted by both parties and is now in force."
},
"REJECTED": {
"name": "Agreement Rejected",
"description": "The agreement has been rejected by Party A and will not proceed."
}
},
"initialize": {
"name": "Initialize",
"description": "Initialize the agreement",
"initialState": "PENDING_PARTY_A_SIGNATURE",
"data": {
"partyAEthAddress": "${variables.partyAEthAddress}",
"partyBEthAddress": "${variables.partyBEthAddress}"
}
},
"inputs": {
"partyAData": {
"type": "VerifiedCredentialEIP712",
"schema": "verified-credential-eip712.schema.json",
"displayName": "Party A Signature",
"description": "EIP712 signature from Party A proposing the MOU terms including scope, duration, and effective date",
"data": {
"partyAName": "${variables.partyAName}",
"scope": "${variables.scope}",
"termDuration": "${variables.termDuration}",
"effectiveDate": "${variables.effectiveDate}"
},
"issuer": "${variables.partyAEthAddress.value}"
},
"partyBData": {
"type": "VerifiedCredentialEIP712",
"schema": "verified-credential-eip712.schema.json",
"displayName": "Party B Signature",
"description": "EIP712 signature from Party B accepting the MOU terms",
"data": {
"partyBName": "${variables.partyBName}",
"partyBSignature": "${variables.partyBSignature}"
},
"issuer": "${variables.partyBEthAddress.value}"
},
"accepted": {
"type": "VerifiedCredentialEIP712",
"schema": "verified-credential-eip712.schema.json",
"displayName": "Party A Accepted Party B's Data",
"description": "EIP712 signature from Party A accepting Party B's data",
"data": {
"partyASignature": "${variables.partyASignature}"
},
"issuer": "${variables.partyAEthAddress.value}"
},
"rejected": {
"type": "VerifiedCredentialEIP712",
"schema": "verified-credential-eip712.schema.json",
"displayName": "Party A Rejected Party B's Data",
"description": "EIP712 signature from Party A rejecting Party B's data",
"data": {
"partyARejectionSignature": {
"type": "string",
"subtype": "signature",
"name": "Party A Rejection Signature",
"validation": {
"required": true
}
}
},
"issuer": "${variables.partyAEthAddress.value}"
}
},
"transitions": [
{
"from": "PENDING_PARTY_A_SIGNATURE",
"to": "PENDING_PARTY_B_SIGNATURE",
"conditions": [
{
"type": "isValid",
"input": "partyAData"
}
]
},
{
"from": "PENDING_PARTY_B_SIGNATURE",
"to": "PENDING_ACCEPTANCE",
"conditions": [
{
"type": "isValid",
"input": "partyBData"
}
]
},
{
"from": "PENDING_ACCEPTANCE",
"to": "ACCEPTED",
"conditions": [
{
"type": "isValid",
"input": "accepted"
}
]
},
{
"from": "PENDING_ACCEPTANCE",
"to": "REJECTED",
"conditions": [
{
"type": "isValid",
"input": "rejected"
}
]
}
]
}
}