{
  "contractName": "TokenPriceDataFeedFactory",
  "abi": [
    {
      "constant": true,
      "inputs": [
        {
          "name": "",
          "type": "address"
        },
        {
          "name": "",
          "type": "address"
        }
      ],
      "name": "tokenPairToDataFeed",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "exchangeAdapter",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "name": "_exchangeAdapter",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "name": "tokenPriceDataFeed",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "token1",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "token2",
          "type": "address"
        }
      ],
      "name": "TokenPriceDataFeedCreated",
      "type": "event"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "token1",
          "type": "address"
        },
        {
          "name": "token2",
          "type": "address"
        }
      ],
      "name": "createTokenPriceDataFeed",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "token1",
          "type": "address"
        },
        {
          "name": "token2",
          "type": "address"
        }
      ],
      "name": "getTokenPriceDataFeed",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "token1",
          "type": "address"
        },
        {
          "name": "token2",
          "type": "address"
        }
      ],
      "name": "tokenPriceDataFeedExists",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b5060405160208061255583398101806040528101908080519060200190929190505050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506124d2806100836000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631a3eeea5146100725780632cbcda251461011557806334c106511461016c578063b06725bc146101cf578063cd8a877d1461024a575b600080fd5b34801561007e57600080fd5b506100d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506102ed565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561012157600080fd5b5061012a61032f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561017857600080fd5b506101cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610354565b005b3480156101db57600080fd5b50610230600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506106e9565b604051808215151515815260200191505060405180910390f35b34801561025657600080fd5b506102ab600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061072c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60016020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061036083836106e9565b1515156103fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f63616e6e6f7420616464206475706c696361746520746f6b656e20707269636581526020017f206461746120666565640000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6104036107d3565b604051809103906000f08015801561041f573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c0c53b8b84846000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b15801561054657600080fd5b505af115801561055a573d6000803e3d6000fd5b5050505080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8c67dba325dc55d3fa0b9c6c22893c34f4ba8922df64095f16ffb19cef347791818484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661070c848461072c565b73ffffffffffffffffffffffffffffffffffffffff161415905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b604051611cc3806107e4833901905600608060405234801561001057600080fd5b50611ca3806100206000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806307acc14b146101015780631a0ba4f2146101545780631b076edc1461019957806325be124e146101f05780632cbcda251461024757806330adb55d1461029e5780636a2ea57e146102ee5780636e4aa4d0146103215780636f1e84981461034c57806371a1c0ae1461037f57806392549bf214610396578063a25fa35c146103e5578063c0a6ab7914610435578063c0c53b8b14610460578063c2605a64146104e3578063c4d66de814610536578063d21220a714610579578063dab21b63146105d0575b600080fd5b34801561010d57600080fd5b506101366004803603810190808035906020019092919080359060200190929190505050610615565b60405180826000191660001916815260200191505060405180910390f35b34801561016057600080fd5b5061017f60048036038101908080359060200190929190505050610780565b604051808215151515815260200191505060405180910390f35b3480156101a557600080fd5b506101ae61079f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101fc57600080fd5b506102056107c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025357600080fd5b5061025c6107eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102aa57600080fd5b506102c960048036038101908080359060200190929190505050610811565b6040518083600019166000191681526020018281526020019250505060405180910390f35b3480156102fa57600080fd5b506103036108e1565b60405180826000191660001916815260200191505060405180910390f35b34801561032d57600080fd5b5061033661091c565b6040518082815260200191505060405180910390f35b34801561035857600080fd5b50610361610944565b60405180826000191660001916815260200191505060405180910390f35b34801561038b57600080fd5b50610394610abe565b005b3480156103a257600080fd5b506103cf600480360381019080803560001916906020019092919080359060200190929190505050610cf3565b6040518082815260200191505060405180910390f35b3480156103f157600080fd5b5061041060048036038101908080359060200190929190505050610eb1565b6040518083600019166000191681526020018281526020019250505060405180910390f35b34801561044157600080fd5b5061044a610f62565b6040518082815260200191505060405180910390f35b34801561046c57600080fd5b506104e1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f72565b005b3480156104ef57600080fd5b5061051860048036038101908080359060200190929190803590602001909291905050506111c1565b60405180826000191660001916815260200191505060405180910390f35b34801561054257600080fd5b50610577600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611476565b005b34801561058557600080fd5b5061058e6116ce565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105dc57600080fd5b506105fb600480360381019080803590602001909291905050506116f4565b604051808215151515815260200191505060405180910390f35b60006060808385111515156106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f7374617274496e646578206d757374206265206c657373207468616e206f722081526020017f657175616c20746f20656e64496e64657800000000000000000000000000000081525060400191505060405180910390fd5b600085111515610756576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f7374617274496e646578206d7573742062652067726561746572207468616e2081526020017f300000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610760858561177c565b915061076b82611828565b905061077681611a70565b9250505092915050565b6000806035600084815260200190815260200160002054119050919050565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061081d836116f4565b1515610891576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f20726573756c742073657420666f72205f696e646578000000000000000081525060200191505060405180910390fd5b603460006033858154811015156108a457fe5b90600052602060002001548152602001908152602001600020546033848154811015156108cd57fe5b906000526020600020015491509150915091565b60006034600060336108f1610f62565b8154811015156108fd57fe5b9060005260206000200154815260200190815260200160002054905090565b60006033610928610f62565b81548110151561093457fe5b9060005260206000200154905090565b6000603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aaaa795603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506040513d6020811015610aa557600080fd5b8101908080519060200190929190505050600102905090565b6000603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aaaa795603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015610bf557600080fd5b505af1158015610c09573d6000803e3d6000fd5b505050506040513d6020811015610c1f57600080fd5b810190808051906020019092919050505090503073ffffffffffffffffffffffffffffffffffffffff166392549bf282600102426040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b158015610cb457600080fd5b505af1158015610cc8573d6000803e3d6000fd5b505050506040513d6020811015610cde57600080fd5b81019080805190602001909291905050505050565b6000603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610de0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f5468652063616c6c6572206973206e6f7420746865206461746120736f75726381526020017f650000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b81428111151515610e59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f446174652063616e6e6f7420626520696e20746865206675747572650000000081525060200191505060405180910390fd5b60006033805490501115610e96576033610e71610f62565b815481101515610e7d57fe5b906000526020600020015483111515610e9557600080fd5b5b610ea08484611abc565b610ea8610f62565b91505092915050565b600080610ebd83610780565b1515610f31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f20726573756c742073657420666f72205f6461746500000000000000000081525060200191505060405180910390fd5b6034600084815260200190815260200160002054603560008581526020019081526020016000205491509150915091565b6000600160338054905003905090565b8073ffffffffffffffffffffffffffffffffffffffff1663d6e7444d84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050506040513d602081101561106b57600080fd5b810190808051906020019092919050505015156110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f6b656e207061697220646f6573206e6f742065786973740000000000000081525060200191505060405180910390fd5b82603760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081603860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080603960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111bc30611476565b505050565b60008060008060008587101515611266576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f737461727444617465206d757374206265206c657373207468616e20656e644481526020017f617465000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60016033805490500391505b6000821180156112825750600084145b156112bb578560338381548110151561129757fe5b90600052602060002001541115156112ad578193505b818060019003925050611272565b600084111515611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f6461746573206f757473696465206f662072616e6765206f662064617461666581526020017f656420726573756c74730000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8660338581548110151561136957fe5b906000526020600020015410151515611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f6461746573206f757473696465206f662072616e6765206f662064617461666581526020017f656420726573756c74730000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8390505b600081101580156114255750600083145b15611460578660338281548110151561143a57fe5b90600052602060002001541015611452576001810192505b808060019003915050611414565b61146a8385610615565b94505050505092915050565b60008060019054906101000a900460ff16806114965750611495611bbb565b5b806114ad57506000809054906101000a900460ff16155b1515611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f436f6e747261637420696e7374616e63652068617320616c726561647920626581526020017f656e20696e697469616c697a656400000000000000000000000000000000000081525060400191505060405180910390fd5b600060019054906101000a900460ff161590508015611596576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561163b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5f64617461536f757263652063616e6e6f74206265206164647265737328302981525060200191505060405180910390fd5b81603660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060336000908060018154018082558091505090600182039060005260206000200160009091929091909150555080156116ca5760008060016101000a81548160ff0219169083151502179055505b5050565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808211151561176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5f696e646578206d7573742062652067726561746572207468616e203000000081525060200191505060405180910390fd5b81603380549050119050919050565b6060600060606000806001878703019350836040519080825280602002602001820160405280156117bc5781602001602082028038833980820191505090505b509250600091508690505b858111151561181b576033818154811015156117df57fe5b906000526020600020015483838151811015156117f857fe5b9060200190602002018181525050818060010192505080806001019150506117c7565b8294505050505092915050565b6060600080600080600080600061184a60028a51611bcc90919063ffffffff16565b96506000955061186560018a51611bf690919063ffffffff16565b94505b84861015611a615761189660026118888789611c1790919063ffffffff16565b611bcc90919063ffffffff16565b935088848151811015156118a657fe5b90602001906020020151925088858151811015156118c057fe5b9060200190602002015189858151811015156118d857fe5b906020019060200201518a868151811015156118f057fe5b9060200190602002018b8881518110151561190757fe5b906020019060200201828152508281525050508591508590505b848110156119cd5761194a898281518110151561193a57fe5b9060200190602002015184611c38565b156119c057888181518110151561195d57fe5b90602001906020020151898381518110151561197557fe5b906020019060200201518a8481518110151561198d57fe5b9060200190602002018b848151811015156119a457fe5b9060200190602002018281525082815250505081806001019250505b8080600101915050611921565b88858151811015156119db57fe5b9060200190602002015189838151811015156119f357fe5b906020019060200201518a84815181101515611a0b57fe5b9060200190602002018b88815181101515611a2257fe5b9060200190602002018281525082815250505086821015611a5857611a51600183611c1790919063ffffffff16565b9550611a5c565b8194505b611868565b88975050505050505050919050565b600080600060028451811515611a8257fe5b0491508382815181101515611a9357fe5b906020019060200201519050603460008281526020019081526020016000205492505050919050565b816034600083815260200190815260200160002081600019169055506033819080600181540180825580915050906001820390600052602060002001600090919290919091505550611b0c610f62565b6035600083815260200190815260200160002081905550611b2d8282611c73565b7f441cd35745cc95136f39641bf16b52089bd7e481d97d7db059792befa3caec198282611b58610f62565b336040518085600019166000191681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a15050565b600080303b90506000811491505090565b600080600083111515611bde57600080fd5b8284811515611be957fe5b0490508091505092915050565b600080838311151515611c0857600080fd5b82840390508091505092915050565b6000808284019050838110151515611c2e57600080fd5b8091505092915050565b600060346000838152602001908152602001600020546001900460346000858152602001908152602001600020546001900410905092915050565b50505600a165627a7a72305820229d59cff97483188e4f5407c14d921953d2d030adeb5e4dedef366296c037e50029a165627a7a7230582073db6e5aa54cd39c15d69a2392f41e503a52897648eced8cbae04b6861f41d390029",
  "deployedBytecode": "0x60806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631a3eeea5146100725780632cbcda251461011557806334c106511461016c578063b06725bc146101cf578063cd8a877d1461024a575b600080fd5b34801561007e57600080fd5b506100d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506102ed565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561012157600080fd5b5061012a61032f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561017857600080fd5b506101cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610354565b005b3480156101db57600080fd5b50610230600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506106e9565b604051808215151515815260200191505060405180910390f35b34801561025657600080fd5b506102ab600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061072c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60016020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061036083836106e9565b1515156103fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f63616e6e6f7420616464206475706c696361746520746f6b656e20707269636581526020017f206461746120666565640000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6104036107d3565b604051809103906000f08015801561041f573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c0c53b8b84846000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b15801561054657600080fd5b505af115801561055a573d6000803e3d6000fd5b5050505080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8c67dba325dc55d3fa0b9c6c22893c34f4ba8922df64095f16ffb19cef347791818484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661070c848461072c565b73ffffffffffffffffffffffffffffffffffffffff161415905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b604051611cc3806107e4833901905600608060405234801561001057600080fd5b50611ca3806100206000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806307acc14b146101015780631a0ba4f2146101545780631b076edc1461019957806325be124e146101f05780632cbcda251461024757806330adb55d1461029e5780636a2ea57e146102ee5780636e4aa4d0146103215780636f1e84981461034c57806371a1c0ae1461037f57806392549bf214610396578063a25fa35c146103e5578063c0a6ab7914610435578063c0c53b8b14610460578063c2605a64146104e3578063c4d66de814610536578063d21220a714610579578063dab21b63146105d0575b600080fd5b34801561010d57600080fd5b506101366004803603810190808035906020019092919080359060200190929190505050610615565b60405180826000191660001916815260200191505060405180910390f35b34801561016057600080fd5b5061017f60048036038101908080359060200190929190505050610780565b604051808215151515815260200191505060405180910390f35b3480156101a557600080fd5b506101ae61079f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101fc57600080fd5b506102056107c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025357600080fd5b5061025c6107eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102aa57600080fd5b506102c960048036038101908080359060200190929190505050610811565b6040518083600019166000191681526020018281526020019250505060405180910390f35b3480156102fa57600080fd5b506103036108e1565b60405180826000191660001916815260200191505060405180910390f35b34801561032d57600080fd5b5061033661091c565b6040518082815260200191505060405180910390f35b34801561035857600080fd5b50610361610944565b60405180826000191660001916815260200191505060405180910390f35b34801561038b57600080fd5b50610394610abe565b005b3480156103a257600080fd5b506103cf600480360381019080803560001916906020019092919080359060200190929190505050610cf3565b6040518082815260200191505060405180910390f35b3480156103f157600080fd5b5061041060048036038101908080359060200190929190505050610eb1565b6040518083600019166000191681526020018281526020019250505060405180910390f35b34801561044157600080fd5b5061044a610f62565b6040518082815260200191505060405180910390f35b34801561046c57600080fd5b506104e1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f72565b005b3480156104ef57600080fd5b5061051860048036038101908080359060200190929190803590602001909291905050506111c1565b60405180826000191660001916815260200191505060405180910390f35b34801561054257600080fd5b50610577600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611476565b005b34801561058557600080fd5b5061058e6116ce565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105dc57600080fd5b506105fb600480360381019080803590602001909291905050506116f4565b604051808215151515815260200191505060405180910390f35b60006060808385111515156106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f7374617274496e646578206d757374206265206c657373207468616e206f722081526020017f657175616c20746f20656e64496e64657800000000000000000000000000000081525060400191505060405180910390fd5b600085111515610756576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f7374617274496e646578206d7573742062652067726561746572207468616e2081526020017f300000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610760858561177c565b915061076b82611828565b905061077681611a70565b9250505092915050565b6000806035600084815260200190815260200160002054119050919050565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061081d836116f4565b1515610891576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f20726573756c742073657420666f72205f696e646578000000000000000081525060200191505060405180910390fd5b603460006033858154811015156108a457fe5b90600052602060002001548152602001908152602001600020546033848154811015156108cd57fe5b906000526020600020015491509150915091565b60006034600060336108f1610f62565b8154811015156108fd57fe5b9060005260206000200154815260200190815260200160002054905090565b60006033610928610f62565b81548110151561093457fe5b9060005260206000200154905090565b6000603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aaaa795603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506040513d6020811015610aa557600080fd5b8101908080519060200190929190505050600102905090565b6000603960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aaaa795603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16603860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015610bf557600080fd5b505af1158015610c09573d6000803e3d6000fd5b505050506040513d6020811015610c1f57600080fd5b810190808051906020019092919050505090503073ffffffffffffffffffffffffffffffffffffffff166392549bf282600102426040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b158015610cb457600080fd5b505af1158015610cc8573d6000803e3d6000fd5b505050506040513d6020811015610cde57600080fd5b81019080805190602001909291905050505050565b6000603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610de0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f5468652063616c6c6572206973206e6f7420746865206461746120736f75726381526020017f650000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b81428111151515610e59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f446174652063616e6e6f7420626520696e20746865206675747572650000000081525060200191505060405180910390fd5b60006033805490501115610e96576033610e71610f62565b815481101515610e7d57fe5b906000526020600020015483111515610e9557600080fd5b5b610ea08484611abc565b610ea8610f62565b91505092915050565b600080610ebd83610780565b1515610f31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f20726573756c742073657420666f72205f6461746500000000000000000081525060200191505060405180910390fd5b6034600084815260200190815260200160002054603560008581526020019081526020016000205491509150915091565b6000600160338054905003905090565b8073ffffffffffffffffffffffffffffffffffffffff1663d6e7444d84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050506040513d602081101561106b57600080fd5b810190808051906020019092919050505015156110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f746f6b656e207061697220646f6573206e6f742065786973740000000000000081525060200191505060405180910390fd5b82603760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081603860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080603960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111bc30611476565b505050565b60008060008060008587101515611266576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f737461727444617465206d757374206265206c657373207468616e20656e644481526020017f617465000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60016033805490500391505b6000821180156112825750600084145b156112bb578560338381548110151561129757fe5b90600052602060002001541115156112ad578193505b818060019003925050611272565b600084111515611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f6461746573206f757473696465206f662072616e6765206f662064617461666581526020017f656420726573756c74730000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8660338581548110151561136957fe5b906000526020600020015410151515611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f6461746573206f757473696465206f662072616e6765206f662064617461666581526020017f656420726573756c74730000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8390505b600081101580156114255750600083145b15611460578660338281548110151561143a57fe5b90600052602060002001541015611452576001810192505b808060019003915050611414565b61146a8385610615565b94505050505092915050565b60008060019054906101000a900460ff16806114965750611495611bbb565b5b806114ad57506000809054906101000a900460ff16155b1515611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f436f6e747261637420696e7374616e63652068617320616c726561647920626581526020017f656e20696e697469616c697a656400000000000000000000000000000000000081525060400191505060405180910390fd5b600060019054906101000a900460ff161590508015611596576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561163b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5f64617461536f757263652063616e6e6f74206265206164647265737328302981525060200191505060405180910390fd5b81603660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060336000908060018154018082558091505090600182039060005260206000200160009091929091909150555080156116ca5760008060016101000a81548160ff0219169083151502179055505b5050565b603760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808211151561176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5f696e646578206d7573742062652067726561746572207468616e203000000081525060200191505060405180910390fd5b81603380549050119050919050565b6060600060606000806001878703019350836040519080825280602002602001820160405280156117bc5781602001602082028038833980820191505090505b509250600091508690505b858111151561181b576033818154811015156117df57fe5b906000526020600020015483838151811015156117f857fe5b9060200190602002018181525050818060010192505080806001019150506117c7565b8294505050505092915050565b6060600080600080600080600061184a60028a51611bcc90919063ffffffff16565b96506000955061186560018a51611bf690919063ffffffff16565b94505b84861015611a615761189660026118888789611c1790919063ffffffff16565b611bcc90919063ffffffff16565b935088848151811015156118a657fe5b90602001906020020151925088858151811015156118c057fe5b9060200190602002015189858151811015156118d857fe5b906020019060200201518a868151811015156118f057fe5b9060200190602002018b8881518110151561190757fe5b906020019060200201828152508281525050508591508590505b848110156119cd5761194a898281518110151561193a57fe5b9060200190602002015184611c38565b156119c057888181518110151561195d57fe5b90602001906020020151898381518110151561197557fe5b906020019060200201518a8481518110151561198d57fe5b9060200190602002018b848151811015156119a457fe5b9060200190602002018281525082815250505081806001019250505b8080600101915050611921565b88858151811015156119db57fe5b9060200190602002015189838151811015156119f357fe5b906020019060200201518a84815181101515611a0b57fe5b9060200190602002018b88815181101515611a2257fe5b9060200190602002018281525082815250505086821015611a5857611a51600183611c1790919063ffffffff16565b9550611a5c565b8194505b611868565b88975050505050505050919050565b600080600060028451811515611a8257fe5b0491508382815181101515611a9357fe5b906020019060200201519050603460008281526020019081526020016000205492505050919050565b816034600083815260200190815260200160002081600019169055506033819080600181540180825580915050906001820390600052602060002001600090919290919091505550611b0c610f62565b6035600083815260200190815260200160002081905550611b2d8282611c73565b7f441cd35745cc95136f39641bf16b52089bd7e481d97d7db059792befa3caec198282611b58610f62565b336040518085600019166000191681526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a15050565b600080303b90506000811491505090565b600080600083111515611bde57600080fd5b8284811515611be957fe5b0490508091505092915050565b600080838311151515611c0857600080fd5b82840390508091505092915050565b6000808284019050838110151515611c2e57600080fd5b8091505092915050565b600060346000838152602001908152602001600020546001900460346000858152602001908152602001600020546001900410905092915050565b50505600a165627a7a72305820229d59cff97483188e4f5407c14d921953d2d030adeb5e4dedef366296c037e50029a165627a7a7230582073db6e5aa54cd39c15d69a2392f41e503a52897648eced8cbae04b6861f41d390029",
  "sourceMap": "63:1260:2:-;;;377:99;8:9:-1;5:2;;;30:1;27;20:12;5:2;377:99:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;455:16;437:15;;:34;;;;;;;;;;;;;;;;;;377:99;63:1260;;;;;;",
  "deployedSourceMap": "63:1260:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;287:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;287:85:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;199:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;199:39:2;;;;;;;;;;;;;;;;;;;;;;;;;;;480:476;;8:9:-1;5:2;;;30:1;27;20:12;5:2;480:476:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1135:185;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1135:185:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;960:171;;8:9:-1;5:2;;;30:1;27;20:12;5:2;960:171:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;287:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;199:39::-;;;;;;;;;;;;;:::o;480:476::-;674:37;580:40;605:6;613;580:24;:40::i;:::-;579:41;571:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;714:24;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;714:24:2;674:64;;744:18;:29;;;774:6;782;790:15;;;;;;;;;;;744:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;744:62:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;744:62:2;;;;851:18;813:19;:27;833:6;813:27;;;;;;;;;;;;;;;:35;841:6;813:35;;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;;;;881:70;915:18;936:6;944;881:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;480:476;;;:::o;1135:185::-;1234:4;1313:1;1255:60;;1263:37;1285:6;1293;1263:21;:37::i;:::-;1255:60;;;;1248:67;;1135:185;;;;:::o;960:171::-;1056:18;1091:19;:27;1111:6;1091:27;;;;;;;;;;;;;;;:35;1119:6;1091:35;;;;;;;;;;;;;;;;;;;;;;;;;1084:42;;960:171;;;;:::o;63:1260::-;;;;;;;;;;:::o",
  "source": "pragma solidity >=0.4.24;\n\nimport \"./TokenPriceDataFeed.sol\";\n\ncontract TokenPriceDataFeedFactory {\n\n  event TokenPriceDataFeedCreated(address tokenPriceDataFeed, address token1, address token2);\n\n  IExchangeAdapter public exchangeAdapter;\n\n  // token1 => token2 => TokenPriceDataFeed\n  mapping(address => mapping(address => TokenPriceDataFeed)) public tokenPairToDataFeed;\n\n  constructor(IExchangeAdapter _exchangeAdapter) public {\n    exchangeAdapter = _exchangeAdapter;\n  }\n\n  function createTokenPriceDataFeed(\n    address token1,\n    address token2\n  ) public {\n    require(!tokenPriceDataFeedExists(token1, token2), 'cannot add duplicate token price data feed');\n\n    TokenPriceDataFeed tokenPriceDataFeed = new TokenPriceDataFeed();\n    tokenPriceDataFeed.initialize(token1, token2, exchangeAdapter);\n\n    tokenPairToDataFeed[token1][token2] = tokenPriceDataFeed;\n\n    emit TokenPriceDataFeedCreated(address(tokenPriceDataFeed), token1, token2);\n  }\n\n  function getTokenPriceDataFeed(address token1, address token2)\n    public\n    view\n    returns (TokenPriceDataFeed)\n  {\n    return tokenPairToDataFeed[token1][token2];\n  }\n\n  function tokenPriceDataFeedExists(address token1, address token2)\n    public\n    view\n    returns (bool)\n  {\n    return address(getTokenPriceDataFeed(token1, token2)) != address(0);\n  }\n\n}\n",
  "sourcePath": "/Users/mfcalvanese/dev/eth/token-price-oracles/contracts/DataFeeds/TokenPriceDataFeedFactory.sol",
  "ast": {
    "absolutePath": "/Users/mfcalvanese/dev/eth/token-price-oracles/contracts/DataFeeds/TokenPriceDataFeedFactory.sol",
    "exportedSymbols": {
      "TokenPriceDataFeedFactory": [
        619
      ]
    },
    "id": 620,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 507,
        "literals": [
          "solidity",
          ">=",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:25:2"
      },
      {
        "absolutePath": "/Users/mfcalvanese/dev/eth/token-price-oracles/contracts/DataFeeds/TokenPriceDataFeed.sol",
        "file": "./TokenPriceDataFeed.sol",
        "id": 508,
        "nodeType": "ImportDirective",
        "scope": 620,
        "sourceUnit": 506,
        "src": "27:34:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [
          505
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 619,
        "linearizedBaseContracts": [
          619
        ],
        "name": "TokenPriceDataFeedFactory",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": null,
            "id": 516,
            "name": "TokenPriceDataFeedCreated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 515,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 510,
                  "indexed": false,
                  "name": "tokenPriceDataFeed",
                  "nodeType": "VariableDeclaration",
                  "scope": 516,
                  "src": "135:26:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 509,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "135:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 512,
                  "indexed": false,
                  "name": "token1",
                  "nodeType": "VariableDeclaration",
                  "scope": 516,
                  "src": "163:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 511,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "163:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 514,
                  "indexed": false,
                  "name": "token2",
                  "nodeType": "VariableDeclaration",
                  "scope": 516,
                  "src": "179:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 513,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "179:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "134:60:2"
            },
            "src": "103:92:2"
          },
          {
            "constant": false,
            "id": 518,
            "name": "exchangeAdapter",
            "nodeType": "VariableDeclaration",
            "scope": 619,
            "src": "199:39:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
              "typeString": "contract IExchangeAdapter"
            },
            "typeName": {
              "contractScope": null,
              "id": 517,
              "name": "IExchangeAdapter",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 640,
              "src": "199:16:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                "typeString": "contract IExchangeAdapter"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 524,
            "name": "tokenPairToDataFeed",
            "nodeType": "VariableDeclaration",
            "scope": 619,
            "src": "287:85:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$_$",
              "typeString": "mapping(address => mapping(address => contract TokenPriceDataFeed))"
            },
            "typeName": {
              "id": 523,
              "keyType": {
                "id": 519,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "295:7:2",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "287:58:2",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$_$",
                "typeString": "mapping(address => mapping(address => contract TokenPriceDataFeed))"
              },
              "valueType": {
                "id": 522,
                "keyType": {
                  "id": 520,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "314:7:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "306:38:2",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$",
                  "typeString": "mapping(address => contract TokenPriceDataFeed)"
                },
                "valueType": {
                  "contractScope": null,
                  "id": 521,
                  "name": "TokenPriceDataFeed",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 505,
                  "src": "325:18:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                    "typeString": "contract TokenPriceDataFeed"
                  }
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 533,
              "nodeType": "Block",
              "src": "431:45:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 531,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 529,
                      "name": "exchangeAdapter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 518,
                      "src": "437:15:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                        "typeString": "contract IExchangeAdapter"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 530,
                      "name": "_exchangeAdapter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 526,
                      "src": "455:16:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                        "typeString": "contract IExchangeAdapter"
                      }
                    },
                    "src": "437:34:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                      "typeString": "contract IExchangeAdapter"
                    }
                  },
                  "id": 532,
                  "nodeType": "ExpressionStatement",
                  "src": "437:34:2"
                }
              ]
            },
            "documentation": null,
            "id": 534,
            "implemented": true,
            "isConstructor": true,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 527,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 526,
                  "name": "_exchangeAdapter",
                  "nodeType": "VariableDeclaration",
                  "scope": 534,
                  "src": "389:33:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                    "typeString": "contract IExchangeAdapter"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 525,
                    "name": "IExchangeAdapter",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 640,
                    "src": "389:16:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                      "typeString": "contract IExchangeAdapter"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "388:35:2"
            },
            "payable": false,
            "returnParameters": {
              "id": 528,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "431:0:2"
            },
            "scope": 619,
            "src": "377:99:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 580,
              "nodeType": "Block",
              "src": "565:391:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 546,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "579:41:2",
                        "subExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 543,
                              "name": "token1",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 536,
                              "src": "605:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 544,
                              "name": "token2",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 538,
                              "src": "613:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 542,
                            "name": "tokenPriceDataFeedExists",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 618,
                            "src": "580:24:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                              "typeString": "function (address,address) view returns (bool)"
                            }
                          },
                          "id": 545,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "580:40:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "63616e6e6f7420616464206475706c696361746520746f6b656e20707269636520646174612066656564",
                        "id": 547,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "622:44:2",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e240c95da5a0f1259a52fb9feb669a377b71fec59c1465a6c80d3a160c7a13cd",
                          "typeString": "literal_string \"cannot add duplicate token price data feed\""
                        },
                        "value": "cannot add duplicate token price data feed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e240c95da5a0f1259a52fb9feb669a377b71fec59c1465a6c80d3a160c7a13cd",
                          "typeString": "literal_string \"cannot add duplicate token price data feed\""
                        }
                      ],
                      "id": 541,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1780,
                        1781
                      ],
                      "referencedDeclaration": 1781,
                      "src": "571:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 548,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "571:96:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 549,
                  "nodeType": "ExpressionStatement",
                  "src": "571:96:2"
                },
                {
                  "assignments": [
                    551
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 551,
                      "name": "tokenPriceDataFeed",
                      "nodeType": "VariableDeclaration",
                      "scope": 581,
                      "src": "674:37:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                        "typeString": "contract TokenPriceDataFeed"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 550,
                        "name": "TokenPriceDataFeed",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 505,
                        "src": "674:18:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                          "typeString": "contract TokenPriceDataFeed"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 555,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 553,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "NewExpression",
                      "src": "714:22:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_TokenPriceDataFeed_$505_$",
                        "typeString": "function () returns (contract TokenPriceDataFeed)"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 552,
                        "name": "TokenPriceDataFeed",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 505,
                        "src": "718:18:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                          "typeString": "contract TokenPriceDataFeed"
                        }
                      }
                    },
                    "id": 554,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "714:24:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                      "typeString": "contract TokenPriceDataFeed"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "674:64:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 559,
                        "name": "token1",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 536,
                        "src": "774:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 560,
                        "name": "token2",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 538,
                        "src": "782:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 561,
                        "name": "exchangeAdapter",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 518,
                        "src": "790:15:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                          "typeString": "contract IExchangeAdapter"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                          "typeString": "contract IExchangeAdapter"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 556,
                        "name": "tokenPriceDataFeed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 551,
                        "src": "744:18:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                          "typeString": "contract TokenPriceDataFeed"
                        }
                      },
                      "id": 558,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "initialize",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 465,
                      "src": "744:29:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_contract$_IExchangeAdapter_$640_$returns$__$",
                        "typeString": "function (address,address,contract IExchangeAdapter) external"
                      }
                    },
                    "id": 562,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "744:62:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 563,
                  "nodeType": "ExpressionStatement",
                  "src": "744:62:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 570,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 564,
                          "name": "tokenPairToDataFeed",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 524,
                          "src": "813:19:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$_$",
                            "typeString": "mapping(address => mapping(address => contract TokenPriceDataFeed))"
                          }
                        },
                        "id": 567,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 565,
                          "name": "token1",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 536,
                          "src": "833:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "813:27:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$",
                          "typeString": "mapping(address => contract TokenPriceDataFeed)"
                        }
                      },
                      "id": 568,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 566,
                        "name": "token2",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 538,
                        "src": "841:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "813:35:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                        "typeString": "contract TokenPriceDataFeed"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 569,
                      "name": "tokenPriceDataFeed",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 551,
                      "src": "851:18:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                        "typeString": "contract TokenPriceDataFeed"
                      }
                    },
                    "src": "813:56:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                      "typeString": "contract TokenPriceDataFeed"
                    }
                  },
                  "id": 571,
                  "nodeType": "ExpressionStatement",
                  "src": "813:56:2"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 574,
                            "name": "tokenPriceDataFeed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 551,
                            "src": "915:18:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                              "typeString": "contract TokenPriceDataFeed"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                              "typeString": "contract TokenPriceDataFeed"
                            }
                          ],
                          "id": 573,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "907:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 575,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "907:27:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 576,
                        "name": "token1",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 536,
                        "src": "936:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 577,
                        "name": "token2",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 538,
                        "src": "944:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 572,
                      "name": "TokenPriceDataFeedCreated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 516,
                      "src": "881:25:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address,address)"
                      }
                    },
                    "id": 578,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "881:70:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 579,
                  "nodeType": "EmitStatement",
                  "src": "876:75:2"
                }
              ]
            },
            "documentation": null,
            "id": 581,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "createTokenPriceDataFeed",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 539,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 536,
                  "name": "token1",
                  "nodeType": "VariableDeclaration",
                  "scope": 581,
                  "src": "519:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 535,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "519:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 538,
                  "name": "token2",
                  "nodeType": "VariableDeclaration",
                  "scope": 581,
                  "src": "539:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 537,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "539:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "513:44:2"
            },
            "payable": false,
            "returnParameters": {
              "id": 540,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "565:0:2"
            },
            "scope": 619,
            "src": "480:476:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 596,
              "nodeType": "Block",
              "src": "1078:53:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 590,
                        "name": "tokenPairToDataFeed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 524,
                        "src": "1091:19:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$_$",
                          "typeString": "mapping(address => mapping(address => contract TokenPriceDataFeed))"
                        }
                      },
                      "id": 592,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 591,
                        "name": "token1",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 583,
                        "src": "1111:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "1091:27:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$",
                        "typeString": "mapping(address => contract TokenPriceDataFeed)"
                      }
                    },
                    "id": 594,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 593,
                      "name": "token2",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 585,
                      "src": "1119:6:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1091:35:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                      "typeString": "contract TokenPriceDataFeed"
                    }
                  },
                  "functionReturnParameters": 589,
                  "id": 595,
                  "nodeType": "Return",
                  "src": "1084:42:2"
                }
              ]
            },
            "documentation": null,
            "id": 597,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getTokenPriceDataFeed",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 586,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 583,
                  "name": "token1",
                  "nodeType": "VariableDeclaration",
                  "scope": 597,
                  "src": "991:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 582,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "991:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 585,
                  "name": "token2",
                  "nodeType": "VariableDeclaration",
                  "scope": 597,
                  "src": "1007:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 584,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1007:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "990:32:2"
            },
            "payable": false,
            "returnParameters": {
              "id": 589,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 588,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 597,
                  "src": "1056:18:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                    "typeString": "contract TokenPriceDataFeed"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 587,
                    "name": "TokenPriceDataFeed",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 505,
                    "src": "1056:18:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                      "typeString": "contract TokenPriceDataFeed"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1055:20:2"
            },
            "scope": 619,
            "src": "960:171:2",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 617,
              "nodeType": "Block",
              "src": "1242:78:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 615,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 608,
                              "name": "token1",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 599,
                              "src": "1285:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 609,
                              "name": "token2",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 601,
                              "src": "1293:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 607,
                            "name": "getTokenPriceDataFeed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 597,
                            "src": "1263:21:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_contract$_TokenPriceDataFeed_$505_$",
                              "typeString": "function (address,address) view returns (contract TokenPriceDataFeed)"
                            }
                          },
                          "id": 610,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1263:37:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                            "typeString": "contract TokenPriceDataFeed"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                            "typeString": "contract TokenPriceDataFeed"
                          }
                        ],
                        "id": 606,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1255:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 611,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1255:46:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 613,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1313:1:2",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 612,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1305:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 614,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1305:10:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1255:60:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 605,
                  "id": 616,
                  "nodeType": "Return",
                  "src": "1248:67:2"
                }
              ]
            },
            "documentation": null,
            "id": 618,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "tokenPriceDataFeedExists",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 602,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 599,
                  "name": "token1",
                  "nodeType": "VariableDeclaration",
                  "scope": 618,
                  "src": "1169:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 598,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1169:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 601,
                  "name": "token2",
                  "nodeType": "VariableDeclaration",
                  "scope": 618,
                  "src": "1185:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 600,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1185:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1168:32:2"
            },
            "payable": false,
            "returnParameters": {
              "id": 605,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 604,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 618,
                  "src": "1234:4:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 603,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1234:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1233:6:2"
            },
            "scope": 619,
            "src": "1135:185:2",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 620,
        "src": "63:1260:2"
      }
    ],
    "src": "0:1324:2"
  },
  "legacyAST": {
    "absolutePath": "/Users/mfcalvanese/dev/eth/token-price-oracles/contracts/DataFeeds/TokenPriceDataFeedFactory.sol",
    "exportedSymbols": {
      "TokenPriceDataFeedFactory": [
        619
      ]
    },
    "id": 620,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 507,
        "literals": [
          "solidity",
          ">=",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:25:2"
      },
      {
        "absolutePath": "/Users/mfcalvanese/dev/eth/token-price-oracles/contracts/DataFeeds/TokenPriceDataFeed.sol",
        "file": "./TokenPriceDataFeed.sol",
        "id": 508,
        "nodeType": "ImportDirective",
        "scope": 620,
        "sourceUnit": 506,
        "src": "27:34:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [
          505
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 619,
        "linearizedBaseContracts": [
          619
        ],
        "name": "TokenPriceDataFeedFactory",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": null,
            "id": 516,
            "name": "TokenPriceDataFeedCreated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 515,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 510,
                  "indexed": false,
                  "name": "tokenPriceDataFeed",
                  "nodeType": "VariableDeclaration",
                  "scope": 516,
                  "src": "135:26:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 509,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "135:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 512,
                  "indexed": false,
                  "name": "token1",
                  "nodeType": "VariableDeclaration",
                  "scope": 516,
                  "src": "163:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 511,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "163:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 514,
                  "indexed": false,
                  "name": "token2",
                  "nodeType": "VariableDeclaration",
                  "scope": 516,
                  "src": "179:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 513,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "179:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "134:60:2"
            },
            "src": "103:92:2"
          },
          {
            "constant": false,
            "id": 518,
            "name": "exchangeAdapter",
            "nodeType": "VariableDeclaration",
            "scope": 619,
            "src": "199:39:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
              "typeString": "contract IExchangeAdapter"
            },
            "typeName": {
              "contractScope": null,
              "id": 517,
              "name": "IExchangeAdapter",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 640,
              "src": "199:16:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                "typeString": "contract IExchangeAdapter"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 524,
            "name": "tokenPairToDataFeed",
            "nodeType": "VariableDeclaration",
            "scope": 619,
            "src": "287:85:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$_$",
              "typeString": "mapping(address => mapping(address => contract TokenPriceDataFeed))"
            },
            "typeName": {
              "id": 523,
              "keyType": {
                "id": 519,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "295:7:2",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "287:58:2",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$_$",
                "typeString": "mapping(address => mapping(address => contract TokenPriceDataFeed))"
              },
              "valueType": {
                "id": 522,
                "keyType": {
                  "id": 520,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "314:7:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "306:38:2",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$",
                  "typeString": "mapping(address => contract TokenPriceDataFeed)"
                },
                "valueType": {
                  "contractScope": null,
                  "id": 521,
                  "name": "TokenPriceDataFeed",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 505,
                  "src": "325:18:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                    "typeString": "contract TokenPriceDataFeed"
                  }
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 533,
              "nodeType": "Block",
              "src": "431:45:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 531,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 529,
                      "name": "exchangeAdapter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 518,
                      "src": "437:15:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                        "typeString": "contract IExchangeAdapter"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 530,
                      "name": "_exchangeAdapter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 526,
                      "src": "455:16:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                        "typeString": "contract IExchangeAdapter"
                      }
                    },
                    "src": "437:34:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                      "typeString": "contract IExchangeAdapter"
                    }
                  },
                  "id": 532,
                  "nodeType": "ExpressionStatement",
                  "src": "437:34:2"
                }
              ]
            },
            "documentation": null,
            "id": 534,
            "implemented": true,
            "isConstructor": true,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 527,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 526,
                  "name": "_exchangeAdapter",
                  "nodeType": "VariableDeclaration",
                  "scope": 534,
                  "src": "389:33:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                    "typeString": "contract IExchangeAdapter"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 525,
                    "name": "IExchangeAdapter",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 640,
                    "src": "389:16:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                      "typeString": "contract IExchangeAdapter"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "388:35:2"
            },
            "payable": false,
            "returnParameters": {
              "id": 528,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "431:0:2"
            },
            "scope": 619,
            "src": "377:99:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 580,
              "nodeType": "Block",
              "src": "565:391:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 546,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "579:41:2",
                        "subExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 543,
                              "name": "token1",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 536,
                              "src": "605:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 544,
                              "name": "token2",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 538,
                              "src": "613:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 542,
                            "name": "tokenPriceDataFeedExists",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 618,
                            "src": "580:24:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                              "typeString": "function (address,address) view returns (bool)"
                            }
                          },
                          "id": 545,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "580:40:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "63616e6e6f7420616464206475706c696361746520746f6b656e20707269636520646174612066656564",
                        "id": 547,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "622:44:2",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e240c95da5a0f1259a52fb9feb669a377b71fec59c1465a6c80d3a160c7a13cd",
                          "typeString": "literal_string \"cannot add duplicate token price data feed\""
                        },
                        "value": "cannot add duplicate token price data feed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e240c95da5a0f1259a52fb9feb669a377b71fec59c1465a6c80d3a160c7a13cd",
                          "typeString": "literal_string \"cannot add duplicate token price data feed\""
                        }
                      ],
                      "id": 541,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        1780,
                        1781
                      ],
                      "referencedDeclaration": 1781,
                      "src": "571:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 548,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "571:96:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 549,
                  "nodeType": "ExpressionStatement",
                  "src": "571:96:2"
                },
                {
                  "assignments": [
                    551
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 551,
                      "name": "tokenPriceDataFeed",
                      "nodeType": "VariableDeclaration",
                      "scope": 581,
                      "src": "674:37:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                        "typeString": "contract TokenPriceDataFeed"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 550,
                        "name": "TokenPriceDataFeed",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 505,
                        "src": "674:18:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                          "typeString": "contract TokenPriceDataFeed"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 555,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 553,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "NewExpression",
                      "src": "714:22:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_TokenPriceDataFeed_$505_$",
                        "typeString": "function () returns (contract TokenPriceDataFeed)"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 552,
                        "name": "TokenPriceDataFeed",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 505,
                        "src": "718:18:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                          "typeString": "contract TokenPriceDataFeed"
                        }
                      }
                    },
                    "id": 554,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "714:24:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                      "typeString": "contract TokenPriceDataFeed"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "674:64:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 559,
                        "name": "token1",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 536,
                        "src": "774:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 560,
                        "name": "token2",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 538,
                        "src": "782:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 561,
                        "name": "exchangeAdapter",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 518,
                        "src": "790:15:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                          "typeString": "contract IExchangeAdapter"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_contract$_IExchangeAdapter_$640",
                          "typeString": "contract IExchangeAdapter"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 556,
                        "name": "tokenPriceDataFeed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 551,
                        "src": "744:18:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                          "typeString": "contract TokenPriceDataFeed"
                        }
                      },
                      "id": 558,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "initialize",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 465,
                      "src": "744:29:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_contract$_IExchangeAdapter_$640_$returns$__$",
                        "typeString": "function (address,address,contract IExchangeAdapter) external"
                      }
                    },
                    "id": 562,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "744:62:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 563,
                  "nodeType": "ExpressionStatement",
                  "src": "744:62:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 570,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 564,
                          "name": "tokenPairToDataFeed",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 524,
                          "src": "813:19:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$_$",
                            "typeString": "mapping(address => mapping(address => contract TokenPriceDataFeed))"
                          }
                        },
                        "id": 567,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 565,
                          "name": "token1",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 536,
                          "src": "833:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "813:27:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$",
                          "typeString": "mapping(address => contract TokenPriceDataFeed)"
                        }
                      },
                      "id": 568,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 566,
                        "name": "token2",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 538,
                        "src": "841:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "813:35:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                        "typeString": "contract TokenPriceDataFeed"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 569,
                      "name": "tokenPriceDataFeed",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 551,
                      "src": "851:18:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                        "typeString": "contract TokenPriceDataFeed"
                      }
                    },
                    "src": "813:56:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                      "typeString": "contract TokenPriceDataFeed"
                    }
                  },
                  "id": 571,
                  "nodeType": "ExpressionStatement",
                  "src": "813:56:2"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 574,
                            "name": "tokenPriceDataFeed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 551,
                            "src": "915:18:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                              "typeString": "contract TokenPriceDataFeed"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                              "typeString": "contract TokenPriceDataFeed"
                            }
                          ],
                          "id": 573,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "907:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 575,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "907:27:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 576,
                        "name": "token1",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 536,
                        "src": "936:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 577,
                        "name": "token2",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 538,
                        "src": "944:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 572,
                      "name": "TokenPriceDataFeedCreated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 516,
                      "src": "881:25:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address,address)"
                      }
                    },
                    "id": 578,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "881:70:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 579,
                  "nodeType": "EmitStatement",
                  "src": "876:75:2"
                }
              ]
            },
            "documentation": null,
            "id": 581,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "createTokenPriceDataFeed",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 539,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 536,
                  "name": "token1",
                  "nodeType": "VariableDeclaration",
                  "scope": 581,
                  "src": "519:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 535,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "519:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 538,
                  "name": "token2",
                  "nodeType": "VariableDeclaration",
                  "scope": 581,
                  "src": "539:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 537,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "539:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "513:44:2"
            },
            "payable": false,
            "returnParameters": {
              "id": 540,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "565:0:2"
            },
            "scope": 619,
            "src": "480:476:2",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 596,
              "nodeType": "Block",
              "src": "1078:53:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 590,
                        "name": "tokenPairToDataFeed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 524,
                        "src": "1091:19:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$_$",
                          "typeString": "mapping(address => mapping(address => contract TokenPriceDataFeed))"
                        }
                      },
                      "id": 592,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 591,
                        "name": "token1",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 583,
                        "src": "1111:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "1091:27:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_contract$_TokenPriceDataFeed_$505_$",
                        "typeString": "mapping(address => contract TokenPriceDataFeed)"
                      }
                    },
                    "id": 594,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 593,
                      "name": "token2",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 585,
                      "src": "1119:6:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1091:35:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                      "typeString": "contract TokenPriceDataFeed"
                    }
                  },
                  "functionReturnParameters": 589,
                  "id": 595,
                  "nodeType": "Return",
                  "src": "1084:42:2"
                }
              ]
            },
            "documentation": null,
            "id": 597,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getTokenPriceDataFeed",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 586,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 583,
                  "name": "token1",
                  "nodeType": "VariableDeclaration",
                  "scope": 597,
                  "src": "991:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 582,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "991:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 585,
                  "name": "token2",
                  "nodeType": "VariableDeclaration",
                  "scope": 597,
                  "src": "1007:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 584,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1007:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "990:32:2"
            },
            "payable": false,
            "returnParameters": {
              "id": 589,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 588,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 597,
                  "src": "1056:18:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                    "typeString": "contract TokenPriceDataFeed"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 587,
                    "name": "TokenPriceDataFeed",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 505,
                    "src": "1056:18:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                      "typeString": "contract TokenPriceDataFeed"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1055:20:2"
            },
            "scope": 619,
            "src": "960:171:2",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 617,
              "nodeType": "Block",
              "src": "1242:78:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 615,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 608,
                              "name": "token1",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 599,
                              "src": "1285:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 609,
                              "name": "token2",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 601,
                              "src": "1293:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 607,
                            "name": "getTokenPriceDataFeed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 597,
                            "src": "1263:21:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_contract$_TokenPriceDataFeed_$505_$",
                              "typeString": "function (address,address) view returns (contract TokenPriceDataFeed)"
                            }
                          },
                          "id": 610,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1263:37:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                            "typeString": "contract TokenPriceDataFeed"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_TokenPriceDataFeed_$505",
                            "typeString": "contract TokenPriceDataFeed"
                          }
                        ],
                        "id": 606,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1255:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 611,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1255:46:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 613,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1313:1:2",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 612,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1305:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 614,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1305:10:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1255:60:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 605,
                  "id": 616,
                  "nodeType": "Return",
                  "src": "1248:67:2"
                }
              ]
            },
            "documentation": null,
            "id": 618,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "tokenPriceDataFeedExists",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 602,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 599,
                  "name": "token1",
                  "nodeType": "VariableDeclaration",
                  "scope": 618,
                  "src": "1169:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 598,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1169:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 601,
                  "name": "token2",
                  "nodeType": "VariableDeclaration",
                  "scope": 618,
                  "src": "1185:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 600,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1185:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1168:32:2"
            },
            "payable": false,
            "returnParameters": {
              "id": 605,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 604,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 618,
                  "src": "1234:4:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 603,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1234:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1233:6:2"
            },
            "scope": 619,
            "src": "1135:185:2",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 620,
        "src": "63:1260:2"
      }
    ],
    "src": "0:1324:2"
  },
  "compiler": {
    "name": "solc",
    "version": "0.4.25+commit.59dbf8f1.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "2.0.2",
  "updatedAt": "2020-02-17T22:26:47.994Z"
}