Proof of Loss
What qualifies | How to submit | Technical details

Overview

Proof of loss allows users to prove that they are the owners of one or more addresses that were subject to an incident before submitting a claim. Claim assessors use it to judge if there are material losses to the cover owner of at least 20% of the cover amount due to the incident. For protocol cover, proof of loss is used by Claim assessors to judge:
  • If at least 20% of the cover amount due to the incident.
For custody cover, proof of loss is used by Claim assessors to judge:
  • If there are material losses to the custody cover owner of at least 10% of the cover amount due to the incident; or
  • If funds are prevented from withdrawal without prior notice and are prevented for a continuous period of 90 days or more due to the incident.
Proof of loss is required in the assessment process for all covers starting from and including cover ID 2292.
For Custody Cover, members can submit off-chain evidence to demonstrate material loss or withdrawal prevention for 90 days or more.
For Protocol Cover, members can submit both on-chain and off-chain evidence to demonstrate material loss greater than or equal to 20% due to the incident.

On-Chain Evidence

Members are required to provide on-chain evidence when submitting a Protocol Cover claim.
Examples of on-chain evidence include but are not limited to the examples listed in the Types of proofs section.

Off-Chain Evidence

Members can provide off-chain evidence when submitting either a Protocol Cover or Custody Cover claim.
If off-chain evidence is provided for a Protocol Cover claim, on-chain evidence must also be provided. On-chain evidence is required when providing proof of loss for Protocol Cover.
For Custody Cover, only off-chain evidence is necessary since members do not directly control their assets when they are placed into a custodial account; hence, on-chain evidence cannot be provided by a member.
Examples of off-chain evidence include but are not limited to:
  • Emails from or to the custodian regarding loss or withdrawal prevention; or
  • Screenshots of account statements, withdrawal prevention messages, etc.; or
  • Social media statements from custodians regarding losses and/or halted withdrawals.

Types of proofs

Signature

The user must sign the following message using the affected address: Nexus Mutual proof of loss for cover ID <coverId> <coverId> - the ID of the cover for which the claim is going to be opened The signed message is added to the proof.

Transaction

The user must send 0 ETH to a verification address from the affected address. The transaction hash is added to the proof.
The verification address must be determined from cover ID using the following format: 0x<prefix>...<coverIdAsHex> <prefix> - a prefix used to prevent accidental transactions to be used as proof, currenly set as “c1d”. <coverIdAsHex> - the ID of the cover for which the claim is going to be open represented as hex.
Example:
Given cover ID 3000, we represent that as hex and obtain 0xBB8. Then the verification address will look like this: 0xc1d0000000000000000000000000000000000bb8 (lowercase)
0xc1D0000000000000000000000000000000000bb8 (checksummed)

Composing and submitting proofs

A proof is a json file that contains 4 properties:
  • affectedAddresses - a dictionary where keys are affected addresses and values are either transaction hashes or signed message
  • coverId - the ID of the cover for which the claim is going to be opened
  • version - currently 1.0.0, it will be used to accommodate any changes to the format and allow backwards compatibility
Example: { “affectedAddresses”: {
“0xRecoveredAffectedAddress01”: “0xSignature”,
“0xRecoveredAffectedAddress02”: “0xTxFromAffectedCustodialWalletAddress” },
“version”: “1.0.0”,
“coverId”: 3000,
} Submit steps:
  1. 1.
    Upload json file to IPFS
  2. 2.
    Call addProof with cover ID and CID (IPFS content identifier) as arguments from the ClaimProofs.sol (mainnet: 0xcafea81b73daB8F42C5eca7d2E821A82660B6775): https://github.com/NexusMutual/smart-contracts/blob/release-candidate/contracts/modules/claims/ClaimProofs.sol

Validity of proofs

For a given claim, proofs are verified by loading ProofAdded events (emitted by ClaimProofs.sol) filtered by coverId and owner. coverId - the ID of the cover for which the claim is going to be opened
owner - the EOA that triggered submitClaim from Claims.sol The owner address is obtained from the transaction in which the ClaimRaise event was emitted. Note that there can be multiple ClaimRaise events (with a different claimId) for the same coverId. The ClaimRaise event must be matched by the claimId which is not indexed. While ProofAdded events can be emitted after submitting a claim since there is no restriction on doing that, assessors will only consider the last event that is before or in the same block as the ClaimRaise event of the assessed claim. This event is considered to contain the most up to date proof and is used to load the json proof file from IPFS according to the ipfsHash argument. Any invalid keys or values from the affectedAddresses property of the proof json file will be ignored. We recommend using our app to submit proofs for claims opened by distributors:
https://app.nexusmutual.io/cover/proof-of-loss/add-affected-addresses?coverId=coverId&owner=owner However this only serves one EOA (also referred to as owner), so for more advanced use cases such as aggregating multiple addresses it will require a custom implementation on top of the existing specs since assessors will only consider only one IPFS file as proof.