{
  "DappTokenMock": {
    "abi": [
      {
        "inputs": [
          {
            "internalType": "string",
            "name": "_name",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "_symbol",
            "type": "string"
          },
          {
            "internalType": "uint8",
            "name": "_decimals",
            "type": "uint8"
          },
          {
            "internalType": "address",
            "name": "_barteredToken",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_tokenTransferProxy",
            "type": "address"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "constructor"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "_spender",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          }
        ],
        "name": "Approval",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "bool",
            "name": "state",
            "type": "bool"
          }
        ],
        "name": "ApprovedMigrator",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "SetAbilities",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_from",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "_to",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          }
        ],
        "name": "Transfer",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "bool",
            "name": "state",
            "type": "bool"
          }
        ],
        "name": "WhitelistedRecipient",
        "type": "event"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "name": "addressToAbility",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_spender",
            "type": "address"
          }
        ],
        "name": "allowance",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "_remaining",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_spender",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          }
        ],
        "name": "approve",
        "outputs": [
          {
            "internalType": "bool",
            "name": "_success",
            "type": "bool"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_approver",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_spender",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "_feeRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_feeValue",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_seed",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_expiration",
            "type": "uint256"
          },
          {
            "components": [
              {
                "internalType": "bytes32",
                "name": "r",
                "type": "bytes32"
              },
              {
                "internalType": "bytes32",
                "name": "s",
                "type": "bytes32"
              },
              {
                "internalType": "uint8",
                "name": "v",
                "type": "uint8"
              },
              {
                "internalType": "enum DappToken.SignatureKind",
                "name": "kind",
                "type": "uint8"
              }
            ],
            "internalType": "struct DappToken.SignatureData",
            "name": "_signature",
            "type": "tuple"
          }
        ],
        "name": "approveWithSignature",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "name": "approvedMigrators",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_owner",
            "type": "address"
          }
        ],
        "name": "balanceOf",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "_balance",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "barteredToken",
        "outputs": [
          {
            "internalType": "contract ERC20",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_spender",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "_feeRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_feeValue",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_seed",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_expiration",
            "type": "uint256"
          }
        ],
        "name": "cancelApproveWithSignature",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ],
        "name": "claimCancelled",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ],
        "name": "claimPerformed",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "decimals",
        "outputs": [
          {
            "internalType": "uint8",
            "name": "_decimals",
            "type": "uint8"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "_receiver",
            "type": "address"
          }
        ],
        "name": "deposit",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_approver",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_spender",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "_feeRecipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_feeValue",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_seed",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "_expiration",
            "type": "uint256"
          }
        ],
        "name": "generateClaim",
        "outputs": [
          {
            "internalType": "bytes32",
            "name": "_claim",
            "type": "bytes32"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "grantAbilities",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "isAble",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_signer",
            "type": "address"
          },
          {
            "internalType": "bytes32",
            "name": "_claim",
            "type": "bytes32"
          },
          {
            "components": [
              {
                "internalType": "bytes32",
                "name": "r",
                "type": "bytes32"
              },
              {
                "internalType": "bytes32",
                "name": "s",
                "type": "bytes32"
              },
              {
                "internalType": "uint8",
                "name": "v",
                "type": "uint8"
              },
              {
                "internalType": "enum DappToken.SignatureKind",
                "name": "kind",
                "type": "uint8"
              }
            ],
            "internalType": "struct DappToken.SignatureData",
            "name": "_signature",
            "type": "tuple"
          }
        ],
        "name": "isValidSignature",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "migrate",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "migrationAddress",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "name",
        "outputs": [
          {
            "internalType": "string",
            "name": "_name",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_migrator",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_amount",
            "type": "uint256"
          }
        ],
        "name": "onMigrationReceived",
        "outputs": [
          {
            "internalType": "bytes4",
            "name": "",
            "type": "bytes4"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "revokeAbilities",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "setAbilities",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "bool",
            "name": "_state",
            "type": "bool"
          }
        ],
        "name": "setApprovedMigrator",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "bool",
            "name": "_state",
            "type": "bool"
          }
        ],
        "name": "setWhitelistedRecipient",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          }
        ],
        "name": "startMigration",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes4",
            "name": "_interfaceID",
            "type": "bytes4"
          }
        ],
        "name": "supportsInterface",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "symbol",
        "outputs": [
          {
            "internalType": "string",
            "name": "_symbol",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "tokenTransferProxy",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "totalSupply",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "_totalSupply",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_to",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          }
        ],
        "name": "transfer",
        "outputs": [
          {
            "internalType": "bool",
            "name": "_success",
            "type": "bool"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_from",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_to",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          }
        ],
        "name": "transferFrom",
        "outputs": [
          {
            "internalType": "bool",
            "name": "_success",
            "type": "bool"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "name": "whitelistedRecipients",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "_value",
            "type": "uint256"
          }
        ],
        "name": "withdraw",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      }
    ],
    "evm": {
      "bytecode": {
        "object": "60806040523480156200001157600080fd5b50604051620025633803806200256383398101604081905262000034916200030f565b7f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c58054600160ff199182168117909255336000908152602083815260408220600f90558181527f9047944217cf7a5a57cc49e67181a64066b571778b37f1b501b5b2483c404e7480548416851790557fda3cefe610fb16fb609e83632d9bfe397c73a53e0e3889c3c671f29203793f8280548416851790557f0648b88cb4f83f2d3a24d50bb67a4b7e9cfc7f04811e84ba831e24e1b44237e2805484168517905563313ce56760e01b9091527f57c3f48cc00ca48466de578a46bac144b80c7e62e6b209102e549439d6cf9afa8054909216909217905585516200013f9160029190880190620001a1565b50835162000155906003906020870190620001a1565b506004805460ff191660ff9490941693909317909255600a80546001600160a01b03199081166001600160a01b0393841617909155600880549091169190921617905550620004079050565b828054620001af90620003b4565b90600052602060002090601f016020900481019282620001d357600085556200021e565b82601f10620001ee57805160ff19168380011785556200021e565b828001600101855582156200021e579182015b828111156200021e57825182559160200191906001019062000201565b506200022c92915062000230565b5090565b5b808211156200022c576000815560010162000231565b80516001600160a01b03811681146200025f57600080fd5b919050565b600082601f83011262000275578081fd5b81516001600160401b0380821115620002925762000292620003f1565b6040516020601f8401601f1916820181018381118382101715620002ba57620002ba620003f1565b6040528382528584018101871015620002d1578485fd5b8492505b83831015620002f45785830181015182840182015291820191620002d5565b838311156200030557848185840101525b5095945050505050565b600080600080600060a0868803121562000327578081fd5b85516001600160401b03808211156200033e578283fd5b6200034c89838a0162000264565b9650602088015191508082111562000362578283fd5b50620003718882890162000264565b945050604086015160ff8116811462000388578182fd5b9250620003986060870162000247565b9150620003a86080870162000247565b90509295509295909350565b600281046001821680620003c957607f821691505b60208210811415620003eb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61214c80620004176000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80635d19eb861161011a57806395d89b41116100ad578063c5b97e061161007c578063c5b97e0614610413578063c756672914610433578063dd62ed3e1461043b578063eb92ad661461044e578063f394b6df14610461576101fb565b806395d89b41146103d2578063a0f52da0146103da578063a9059cbb146103ed578063ba00a33014610400576101fb565b806371c396cc116100e957806371c396cc1461039c578063880d6c75146103a45780638fa76d8d146103b75780638fd3ab80146103ca576101fb565b80635d19eb8614610350578063680f36e2146103635780636e553f651461037657806370a0823114610389576101fb565b806323b872dd11610192578063313ce56711610161578063313ce5671461030257806345a32c8614610317578063590318291461032a5780635a2175511461033d576101fb565b806323b872dd146102b657806323bf3396146102c957806325052496146102dc5780632e1a7d4d146102ef576101fb565b80630eefdbad116101ce5780630eefdbad1461026657806313c5d2521461027b57806315ec3b8b1461028e57806318160ddd146102a1576101fb565b806301ffc9a71461020057806306fdde0314610229578063095ea7b31461023e5780630ab319e814610251575b600080fd5b61021361020e366004611e1d565b610474565b6040516102209190611f87565b60405180910390f35b610231610497565b6040516102209190611fce565b61021361024c366004611d69565b610529565b61026461025f366004611d69565b610581565b005b61026e610651565b6040516102209190611f36565b610213610289366004611b8e565b610660565b61026461029c366004611d69565b610675565b6102a961072c565b6040516102209190611f92565b6102136102c4366004611bda565b610732565b6102136102d7366004611e05565b610983565b6102646102ea366004611cf7565b610998565b6102646102fd366004611e05565b610a63565b61030a610ba2565b6040516102209190612021565b6102a9610325366004611b8e565b610bab565b610213610338366004611e05565b610bbd565b61026461034b366004611cf7565b610bd2565b61026461035e366004611c7c565b610c94565b6102a9610371366004611c15565b610f53565b610264610384366004611e55565b610f97565b6102a9610397366004611b8e565b611193565b61026e6111ae565b6102136103b2366004611b8e565b6111bd565b6102136103c5366004611d2d565b6111d2565b610264611370565b610231611532565b6102646103e8366004611b8e565b611541565b6102136103fb366004611d69565b611613565b61021361040e366004611d69565b61178c565b610426610421366004611d69565b6117f1565b6040516102209190611fb9565b61026e611961565b6102a9610449366004611ba8565b611970565b61026461045c366004611d92565b61199b565b61026461046f366004611d69565b611a23565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6060600280546104a69061205e565b80601f01602080910402602001604051908101604052809291908181526020018280546104d29061205e565b801561051f5780601f106104f45761010080835404028352916020019161051f565b820191906000526020600020905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b3360008181526007602090815260408083206001600160a01b038716808552925280832085905551919290916000805160206120f783398151915290610570908690611f92565b60405180910390a350600192915050565b60408051808201909152600681526518189b98181960d11b60208201526001906105af565b60405180910390fd5b5033600090815260016020908152604091829020548251808401909352600683526530313730303160d01b91830191909152821682146106025760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b038316600081815260016020526040808220805486179081905590519092917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b6008546001600160a01b031681565b60096020526000908152604090205460ff1681565b60408051808201825260068082526518189b98181960d11b6020928301523360009081526001808452908490205484518086019095529184526530313730303160d01b92840192909252909190821682146106e35760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b038316600081815260016020526040808220859055518492917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b60055490565b600b5460408051808201909152600681526530313030303560d01b60208201526000916001600160a01b03161561077c5760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b038316600090815260096020908152604091829020548251808401909352600683526530313030303360d01b9183019190915260ff166107d75760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b0384166000908152600660208181526040928390205483518085019094529183526530313030303160d01b9083015283111561082e5760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b0384166000908152600760209081526040808320338452825291829020548251808401909352600683526518189818181960d11b918301919091528311156108915760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b0384166000908152600660205260409020546108b6908390612047565b6001600160a01b0380861660009081526006602052604080822093909355908516815220546108e690839061202f565b6001600160a01b038085166000908152600660209081526040808320949094559187168152600782528281203382529091522054610925908390612047565b6001600160a01b0380861660008181526007602090815260408083203384529091529081902093909355915190851691906000805160206120d783398151915290610971908690611f92565b60405180910390a35060019392505050565b600d6020526000908152604090205460ff1681565b60408051808201825260068082526518189b98181960d11b6020928301523360009081526001835283902054835180850185529182526530313730303160d01b928201929092529082168214610a015760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b0383166000818152600c602052604090819020805460ff1916851515179055517f923b9a8f748e5e88fa9de28bf3e57a5ea1508443a269cc9eeeb322939febf3e090610a56908590611f87565b60405180910390a2505050565b336000908152600660208181526040928390205483518085019094529183526530313030303160d01b90830152821115610ab05760405162461bcd60e51b81526004016105a69190611fce565b5080600554610abf9190612047565b60055533600090815260066020526040902054610add908290612047565b336000818152600660205260409081902092909255600a54915163a9059cbb60e01b81526001600160a01b039092169163a9059cbb91610b21918590600401611f6e565b602060405180830381600087803b158015610b3b57600080fd5b505af1158015610b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b739190611de9565b5060405160009033906000805160206120d783398151915290610b97908590611f92565b60405180910390a350565b60045460ff1690565b60016020526000908152604090205481565b600e6020526000908152604090205460ff1681565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600183528390205483518085019094529083526530313730303160d01b918301919091526010919082168214610c3f5760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b03831660008181526009602052604090819020805460ff1916851515179055517fa5fe0c8d62c32b5b6f14437194dfe68f86aaf45f6d384976081103e7db408bbc90610a56908590611f87565b6000610ca589898989898989610f53565b6000818152600e6020908152604091829020548251808401909352600683526530313030313160d01b918301919091529192509060ff1615610cfa5760405162461bcd60e51b81526004016105a69190611fce565b506000818152600d6020908152604091829020548251808401909352600683526506062606060760d31b9183019190915260ff1615610d4c5760405162461bcd60e51b81526004016105a69190611fce565b50610d588982846111d2565b6040518060400160405280600681526020016530313030303760d01b81525090610d955760405162461bcd60e51b81526004016105a69190611fce565b5060408051808201909152600681526530313030303960d01b6020820152428411610dd35760405162461bcd60e51b81526004016105a69190611fce565b506000818152600d60209081526040808320805460ff191660011790556001600160a01b03808d1680855260078452828520918d1680865291909352928190208a9055516000805160206120f783398151915290610e32908b90611f92565b60405180910390a36001600160a01b0389166000908152600660208181526040928390205483518085019094529183526530313030303160d01b90830152861115610e905760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b038916600090815260066020526040902054610eb5908690612047565b6001600160a01b03808b166000908152600660205260409020919091558616610edc573395505b6001600160a01b038616600090815260066020526040902054610f0090869061202f565b6001600160a01b0380881660008181526006602052604090819020939093559151908b16906000805160206120d783398151915290610f40908990611f92565b60405180910390a3505050505050505050565b60003088888888888888604051602001610f74989796959493929190611e77565b604051602081830303815290604052805190602001209050979650505050505050565b600b5460408051808201909152600681526530313030303560d01b6020820152906001600160a01b031615610fdf5760405162461bcd60e51b81526004016105a69190611fce565b5081600554610fee919061202f565b6005556001600160a01b03811660009081526006602052604090205461101590839061202f565b6001600160a01b038083166000908152600660205260409081902092909255600a5491516323b872dd60e01b81529116906323b872dd9061105e90339030908790600401611f4a565b602060405180830381600087803b15801561107857600080fd5b505af115801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b09190611de9565b506001600160a01b038082166000908152600760209081526040808320600854909416835292905220546110e590839061202f565b6001600160a01b03808316600081815260076020908152604080832060085490951683529390528281209390935590519091906000805160206120d783398151915290611133908690611f92565b60405180910390a36008546001600160a01b03828116600081815260076020908152604080832094909516808352939052839020549251919290916000805160206120f78339815191529161118791611f92565b60405180910390a35050565b6001600160a01b031660009081526006602052604090205490565b600b546001600160a01b031681565b600c6020526000908152604090205460ff1681565b600080826060015160028111156111f957634e487b7160e01b600052602160045260246000fd5b141561129b576001836040516020016112129190611ed4565b60405160208183030381529060405280519060200120836040015184600001518560200151604051600081526020016040526040516112549493929190611f9b565b6020604051602081039080840390855afa158015611276573d6000803e3d6000fd5b505050602060405103516001600160a01b0316846001600160a01b0316149050611369565b6001826060015160028111156112c157634e487b7160e01b600052602160045260246000fd5b14156112da576001836040516020016112129190611f05565b60028260600151600281111561130057634e487b7160e01b600052602160045260246000fd5b141561133557600183836040015184600001518560200151604051600081526020016040526040516112549493929190611f9b565b604080518082018252600681526503031303031360d41b6020820152905162461bcd60e51b81526105a69190600401611fce565b9392505050565b600b546040805180820190915260068152650c0c4c0c0c0d60d21b6020820152906001600160a01b03166113b75760405162461bcd60e51b81526004016105a69190611fce565b5033600090815260066020526040812080549190556005546113da908290612047565b600555600a54600b5460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92611413929116908590600401611f6e565b602060405180830381600087803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114659190611de9565b50600b546040516362dcbf0360e11b808252916001600160a01b03169063c5b97e06906114989033908690600401611f6e565b602060405180830381600087803b1580156114b257600080fd5b505af11580156114c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ea9190611e39565b6001600160e01b031916146040518060400160405280600681526020016518189818181b60d11b81525090610b735760405162461bcd60e51b81526004016105a69190611fce565b6060600380546104a69061205e565b60408051808201825260068082526518189b98181960d11b602092830152336000908152600183528390205483518085019094529083526530313730303160d01b83830152909190821682146115aa5760405162461bcd60e51b81526004016105a69190611fce565b506040805180820190915260068152650c0c4c0c0c0d60d21b60208201526001600160a01b0383166115ef5760405162461bcd60e51b81526004016105a69190611fce565b5050600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b5460408051808201909152600681526530313030303560d01b60208201526000916001600160a01b03161561165d5760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b038316600090815260096020908152604091829020548251808401909352600683526530313030303360d01b9183019190915260ff166116b85760405162461bcd60e51b81526004016105a69190611fce565b50336000908152600660208181526040928390205483518085019094529183526530313030303160d01b908301528311156117065760405162461bcd60e51b81526004016105a69190611fce565b5033600090815260066020526040902054611722908390612047565b33600090815260066020526040808220929092556001600160a01b0385168152205461174f90839061202f565b6001600160a01b0384166000818152600660205260409081902092909255905133906000805160206120d783398151915290610570908690611f92565b60008082116040518060400160405280600681526020016518189b98181960d11b815250906117ce5760405162461bcd60e51b81526004016105a69190611fce565b50506001600160a01b039190911660009081526001602052604090205481161490565b336000908152600c60209081526040808320548151808301909252600682526518189818181b60d11b928201929092529060ff166118425760405162461bcd60e51b81526004016105a69190611fce565b5081600554611851919061202f565b6005556001600160a01b03831660009081526006602052604090205461187890839061202f565b6001600160a01b038085166000908152600660209081526040808320949094556007815283822060085490931682529190915220546118b890839061202f565b6001600160a01b03848116600081815260076020908152604080832060088054871685529252808320959095555490921680835291839020549251919290916000805160206120f78339815191529161191091611f92565b60405180910390a3826001600160a01b031660006001600160a01b03166000805160206120d78339815191528460405161194a9190611f92565b60405180910390a3506362dcbf0360e11b92915050565b600a546001600160a01b031681565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b60006119ac33888888888888610f53565b6000818152600d6020908152604091829020548251808401909352600683526506062606060760d31b918301919091529192509060ff1615611a015760405162461bcd60e51b81526004016105a69190611fce565b506000908152600e60205260409020805460ff19166001179055505050505050565b60408051808201825260068082526518189b98181960d11b6020928301523360009081526001808452908490205484518086019095529184526530313730303160d01b9284019290925290919082168214611a915760405162461bcd60e51b81526004016105a69190611fce565b506001600160a01b03831660008181526001602052604080822080548619169081905590519092917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b80356001600160a01b038116811461049257600080fd5b80356003811061049257600080fd5b600060808284031215611b18578081fd5b6040516080810181811067ffffffffffffffff82111715611b4757634e487b7160e01b83526041600452602483fd5b80604052508091508235815260208301356020820152604083013560ff81168114611b7157600080fd5b6040820152611b8260608401611af8565b60608201525092915050565b600060208284031215611b9f578081fd5b61136982611ae1565b60008060408385031215611bba578081fd5b611bc383611ae1565b9150611bd160208401611ae1565b90509250929050565b600080600060608486031215611bee578081fd5b611bf784611ae1565b9250611c0560208501611ae1565b9150604084013590509250925092565b600080600080600080600060e0888a031215611c2f578283fd5b611c3888611ae1565b9650611c4660208901611ae1565b955060408801359450611c5b60608901611ae1565b9699959850939660808101359560a0820135955060c0909101359350915050565b600080600080600080600080610160898b031215611c98578081fd5b611ca189611ae1565b9750611caf60208a01611ae1565b965060408901359550611cc460608a01611ae1565b94506080890135935060a0890135925060c08901359150611ce88a60e08b01611b07565b90509295985092959890939650565b60008060408385031215611d09578182fd5b611d1283611ae1565b91506020830135611d22816120af565b809150509250929050565b600080600060c08486031215611d41578283fd5b611d4a84611ae1565b925060208401359150611d608560408601611b07565b90509250925092565b60008060408385031215611d7b578182fd5b611d8483611ae1565b946020939093013593505050565b60008060008060008060c08789031215611daa578182fd5b611db387611ae1565b955060208701359450611dc860408801611ae1565b9350606087013592506080870135915060a087013590509295509295509295565b600060208284031215611dfa578081fd5b8151611369816120af565b600060208284031215611e16578081fd5b5035919050565b600060208284031215611e2e578081fd5b8135611369816120c0565b600060208284031215611e4a578081fd5b8151611369816120c0565b60008060408385031215611e67578182fd5b82359150611bd160208401611ae1565b6bffffffffffffffffffffffff196060998a1b8116825297891b8816601482015295881b87166028870152603c8601949094529190951b909316605c8301526070820193909352609081019190915260b081019190915260d00190565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b7f19457468657265756d205369676e6564204d6573736167653a0a2000000000008152601b810191909152603b0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b6000602080835283518082850152825b81811015611ffa57858101830151858201604001528201611fde565b8181111561200b5783604083870101525b50601f01601f1916929092016040019392505050565b60ff91909116815260200190565b6000821982111561204257612042612099565b500190565b60008282101561205957612059612099565b500390565b60028104600182168061207257607f821691505b6020821081141561209357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80151581146120bd57600080fd5b50565b6001600160e01b0319811681146120bd57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220b6a47bc6c2041242ca8971183597a5bb8da668bfe1417d7b8afe2128d4e651cd64736f6c63430008000033"
      },
      "methodIdentifiers": {
        "addressToAbility(address)": "45a32c86",
        "allowance(address,address)": "dd62ed3e",
        "approve(address,uint256)": "095ea7b3",
        "approveWithSignature(address,address,uint256,address,uint256,uint256,uint256,(bytes32,bytes32,uint8,uint8))": "5d19eb86",
        "approvedMigrators(address)": "880d6c75",
        "balanceOf(address)": "70a08231",
        "barteredToken()": "c7566729",
        "cancelApproveWithSignature(address,uint256,address,uint256,uint256,uint256)": "eb92ad66",
        "claimCancelled(bytes32)": "59031829",
        "claimPerformed(bytes32)": "23bf3396",
        "decimals()": "313ce567",
        "deposit(uint256,address)": "6e553f65",
        "generateClaim(address,address,uint256,address,uint256,uint256,uint256)": "680f36e2",
        "grantAbilities(address,uint256)": "0ab319e8",
        "isAble(address,uint256)": "ba00a330",
        "isValidSignature(address,bytes32,(bytes32,bytes32,uint8,uint8))": "8fa76d8d",
        "migrate()": "8fd3ab80",
        "migrationAddress()": "71c396cc",
        "name()": "06fdde03",
        "onMigrationReceived(address,uint256)": "c5b97e06",
        "revokeAbilities(address,uint256)": "f394b6df",
        "setAbilities(address,uint256)": "15ec3b8b",
        "setApprovedMigrator(address,bool)": "25052496",
        "setWhitelistedRecipient(address,bool)": "5a217551",
        "startMigration(address)": "a0f52da0",
        "supportsInterface(bytes4)": "01ffc9a7",
        "symbol()": "95d89b41",
        "tokenTransferProxy()": "0eefdbad",
        "totalSupply()": "18160ddd",
        "transfer(address,uint256)": "a9059cbb",
        "transferFrom(address,address,uint256)": "23b872dd",
        "whitelistedRecipients(address)": "13c5d252",
        "withdraw(uint256)": "2e1a7d4d"
      }
    },
    "metadata": {
      "compiler": {
        "version": "0.8.0+commit.c7dfd78e"
      },
      "language": "Solidity",
      "output": {
        "abi": [
          {
            "inputs": [
              {
                "internalType": "string",
                "name": "_name",
                "type": "string"
              },
              {
                "internalType": "string",
                "name": "_symbol",
                "type": "string"
              },
              {
                "internalType": "uint8",
                "name": "_decimals",
                "type": "uint8"
              },
              {
                "internalType": "address",
                "name": "_barteredToken",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_tokenTransferProxy",
                "type": "address"
              }
            ],
            "stateMutability": "nonpayable",
            "type": "constructor"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "address",
                "name": "_spender",
                "type": "address"
              },
              {
                "indexed": false,
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              }
            ],
            "name": "Approval",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "indexed": false,
                "internalType": "bool",
                "name": "state",
                "type": "bool"
              }
            ],
            "name": "ApprovedMigrator",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "SetAbilities",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_from",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "address",
                "name": "_to",
                "type": "address"
              },
              {
                "indexed": false,
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              }
            ],
            "name": "Transfer",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "indexed": false,
                "internalType": "bool",
                "name": "state",
                "type": "bool"
              }
            ],
            "name": "WhitelistedRecipient",
            "type": "event"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "name": "addressToAbility",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_spender",
                "type": "address"
              }
            ],
            "name": "allowance",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "_remaining",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_spender",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              }
            ],
            "name": "approve",
            "outputs": [
              {
                "internalType": "bool",
                "name": "_success",
                "type": "bool"
              }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_approver",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_spender",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              },
              {
                "internalType": "address",
                "name": "_feeRecipient",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_feeValue",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_expiration",
                "type": "uint256"
              },
              {
                "components": [
                  {
                    "internalType": "bytes32",
                    "name": "r",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "bytes32",
                    "name": "s",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "uint8",
                    "name": "v",
                    "type": "uint8"
                  },
                  {
                    "internalType": "enum DappToken.SignatureKind",
                    "name": "kind",
                    "type": "uint8"
                  }
                ],
                "internalType": "struct DappToken.SignatureData",
                "name": "_signature",
                "type": "tuple"
              }
            ],
            "name": "approveWithSignature",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "name": "approvedMigrators",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_owner",
                "type": "address"
              }
            ],
            "name": "balanceOf",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "_balance",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "barteredToken",
            "outputs": [
              {
                "internalType": "contract ERC20",
                "name": "",
                "type": "address"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_spender",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              },
              {
                "internalType": "address",
                "name": "_feeRecipient",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_feeValue",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_expiration",
                "type": "uint256"
              }
            ],
            "name": "cancelApproveWithSignature",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
              }
            ],
            "name": "claimCancelled",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
              }
            ],
            "name": "claimPerformed",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "decimals",
            "outputs": [
              {
                "internalType": "uint8",
                "name": "_decimals",
                "type": "uint8"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              },
              {
                "internalType": "address",
                "name": "_receiver",
                "type": "address"
              }
            ],
            "name": "deposit",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_approver",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_spender",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              },
              {
                "internalType": "address",
                "name": "_feeRecipient",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_feeValue",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "_expiration",
                "type": "uint256"
              }
            ],
            "name": "generateClaim",
            "outputs": [
              {
                "internalType": "bytes32",
                "name": "_claim",
                "type": "bytes32"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "grantAbilities",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "isAble",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_signer",
                "type": "address"
              },
              {
                "internalType": "bytes32",
                "name": "_claim",
                "type": "bytes32"
              },
              {
                "components": [
                  {
                    "internalType": "bytes32",
                    "name": "r",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "bytes32",
                    "name": "s",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "uint8",
                    "name": "v",
                    "type": "uint8"
                  },
                  {
                    "internalType": "enum DappToken.SignatureKind",
                    "name": "kind",
                    "type": "uint8"
                  }
                ],
                "internalType": "struct DappToken.SignatureData",
                "name": "_signature",
                "type": "tuple"
              }
            ],
            "name": "isValidSignature",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "pure",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "migrate",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "migrationAddress",
            "outputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "name",
            "outputs": [
              {
                "internalType": "string",
                "name": "_name",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_migrator",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_amount",
                "type": "uint256"
              }
            ],
            "name": "onMigrationReceived",
            "outputs": [
              {
                "internalType": "bytes4",
                "name": "",
                "type": "bytes4"
              }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "revokeAbilities",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "setAbilities",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "bool",
                "name": "_state",
                "type": "bool"
              }
            ],
            "name": "setApprovedMigrator",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "bool",
                "name": "_state",
                "type": "bool"
              }
            ],
            "name": "setWhitelistedRecipient",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              }
            ],
            "name": "startMigration",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bytes4",
                "name": "_interfaceID",
                "type": "bytes4"
              }
            ],
            "name": "supportsInterface",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "symbol",
            "outputs": [
              {
                "internalType": "string",
                "name": "_symbol",
                "type": "string"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "tokenTransferProxy",
            "outputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "totalSupply",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "_totalSupply",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_to",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              }
            ],
            "name": "transfer",
            "outputs": [
              {
                "internalType": "bool",
                "name": "_success",
                "type": "bool"
              }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_from",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_to",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              }
            ],
            "name": "transferFrom",
            "outputs": [
              {
                "internalType": "bool",
                "name": "_success",
                "type": "bool"
              }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "name": "whitelistedRecipients",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "uint256",
                "name": "_value",
                "type": "uint256"
              }
            ],
            "name": "withdraw",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          }
        ],
        "devdoc": {
          "details": "This is an example contract implementation of DappToken.",
          "kind": "dev",
          "methods": {
            "allowance(address,address)": {
              "details": "Returns the amount which _spender is still allowed to withdraw from _owner.",
              "params": {
                "_owner": "The address of the account owning tokens.",
                "_spender": "The address of the account able to transfer the tokens."
              }
            },
            "approve(address,uint256)": {
              "details": "Allows _spender to withdraw from your account multiple times, up to the _value amount. If this function is called again it overwrites the current allowance with _value.",
              "params": {
                "_spender": "The address of the account able to transfer the tokens.",
                "_value": "The amount of tokens to be approved for transfer."
              }
            },
            "approveWithSignature(address,address,uint256,address,uint256,uint256,uint256,(bytes32,bytes32,uint8,uint8))": {
              "details": "Allows _spender to withdraw from your account multiple times, up to the _value amount. If this function is called again it overwrites the current allowance with _value.",
              "params": {
                "_approver": "Approving address from which the spender will be able to transfer tokens.",
                "_expiration": "Timestamp of when the claim expires.",
                "_feeRecipient": "Address of the fee recipient. If set to zero address the msg.sender will automatically become the fee recipient.",
                "_feeValue": "The amount of token then will be tranfered to the executor of this method.",
                "_seed": "Arbitrary number to facilitate uniqueness of the order's hash. Usually timestamp.",
                "_signature": "Data from the signature.",
                "_spender": "The address of the account able to transfer the tokens.",
                "_value": "The amount of tokens to be approved for transfer."
              }
            },
            "balanceOf(address)": {
              "details": "Returns the account balance of another account with address _owner.",
              "params": {
                "_owner": "The address from which the balance will be retrieved."
              }
            },
            "cancelApproveWithSignature(address,uint256,address,uint256,uint256,uint256)": {
              "details": "Cancels approveWithSignature claim.",
              "params": {
                "_expiration": "Timestamp of when the claim expires.",
                "_feeRecipient": "Address of the fee recipient. If set to zero address the msg.sender will automatically become the fee recipient.",
                "_feeValue": "The amount of token then will be tranfered to the executor of this method.",
                "_seed": "Arbitrary number to facilitate uniqueness of the order's hash. Usually timestamp.",
                "_spender": "The address of the account able to transfer the tokens.",
                "_value": "The amount of tokens to be approved for transfer."
              }
            },
            "decimals()": {
              "details": "Returns the number of decimals the token uses."
            },
            "deposit(uint256,address)": {
              "details": "Deposit bartered token into the contract. Calling this function will transfer bartered token into the dapp token and create the same amount of dapp tokens to the caller. This auto approves TokenTransferProxy contract.",
              "params": {
                "_receiver": "Receiver of dapp tokens.",
                "_value": "Amount of bartered token we are depositing."
              }
            },
            "generateClaim(address,address,uint256,address,uint256,uint256,uint256)": {
              "details": "Generates hash representing the approve definition.",
              "params": {
                "_approver": "Approving address from which the spender will be able to transfer tokens.",
                "_expiration": "Timestamp of when the claim expires.",
                "_feeRecipient": "Address of the fee recipient. If set to zero address the msg.sender will automatically become the fee recipient.",
                "_feeValue": "The amount of token then will be tranfered to the executor of this method.",
                "_seed": "Arbitrary number to facilitate uniqueness of the order's hash. Usually timestamp.",
                "_spender": "The address of the account able to transfer the tokens.",
                "_value": "The amount of tokens to be approved for transfer."
              }
            },
            "grantAbilities(address,uint256)": {
              "details": "Grants specific abilities to specified address.",
              "params": {
                "_abilities": "Number representing bitfield of abilities we are granting.",
                "_target": "Address to grant abilities to."
              }
            },
            "isAble(address,uint256)": {
              "details": "Check if an address has a specific ability. Throws if checking for 0.",
              "params": {
                "_abilities": "Number representing bitfield of abilities we are checking.",
                "_target": "Address for which we want to check if it has a specific abilities."
              }
            },
            "isValidSignature(address,bytes32,(bytes32,bytes32,uint8,uint8))": {
              "details": "Verifies if claim signature is valid.",
              "params": {
                "_claim": "Signed Keccak-256 hash.",
                "_signature": "Signature data.",
                "_signer": "address of signer."
              }
            },
            "migrate()": {
              "details": "Migrate to a new Dapp token smart contract. Senders bartered tokens get transferred to the new Dapp token where tokens in the same amount get created. Tokens on this smart contract get destroyed."
            },
            "name()": {
              "details": "Returns the name of the token."
            },
            "onMigrationReceived(address,uint256)": {
              "details": "Handles the receipt of a migration. The dapp token calls this function on the migration address when migrating. Return of other than the magic value MUST result in the transaction being reverted. Returns `bytes4(keccak256(\"onMigrationReceived(address,uint256)\"))` unless throwing. This method registers receiving bartered tokens and creates new tokens for the migrator.",
              "params": {
                "_amount": "Amount of tokens being migrated.",
                "_migrator": "The address which called `migrate` function."
              },
              "returns": {
                "_0": "Returns `bytes4(keccak256(\"onMigrationReceived(address,uint256)\"))`."
              }
            },
            "revokeAbilities(address,uint256)": {
              "details": "Unassigns specific abilities from specified address.",
              "params": {
                "_abilities": "Number representing bitfield of abilities we are revoking.",
                "_target": "Address of which we revoke abilites."
              }
            },
            "setAbilities(address,uint256)": {
              "details": "Sets specific abilities to specified address.",
              "params": {
                "_abilities": "Number representing bitfield of abilities we are setting.",
                "_target": "Address to which we are setting abilitites."
              }
            },
            "setApprovedMigrator(address,bool)": {
              "details": "Sets migration caller state to an address.",
              "params": {
                "_state": "State we are setting. True means the address is a migration caller while false the opposite.",
                "_target": "Address we are setting the migration caller state."
              }
            },
            "setWhitelistedRecipient(address,bool)": {
              "details": "Sets whitelist state to an address",
              "params": {
                "_state": "State we are setting. True means the address is whitelisted while false the opposite.",
                "_target": "Address we are setting the whitelist state."
              }
            },
            "startMigration(address)": {
              "details": "Sets address to which migration is done.",
              "params": {
                "_target": "Targeted address."
              }
            },
            "supportsInterface(bytes4)": {
              "details": "Function to check which interfaces are supported by this contract.",
              "params": {
                "_interfaceID": "Id of the interface."
              }
            },
            "symbol()": {
              "details": "Returns the symbol of the token."
            },
            "totalSupply()": {
              "details": "Returns the total token supply."
            },
            "transfer(address,uint256)": {
              "details": "Transfers _value amount of tokens to address _to, and MUST fire the Transfer event. The function SHOULD throw if the message caller's account balance does not have enough tokens to spend.",
              "params": {
                "_to": "The address of the recipient.",
                "_value": "The amount of token to be transferred."
              }
            },
            "transferFrom(address,address,uint256)": {
              "details": "Transfers _value amount of tokens from address _from to address _to, and MUST fire the Transfer event.",
              "params": {
                "_from": "The address of the sender.",
                "_to": "The address of the recipient.",
                "_value": "The amount of token to be transferred."
              }
            },
            "withdraw(uint256)": {
              "details": "Withdraw bartered token from the contract. Calling this function will destroy dapp tokens and transfer the bartered token back to the caller.",
              "params": {
                "_value": "The amount of bartered token we are withdrawing."
              }
            }
          },
          "version": 1
        },
        "userdoc": {
          "kind": "user",
          "methods": {
            "approve(address,uint256)": {
              "notice": "To prevent attack vectors like the one described here: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/edit and discussed here: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729, clients SHOULD make sure to create user interfaces in such a way that they set the allowance first to 0 before setting it to another value for the same spender. THOUGH The contract itself shouldn’t enforce it, to allow backwards compatibility with contracts deployed before."
            },
            "approveWithSignature(address,address,uint256,address,uint256,uint256,uint256,(bytes32,bytes32,uint8,uint8))": {
              "notice": "To prevent attack vectors like the one described here: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/edit and discussed here: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729, clients SHOULD make sure to create user interfaces in such a way that they set the allowance first to 0 before setting it to another value for the same spender. THOUGH The contract itself shouldn’t enforce it, to allow backwards compatibility with contracts deployed before."
            },
            "cancelApproveWithSignature(address,uint256,address,uint256,uint256,uint256)": {
              "notice": "This works even if sender doesn't own any tokens at the time."
            }
          },
          "version": 1
        }
      },
      "settings": {
        "compilationTarget": {
          "./src/contracts/mocks/dapp-token-mock.sol": "DappTokenMock"
        },
        "evmVersion": "istanbul",
        "libraries": {},
        "metadata": {
          "bytecodeHash": "ipfs"
        },
        "optimizer": {
          "enabled": true,
          "runs": 200
        },
        "remappings": []
      },
      "sources": {
        "./src/contracts/mocks/dapp-token-mock.sol": {
          "keccak256": "0x45fda46e70cbfc04964ffef0f3d647faf0dc0de9885d703a4e122266664ab4b1",
          "license": "MIT",
          "urls": [
            "bzz-raw://e6323eb3f534abbdc4a03e90f609882c2aa01669733090b2dfd28500f4bd2cdd",
            "dweb:/ipfs/QmVUMfmzZK4FxohXoNjLJdPFAjTZRdVHEGjVtTxJ2mXnxx"
          ]
        }
      },
      "version": 1
    }
  }
}