DisputeClient

Methods

  • raiseDispute
  • cancelDispute
  • resolveDispute
  • tagIfRelatedIpInfringed
  • disputeAssertion
  • disputeIdToAssertionId

raiseDispute

Raises a dispute on a given ipId

MethodType
raiseDispute(request: RaiseDisputeRequest) => Promise<RaiseDisputeResponse>

Parameters:

  • request.targetIpId: The IP ID that is the target of the dispute.
  • request.targetTag: The target tag of the dispute. See dispute tags. Example: “IMPROPER_REGISTRATION”
  • request.cid: Content Identifier (CID) for the dispute evidence. This should be obtained by uploading your dispute evidence (documents, images, etc.) to IPFS. Example: “QmX4zdp8VpzqvtKuEqMo6gfZPdoUx9TeHXCgzKLcFfSUbk”
  • request.liveness: The liveness is the time window (in seconds) in which a counter dispute can be presented (30days).
  • request.bond: [Optional] If not specified, it defaults to the minimum bond value. The amount of wrapper IP that the dispute initiator pays upfront into a pool. To counter that dispute the opposite party of the dispute has to place a bond of the same amount. The winner of the dispute gets the original bond back + 50% of the other party bond. The remaining 50% of the loser party bond goes to the reviewer.
  • request.wipOptions: [Optional]
    • request.wipOptions.enableAutoWrapIp: [Optional]By default IP is converted to WIP if the current WIP balance does not cover the fees. Set this to false to disable this behavior. Default: true
    • request.wipOptions.enableAutoApprove: [Optional]Automatically approve WIP usage when WIP is needed but current allowance is not sufficient. Set this to false to disable this behavior. Default: true
  • request.txOptions: [Optional] The transaction options.
import { parseEther } from "viem";

const response = await client.dispute.raiseDispute({
  targetIpId: "0xC92EC2f4c86458AFee7DD9EB5d8c57920BfCD0Ba",
  // NOTE: you must use your own CID here, because every time it is used,
  // the protocol does not allow you to use it again
  cid: "QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR",
  // you must pick from one of the whitelisted tags here:
  // https://docs.story.foundation/docs/dispute-module#dispute-tags
  targetTag: "IMPROPER_REGISTRATION",
  bond: parseEther("0.1"), // minimum of 0.1
  liveness: 2592000,
  txOptions: { waitForTransaction: true },
});
console.log(
  `Dispute raised at transaction hash ${disputeResponse.txHash}, Dispute ID: ${disputeResponse.disputeId}`
);

cancelDispute

Cancels an ongoing dispute

MethodType
cancelDispute(request: CancelDisputeRequest) => Promise<CancelDisputeResponse>

Parameters:

  • request.disputeId: The ID of the dispute to be cancelled.
  • request.data: [Optional] Additional data used in the cancellation process. Defaults to “0x”.
  • request.txOptions: [Optional] The transaction options.
const response = await client.dispute.cancelDispute({
  disputeId: 1,
  txOptions: { waitForTransactions: true },
});

resolveDispute

Resolves a dispute after it has been judged

MethodType
resolveDispute(request: ResolveDisputeRequest) => Promise<ResolveDisputeResponse>

Parameters:

  • request.disputeId: The ID of the dispute to be resolved.
  • request.data: [Optional] The data to resolve the dispute. Defaults to “0x”.
  • request.txOptions: [Optional] The transaction options.
const response = await client.dispute.resolveDispute({
  disputeId: 1,
  data: "0x",
  txOptions: { waitForTransaction: true },
});

tagIfRelatedIpInfringed

Tags a derivative if a parent has been tagged with an infringement tag or a group ip if a group member has been tagged with an infringement tag.

MethodType
tagIfRelatedIpInfringed(request: TagIfRelatedIpInfringedRequest) => Promise<TransactionResponse[]>

Parameters:

  • request.infringementTags[]: An array of tags relating to the dispute
    • request.infringementTags[].ipId: The ipId to tag
    • request.infringementTags[].disputeId: The dispute id that tagged the related infringing parent IP
  • request.options: [Optional]
    • request.options.useMulticallWhenPossible: [Optional] Use multicall to batch the calls into one transaction when possible. If only 1 infringementTag is provided, multicall will not be used. Default: true
  • request.txOptions: [Optional] The transaction options.
const response = await client.dispute.tagIfRelatedIpInfringed({
  infringementTags: [
    {
      ipId: "0xa1BaAA464716eC76A285Ef873d27f97645fE0366",
      disputeId: 1,
    },
  ],
  txOptions: { waitForTransaction: true },
});

disputeAssertion

Counters a dispute that was raised by another party on an IP using counter evidence.

This method can only be called by the IP’s owner to counter a dispute by providing counter evidence. The counter evidence (e.g., documents, images) should be uploaded to IPFS, and its corresponding CID is converted to a hash for the request.

If you only have a disputeId, call disputeIdToAssertionId to get the assertionId needed here.

MethodType
disputeAssertion(request: DisputeAssertionRequest) => Promise<TransactionResponse>

Parameters:

  • request.ipId: The IP ID that is the target of the dispute.
  • request.assertionId: The identifier of the assertion that was disputed. You can get this from the disputeId by calling dispute.disputeIdToAssertionId.
  • request.counterEvidenceCID: Content Identifier (CID) for the counter evidence. This should be obtained by uploading your dispute evidence (documents, images, etc.) to IPFS. Example: “QmX4zdp8VpzqvtKuEqMo6gfZPdoUx9TeHXCgzKLcFfSUbk”
  • request.wipOptions: [Optional]
    • request.wipOptions.enableAutoWrapIp: [Optional]By default IP is converted to WIP if the current WIP balance does not cover the fees. Set this to false to disable this behavior. Default: true
    • request.wipOptions.enableAutoApprove: [Optional]Automatically approve WIP usage when WIP is needed but current allowance is not sufficient. Set this to false to disable this behavior. Default: true
  • request.txOptions: [Optional] The transaction options.
const assertionId = await client.dispute.disputeIdToAssertionId(1);

const result = await client.dispute.disputeAssertion({
  ipId: "0xa1BaAA464716eC76A285Ef873d27f97645fE0366",
  assertionId: assertionId,
  counterEvidenceCID: "QmX4zdp8VpzqvtKuEqMo6gfZPdoUx9TeHXCgzKLcFfSUbk",
  txOptions: { waitForTransaction: true },
});

disputeIdToAssertionId

Maps a dispute id to an assertion id

MethodType
disputeIdToAssertionId(disputeId: number) => Promise<Hex>

Parameters:

  • request.disputeId: The dispute ID.
const result = await client.dispute.disputeIdToAssertionId(1);