This contract is designed to operate in tandem with
In fact, in order to function properly, every contract operating behind a
CALL-style proxy must inherit
Proxyable to ensure that the message sender is set and that events are correctly emitted.
This contract can support two proxies simultaneously. Events can be emitted independently from each proxy, but it is sensible to restrict event emission to a single proxy in most cases.
The address of an additional proxy which can be used to forward contract calls to this contract. Generally speaking, events should not be passed to the integrationProxy.
The caller of the proxy in the current invocation. This variable is set to the value of
msg.sender visible to the proxy before every function call by that
Proxy to this
Proxyable. Once set,
messageSender should be used in place of
msg.sender wherever it is used in contracts inheriting
All functions which make use of
messageSender should have one of the modifiers provided by the
Proxyable interface, otherwise users who call the contract directly rather than through the proxy will be executing with stale values of
Functions which do not require
messageSender need not apply any of the proxy modifiers, but care must be taken when applying other function modifiers within a proxyable contract. For example, see
constructor(address _proxy, address _owner) public
Sets this contract's primary proxy.
setProxy cannot be called through a proxy.
setProxy(address _proxy) external
Sets this contract's secondary proxy.
setIntegrationProxy cannot be called through a proxy.
setIntegrationProxy(address _IntegrationProxy) external
setMessageSender(address sender) external
Reverts the transaction if the actual
messageSender) is not the proxy or the integration proxy.
This modifier allows a function to be called through the proxies, or alternatively to be called directly for a small gas savings.
It operates simply: if the caller is not either the proxy or the integration proxy, then overwrite
msg.sender, otherwise use whatever it was set to by the proxy.
This modifier is largely the same as
optionalProxy, but it disallow callers who are not the contract owner. This modifier exists because
msg.sender, and not
proxyAddress has been set as the new