{
  "_format": "hh-sol-artifact-1",
  "contractName": "PreciseUnitMathMock",
  "sourceName": "contracts/mocks/PreciseUnitMathMock.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "a",
          "type": "int256"
        }
      ],
      "name": "abs",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "a",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "b",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "range",
          "type": "uint256"
        }
      ],
      "name": "approximatelyEquals",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "a",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "b",
          "type": "int256"
        }
      ],
      "name": "conservativePreciseDiv",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "a",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "b",
          "type": "int256"
        }
      ],
      "name": "conservativePreciseMul",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "a",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "b",
          "type": "int256"
        }
      ],
      "name": "divDown",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxInt256",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minInt256",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "a",
          "type": "int256"
        }
      ],
      "name": "neg",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "a",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "b",
          "type": "int256"
        }
      ],
      "name": "preciseDiv",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "a",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "b",
          "type": "uint256"
        }
      ],
      "name": "preciseDiv",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "a",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "b",
          "type": "uint256"
        }
      ],
      "name": "preciseDivCeil",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "a",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "b",
          "type": "int256"
        }
      ],
      "name": "preciseDivCeilInt",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "a",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "b",
          "type": "uint256"
        }
      ],
      "name": "preciseMul",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "a",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "b",
          "type": "uint256"
        }
      ],
      "name": "preciseMulCeil",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "a",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "b",
          "type": "int256"
        }
      ],
      "name": "preciseMulInt",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "preciseUnit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "preciseUnitInt",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "a",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "b",
          "type": "uint256"
        }
      ],
      "name": "safePower",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b50610c7f806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063ad8b9b9b116100a2578063db43cf9211610071578063db43cf9214610201578063ddb29e9214610214578063dfcc00f214610227578063e22cfd3f1461023a578063ebf585301461024d57610116565b8063ad8b9b9b146101bb578063cc06c6dd146101ce578063d0c11c77146101e1578063d5e5e6e61461011b57610116565b8063576dcc3d116100e9578063576dcc3d146101725780636749ab9a1461018557806370f0e27a146101985780637c1bd7c8146101ab57806393b027b4146101b357610116565b8063127a30f11461011b5780631ad50586146101395780631b5ac4b51461014c57806354a53dc11461015f575b600080fd5b610123610260565b60405161013091906109d6565b60405180910390f35b61012361014736600461098e565b61026f565b61012361015a366004610955565b61028a565b61012361016d366004610955565b610295565b61012361018036600461098e565b6102a0565b61012361019336600461098e565b6102b2565b6101236101a636600461096d565b6102c4565b6101236102d6565b6101236102e0565b6101236101c936600461096d565b6102ea565b6101236101dc36600461096d565b6102fc565b6101f46101ef3660046109a0565b61030e565b60405161013091906109cb565b61012361020f36600461098e565b610329565b61012361022236600461096d565b61033b565b61012361023536600461096d565b61034d565b61012361024836600461096d565b61035f565b61012361025b36600461098e565b610371565b600061026a610383565b905090565b6000610281838363ffffffff61038f16565b90505b92915050565b6000610284826103ea565b60006102848261041c565b6000610281838363ffffffff61044816565b6000610281838363ffffffff6104bf16565b6000610281838363ffffffff6104fe16565b600061026a610521565b600061026a610529565b6000610281838363ffffffff61053416565b6000610281838363ffffffff61055716565b600061032184848463ffffffff6105d116565b949350505050565b6000610281838363ffffffff61060816565b6000610281838363ffffffff61062616565b6000610281838363ffffffff6106b416565b6000610281838363ffffffff6106de16565b6000610281838363ffffffff6106fc16565b670de0b6b3a764000090565b60008083116103b95760405162461bcd60e51b81526004016103b090610a69565b60405180910390fd5b600160005b838110156103e257816103d7818763ffffffff61071a16565b9250506001016103be565b509392505050565b6000808212156104135761040e6104098360001963ffffffff61075416565b6107bf565b610284565b610284826107bf565b6000600160ff1b82136104415760405162461bcd60e51b81526004016103b090610bbe565b5060000390565b6000816104675760405162461bcd60e51b81526004016103b090610c1f565b60008311610476576000610281565b61028160016104b3846104a78361049b89670de0b6b3a764000063ffffffff61071a16565b9063ffffffff6107e516565b9063ffffffff61082716565b9063ffffffff61086916565b60008215806104cc575081155b156104d957506000610284565b61028160016104b3670de0b6b3a76400006104a78361049b898963ffffffff61071a16565b6000610281610513848463ffffffff61075416565b670de0b6b3a7640000610626565b600160ff1b90565b6001600160ff1b0390565b600061028161055184670de0b6b3a764000063ffffffff61075416565b83610626565b6000816105765760405162461bcd60e51b81526004016103b090610c1f565b61058e83670de0b6b3a764000063ffffffff61075416565b925060006105a2848463ffffffff61088e16565b90508284816105ad57fe5b0715610281576000838518136105c75760001901806103e2565b6001019392505050565b60006105e3838363ffffffff61086916565b841115801561032157506105fd838363ffffffff6107e516565b909310159392505050565b6000610281670de0b6b3a76400006104a7858563ffffffff61071a16565b6000816106455760405162461bcd60e51b81526004016103b090610c1f565b600160ff1b8314158061065a57508160001914155b6106765760405162461bcd60e51b81526004016103b090610b97565b6000610688848463ffffffff61088e16565b905060008385181280156106a457508284816106a057fe5b0715155b1561028157600019019392505050565b6000610281670de0b6b3a76400006106d2858563ffffffff61075416565b9063ffffffff61088e16565b6000610281826106d285670de0b6b3a764000063ffffffff61075416565b6000610281826104a785670de0b6b3a764000063ffffffff61071a16565b60008261072957506000610284565b8282028284828161073657fe5b04146102815760405162461bcd60e51b81526004016103b090610b0f565b60008261076357506000610284565b826000191480156107775750600160ff1b82145b156107945760405162461bcd60e51b81526004016103b090610b50565b828202828482816107a157fe5b05146102815760405162461bcd60e51b81526004016103b090610b50565b6000808212156107e15760405162461bcd60e51b81526004016103b090610a99565b5090565b600061028183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506108f2565b600061028183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061091e565b6000828201838110156102815760405162461bcd60e51b81526004016103b090610a32565b6000816108ad5760405162461bcd60e51b81526004016103b090610bea565b816000191480156108c15750600160ff1b83145b156108de5760405162461bcd60e51b81526004016103b090610ace565b60008284816108e957fe5b05949350505050565b600081848411156109165760405162461bcd60e51b81526004016103b091906109df565b505050900390565b6000818361093f5760405162461bcd60e51b81526004016103b091906109df565b50600083858161094b57fe5b0495945050505050565b600060208284031215610966578081fd5b5035919050565b6000806040838503121561097f578081fd5b50508035926020909101359150565b6000806040838503121561097f578182fd5b6000806000606084860312156109b4578081fd5b505081359360208301359350604090920135919050565b901515815260200190565b90815260200190565b6000602080835283518082850152825b81811015610a0b578581018301518582016040015282016109ef565b81811115610a1c5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526016908201527556616c7565206d75737420626520706f73697469766560501b604082015260600190565b6020808252818101527f53616665436173743a2076616c7565206d75737420626520706f736974697665604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526027908201527f5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f604082015266766572666c6f7760c81b606082015260800190565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b602080825260129082015271496e76657273696f6e206f766572666c6f7760701b604082015260600190565b6020808252818101527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604082015260600190565b60208082526010908201526f043616e742064697669646520627920360841b60408201526060019056fea26469706673582212208abc43f57416779d2ab2f649b2c84e64ced64f5ccf5683feb61422718a0c65b064736f6c634300060a0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063ad8b9b9b116100a2578063db43cf9211610071578063db43cf9214610201578063ddb29e9214610214578063dfcc00f214610227578063e22cfd3f1461023a578063ebf585301461024d57610116565b8063ad8b9b9b146101bb578063cc06c6dd146101ce578063d0c11c77146101e1578063d5e5e6e61461011b57610116565b8063576dcc3d116100e9578063576dcc3d146101725780636749ab9a1461018557806370f0e27a146101985780637c1bd7c8146101ab57806393b027b4146101b357610116565b8063127a30f11461011b5780631ad50586146101395780631b5ac4b51461014c57806354a53dc11461015f575b600080fd5b610123610260565b60405161013091906109d6565b60405180910390f35b61012361014736600461098e565b61026f565b61012361015a366004610955565b61028a565b61012361016d366004610955565b610295565b61012361018036600461098e565b6102a0565b61012361019336600461098e565b6102b2565b6101236101a636600461096d565b6102c4565b6101236102d6565b6101236102e0565b6101236101c936600461096d565b6102ea565b6101236101dc36600461096d565b6102fc565b6101f46101ef3660046109a0565b61030e565b60405161013091906109cb565b61012361020f36600461098e565b610329565b61012361022236600461096d565b61033b565b61012361023536600461096d565b61034d565b61012361024836600461096d565b61035f565b61012361025b36600461098e565b610371565b600061026a610383565b905090565b6000610281838363ffffffff61038f16565b90505b92915050565b6000610284826103ea565b60006102848261041c565b6000610281838363ffffffff61044816565b6000610281838363ffffffff6104bf16565b6000610281838363ffffffff6104fe16565b600061026a610521565b600061026a610529565b6000610281838363ffffffff61053416565b6000610281838363ffffffff61055716565b600061032184848463ffffffff6105d116565b949350505050565b6000610281838363ffffffff61060816565b6000610281838363ffffffff61062616565b6000610281838363ffffffff6106b416565b6000610281838363ffffffff6106de16565b6000610281838363ffffffff6106fc16565b670de0b6b3a764000090565b60008083116103b95760405162461bcd60e51b81526004016103b090610a69565b60405180910390fd5b600160005b838110156103e257816103d7818763ffffffff61071a16565b9250506001016103be565b509392505050565b6000808212156104135761040e6104098360001963ffffffff61075416565b6107bf565b610284565b610284826107bf565b6000600160ff1b82136104415760405162461bcd60e51b81526004016103b090610bbe565b5060000390565b6000816104675760405162461bcd60e51b81526004016103b090610c1f565b60008311610476576000610281565b61028160016104b3846104a78361049b89670de0b6b3a764000063ffffffff61071a16565b9063ffffffff6107e516565b9063ffffffff61082716565b9063ffffffff61086916565b60008215806104cc575081155b156104d957506000610284565b61028160016104b3670de0b6b3a76400006104a78361049b898963ffffffff61071a16565b6000610281610513848463ffffffff61075416565b670de0b6b3a7640000610626565b600160ff1b90565b6001600160ff1b0390565b600061028161055184670de0b6b3a764000063ffffffff61075416565b83610626565b6000816105765760405162461bcd60e51b81526004016103b090610c1f565b61058e83670de0b6b3a764000063ffffffff61075416565b925060006105a2848463ffffffff61088e16565b90508284816105ad57fe5b0715610281576000838518136105c75760001901806103e2565b6001019392505050565b60006105e3838363ffffffff61086916565b841115801561032157506105fd838363ffffffff6107e516565b909310159392505050565b6000610281670de0b6b3a76400006104a7858563ffffffff61071a16565b6000816106455760405162461bcd60e51b81526004016103b090610c1f565b600160ff1b8314158061065a57508160001914155b6106765760405162461bcd60e51b81526004016103b090610b97565b6000610688848463ffffffff61088e16565b905060008385181280156106a457508284816106a057fe5b0715155b1561028157600019019392505050565b6000610281670de0b6b3a76400006106d2858563ffffffff61075416565b9063ffffffff61088e16565b6000610281826106d285670de0b6b3a764000063ffffffff61075416565b6000610281826104a785670de0b6b3a764000063ffffffff61071a16565b60008261072957506000610284565b8282028284828161073657fe5b04146102815760405162461bcd60e51b81526004016103b090610b0f565b60008261076357506000610284565b826000191480156107775750600160ff1b82145b156107945760405162461bcd60e51b81526004016103b090610b50565b828202828482816107a157fe5b05146102815760405162461bcd60e51b81526004016103b090610b50565b6000808212156107e15760405162461bcd60e51b81526004016103b090610a99565b5090565b600061028183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506108f2565b600061028183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061091e565b6000828201838110156102815760405162461bcd60e51b81526004016103b090610a32565b6000816108ad5760405162461bcd60e51b81526004016103b090610bea565b816000191480156108c15750600160ff1b83145b156108de5760405162461bcd60e51b81526004016103b090610ace565b60008284816108e957fe5b05949350505050565b600081848411156109165760405162461bcd60e51b81526004016103b091906109df565b505050900390565b6000818361093f5760405162461bcd60e51b81526004016103b091906109df565b50600083858161094b57fe5b0495945050505050565b600060208284031215610966578081fd5b5035919050565b6000806040838503121561097f578081fd5b50508035926020909101359150565b6000806040838503121561097f578182fd5b6000806000606084860312156109b4578081fd5b505081359360208301359350604090920135919050565b901515815260200190565b90815260200190565b6000602080835283518082850152825b81811015610a0b578581018301518582016040015282016109ef565b81811115610a1c5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526016908201527556616c7565206d75737420626520706f73697469766560501b604082015260600190565b6020808252818101527f53616665436173743a2076616c7565206d75737420626520706f736974697665604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526027908201527f5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f604082015266766572666c6f7760c81b606082015260800190565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b602080825260129082015271496e76657273696f6e206f766572666c6f7760701b604082015260600190565b6020808252818101527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604082015260600190565b60208082526010908201526f043616e742064697669646520627920360841b60408201526060019056fea26469706673582212208abc43f57416779d2ab2f649b2c84e64ced64f5ccf5683feb61422718a0c65b064736f6c634300060a0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
