{
  "name": "Nulvo",
  "chain": {
    "name": "Elysium",
    "id": 99901,
    "rpc": "https://rpc.elysium.kinetiq.xyz",
    "explorer": "https://elysium.kinetiq.xyz"
  },
  "contracts": {
    "NulvoPaymentBook": {
      "address": null,
      "deployedBlock": null,
      "receiptTag": "0x191df5521f97ce09fa3d21c488becc2a7a85102f043d610c245ac9f220d55d1d",
      "abi": [
        {
          "type": "receive",
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "MAX_EXPIRY",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "RECEIPT_TAG",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "cancel",
          "inputs": [
            {
              "name": "id",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "commitmentFor",
          "inputs": [
            {
              "name": "salt",
              "type": "bytes32",
              "internalType": "bytes32"
            },
            {
              "name": "detailsHash",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "pure"
        },
        {
          "type": "function",
          "name": "isOperator",
          "inputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "linkIdFor",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "expiresAt",
              "type": "uint64",
              "internalType": "uint64"
            },
            {
              "name": "commitment",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "linkOf",
          "inputs": [
            {
              "name": "linkId",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "tuple",
              "internalType": "struct NulvoPaymentBook.LinkPayment",
              "components": [
                {
                  "name": "payer",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "paidAt",
                  "type": "uint64",
                  "internalType": "uint64"
                },
                {
                  "name": "recipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "token",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "amount",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "commitment",
                  "type": "bytes32",
                  "internalType": "bytes32"
                }
              ]
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "linkRevoked",
          "inputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "linksPaid",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "linksRevoked",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "nonceOf",
          "inputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "open",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "expiresAt",
              "type": "uint64",
              "internalType": "uint64"
            },
            {
              "name": "commitment",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "id",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "pay",
          "inputs": [
            {
              "name": "id",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [],
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "payLink",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "expiresAt",
              "type": "uint64",
              "internalType": "uint64"
            },
            {
              "name": "commitment",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "linkId",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "requestOf",
          "inputs": [
            {
              "name": "id",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "r",
              "type": "tuple",
              "internalType": "struct NulvoPaymentBook.Request",
              "components": [
                {
                  "name": "recipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "createdAt",
                  "type": "uint64",
                  "internalType": "uint64"
                },
                {
                  "name": "token",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "expiresAt",
                  "type": "uint64",
                  "internalType": "uint64"
                },
                {
                  "name": "amount",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "commitment",
                  "type": "bytes32",
                  "internalType": "bytes32"
                },
                {
                  "name": "payer",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "settledAt",
                  "type": "uint64",
                  "internalType": "uint64"
                },
                {
                  "name": "status",
                  "type": "uint8",
                  "internalType": "enum NulvoPaymentBook.Status"
                }
              ]
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "requestsCancelled",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "requestsOpened",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "requestsPaid",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "revokeLink",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "expiresAt",
              "type": "uint64",
              "internalType": "uint64"
            },
            {
              "name": "commitment",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "linkId",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setOperator",
          "inputs": [
            {
              "name": "operator",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "allowed",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "statusOf",
          "inputs": [
            {
              "name": "id",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint8",
              "internalType": "enum NulvoPaymentBook.Status"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "totals",
          "inputs": [],
          "outputs": [
            {
              "name": "opened",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "paid",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "cancelled",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "linkPaid",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "linkRevoke",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "verifyLink",
          "inputs": [
            {
              "name": "linkId",
              "type": "bytes32",
              "internalType": "bytes32"
            },
            {
              "name": "salt",
              "type": "bytes32",
              "internalType": "bytes32"
            },
            {
              "name": "detailsHash",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "verifyRequest",
          "inputs": [
            {
              "name": "id",
              "type": "bytes32",
              "internalType": "bytes32"
            },
            {
              "name": "salt",
              "type": "bytes32",
              "internalType": "bytes32"
            },
            {
              "name": "detailsHash",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "event",
          "name": "LinkPaid",
          "inputs": [
            {
              "name": "linkId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "bytes32"
            },
            {
              "name": "payer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "commitment",
              "type": "bytes32",
              "indexed": false,
              "internalType": "bytes32"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LinkRevoked",
          "inputs": [
            {
              "name": "linkId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "bytes32"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "by",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OperatorSet",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "operator",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "allowed",
              "type": "bool",
              "indexed": false,
              "internalType": "bool"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "RequestCancelled",
          "inputs": [
            {
              "name": "id",
              "type": "bytes32",
              "indexed": true,
              "internalType": "bytes32"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "by",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "RequestOpened",
          "inputs": [
            {
              "name": "id",
              "type": "bytes32",
              "indexed": true,
              "internalType": "bytes32"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "openedBy",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "expiresAt",
              "type": "uint64",
              "indexed": false,
              "internalType": "uint64"
            },
            {
              "name": "commitment",
              "type": "bytes32",
              "indexed": false,
              "internalType": "bytes32"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "RequestPaid",
          "inputs": [
            {
              "name": "id",
              "type": "bytes32",
              "indexed": true,
              "internalType": "bytes32"
            },
            {
              "name": "payer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "commitment",
              "type": "bytes32",
              "indexed": false,
              "internalType": "bytes32"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "AlreadyPaid",
          "inputs": []
        },
        {
          "type": "error",
          "name": "BadExpiry",
          "inputs": []
        },
        {
          "type": "error",
          "name": "FeeOnTransfer",
          "inputs": [
            {
              "name": "expected",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "received",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "LinkExpired",
          "inputs": []
        },
        {
          "type": "error",
          "name": "LinkIsRevoked",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotAContract",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "NotOpen",
          "inputs": [
            {
              "name": "status",
              "type": "uint8",
              "internalType": "enum NulvoPaymentBook.Status"
            }
          ]
        },
        {
          "type": "error",
          "name": "NotRecipientOrOperator",
          "inputs": []
        },
        {
          "type": "error",
          "name": "RecipientRejected",
          "inputs": []
        },
        {
          "type": "error",
          "name": "Reentrancy",
          "inputs": []
        },
        {
          "type": "error",
          "name": "RequestExpired",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SelfOperator",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SelfPayment",
          "inputs": []
        },
        {
          "type": "error",
          "name": "TokenTransferFailed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "UnknownRequest",
          "inputs": []
        },
        {
          "type": "error",
          "name": "WrongValue",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAmount",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroCommitment",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroRecipient",
          "inputs": []
        }
      ]
    }
  },
  "receipt": "commitment = keccak256(abi.encode(RECEIPT_TAG, salt, keccak256(utf8(JSON {memo, ref}))))",
  "notes": "No owner, no admin, no fee. The book forwards each payment in the same transaction and never holds a balance."
}