UNPKG

@aragon/apps-payroll

Version:

_**Code in Github:**_ [aragon-apps/apps/payroll](https://github.com/aragon/aragon-apps/tree/master/future-apps/payroll)

246 lines 707 kB
{ "contractName": "PPF", "abi": [ { "constant": true, "inputs": [], "name": "operatorOwner", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "operator", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "PPF_v1_ID", "outputs": [ { "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "inputs": [ { "name": "_operator", "type": "address" }, { "name": "_operatorOwner", "type": "address" } ], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "base", "type": "address" }, { "indexed": true, "name": "quote", "type": "address" }, { "indexed": false, "name": "xrt", "type": "uint256" }, { "indexed": false, "name": "when", "type": "uint64" } ], "name": "SetRate", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "operator", "type": "address" } ], "name": "SetOperator", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "operatorOwner", "type": "address" } ], "name": "SetOperatorOwner", "type": "event" }, { "constant": false, "inputs": [ { "name": "_operator", "type": "address" } ], "name": "setOperator", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "_operatorOwner", "type": "address" } ], "name": "setOperatorOwner", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "base", "type": "address" }, { "name": "quote", "type": "address" } ], "name": "get", "outputs": [ { "name": "", "type": "uint128" }, { "name": "", "type": "uint64" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "ratePrecision", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "pure", "type": "function" }, { "constant": false, "inputs": [ { "name": "base", "type": "address" }, { "name": "quote", "type": "address" }, { "name": "xrt", "type": "uint128" }, { "name": "when", "type": "uint64" }, { "name": "sig", "type": "bytes" } ], "name": "update", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "bases", "type": "address[]" }, { "name": "quotes", "type": "address[]" }, { "name": "xrts", "type": "uint128[]" }, { "name": "whens", "type": "uint64[]" }, { "name": "sigs", "type": "bytes" } ], "name": "updateMany", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x60806040523480156200001157600080fd5b5060405160408062001b188339810160405280516020909101516200003f826401000000006200005b810204565b62000053816401000000006200018a810204565b50506200027e565b60408051808201909152601981527f5050465f4f50455241544f525f414444524553535f5a45524f000000000000006020820152600160a060020a038216151562000141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000105578181015183820152602001620000eb565b50505050905090810190601f168015620001335780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008054600160a060020a031916600160a060020a038316908117825560405190917fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee91a250565b60408051808201909152601f81527f5050465f4f50455241544f525f4f574e45525f414444524553535f5a45524f006020820152600160a060020a038216151562000233576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101562000105578181015183820152602001620000eb565b5060018054600160a060020a031916600160a060020a0383169081179091556040517f99ac3391bcaac6e04578cbac2efd183c665745adeb1ad37989376c39f137177a90600090a250565b61188a806200028e6000396000f3006080604052600436106100985763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630cc893e2811461009d5780630dfcdb07146100db578063570ca7351461021b57806377bb136114610230578063b3ab15fb14610257578063b800919e14610285578063d81e8423146102b3578063f40a04481461031c578063fdadbbb614610331575b600080fd5b3480156100a957600080fd5b506100b26103d1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100e757600080fd5b506040805160206004803580820135838102808601850190965280855261021995369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506103ed9650505050505050565b005b34801561022757600080fd5b506100b26108d3565b34801561023c57600080fd5b506102456108ef565b60408051918252519081900360200190f35b34801561026357600080fd5b5061021973ffffffffffffffffffffffffffffffffffffffff60043516610913565b34801561029157600080fd5b5061021973ffffffffffffffffffffffffffffffffffffffff600435166109fa565b3480156102bf57600080fd5b506102e773ffffffffffffffffffffffffffffffffffffffff60043581169060243516610aba565b604080516fffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301528051918290030190f35b34801561032857600080fd5b50610245610baf565b34801561033d57600080fd5b50604080516020601f6084356004818101359283018490048402850184019095528184526102199473ffffffffffffffffffffffffffffffffffffffff813581169560248035909216956fffffffffffffffffffffffffffffffff604435169567ffffffffffffffff606435169536959460a49493910191908190840183828082843750949750610bbb9650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b845160408051808201909152601b81527f5050465f424153455f4144445245535345535f4c454e5f5a45524f00000000006020820152600091606091839115156104cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561049457818101518382015260200161047c565b50505050905090810190601f1680156104c15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50865188516040805180820190915260208082527f5050465f51554f54455f4144445245535345535f4c454e5f4d49534d41544348908201529114610570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b508551885160408051808201909152601c81527f5050465f524154455f56414c5545535f4c454e5f4d49534d415443480000000060208201529114610611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50845188516040805180820190915260208082527f5050465f524154455f54494d455354414d50535f4c454e5f4d49534d415443489082015291146106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b508351885160408051808201909152601b81527f5050465f5349474e4154555245535f4c454e5f4d49534d4154434800000000006020820152916041900414610757576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50835160408051808201909152601b81527f5050465f5349474e4154555245535f4c454e5f4d49534d41544348000000000060208201529060419006156107fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50600092505b87518310156108c957604080516041808252608082019092529060208201610820803883390190505091508260410260200190508084015160208301526020810184015160408301526021810184015160608301536108be888481518110151561086657fe5b90602001906020020151888581518110151561087e57fe5b90602001906020020151888681518110151561089657fe5b9060200190602002015188878151811015156108ae57fe5b9060200190602002015186610bbb565b600190920191610800565b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b7f33a8ba7202230fa1cee2aac7bac322939edc7ba0a48b0989335a5f87a577036981565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610950575060015473ffffffffffffffffffffffffffffffffffffffff1633145b60408051808201909152601881527f5050465f43414e5f4e4f545f5345545f4f50455241544f52000000000000000060208201529015156109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b506109f781611032565b50565b60015460408051808201909152601e81527f5050465f43414e5f4e4f545f5345545f4f50455241544f525f4f574e4552000060208201529073ffffffffffffffffffffffffffffffffffffffff163314610ab0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b506109f781611153565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b0d57670de0b6b3a7640000610b04611276565b92509250610ba7565b60026000610b1b878761128d565b815260208101919091526040016000208054909150700100000000000000000000000000000000900467ffffffffffffffff161515610b605760009250829150610ba7565b8054610b8190869086906fffffffffffffffffffffffffffffffff166113e1565b8154909350700100000000000000000000000000000000900467ffffffffffffffff1691505b509250929050565b670de0b6b3a764000090565b600080610bc8878761128d565b60008181526002602052604090205490925067ffffffffffffffff7001000000000000000000000000000000009091048116908516118015610c1b5750610c0d611432565b8467ffffffffffffffff1611155b60408051808201909152601681527f5050465f4241445f524154455f54494d455354414d50000000000000000000006020820152901515610cb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b5060408051808201909152601681527f5050465f494e56414c49445f524154455f56414c554500000000000000000000602082015260006fffffffffffffffffffffffffffffffff871611610d69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b5060408051808201909152601e81527f5050465f455155414c5f424153455f51554f54455f4144445245535345530000602082015273ffffffffffffffffffffffffffffffffffffffff8881169088161415610e21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50610e2e87878787611436565b60005490915073ffffffffffffffffffffffffffffffffffffffff16610e5a828563ffffffff6115a116565b73ffffffffffffffffffffffffffffffffffffffff16146040805190810160405280601181526020017f5050465f4241445f5349474e4154555245000000000000000000000000000000815250901515610f10576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b506040805190810160405280610f278989896113e1565b6fffffffffffffffffffffffffffffffff908116825267ffffffffffffffff878116602093840181905260008781526002855260409081902086518154978701517fffffffffffffffffffffffffffffffff00000000000000000000000000000000909816908616177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000009790941696909602929092179094558051918916825291810192909252805173ffffffffffffffffffffffffffffffffffffffff89811693908b16927fdc3cf748498d22cc47e2d62e2a7216a21f3e47de73ea3d4a9b2a7ccd976ff84d92918290030190a350505050505050565b60408051808201909152601981527f5050465f4f50455241544f525f414444524553535f5a45524f00000000000000602082015273ffffffffffffffffffffffffffffffffffffffff821615156110e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee91a250565b60408051808201909152601f81527f5050465f4f50455241544f525f4f574e45525f414444524553535f5a45524f00602082015273ffffffffffffffffffffffffffffffffffffffff82161515611206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f99ac3391bcaac6e04578cbac2efd183c665745adeb1ad37989376c39f137177a90600090a250565b6000611288611283611432565b6115bc565b905090565b60008060008061129d868661166c565b9250826112aa57846112ac565b855b9150826112b957856112bb565b845b90508181604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040516020818303038152906040526040518082805190602001908083835b602083106113a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161136b565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902093505b50505092915050565b6000806113ee858561166c565b905080611427576fffffffffffffffffffffffffffffffff83166ec097ce7bc90715b34b9f100000000081151561142157fe5b04611429565b825b95945050505050565b4290565b604080517f33a8ba7202230fa1cee2aac7bac322939edc7ba0a48b0989335a5f87a57703696020808301919091526c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff80891682028486015287160260548301527001000000000000000000000000000000006fffffffffffffffffffffffffffffffff8616026068830152780100000000000000000000000000000000000000000000000067ffffffffffffffff8516026078830152825160608184030181526080909201928390528151600093918291908401908083835b6020831061154e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611511565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912098975050505050505050565b60006115b56115af8461168a565b83611770565b9392505050565b60408051808201909152601581527f55494e5436345f4e554d4245525f544f4f5f4249470000000000000000000000602082015260009067ffffffffffffffff831115611665576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff90811691161090565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c80830185905283518084039091018152605c909201928390528151600093918291908401908083835b6020831061172057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016116e3565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912095945050505050565b6000806000808451604114151561178a57600093506113d8565b50505060208201516040830151606084015160001a601b60ff821610156117af57601b015b8060ff16601b141580156117c757508060ff16601c14155b156117d557600093506113d8565b60408051600080825260208083018085528a905260ff8516838501526060830187905260808301869052925160019360a08085019491937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840193928390039091019190865af115801561184d573d6000803e3d6000fd5b5050506020604051035193506113d85600a165627a7a723058202ca3f8d616980530f7323691d735d7af3d21f71b3ea730afd6ba4a1d484a888b0029", "deployedBytecode": "0x6080604052600436106100985763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630cc893e2811461009d5780630dfcdb07146100db578063570ca7351461021b57806377bb136114610230578063b3ab15fb14610257578063b800919e14610285578063d81e8423146102b3578063f40a04481461031c578063fdadbbb614610331575b600080fd5b3480156100a957600080fd5b506100b26103d1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100e757600080fd5b506040805160206004803580820135838102808601850190965280855261021995369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506103ed9650505050505050565b005b34801561022757600080fd5b506100b26108d3565b34801561023c57600080fd5b506102456108ef565b60408051918252519081900360200190f35b34801561026357600080fd5b5061021973ffffffffffffffffffffffffffffffffffffffff60043516610913565b34801561029157600080fd5b5061021973ffffffffffffffffffffffffffffffffffffffff600435166109fa565b3480156102bf57600080fd5b506102e773ffffffffffffffffffffffffffffffffffffffff60043581169060243516610aba565b604080516fffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301528051918290030190f35b34801561032857600080fd5b50610245610baf565b34801561033d57600080fd5b50604080516020601f6084356004818101359283018490048402850184019095528184526102199473ffffffffffffffffffffffffffffffffffffffff813581169560248035909216956fffffffffffffffffffffffffffffffff604435169567ffffffffffffffff606435169536959460a49493910191908190840183828082843750949750610bbb9650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b845160408051808201909152601b81527f5050465f424153455f4144445245535345535f4c454e5f5a45524f00000000006020820152600091606091839115156104cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561049457818101518382015260200161047c565b50505050905090810190601f1680156104c15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50865188516040805180820190915260208082527f5050465f51554f54455f4144445245535345535f4c454e5f4d49534d41544348908201529114610570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b508551885160408051808201909152601c81527f5050465f524154455f56414c5545535f4c454e5f4d49534d415443480000000060208201529114610611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50845188516040805180820190915260208082527f5050465f524154455f54494d455354414d50535f4c454e5f4d49534d415443489082015291146106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b508351885160408051808201909152601b81527f5050465f5349474e4154555245535f4c454e5f4d49534d4154434800000000006020820152916041900414610757576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50835160408051808201909152601b81527f5050465f5349474e4154555245535f4c454e5f4d49534d41544348000000000060208201529060419006156107fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50600092505b87518310156108c957604080516041808252608082019092529060208201610820803883390190505091508260410260200190508084015160208301526020810184015160408301526021810184015160608301536108be888481518110151561086657fe5b90602001906020020151888581518110151561087e57fe5b90602001906020020151888681518110151561089657fe5b9060200190602002015188878151811015156108ae57fe5b9060200190602002015186610bbb565b600190920191610800565b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b7f33a8ba7202230fa1cee2aac7bac322939edc7ba0a48b0989335a5f87a577036981565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610950575060015473ffffffffffffffffffffffffffffffffffffffff1633145b60408051808201909152601881527f5050465f43414e5f4e4f545f5345545f4f50455241544f52000000000000000060208201529015156109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b506109f781611032565b50565b60015460408051808201909152601e81527f5050465f43414e5f4e4f545f5345545f4f50455241544f525f4f574e4552000060208201529073ffffffffffffffffffffffffffffffffffffffff163314610ab0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b506109f781611153565b60008060008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b0d57670de0b6b3a7640000610b04611276565b92509250610ba7565b60026000610b1b878761128d565b815260208101919091526040016000208054909150700100000000000000000000000000000000900467ffffffffffffffff161515610b605760009250829150610ba7565b8054610b8190869086906fffffffffffffffffffffffffffffffff166113e1565b8154909350700100000000000000000000000000000000900467ffffffffffffffff1691505b509250929050565b670de0b6b3a764000090565b600080610bc8878761128d565b60008181526002602052604090205490925067ffffffffffffffff7001000000000000000000000000000000009091048116908516118015610c1b5750610c0d611432565b8467ffffffffffffffff1611155b60408051808201909152601681527f5050465f4241445f524154455f54494d455354414d50000000000000000000006020820152901515610cb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b5060408051808201909152601681527f5050465f494e56414c49445f524154455f56414c554500000000000000000000602082015260006fffffffffffffffffffffffffffffffff871611610d69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b5060408051808201909152601e81527f5050465f455155414c5f424153455f51554f54455f4144445245535345530000602082015273ffffffffffffffffffffffffffffffffffffffff8881169088161415610e21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50610e2e87878787611436565b60005490915073ffffffffffffffffffffffffffffffffffffffff16610e5a828563ffffffff6115a116565b73ffffffffffffffffffffffffffffffffffffffff16146040805190810160405280601181526020017f5050465f4241445f5349474e4154555245000000000000000000000000000000815250901515610f10576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b506040805190810160405280610f278989896113e1565b6fffffffffffffffffffffffffffffffff908116825267ffffffffffffffff878116602093840181905260008781526002855260409081902086518154978701517fffffffffffffffffffffffffffffffff00000000000000000000000000000000909816908616177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000009790941696909602929092179094558051918916825291810192909252805173ffffffffffffffffffffffffffffffffffffffff89811693908b16927fdc3cf748498d22cc47e2d62e2a7216a21f3e47de73ea3d4a9b2a7ccd976ff84d92918290030190a350505050505050565b60408051808201909152601981527f5050465f4f50455241544f525f414444524553535f5a45524f00000000000000602082015273ffffffffffffffffffffffffffffffffffffffff821615156110e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee91a250565b60408051808201909152601f81527f5050465f4f50455241544f525f4f574e45525f414444524553535f5a45524f00602082015273ffffffffffffffffffffffffffffffffffffffff82161515611206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b50600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f99ac3391bcaac6e04578cbac2efd183c665745adeb1ad37989376c39f137177a90600090a250565b6000611288611283611432565b6115bc565b905090565b60008060008061129d868661166c565b9250826112aa57846112ac565b855b9150826112b957856112bb565b845b90508181604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040516020818303038152906040526040518082805190602001908083835b602083106113a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161136b565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902093505b50505092915050565b6000806113ee858561166c565b905080611427576fffffffffffffffffffffffffffffffff83166ec097ce7bc90715b34b9f100000000081151561142157fe5b04611429565b825b95945050505050565b4290565b604080517f33a8ba7202230fa1cee2aac7bac322939edc7ba0a48b0989335a5f87a57703696020808301919091526c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff80891682028486015287160260548301527001000000000000000000000000000000006fffffffffffffffffffffffffffffffff8616026068830152780100000000000000000000000000000000000000000000000067ffffffffffffffff8516026078830152825160608184030181526080909201928390528151600093918291908401908083835b6020831061154e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611511565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912098975050505050505050565b60006115b56115af8461168a565b83611770565b9392505050565b60408051808201909152601581527f55494e5436345f4e554d4245525f544f4f5f4249470000000000000000000000602082015260009067ffffffffffffffff831115611665576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360008381101561049457818101518382015260200161047c565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff90811691161090565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c80830185905283518084039091018152605c909201928390528151600093918291908401908083835b6020831061172057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016116e3565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912095945050505050565b6000806000808451604114151561178a57600093506113d8565b50505060208201516040830151606084015160001a601b60ff821610156117af57601b015b8060ff16601b141580156117c757508060ff16601c14155b156117d557600093506113d8565b60408051600080825260208083018085528a905260ff8516838501526060830187905260808301869052925160019360a08085019491937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840193928390039091019190865af115801561184d573d6000803e3d6000fd5b5050506020604051035193506113d85600a165627a7a723058202ca3f8d616980530f7323691d735d7af3d21f71b3ea730afd6ba4a1d484a888b0029", "sourceMap": "144:9092:64:-;;;2221:146;8:9:-1;5:2;;;30:1;27;20:12;5:2;2221:146:64;;;;;;;;;;;;;;;;;;;2294:23;2221:146;2294:12;;;;:23;:::i;:::-;2327:33;2345:14;2327:17;;;;:33;:::i;:::-;2221:146;;144:9092;;7688:195;7781:27;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7756:23:64;;;;7748:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7748:61:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7819:8:64;:20;;-1:-1:-1;;;;;;7819:20:64;-1:-1:-1;;;;;7819:20:64;;;;;;;7854:22;;7819:20;;7854:22;;;7688:195;:::o;7889:236::-;7997:33;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7967:28:64;;;;7959:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7959:72:64;-1:-1:-1;8041:13:64;:30;;-1:-1:-1;;;;;;8041:30:64;-1:-1:-1;;;;;8041:30:64;;;;;;;;8086:32;;;;-1:-1:-1;;8086:32:64;7889:236;:::o;144:9092::-;;;;;;;", "deployedSourceMap": "144:9092:64:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1764:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1764:28:64;;;;;;;;;;;;;;;;;;;;;;;6312:1370;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6312:1370:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6312:1370:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6312:1370:64;;;;-1:-1:-1;6312:1370:64;-1:-1:-1;6312:1370:64;;-1:-1:-1;6312:1370:64;;;;;;;;;-1:-1:-1;;6312:1370:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6312:1370:64;;;;-1:-1:-1;6312:1370:64;-1:-1:-1;6312:1370:64;;-1:-1:-1;6312:1370:64;;;;;;;;;-1:-1:-1;;6312:1370:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6312:1370:64;;;;-1:-1:-1;6312:1370:64;-1:-1:-1;6312:1370:64;;-1:-1:-1;6312:1370:64;;;;;;;;;-1:-1:-1;;6312:1370:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6312:1370:64;;;;-1:-1:-1;6312:1370:64;-1:-1:-1;6312:1370:64;;-1:-1:-1;6312:1370:64;;;;;;;;-1:-1:-1;6312:1370:64;;-1:-1:-1;6312:1370:64;;-1:-1:-1;;;;;;;6312:1370:64;;;1735:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1735:23:64;;;;220:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;220:102:64;;;;;;;;;;;;;;;;;;;;2524:363;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2524:363:64;;;;;;;3040:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3040:189:64;;;;;;;3452:408;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3452:408:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3951:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3951:84:64;;;;4756:905;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4756:905:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4756:905:64;;-1:-1:-1;4756:905:64;;-1:-1:-1;;;;;;;4756:905:64;1764:28;;;;;;:::o;6312:1370::-;6436:12;;6455:32;;;;;;;;;;;;;;;;;6917:9;;7048:16;;6917:9;;6436:17;;6428:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6428:60:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6522:13:64;;6506:12;;6537:37;;;;;;;;;;;;;;;;;;;6506:29;6498:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6498:77:64;-1:-1:-1;6609:11:64;;6593:12;;6622:33;;;;;;;;;;;;;;;;;;6593:27;6585:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6585:71:64;-1:-1:-1;6690:12:64;;6674;;6704:37;;;;;;;;;;;;;;;;;;;6674:28;6666:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6666:76:64;-1:-1:-1;6776:11:64;;6760:12;;6794:32;;;;;;;;;;;;;;;;;;6790:2;6776:16;;6760:32;6752:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6752:75:64;-1:-1:-1;6845:11:64;;6868:32;;;;;;;;;;;;;;;;;;6859:2;6845:16;;:21;6837:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6837:64:64;;6929:1;6917:13;;6912:764;6936:5;:12;6932:1;:16;6912:764;;;7067:13;;;7077:2;7067:13;;;;;;;;;;;;;17:15:-1;;105:10;7067:13:64;88:34:-1;136:17;;-1:-1;7067:13:64;7048:32;;7121:1;7116:2;:6;7111:2;:11;7094:28;;7315:6;7309:4;7305:17;7299:24;7292:4;7287:3;7283:14;7276:48;7392:4;7384:6;7380:17;7374:4;7370:28;7364:35;7357:4;7352:3;7348:14;7341:59;7578:4;7570:6;7566:17;7560:4;7556:28;7550:35;7543:4;7538:3;7534:14;7526:60;7614:51;7621:5;7627:1;7621:8;;;;;;;;;;;;;;;;;;7631:6;7638:1;7631:9;;;;;;;;;;;;;;;;;;7642:4;7647:1;7642:7;;;;;;;;;;;;;;;;;;7651:5;7657:1;7651:8;;;;;;;;;;;;;;;;;;7661:3;7614:6;:51::i;:::-;6950:3;;;;;6912:764;;;6312:1370;;;;;;;;:::o;1735:23::-;;;;;;:::o;220:102::-;256:66;220:102;:::o;2524:363::-;2779:8;;;;2765:10;:22;;:53;;-1:-1:-1;2805:13:64;;;;2791:10;:27;2765:53;2820:26;;;;;;;;;;;;;;;;;;2757:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;2757:90:64;;2857:23;2870:9;2857:12;:23::i;:::-;2524:363;:::o;3040:189::-;3131:13;;3146:32;;;;;;;;;;;;;;;;;;3131:13;;3117:10;:27;3109:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3109:70:64;;3189:33;3207:14;3189:17;:33::i;3452:408::-;3517:7;3526:6;3637:19;3556:5;3548:13;;:4;:13;;;3544:83;;;384:8;3599:16;:14;:16::i;:::-;3577:39;;;;;;3544:83;3659:4;:26;3664:20;3672:4;3678:5;3664:7;:20::i;:::-;3659:26;;;;;;;;;;;-1:-1:-1;3659:26:64;3735:10;;3659:26;;-1:-1:-1;3735:10:64;;;;;:15;3731:59;;;3774:1;;-1:-1:-1;3774:1:64;;-1:-1:-1;3766:13:64;;3731:59;3830:9;;3808:32;;3817:4;;3823:5;;3830:9;;3808:8;:32::i;:::-;3842:10;;3800:53;;-1:-1:-1;3842:10:64;;;;;;-1:-1:-1;3452:408:64;;;;;;;:::o;3951:84::-;384:8;3951:84;:::o;4756:905::-;4855:12;5375:9;4870:20;4878:4;4884:5;4870:7;:20::i;:::-;5022:10;;;;:4;:10;;;;;:15;4855:35;;-1:-1:-1;5022:15:64;;;;;;;5015:22;;;;:48;;;;;5049:14;:12;:14::i;:::-;5041:4;:22;;;;5015:48;5065:24;;;;;;;;;;;;;;;;;;5007:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5007:83:64;-1:-1:-1;5117:24:64;;;;;;;;;;;;;;;;;5114:1;5108:7;;;;5100:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5100:42:64;-1:-1:-1;5257:32:64;;;;;;;;;;;;;;;;;5242:13;;;;;;;;;5234:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5234:56:64;;5387:32;5396:4;5402:5;5409:3;5414:4;5387:8;:32::i;:::-;5463:8;;5375:44;;-1:-1:-1;5463:8:64;;5437:22;5375:44;5455:3;5437:22;:17;:22;:::i;:::-;:34;;;5473:19;;;;;;;;;;;;;;;;;;5429:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5429:64:64;;5568:39;;;;;;;;;5574:26;5583:4;5589:5;5596:3;5574:8;:26::i;:::-;5568:39;;;;;;;;;;;;;;;;;-1:-1:-1;5555:10:64;;;:4;:10;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5623:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4756:905;;;;;;;:::o;7688:195::-;7781:27;;;;;;;;;;;;;;;;;7756:23;;;;;7748:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7748:61:64;-1:-1:-1;7819:8:64;:20;;;;;;;;;;;;7854:22;;7819:20;;7854:22;;;7688:195;:::o;7889:236::-;7997:33;;;;;;;;;;;;;;;;;7967:28;;;;;7959:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7959:72:64;-1:-1:-1;8041:13:64;:30;;;;;;;;;;;;;8086:32;;;;-1:-1:-1;;8086:32:64;7889:236;:::o;1261:106:37:-;1310:6;1335:25;:14;:12;:14::i;:::-;:23;:25::i;:::-;1328:32;;1261:106;:::o;8234:330:64:-;8303:7;8322:16;8378:19;8436:20;8341:27;8356:4;8362:5;8341:14;:27::i;:::-;8322:46;;8400:11;:26;;8421:5;8400:26;;;8414:4;8400:26;8378:48;;8459:11;:26;;8481:4;8459:26;;;8473:5;8459:26;8436:49;;8530:11;8543:12;8513:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8513:43:64;;;8503:54;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8503:54:64;;;;;;;;;;;;;;;;8496:61;;8234:330;;;;;;;;:::o;8643:271::-;8726:7;8745:16;8764:27;8779:4;8785:5;8764:14;:27::i;:::-;8745:46;;8809:11;:52;;8847:12;;;8838:6;:21;;;;;;;;8809:52;;;8823:3;8809:52;8802:59;8643:271;-1:-1:-1;;;;;8643:271:64:o;926:144:37:-;999:15;926:144;:::o;8920:191:64:-;9052:51;;;256:66;9052:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;9052:51:64;;;;;;;;9042:62;;9016:7;;9052:51;;;9042:62;;;;;9052:51;9042:62;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;9042:62:64;;;;;;;;;;;;-1:-1:-1;;;;;;;;8920:191:64:o;588:142:65:-;661:7;683:42;691:28;714:4;691:22;:28::i;:::-;721:3;683:7;:42::i;:::-;676:49;588:142;-1:-1:-1;;;588:142:65:o;188:149:38:-;283:20;;;;;;;;;;;;;;;;;240:6;;271:10;266:15;;;258:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;258:46:38;-1:-1:-1;328:1:38;;188:149;-1:-1:-1;188:149:38:o;9117:117:64:-;9215:12;;;;;;;;9117:117::o;1844:283:65:-;2045:76;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2045:76:65;;;;;;;;2035:87;;1925:7;;2045:76;;;2035:87;;;;;2045:76;2035:87;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;2035:87:65;;;;;;;;;;;;-1:-1:-1;;;;;1844:283:65:o;1006:695::-;1071:7;1086:9;1101;1116:7;1167:3;:10;1181:2;1167:16;;1163:56;;;1209:1;1193:19;;;;1163:56;-1:-1:-1;;;1314:2:65;1305:12;;1299:19;1345:2;1336:12;;1330:19;1384:2;1375:12;;1369:19;1366:1;1361:28;1496:2;1492:6;;;;1488:34;;;1513:2;1508:7;1488:34;1591:1;:7;;1596:2;1591:7;;:18;;;;;1602:1;:7;;1607:2;1602:7;;1591:18;1587:110;;;1635:1;1619:19;;;;1587:110;1666:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1666:24:65;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1666:24:65;;;;;;;;1659:31;;;", "source": "pragma solidity 0.4.24;\n\nimport \"./IFeed.sol\";\nimport \"./open-zeppelin/ECRecovery.sol\";\nimport \"@aragon/os/contracts/common/TimeHelpers.sol\";\n\n\ncontract PPF is IFeed, TimeHelpers {\n using ECRecovery for bytes32;\n\n bytes32 constant public PPF_v1_ID = 0x33a8ba7202230fa1cee2aac7bac322939edc7ba0a48b0989335a5f87a5770369; // keccak256(\"PPF-v1\");\n uint256 constant internal ONE = 10 ** 18; // 10^18 is considered 1 in the price feed to allow for decimal calculations\n\n string private constant ERROR_BAD_SIGNATURE = \"PPF_BAD_SIGNATURE\";\n string private constant ERROR_BAD_RATE_TIMESTAMP = \"PPF_BAD_RATE_TIMESTAMP\";\n string private constant ERROR_INVALID_RATE_VALUE = \"PPF_INVALID_RATE_VALUE\";\n string private constant ERROR_EQUAL_BASE_QUOTE_ADDRESSES = \"PPF_EQUAL_BASE_QUOTE_ADDRESSES\";\n string private constant ERROR_BASE_ADDRESSES_LENGTH_ZERO = \"PPF_BASE_ADDRESSES_LEN_ZERO\";\n string private constant ERROR_QUOTE_ADDRESSES_LENGTH_MISMATCH = \"PPF_QUOTE_ADDRESSES_LEN_MISMATCH\";\n string private constant ERROR_RATE_VALUES_LENGTH_MISMATCH = \"PPF_RATE_VALUES_LEN_MISMATCH\";\n string private constant ERROR_RATE_TIMESTAMPS_LENGTH_MISMATCH = \"PPF_RATE_TIMESTAMPS_LEN_MISMATCH\";\n string private constant ERROR_SIGNATURES_LENGTH_MISMATCH = \"PPF_SIGNATURES_LEN_MISMATCH\";\n string private constant ERROR_CAN_NOT_SET_OPERATOR = \"PPF_CAN_NOT_SET_OPERATOR\";\n string private constant ERROR_CAN_NOT_SET_OPERATOR_OWNER = \"PPF_CAN_NOT_SET_OPERATOR_OWNER\";\n string private constant ERROR_OPERATOR_ADDRESS_ZERO = \"PPF_OPERATOR_ADDRESS_ZERO\";\n string private constant ERROR_OPERATOR_OWNER_ADDRESS_ZERO = \"PPF_OPERATOR_OWNER_ADDRESS_ZERO\";\n\n struct Price {\n uint128 xrt;\n uint64 when;\n }\n\n address public operator;\n address public operatorOwner;\n mapping (bytes32 => Price) internal feed;\n\n event SetRate(address indexed base, address indexed quote, uint256 xrt, uint64 when);\n event SetOperator(address indexed operator);\n event SetOperatorOwner(address indexed operatorOwner);\n\n /**\n * @param _operator Public key allowed to sign messages to update the pricefeed\n * @param _operatorOwner Address of an account that can change the operator\n */\n constructor (address _operator, address _operatorOwner) public {\n _setOperator(_operator);\n _setOperatorOwner(_operatorOwner);\n }\n\n /**\n * @notice Set operator public key to `_operator`\n * @param _operator Public key allowed to sign messages to update the pricefeed\n */\n function setOperator(address _operator) external {\n // Allow the current operator to change the operator to avoid having to hassle the\n // operatorOwner in cases where a node just wants to rotate its public key\n require(msg.sender == operator || msg.sender == operatorOwner, ERROR_CAN_NOT_SET_OPERATOR);\n _setOperator(_operator);\n }\n\n /**\n * @notice Set operator owner to `_operatorOwner`\n * @param _operatorOwner Address of an account that can change the operator\n */\n function setOperatorOwner(address _operatorOwner) external {\n require(msg.sender == operatorOwner, ERROR_CAN_NOT_SET_OPERATOR_OWNER);\n _setOperatorOwner(_operatorOwner);\n }\n\n /**\n * @param base Address for the base token in the feed\n * @param quote Address for the quote token the base is denominated in\n * @return XRT for base:quote and the timestamp when it was updated\n */\n function get(address base, address quote) external view returns (uint128, uint64) {\n if (base == quote) {\n return (uint128(ONE), getTimestamp64());\n }\n\n Price storage price = feed[_pairId(base, quote)];\n\n // if never set, return 0.\n if (price.when == 0) {\n return (0, 0);\n }\n\n return (_pairXRT(base, quote, price.xrt), price.when);\n }\n\n /**\n\n * @return The minimum rate precision used for the exchange rates\n */\n function ratePrecision() external pure returns (uint256) {\n return ONE;\n }\n\n /**\n * @notice Update the price for the `base + ':' + quote` feed with an exchange rate of `xrt / ONE` for time `when`\n * @dev If the number representation of base is lower than the one for quote, and update is cheaper, as less manipulation is required.\n * @param base Address for the base token in the feed\n * @param quote Address for the quote token the base is denominated in\n * @param xrt Exchange rate for base denominated in quote. 10^18 is considered 1 to allow for decimal calculations\n * @param when Timestamp for the exchange rate value\n * @param sig Signature payload (EIP191) from operator, concatenated [ r ][ s ][v]. See _setHash function for the hash calculation.\n */\n function update(address base, address quote, uint128 xrt, uint64 when, bytes sig) public {\n bytes32 pair = _pairId(base, quote);\n\n // Ensure it is more recent than the current value (implicit check for > 0) and not a future date\n require(when > feed[pair].when && when <= getTimestamp(), ERROR_BAD_RATE_TIMESTAMP);\n require(xrt > 0, ERROR_INVALID_RATE_VALUE); // Make sure xrt is not 0, as the math would break (Dividing by 0 sucks big time)\n require(base != quote, ERROR_EQUAL_BASE_QUOTE_ADDRESSES); // Assumption that currency units are fungible and xrt should always be 1\n\n bytes32 h = _setHash(base, quote, xrt, when);\n require(h.personalRecover(sig) == operator, ERROR_BAD_SIGNATURE); // Make sure the update was signed by the operator\n\n feed[pair] = Price(_pairXRT(base, quote, xrt), when);\n\n emit SetRate(base, quote, xrt, when);\n }\n\n /**\n * @notice Update the price for many pairs\n * @dev If the number representation of bases is lower than the one for quotes, and update is cheaper, as less manipulation is required.\n * @param bases Array of addresses for the base tokens in the feed\n * @param quotes Array of addresses for the quote tokens bases are denominated in\n * @param xrts Array of the exchange rates for bases denominated in quotes. 10^18 is considered 1 to allow for decimal calculations\n * @param whens Array of timestamps for the exchange rate value\n * @param sigs Bytes array with the ordered concatenated signatures for the updates\n */\n function updateMany(address[] bases, address[] quotes, uint128[] xrts, uint64[] whens, bytes sigs) public {\n require(bases.length != 0, ERROR_BASE_ADDRESSES_LENGTH_ZERO);\n require(bases.length == quotes.length, ERROR_QUOTE_ADDRESSES_LENGTH_MISMATCH);\n require(bases.length == xrts.length, ERROR_RATE_VALUES_LENGTH_MISMATCH);\n require(bases.length == whens.length, ERROR_RATE_TIMESTAMPS_LENGTH_MISMATCH);\n require(bases.length == sigs.length / 65, ERROR_SIGNATURES_LENGTH_MISMATCH);\n require(sigs.length % 65 == 0, ERROR_SIGNATURES_LENGTH_MISMATCH);\n\n for (uint256 i = 0; i < bases.length; i++) {\n // Extract the signature for the update from the concatenated sigs\n bytes memory sig = new bytes(65);\n uint256 needle = 32 + 65 * i; // where to start copying from sigs\n assembly {\n // copy 32 bytes at a time and just the last byte at the end\n mstore(add(sig, 0x20), mload(add(sigs, needle)))\n mstore(add(sig, 0x40), mload(add(sigs, add(needle, 0x20))))\n // we have to mload the last 32 bytes of the sig, and mstore8 just gets the LSB for the word\n mstore8(add(sig, 0x60), mload(add(sigs, add(needle, 0x21))))\n }\n\n update(bases[i], quotes[i], xrts[i], whens[i], sig);\n }\n }\n\n function _setOperator(address _operator) internal {\n require(_operator != address(0), ERROR_OPERATOR_ADDRESS_ZERO);\n operator = _operator;\n emit SetOperator(_operator);\n }\n\n function _setOperatorOwner(address _operatorOwner) internal {\n require(_operatorOwner != address(0), ERROR_OPERATOR_OWNER_ADDRESS_ZERO);\n operatorOwner = _operatorOwner;\n emit SetOperatorOwner(_operatorOwner);\n }\n\n /**\n * @dev Returns a unique id for each pair, regardless of the order of base and quote\n */\n function _pairId(address base, address quote) internal pure returns (bytes32) {\n bool pairOrdered = _isPairOrdered(base, quote);\n address orderedBase = pairOrdered ? base : quote;\n address orderedQuote = pairOrdered ? quote : base;\n\n return keccak256(abi.encodePacked(orderedBase, orderedQuote));\n }\n\n /**\n * @dev Compute xrt depending on base and quote order.\n */\n function _pairXRT(address base, address quote, uint128 xrt) internal pure returns (uint128) {\n bool pairOrdered = _isPairOrdered(b