A proxy contract is a contract which delegates calls to another contract. To interact with the actual contract you have to go through the proxy, and the proxy knows which contract to delegate the call to (the target).
A proxy pattern is used when you want upgradability for your contracts. This way the proxy contract stays immutable, but you can deploy a new contract behind the proxy contract – simply change the target address inside the proxy contract.
Therefore it’s a bit dangerous to use a proxy contract, since there are no guarantees that the underlying (target) contract hasn’t been changed to a malicious one. There is no strict definition on how to detect a proxy contract, but basically it’s anything that delegates the functionality to another contract. You have to analyze the source code to be able to decide.
Get rid of any library (like that of OpenZeppelin’s Enumerable or Ownable) whose only few functions you would need. Instead, define those specific functions yourself. (이 방법은 실제로 stellaiam 개발시 사용해봄 효과 있음)
Identify any public variables that can be made private, the compiler adds a getter function by itself which adds to the code size.
If you have a lot of comments, get rid of them or shorten them.
The last resort: try to shorten the error message, variable names.
modifier에 코드를 작성해서 그냥 사용하지 말고 다른 함수에 코드를 작성하고 modifier에서는 함수를 호출하는 방식으로 하면 사이즈가 줄어든다. 실제 Ownable 코드를 확인해 보면 이미 안에 이런 형식 형식으로 작성되어있다. 그래서 stellaiam개발시 사용해보지는 못했다.