{
  "TokenDeployGateway": {
    "abi": [
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "_tokenDeployProxy",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "_tokenTransferProxy",
            "type": "address"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "constructor"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_maker",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "_taker",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "bytes32",
            "name": "_claim",
            "type": "bytes32"
          }
        ],
        "name": "Cancel",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "_maker",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "_taker",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "address",
            "name": "_createdContract",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "bytes32",
            "name": "_claim",
            "type": "bytes32"
          }
        ],
        "name": "Perform",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "_proxy",
            "type": "address"
          }
        ],
        "name": "ProxyChange",
        "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"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "name": "addressToAbility",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "maker",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "taker",
                "type": "address"
              },
              {
                "components": [
                  {
                    "internalType": "string",
                    "name": "name",
                    "type": "string"
                  },
                  {
                    "internalType": "string",
                    "name": "symbol",
                    "type": "string"
                  },
                  {
                    "internalType": "uint256",
                    "name": "supply",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint8",
                    "name": "decimals",
                    "type": "uint8"
                  },
                  {
                    "internalType": "address",
                    "name": "owner",
                    "type": "address"
                  }
                ],
                "internalType": "struct TokenDeployGateway.TokenData",
                "name": "tokenData",
                "type": "tuple"
              },
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "token",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "to",
                    "type": "address"
                  },
                  {
                    "internalType": "uint256",
                    "name": "value",
                    "type": "uint256"
                  }
                ],
                "internalType": "struct TokenDeployGateway.TransferData",
                "name": "transferData",
                "type": "tuple"
              },
              {
                "internalType": "uint256",
                "name": "seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "expiration",
                "type": "uint256"
              }
            ],
            "internalType": "struct TokenDeployGateway.DeployData",
            "name": "_data",
            "type": "tuple"
          }
        ],
        "name": "cancel",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ],
        "name": "deployCancelled",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "type": "bytes32"
          }
        ],
        "name": "deployPerformed",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "maker",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "taker",
                "type": "address"
              },
              {
                "components": [
                  {
                    "internalType": "string",
                    "name": "name",
                    "type": "string"
                  },
                  {
                    "internalType": "string",
                    "name": "symbol",
                    "type": "string"
                  },
                  {
                    "internalType": "uint256",
                    "name": "supply",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint8",
                    "name": "decimals",
                    "type": "uint8"
                  },
                  {
                    "internalType": "address",
                    "name": "owner",
                    "type": "address"
                  }
                ],
                "internalType": "struct TokenDeployGateway.TokenData",
                "name": "tokenData",
                "type": "tuple"
              },
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "token",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "to",
                    "type": "address"
                  },
                  {
                    "internalType": "uint256",
                    "name": "value",
                    "type": "uint256"
                  }
                ],
                "internalType": "struct TokenDeployGateway.TransferData",
                "name": "transferData",
                "type": "tuple"
              },
              {
                "internalType": "uint256",
                "name": "seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "expiration",
                "type": "uint256"
              }
            ],
            "internalType": "struct TokenDeployGateway.DeployData",
            "name": "_deployData",
            "type": "tuple"
          }
        ],
        "name": "getDeployDataClaim",
        "outputs": [
          {
            "internalType": "bytes32",
            "name": "",
            "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 TokenDeployGateway.SignatureKind",
                "name": "kind",
                "type": "uint8"
              }
            ],
            "internalType": "struct TokenDeployGateway.SignatureData",
            "name": "_signature",
            "type": "tuple"
          }
        ],
        "name": "isValidSignature",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "maker",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "taker",
                "type": "address"
              },
              {
                "components": [
                  {
                    "internalType": "string",
                    "name": "name",
                    "type": "string"
                  },
                  {
                    "internalType": "string",
                    "name": "symbol",
                    "type": "string"
                  },
                  {
                    "internalType": "uint256",
                    "name": "supply",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint8",
                    "name": "decimals",
                    "type": "uint8"
                  },
                  {
                    "internalType": "address",
                    "name": "owner",
                    "type": "address"
                  }
                ],
                "internalType": "struct TokenDeployGateway.TokenData",
                "name": "tokenData",
                "type": "tuple"
              },
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "token",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "to",
                    "type": "address"
                  },
                  {
                    "internalType": "uint256",
                    "name": "value",
                    "type": "uint256"
                  }
                ],
                "internalType": "struct TokenDeployGateway.TransferData",
                "name": "transferData",
                "type": "tuple"
              },
              {
                "internalType": "uint256",
                "name": "seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "expiration",
                "type": "uint256"
              }
            ],
            "internalType": "struct TokenDeployGateway.DeployData",
            "name": "_data",
            "type": "tuple"
          },
          {
            "components": [
              {
                "internalType": "bytes32",
                "name": "r",
                "type": "bytes32"
              },
              {
                "internalType": "bytes32",
                "name": "s",
                "type": "bytes32"
              },
              {
                "internalType": "uint8",
                "name": "v",
                "type": "uint8"
              },
              {
                "internalType": "enum TokenDeployGateway.SignatureKind",
                "name": "kind",
                "type": "uint8"
              }
            ],
            "internalType": "struct TokenDeployGateway.SignatureData",
            "name": "_signature",
            "type": "tuple"
          }
        ],
        "name": "perform",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "maker",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "taker",
                "type": "address"
              },
              {
                "components": [
                  {
                    "internalType": "string",
                    "name": "name",
                    "type": "string"
                  },
                  {
                    "internalType": "string",
                    "name": "symbol",
                    "type": "string"
                  },
                  {
                    "internalType": "uint256",
                    "name": "supply",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint8",
                    "name": "decimals",
                    "type": "uint8"
                  },
                  {
                    "internalType": "address",
                    "name": "owner",
                    "type": "address"
                  }
                ],
                "internalType": "struct TokenDeployGateway.TokenData",
                "name": "tokenData",
                "type": "tuple"
              },
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "token",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "to",
                    "type": "address"
                  },
                  {
                    "internalType": "uint256",
                    "name": "value",
                    "type": "uint256"
                  }
                ],
                "internalType": "struct TokenDeployGateway.TransferData",
                "name": "transferData",
                "type": "tuple"
              },
              {
                "internalType": "uint256",
                "name": "seed",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "expiration",
                "type": "uint256"
              }
            ],
            "internalType": "struct TokenDeployGateway.DeployData",
            "name": "_data",
            "type": "tuple"
          },
          {
            "components": [
              {
                "internalType": "bytes32",
                "name": "r",
                "type": "bytes32"
              },
              {
                "internalType": "bytes32",
                "name": "s",
                "type": "bytes32"
              },
              {
                "internalType": "uint8",
                "name": "v",
                "type": "uint8"
              },
              {
                "internalType": "enum TokenDeployGateway.SignatureKind",
                "name": "kind",
                "type": "uint8"
              }
            ],
            "internalType": "struct TokenDeployGateway.SignatureData",
            "name": "_signature",
            "type": "tuple"
          }
        ],
        "name": "performAnyTaker",
        "outputs": [],
        "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": "_tokenDeployProxy",
            "type": "address"
          }
        ],
        "name": "setDeployProxy",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "tokenDeployProxy",
        "outputs": [
          {
            "internalType": "contract TokenDeployProxy",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "tokenTransferProxy",
        "outputs": [
          {
            "internalType": "contract Proxy",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      }
    ],
    "evm": {
      "bytecode": {
        "object": "608060405234801561001057600080fd5b50604051620016ab380380620016ab83398101604081905261003191610091565b336000908152602081905260409020600f9055600180546001600160a01b039384166001600160a01b031991821617909155600280549290931691161790556100c3565b80516001600160a01b038116811461008c57600080fd5b919050565b600080604083850312156100a3578182fd5b6100ac83610075565b91506100ba60208401610075565b90509250929050565b6115d880620000d36000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80634e4631e711610097578063ba00a33011610066578063ba00a330146101e7578063c11e8b7a146101fa578063c9f600f71461020d578063f394b6df14610220576100f5565b80634e4631e71461019957806352af3ebd146101ac57806382901b7b146101cc5780638fa76d8d146101d4576100f5565b806315f0a1a6116100d357806315f0a1a61461014057806338d7d25c1461015357806341f343cd1461016657806345a32c8614610179576100f5565b80630ab319e8146100fa5780630eefdbad1461010f57806315ec3b8b1461012d575b600080fd5b61010d610108366004611230565b610233565b005b610117610301565b6040516101249190611459565b60405180910390f35b61010d61013b366004611230565b610310565b61010d61014e3660046112ae565b6103c5565b61010d6101613660046112ae565b6105df565b61010d6101743660046111ba565b610790565b61018c6101873660046111ba565b610854565b60405161012491906114bb565b61010d6101a7366004611273565b610866565b6101bf6101ba36600461125b565b61097d565b60405161012491906114b0565b610117610992565b6101bf6101e23660046111f2565b6109a1565b6101bf6101f5366004611230565b610b3f565b61018c610208366004611273565b610ba4565b6101bf61021b36600461125b565b610c76565b61010d61022e366004611230565b610c8b565b60408051808201909152600681526518189b98181960d11b6020820152600190610261565b60405180910390fd5b503360009081526020818152604091829020548251808401909352600683526530313730303160d01b91830191909152821682146102b25760405162461bcd60e51b815260040161025891906114e2565b506001600160a01b038316600081815260208190526040808220805486179081905590519092917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b6002546001600160a01b031681565b60408051808201825260068082526518189b98181960d11b6020928301523360009081528083528390205483518085019094529083526530313730303160d01b91830191909152600191908216821461037c5760405162461bcd60e51b815260040161025891906114e2565b506001600160a01b038316600081815260208190526040808220859055518492917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b336001600160a01b031682602001516001600160a01b0316146040518060400160405280600681526020016518189898181960d11b8152509061041b5760405162461bcd60e51b815260040161025891906114e2565b50428260a0015110156040518060400160405280600681526020016530313130303360d01b815250906104615760405162461bcd60e51b815260040161025891906114e2565b50600061046d83610ba4565b905061047e836000015182846109a1565b604051806040016040528060068152602001650c0c4c4c0c0d60d21b815250906104bb5760405162461bcd60e51b815260040161025891906114e2565b50600081815260036020908152604091829020548251808401909352600683526530313130303560d01b9183019190915260ff161561050d5760405162461bcd60e51b815260040161025891906114e2565b50600081815260046020908152604091829020548251808401909352600683526518189898181b60d11b9183019190915260ff161561055f5760405162461bcd60e51b815260040161025891906114e2565b506000818152600460205260408120805460ff1916600117905561058284610d47565b905083602001516001600160a01b031684600001516001600160a01b03167f492318801c2cec532d47019a0b69f83b8d5b499a022b7adb6100a766050644f283856040516105d1929190611497565b60405180910390a350505050565b428260a0015110156040518060400160405280600681526020016530313130303360d01b815250906106245760405162461bcd60e51b815260040161025891906114e2565b50600061063083610ba4565b9050610641836000015182846109a1565b604051806040016040528060068152602001650c0c4c4c0c0d60d21b8152509061067e5760405162461bcd60e51b815260040161025891906114e2565b50600081815260036020908152604091829020548251808401909352600683526530313130303560d01b9183019190915260ff16156106d05760405162461bcd60e51b815260040161025891906114e2565b50600081815260046020908152604091829020548251808401909352600683526518189898181b60d11b9183019190915260ff16156107225760405162461bcd60e51b815260040161025891906114e2565b506000818152600460205260408120805460ff1916600117905561074584610e6c565b9050336001600160a01b031684600001516001600160a01b03167f492318801c2cec532d47019a0b69f83b8d5b499a022b7adb6100a766050644f283856040516105d1929190611497565b60408051808201825260068082526518189b98181960d11b6020928301523360009081528083528390205483518085019094529083526530313730303160d01b9183019190915260109190821682146107fc5760405162461bcd60e51b815260040161025891906114e2565b50600180546001600160a01b0319166001600160a01b0384161790556040517f427ee0ec515416f6ef107d53338080aa8cdf1763bb545dfd1585d1d5a6f6872f90610848908490611459565b60405180910390a15050565b60006020819052908152604090205481565b805160408051808201909152600681526530313130303760d01b6020820152906001600160a01b031633146108ae5760405162461bcd60e51b815260040161025891906114e2565b5060006108ba82610ba4565b600081815260046020908152604091829020548251808401909352600683526518189898181b60d11b918301919091529192509060ff161561090f5760405162461bcd60e51b815260040161025891906114e2565b50600081815260036020908152604091829020805460ff19166001179055830151835191516001600160a01b0391821692909116907f421b43caf093b5e58d1ea89ca0d80151eda923342cf3cfddf5eb6b30d4947ba0906109719085906114bb565b60405180910390a35050565b60036020526000908152604090205460ff1681565b6001546001600160a01b031681565b600080826060015160028111156109c857634e487b7160e01b600052602160045260246000fd5b1415610a6a576001836040516020016109e191906113f7565b6040516020818303038152906040528051906020012083604001518460000151856020015160405160008152602001604052604051610a2394939291906114c4565b6020604051602081039080840390855afa158015610a45573d6000803e3d6000fd5b505050602060405103516001600160a01b0316846001600160a01b0316149050610b38565b600182606001516002811115610a9057634e487b7160e01b600052602160045260246000fd5b1415610aa9576001836040516020016109e19190611428565b600282606001516002811115610acf57634e487b7160e01b600052602160045260246000fd5b1415610b045760018383604001518460000151856020015160405160008152602001604052604051610a2394939291906114c4565b604080518082018252600681526530313130303160d01b6020820152905162461bcd60e51b815261025891906004016114e2565b9392505050565b60008082116040518060400160405280600681526020016518189b98181960d11b81525090610b815760405162461bcd60e51b815260040161025891906114e2565b50506001600160a01b039190911660009081526020819052604090205481161490565b604080820151805160208083015183850151606085015160809095015195516000968796610bd5969590920161139b565b60408051601f19818403018152828252805160209182012060608701518051818401519190940151919550600094610c11949391929101611372565b6040516020818303038152906040528051906020012090503084600001518560200151848488608001518960a00151604051602001610c569796959493929190611327565b60405160208183030381529060405280519060200120925050505b919050565b60046020526000908152604090205460ff1681565b60408051808201825260068082526518189b98181960d11b6020928301523360009081528083528390205483518085019094529083526530313730303160d01b918301919091526001919082168214610cf75760405162461bcd60e51b815260040161025891906114e2565b506001600160a01b03831660008181526020819052604080822080548619169081905590519092917fd1d59d2d212a435434e7a4a4676427610dfe2b6268b01e541d280d65bf3d6b9091a3505050565b600254606082015180518351602083015160409384015193516311cd770360e11b81526000956001600160a01b03169463239aee0694610d90949093909290919060040161146d565b600060405180830381600087803b158015610daa57600080fd5b505af1158015610dbe573d6000803e3d6000fd5b50506001546040808601518051602082015182840151606084015160809094015194516302b0cec960e11b81526001600160a01b0390961697506305619d929650610e14959294919390929091906004016114f5565b602060405180830381600087803b158015610e2e57600080fd5b505af1158015610e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6691906111d6565b92915050565b6060810151602001516000906001600160a01b0316610e92576060820151336020909101525b600254606083015180518451602083015160409384015193516311cd770360e11b81526001600160a01b039095169463239aee0694610d909493929160040161146d565b8035610c718161158a565b600082601f830112610ef1578081fd5b813567ffffffffffffffff80821115610f0c57610f0c611574565b604051601f8301601f191681016020018281118282101715610f3057610f30611574565b604052828152848301602001861015610f47578384fd5b82602086016020830137918201602001929092529392505050565b60006101008284031215610f74578081fd5b60405160c0810167ffffffffffffffff8282108183111715610f9857610f98611574565b81604052829350610fa885610ed6565b8352610fb660208601610ed6565b60208401526040850135915080821115610fcf57600080fd5b50610fdc85828601611089565b604083015250610fef846060850161113e565b606082015260c0830135608082015260e083013560a08201525092915050565b600060808284031215611020578081fd5b6040516080810181811067ffffffffffffffff8211171561104357611043611574565b80604052508091508235815260208301356020820152611065604084016111a9565b604082015260608301356003811061107c57600080fd5b6060919091015292915050565b600060a0828403121561109a578081fd5b60405160a0810167ffffffffffffffff82821081831117156110be576110be611574565b8160405282935084359150808211156110d657600080fd5b6110e286838701610ee1565b835260208501359150808211156110f857600080fd5b5061110585828601610ee1565b60208301525060408301356040820152611121606084016111a9565b606082015261113260808401610ed6565b60808201525092915050565b60006060828403121561114f578081fd5b6040516060810181811067ffffffffffffffff8211171561117257611172611574565b60405290508082356111838161158a565b815260208301356111938161158a565b6020820152604092830135920191909152919050565b803560ff81168114610c7157600080fd5b6000602082840312156111cb578081fd5b8135610b388161158a565b6000602082840312156111e7578081fd5b8151610b388161158a565b600080600060c08486031215611206578182fd5b83356112118161158a565b925060208401359150611227856040860161100f565b90509250925092565b60008060408385031215611242578182fd5b823561124d8161158a565b946020939093013593505050565b60006020828403121561126c578081fd5b5035919050565b600060208284031215611284578081fd5b813567ffffffffffffffff81111561129a578182fd5b6112a684828501610f62565b949350505050565b60008060a083850312156112c0578182fd5b823567ffffffffffffffff8111156112d6578283fd5b6112e285828601610f62565b9250506112f2846020850161100f565b90509250929050565b60008151808452611313816020860160208601611544565b601f01601f19169290920160200192915050565b6001600160601b0319606098891b8116825296881b871660148201529490961b9094166028840152603c830191909152605c820152607c810191909152609c81019190915260bc0190565b6001600160601b0319606094851b811682529290931b9091166014830152602882015260480190565b600086516113ad818460208b01611544565b8651908301906113c1818360208b01611544565b01948552505060f89190911b6001600160f81b031916602083015260601b6001600160601b031916602182015260350192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b7f19457468657265756d205369676e6564204d6573736167653a0a2000000000008152601b810191909152603b0190565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b3860208301846112fb565b600060a0825261150860a08301886112fb565b828103602084015261151a81886112fb565b6040840196909652505060ff9290921660608301526001600160a01b031660809091015292915050565b60005b8381101561155f578181015183820152602001611547565b8381111561156e576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461159f57600080fd5b5056fea26469706673582212209794b096837006770e074cab14d5f09a06e9a45a553e900e226d6165a8a2716764736f6c63430008000033"
      },
      "methodIdentifiers": {
        "addressToAbility(address)": "45a32c86",
        "cancel((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256))": "4e4631e7",
        "deployCancelled(bytes32)": "52af3ebd",
        "deployPerformed(bytes32)": "c9f600f7",
        "getDeployDataClaim((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256))": "c11e8b7a",
        "grantAbilities(address,uint256)": "0ab319e8",
        "isAble(address,uint256)": "ba00a330",
        "isValidSignature(address,bytes32,(bytes32,bytes32,uint8,uint8))": "8fa76d8d",
        "perform((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256),(bytes32,bytes32,uint8,uint8))": "15f0a1a6",
        "performAnyTaker((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256),(bytes32,bytes32,uint8,uint8))": "38d7d25c",
        "revokeAbilities(address,uint256)": "f394b6df",
        "setAbilities(address,uint256)": "15ec3b8b",
        "setDeployProxy(address)": "41f343cd",
        "tokenDeployProxy()": "82901b7b",
        "tokenTransferProxy()": "0eefdbad"
      }
    },
    "metadata": {
      "compiler": {
        "version": "0.8.0+commit.c7dfd78e"
      },
      "language": "Solidity",
      "output": {
        "abi": [
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "_tokenDeployProxy",
                "type": "address"
              },
              {
                "internalType": "address",
                "name": "_tokenTransferProxy",
                "type": "address"
              }
            ],
            "stateMutability": "nonpayable",
            "type": "constructor"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_maker",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "address",
                "name": "_taker",
                "type": "address"
              },
              {
                "indexed": false,
                "internalType": "bytes32",
                "name": "_claim",
                "type": "bytes32"
              }
            ],
            "name": "Cancel",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": true,
                "internalType": "address",
                "name": "_maker",
                "type": "address"
              },
              {
                "indexed": true,
                "internalType": "address",
                "name": "_taker",
                "type": "address"
              },
              {
                "indexed": false,
                "internalType": "address",
                "name": "_createdContract",
                "type": "address"
              },
              {
                "indexed": false,
                "internalType": "bytes32",
                "name": "_claim",
                "type": "bytes32"
              }
            ],
            "name": "Perform",
            "type": "event"
          },
          {
            "anonymous": false,
            "inputs": [
              {
                "indexed": false,
                "internalType": "address",
                "name": "_proxy",
                "type": "address"
              }
            ],
            "name": "ProxyChange",
            "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"
          },
          {
            "inputs": [
              {
                "internalType": "address",
                "name": "",
                "type": "address"
              }
            ],
            "name": "addressToAbility",
            "outputs": [
              {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "maker",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "taker",
                    "type": "address"
                  },
                  {
                    "components": [
                      {
                        "internalType": "string",
                        "name": "name",
                        "type": "string"
                      },
                      {
                        "internalType": "string",
                        "name": "symbol",
                        "type": "string"
                      },
                      {
                        "internalType": "uint256",
                        "name": "supply",
                        "type": "uint256"
                      },
                      {
                        "internalType": "uint8",
                        "name": "decimals",
                        "type": "uint8"
                      },
                      {
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                      }
                    ],
                    "internalType": "struct TokenDeployGateway.TokenData",
                    "name": "tokenData",
                    "type": "tuple"
                  },
                  {
                    "components": [
                      {
                        "internalType": "address",
                        "name": "token",
                        "type": "address"
                      },
                      {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                      },
                      {
                        "internalType": "uint256",
                        "name": "value",
                        "type": "uint256"
                      }
                    ],
                    "internalType": "struct TokenDeployGateway.TransferData",
                    "name": "transferData",
                    "type": "tuple"
                  },
                  {
                    "internalType": "uint256",
                    "name": "seed",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint256",
                    "name": "expiration",
                    "type": "uint256"
                  }
                ],
                "internalType": "struct TokenDeployGateway.DeployData",
                "name": "_data",
                "type": "tuple"
              }
            ],
            "name": "cancel",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
              }
            ],
            "name": "deployCancelled",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "internalType": "bytes32",
                "name": "",
                "type": "bytes32"
              }
            ],
            "name": "deployPerformed",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "maker",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "taker",
                    "type": "address"
                  },
                  {
                    "components": [
                      {
                        "internalType": "string",
                        "name": "name",
                        "type": "string"
                      },
                      {
                        "internalType": "string",
                        "name": "symbol",
                        "type": "string"
                      },
                      {
                        "internalType": "uint256",
                        "name": "supply",
                        "type": "uint256"
                      },
                      {
                        "internalType": "uint8",
                        "name": "decimals",
                        "type": "uint8"
                      },
                      {
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                      }
                    ],
                    "internalType": "struct TokenDeployGateway.TokenData",
                    "name": "tokenData",
                    "type": "tuple"
                  },
                  {
                    "components": [
                      {
                        "internalType": "address",
                        "name": "token",
                        "type": "address"
                      },
                      {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                      },
                      {
                        "internalType": "uint256",
                        "name": "value",
                        "type": "uint256"
                      }
                    ],
                    "internalType": "struct TokenDeployGateway.TransferData",
                    "name": "transferData",
                    "type": "tuple"
                  },
                  {
                    "internalType": "uint256",
                    "name": "seed",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint256",
                    "name": "expiration",
                    "type": "uint256"
                  }
                ],
                "internalType": "struct TokenDeployGateway.DeployData",
                "name": "_deployData",
                "type": "tuple"
              }
            ],
            "name": "getDeployDataClaim",
            "outputs": [
              {
                "internalType": "bytes32",
                "name": "",
                "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 TokenDeployGateway.SignatureKind",
                    "name": "kind",
                    "type": "uint8"
                  }
                ],
                "internalType": "struct TokenDeployGateway.SignatureData",
                "name": "_signature",
                "type": "tuple"
              }
            ],
            "name": "isValidSignature",
            "outputs": [
              {
                "internalType": "bool",
                "name": "",
                "type": "bool"
              }
            ],
            "stateMutability": "pure",
            "type": "function"
          },
          {
            "inputs": [
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "maker",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "taker",
                    "type": "address"
                  },
                  {
                    "components": [
                      {
                        "internalType": "string",
                        "name": "name",
                        "type": "string"
                      },
                      {
                        "internalType": "string",
                        "name": "symbol",
                        "type": "string"
                      },
                      {
                        "internalType": "uint256",
                        "name": "supply",
                        "type": "uint256"
                      },
                      {
                        "internalType": "uint8",
                        "name": "decimals",
                        "type": "uint8"
                      },
                      {
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                      }
                    ],
                    "internalType": "struct TokenDeployGateway.TokenData",
                    "name": "tokenData",
                    "type": "tuple"
                  },
                  {
                    "components": [
                      {
                        "internalType": "address",
                        "name": "token",
                        "type": "address"
                      },
                      {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                      },
                      {
                        "internalType": "uint256",
                        "name": "value",
                        "type": "uint256"
                      }
                    ],
                    "internalType": "struct TokenDeployGateway.TransferData",
                    "name": "transferData",
                    "type": "tuple"
                  },
                  {
                    "internalType": "uint256",
                    "name": "seed",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint256",
                    "name": "expiration",
                    "type": "uint256"
                  }
                ],
                "internalType": "struct TokenDeployGateway.DeployData",
                "name": "_data",
                "type": "tuple"
              },
              {
                "components": [
                  {
                    "internalType": "bytes32",
                    "name": "r",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "bytes32",
                    "name": "s",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "uint8",
                    "name": "v",
                    "type": "uint8"
                  },
                  {
                    "internalType": "enum TokenDeployGateway.SignatureKind",
                    "name": "kind",
                    "type": "uint8"
                  }
                ],
                "internalType": "struct TokenDeployGateway.SignatureData",
                "name": "_signature",
                "type": "tuple"
              }
            ],
            "name": "perform",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [
              {
                "components": [
                  {
                    "internalType": "address",
                    "name": "maker",
                    "type": "address"
                  },
                  {
                    "internalType": "address",
                    "name": "taker",
                    "type": "address"
                  },
                  {
                    "components": [
                      {
                        "internalType": "string",
                        "name": "name",
                        "type": "string"
                      },
                      {
                        "internalType": "string",
                        "name": "symbol",
                        "type": "string"
                      },
                      {
                        "internalType": "uint256",
                        "name": "supply",
                        "type": "uint256"
                      },
                      {
                        "internalType": "uint8",
                        "name": "decimals",
                        "type": "uint8"
                      },
                      {
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                      }
                    ],
                    "internalType": "struct TokenDeployGateway.TokenData",
                    "name": "tokenData",
                    "type": "tuple"
                  },
                  {
                    "components": [
                      {
                        "internalType": "address",
                        "name": "token",
                        "type": "address"
                      },
                      {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                      },
                      {
                        "internalType": "uint256",
                        "name": "value",
                        "type": "uint256"
                      }
                    ],
                    "internalType": "struct TokenDeployGateway.TransferData",
                    "name": "transferData",
                    "type": "tuple"
                  },
                  {
                    "internalType": "uint256",
                    "name": "seed",
                    "type": "uint256"
                  },
                  {
                    "internalType": "uint256",
                    "name": "expiration",
                    "type": "uint256"
                  }
                ],
                "internalType": "struct TokenDeployGateway.DeployData",
                "name": "_data",
                "type": "tuple"
              },
              {
                "components": [
                  {
                    "internalType": "bytes32",
                    "name": "r",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "bytes32",
                    "name": "s",
                    "type": "bytes32"
                  },
                  {
                    "internalType": "uint8",
                    "name": "v",
                    "type": "uint8"
                  },
                  {
                    "internalType": "enum TokenDeployGateway.SignatureKind",
                    "name": "kind",
                    "type": "uint8"
                  }
                ],
                "internalType": "struct TokenDeployGateway.SignatureData",
                "name": "_signature",
                "type": "tuple"
              }
            ],
            "name": "performAnyTaker",
            "outputs": [],
            "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": "_tokenDeployProxy",
                "type": "address"
              }
            ],
            "name": "setDeployProxy",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "tokenDeployProxy",
            "outputs": [
              {
                "internalType": "contract TokenDeployProxy",
                "name": "",
                "type": "address"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          },
          {
            "inputs": [],
            "name": "tokenTransferProxy",
            "outputs": [
              {
                "internalType": "contract Proxy",
                "name": "",
                "type": "address"
              }
            ],
            "stateMutability": "view",
            "type": "function"
          }
        ],
        "devdoc": {
          "details": "Atomic deploy of a new token (erc20 fungible) smart contract with a token transfer.",
          "events": {
            "Cancel(address,address,bytes32)": {
              "details": "This event emits when deploy is cancelled."
            },
            "Perform(address,address,address,bytes32)": {
              "details": "This event emits when deploy is performed."
            },
            "ProxyChange(address)": {
              "details": "This event emits when proxy address is changed."
            }
          },
          "kind": "dev",
          "methods": {
            "cancel((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256))": {
              "details": "Cancels deploy.",
              "params": {
                "_data": "Data of deploy to cancel."
              }
            },
            "constructor": {
              "details": "Constructor sets token transfer proxy address.",
              "params": {
                "_tokenDeployProxy": "Address of token deploy proxy.",
                "_tokenTransferProxy": "Address of token transfer proxy."
              }
            },
            "getDeployDataClaim((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256))": {
              "details": "Calculates keccak-256 hash of DeployData from parameters.",
              "params": {
                "_deployData": "Data needed for atomic swap."
              },
              "returns": {
                "_0": "keccak-hash of deploy data."
              }
            },
            "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."
              }
            },
            "perform((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256),(bytes32,bytes32,uint8,uint8))": {
              "details": "Performs the atomic swap that deploys a new token smart contract and at the same time transfers tokens.",
              "params": {
                "_data": "Data required to make the deploy.",
                "_signature": "Data from the signature."
              }
            },
            "performAnyTaker((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256),(bytes32,bytes32,uint8,uint8))": {
              "details": "Performs the atomic swap that deploys a new token smart contract and at the same time transfers tokens where performing address does not need to be known before hand.",
              "params": {
                "_data": "Data required to make the deploy.",
                "_signature": "Data from the signature."
              }
            },
            "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."
              }
            },
            "setDeployProxy(address)": {
              "details": "Sets deploy proxy address.",
              "params": {
                "_tokenDeployProxy": "Address of deploy proxy."
              }
            }
          },
          "stateVariables": {
            "ABILITY_TO_SET_PROXY": {
              "details": "List of this contract abilities: 16 - Ability to set deploy proxy."
            },
            "INVALID_SIGNATURE_KIND": {
              "details": "Error constants."
            },
            "deployCancelled": {
              "details": "Mapping of all cancelled deploys."
            },
            "deployPerformed": {
              "details": "Mapping of all performed deploys."
            },
            "tokenDeployProxy": {
              "details": "Instance of token deploy proxy."
            },
            "tokenTransferProxy": {
              "details": "Instance of token transfer proxy."
            }
          },
          "version": 1
        },
        "userdoc": {
          "kind": "user",
          "methods": {
            "cancel((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256))": {
              "notice": "You can cancel the same deploy multiple times. There is no check for whether the deploy was already canceled due to gas optimization. You should either check deployCancelled variable or listen to Cancel event if you want to check if a deploy is already canceled."
            },
            "performAnyTaker((address,address,(string,string,uint256,uint8,address),(address,address,uint256),uint256,uint256),(bytes32,bytes32,uint8,uint8))": {
              "notice": "When using this function, be aware that the zero address is reserved for replacement with msg.sender, meaning you cannot send anything to the zero address."
            }
          },
          "version": 1
        }
      },
      "settings": {
        "compilationTarget": {
          "./src/contracts/token-deploy-gateway.sol": "TokenDeployGateway"
        },
        "evmVersion": "istanbul",
        "libraries": {},
        "metadata": {
          "bytecodeHash": "ipfs"
        },
        "optimizer": {
          "enabled": true,
          "runs": 200
        },
        "remappings": []
      },
      "sources": {
        "./src/contracts/token-deploy-gateway.sol": {
          "keccak256": "0x213b233916c23cecb23310bf1c9248ecd238f56289bbc1eb4b4846e023000b04",
          "license": "MIT",
          "urls": [
            "bzz-raw://4e326cba8ccdfdf02b6f00b21adf145709b52fd9d709219ec6eb65c7f4b52a7f",
            "dweb:/ipfs/QmThzYP83XCC6Yb8GzCMT5HfjGLEJeoBxFbaPG2DDWt2y1"
          ]
        }
      },
      "version": 1
    }
  }
}