{
  "TokenTransferProxy": {
    "abi": [
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "uint256",
            "name": "_abilities",
            "type": "uint256"
          }
        ],
        "name": "SetAbilities",
        "type": "event"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "name": "addressToAbility",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_target",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_a",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_b",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "_c",
            "type": "uint256"
          }
        ],
        "name": "execute",
        "outputs": [],
        "stateMutability": "nonpayable",
        "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": "_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"
      }
    ],
    "evm": {
      "bytecode": {
        "object": "608060405234801561001057600080fd5b50336000908152602081905260409020600f9055610679806100336000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80630ab319e81461006757806315ec3b8b1461007c578063239aee061461008f57806345a32c86146100a2578063ba00a330146100cb578063f394b6df146100eb575b600080fd5b61007a61007536600461056f565b6100fe565b005b61007a61008a36600461056f565b6101cc565b61007a61009d366004610525565b610281565b6100b56100b0366004610504565b6103b5565b6040516100c2919061063a565b60405180910390f35b6100de6100d936600461056f565b6103c7565b6040516100c291906105dc565b61007a6100f936600461056f565b61042c565b60408051808201909152600681526518189b98181960d11b602082015260019061012c565b60405180910390fd5b503360009081526020818152604091829020548251808401909352600683526530313730303160d01b918301919091528216821461017d5760405162461bcd60e51b815260040161012391906105e7565b506001600160a01b038316600081815260208190526040808220805486179081905590519092917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b60408051808201825260068082526518189b98181960d11b6020928301523360009081528083528390205483518085019094529083526530313730303160d01b9183019190915260019190821682146102385760405162461bcd60e51b815260040161012391906105e7565b506001600160a01b038316600081815260208190526040808220859055518492917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b60408051808201825260068082526518189b98181960d11b6020928301523360009081528083528390205483518085019094529083526530313730303160d01b9183019190915260109190821682146102ed5760405162461bcd60e51b815260040161012391906105e7565b506040516323b872dd60e01b81526001600160a01b038616906323b872dd9061031e908790879087906004016105b8565b602060405180830381600087803b15801561033857600080fd5b505af115801561034c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103709190610598565b6040518060400160405280600681526020016530313230303160d01b815250906103ad5760405162461bcd60e51b815260040161012391906105e7565b505050505050565b60006020819052908152604090205481565b60008082116040518060400160405280600681526020016518189b98181960d11b815250906104095760405162461bcd60e51b815260040161012391906105e7565b50506001600160a01b039190911660009081526020819052604090205481161490565b60408051808201825260068082526518189b98181960d11b6020928301523360009081528083528390205483518085019094529083526530313730303160d01b9183019190915260019190821682146104985760405162461bcd60e51b815260040161012391906105e7565b506001600160a01b03831660008181526020819052604080822080548619169081905590519092917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b80356001600160a01b03811681146104ff57600080fd5b919050565b600060208284031215610515578081fd5b61051e826104e8565b9392505050565b6000806000806080858703121561053a578283fd5b610543856104e8565b9350610551602086016104e8565b925061055f604086016104e8565b9396929550929360600135925050565b60008060408385031215610581578182fd5b61058a836104e8565b946020939093013593505050565b6000602082840312156105a9578081fd5b8151801515811461051e578182fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b6000602080835283518082850152825b81811015610613578581018301518582016040015282016105f7565b818111156106245783604083870101525b50601f01601f1916929092016040019392505050565b9081526020019056fea26469706673582212204dbe34a07867e218b160fd6d57bed7bee1d2cb8c3b4cb829aad98949cf4130df64736f6c63430008000033"
      },
      "methodIdentifiers": {
        "addressToAbility(address)": "45a32c86",
        "execute(address,address,address,uint256)": "239aee06",
        "grantAbilities(address,uint256)": "0ab319e8",
        "isAble(address,uint256)": "ba00a330",
        "revokeAbilities(address,uint256)": "f394b6df",
        "setAbilities(address,uint256)": "15ec3b8b"
      }
    },
    "metadata": {
      "compiler": {
        "version": "0.8.0+commit.c7dfd78e"
      },
      "language": "Solidity",
      "output": {
        "abi": [
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "uint256",
                "name": "_abilities",
                "type": "uint256"
              }
            ],
            "name": "SetAbilities",
            "type": "event"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "name": "addressToAbility",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_target",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_a",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_b",
                "type": "address"
              },
              {
                "internalType": "uint256",
                "name": "_c",
                "type": "uint256"
              }
            ],
            "name": "execute",
            "outputs": [],
            "stateMutability": "nonpayable",
            "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": "_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"
          }
        ],
        "devdoc": {
          "details": "Based on:https://github.com/0xProject/contracts/blob/master/contracts/TokenTransferProxy.sol",
          "kind": "dev",
          "methods": {
            "execute(address,address,address,uint256)": {
              "details": "Calls into ERC20 Token contract, invoking transferFrom.",
              "params": {
                "_a": "Address to transfer token from.",
                "_b": "Address to transfer token to.",
                "_c": "Amount of token to transfer.",
                "_target": "Address of token to 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."
              }
            },
            "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."
              }
            }
          },
          "stateVariables": {
            "ABILITY_TO_EXECUTE": {
              "details": "List of abilities: 16 - Ability to execute transfer."
            },
            "TRANSFER_FAILED": {
              "details": "Error constants."
            }
          },
          "title": "TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.",
          "version": 1
        },
        "userdoc": {
          "kind": "user",
          "methods": {},
          "version": 1
        }
      },
      "settings": {
        "compilationTarget": {
          "./src/contracts/token-transfer-proxy.sol": "TokenTransferProxy"
        },
        "evmVersion": "istanbul",
        "libraries": {},
        "metadata": {
          "bytecodeHash": "ipfs"
        },
        "optimizer": {
          "enabled": true,
          "runs": 200
        },
        "remappings": []
      },
      "sources": {
        "./src/contracts/token-transfer-proxy.sol": {
          "keccak256": "0x7ef3d00761a77540e4697b845762ff2403be660e0436246b2321746d37c7ecef",
          "license": "MIT",
          "urls": [
            "bzz-raw://35a92b844bbfa63ff3b39330f9503ad84557e5fff816fc89f8fa189b1af861d0",
            "dweb:/ipfs/QmXScEUiHQYNGuAmYjXTzXhmqT4n54YAgusSuh1grDCh9t"
          ]
        }
      },
      "version": 1
    }
  }
}