{
  "_format": "hh-sol-artifact-1",
  "contractName": "Roles",
  "sourceName": "contracts/utils/Roles.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "InvalidProposedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "fromAccount",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "toAccount",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "accountRoles",
          "type": "uint256"
        }
      ],
      "name": "InvalidProposedRoles",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "accountRoles",
          "type": "uint256"
        }
      ],
      "name": "MissingAllRoles",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "accountRoles",
          "type": "uint256"
        }
      ],
      "name": "MissingAnyOfRoles",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "role",
          "type": "uint8"
        }
      ],
      "name": "MissingRole",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "accountRoles",
          "type": "uint256"
        }
      ],
      "name": "RolesAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "fromAccount",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "toAccount",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "accountRoles",
          "type": "uint256"
        }
      ],
      "name": "RolesProposed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "accountRoles",
          "type": "uint256"
        }
      ],
      "name": "RolesRemoved",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "fromAccount",
          "type": "address"
        },
        {
          "internalType": "uint8[]",
          "name": "roles",
          "type": "uint8[]"
        }
      ],
      "name": "acceptRoles",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "getAccountRoles",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "accountRoles",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "fromAccount",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "toAccount",
          "type": "address"
        }
      ],
      "name": "getProposedRoles",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "proposedRoles_",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint8[]",
          "name": "roles",
          "type": "uint8[]"
        }
      ],
      "name": "hasAllTheRoles",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint8[]",
          "name": "roles",
          "type": "uint8[]"
        }
      ],
      "name": "hasAnyOfRoles",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "role",
          "type": "uint8"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "toAccount",
          "type": "address"
        },
        {
          "internalType": "uint8[]",
          "name": "roles",
          "type": "uint8[]"
        }
      ],
      "name": "proposeRoles",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "toAccount",
          "type": "address"
        },
        {
          "internalType": "uint8[]",
          "name": "roles",
          "type": "uint8[]"
        }
      ],
      "name": "transferRoles",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b506109c3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a7c6464a1161005b578063a7c6464a146100f0578063ca1e5a0f14610103578063cacebadc14610124578063fa0cd6e31461013757600080fd5b806328a7394d1461008d5780635bfc19fb146100b55780638ecf1e9a146100ca57806395a8c58d146100dd575b600080fd5b6100a061009b3660046107f0565b61014a565b60405190151581526020015b60405180910390f35b6100c86100c33660046107f0565b61016f565b005b6100c86100d83660046107f0565b61017e565b6100a06100eb3660046108e6565b610215565b6100c86100fe3660046107f0565b610230565b610116610111366004610919565b6102c2565b6040519081526020016100ac565b610116610132366004610943565b6102ce565b6100a06101453660046107f0565b6102df565b6000610168610158846102fc565b61016184610310565b9081161490565b9392505050565b61017a823383610358565b5050565b73ffffffffffffffffffffffffffffffffffffffff821615806101b6575073ffffffffffffffffffffffffffffffffffffffff821633145b1561020a576040517fefacae2200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024015b60405180910390fd5b61017a338383610370565b6000610168610223846102fc565b600160ff85161b16151590565b73ffffffffffffffffffffffffffffffffffffffff82161580610268575073ffffffffffffffffffffffffffffffffffffffff821633145b156102b7576040517fefacae2200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610201565b61017a338383610383565b60006101688383610396565b60006102d9826102fc565b92915050565b60006101686102ed846102fc565b6102f684610310565b16151590565b600080610308836103ac565b549392505050565b805160009081805b82811015610350578481815181106103325761033261095e565b602002602001015160ff166001901b82179150806001019050610318565b509392505050565b61036b838361036684610310565b61042c565b505050565b61036b838361037e84610310565b6104ac565b61036b838361039184610310565b61058b565b6000806103a38484610600565b54949350505050565b60007fde9bdca322e1a848f72215bc15cf2c87fe7749145789a9ee281a2a6290af26ab8260405160200161040f92919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b604051602081830303815290604052805190602001209050919050565b806104378484610396565b14610495576040517f6004fe4000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301528316602482015260448101829052606401610201565b6104a18383600061068f565b61036b83838361058b565b6104bf6104b8846102fc565b8216821490565b610514576040517f7fa6fbb400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604401610201565b61051f83838361068f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff7158d1591c2cf17c0e6b9459d86365c47fe0969c79f40ef49e0c437d8f399148360405161057e91815260200190565b60405180910390a3505050565b6105976104b8846102fc565b6105ec576040517f7fa6fbb400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604401610201565b6105f683826106a4565b61036b8282610713565b60007ff96e07b2f4fbb81c31567d2b261589af429e98f0958d53f7e6ad5d63aea0ab7c838360405160200161067193929190928352606091821b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020850152911b16603482015260480190565b60405160208183030381529060405280519060200120905092915050565b600061069b8484610600565b91909155505050565b600081196106b1846102fc565b1690506106be8382610774565b8273ffffffffffffffffffffffffffffffffffffffff167fccf920c8facee98a9c2a6c6124f2857b87b17e9f3a819bfcc6945196ee77366b8360405161070691815260200190565b60405180910390a2505050565b60008161071f846102fc565b17905061072c8382610774565b8273ffffffffffffffffffffffffffffffffffffffff167f34e73c57659d4b6809b53db4feee9b007b892e978114eda420d2991aba1501438360405161070691815260200190565b600061077f836103ac565b919091555050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107ab57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b803560ff811681146107ab57600080fd5b6000806040838503121561080357600080fd5b61080c83610787565b915060208084013567ffffffffffffffff8082111561082a57600080fd5b818601915086601f83011261083e57600080fd5b813581811115610850576108506107b0565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715610893576108936107b0565b6040529182528482019250838101850191898311156108b157600080fd5b938501935b828510156108d6576108c7856107df565b845293850193928501926108b6565b8096505050505050509250929050565b600080604083850312156108f957600080fd5b61090283610787565b9150610910602084016107df565b90509250929050565b6000806040838503121561092c57600080fd5b61093583610787565b915061091060208401610787565b60006020828403121561095557600080fd5b61016882610787565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122075ab60d1c1a70d22dd0ced64523fff2d4fadf14a26bbf89312bf464d665ad92f64736f6c63430008170033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a7c6464a1161005b578063a7c6464a146100f0578063ca1e5a0f14610103578063cacebadc14610124578063fa0cd6e31461013757600080fd5b806328a7394d1461008d5780635bfc19fb146100b55780638ecf1e9a146100ca57806395a8c58d146100dd575b600080fd5b6100a061009b3660046107f0565b61014a565b60405190151581526020015b60405180910390f35b6100c86100c33660046107f0565b61016f565b005b6100c86100d83660046107f0565b61017e565b6100a06100eb3660046108e6565b610215565b6100c86100fe3660046107f0565b610230565b610116610111366004610919565b6102c2565b6040519081526020016100ac565b610116610132366004610943565b6102ce565b6100a06101453660046107f0565b6102df565b6000610168610158846102fc565b61016184610310565b9081161490565b9392505050565b61017a823383610358565b5050565b73ffffffffffffffffffffffffffffffffffffffff821615806101b6575073ffffffffffffffffffffffffffffffffffffffff821633145b1561020a576040517fefacae2200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024015b60405180910390fd5b61017a338383610370565b6000610168610223846102fc565b600160ff85161b16151590565b73ffffffffffffffffffffffffffffffffffffffff82161580610268575073ffffffffffffffffffffffffffffffffffffffff821633145b156102b7576040517fefacae2200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610201565b61017a338383610383565b60006101688383610396565b60006102d9826102fc565b92915050565b60006101686102ed846102fc565b6102f684610310565b16151590565b600080610308836103ac565b549392505050565b805160009081805b82811015610350578481815181106103325761033261095e565b602002602001015160ff166001901b82179150806001019050610318565b509392505050565b61036b838361036684610310565b61042c565b505050565b61036b838361037e84610310565b6104ac565b61036b838361039184610310565b61058b565b6000806103a38484610600565b54949350505050565b60007fde9bdca322e1a848f72215bc15cf2c87fe7749145789a9ee281a2a6290af26ab8260405160200161040f92919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b604051602081830303815290604052805190602001209050919050565b806104378484610396565b14610495576040517f6004fe4000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301528316602482015260448101829052606401610201565b6104a18383600061068f565b61036b83838361058b565b6104bf6104b8846102fc565b8216821490565b610514576040517f7fa6fbb400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604401610201565b61051f83838361068f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff7158d1591c2cf17c0e6b9459d86365c47fe0969c79f40ef49e0c437d8f399148360405161057e91815260200190565b60405180910390a3505050565b6105976104b8846102fc565b6105ec576040517f7fa6fbb400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604401610201565b6105f683826106a4565b61036b8282610713565b60007ff96e07b2f4fbb81c31567d2b261589af429e98f0958d53f7e6ad5d63aea0ab7c838360405160200161067193929190928352606091821b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020850152911b16603482015260480190565b60405160208183030381529060405280519060200120905092915050565b600061069b8484610600565b91909155505050565b600081196106b1846102fc565b1690506106be8382610774565b8273ffffffffffffffffffffffffffffffffffffffff167fccf920c8facee98a9c2a6c6124f2857b87b17e9f3a819bfcc6945196ee77366b8360405161070691815260200190565b60405180910390a2505050565b60008161071f846102fc565b17905061072c8382610774565b8273ffffffffffffffffffffffffffffffffffffffff167f34e73c57659d4b6809b53db4feee9b007b892e978114eda420d2991aba1501438360405161070691815260200190565b600061077f836103ac565b919091555050565b803573ffffffffffffffffffffffffffffffffffffffff811681146107ab57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b803560ff811681146107ab57600080fd5b6000806040838503121561080357600080fd5b61080c83610787565b915060208084013567ffffffffffffffff8082111561082a57600080fd5b818601915086601f83011261083e57600080fd5b813581811115610850576108506107b0565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715610893576108936107b0565b6040529182528482019250838101850191898311156108b157600080fd5b938501935b828510156108d6576108c7856107df565b845293850193928501926108b6565b8096505050505050509250929050565b600080604083850312156108f957600080fd5b61090283610787565b9150610910602084016107df565b90509250929050565b6000806040838503121561092c57600080fd5b61093583610787565b915061091060208401610787565b60006020828403121561095557600080fd5b61016882610787565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122075ab60d1c1a70d22dd0ced64523fff2d4fadf14a26bbf89312bf464d665ad92f64736f6c63430008170033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
