mirror of
https://github.com/Instadapp/smart-contract.git
synced 2024-07-29 22:08:07 +00:00
32 lines
1.0 KiB
Solidity
32 lines
1.0 KiB
Solidity
// DSProxyCache
|
|
// This global cache stores addresses of contracts previously deployed
|
|
// by a proxy. This saves gas from repeat deployment of the same
|
|
// contracts and eliminates blockchain bloat.
|
|
|
|
// By default, all proxies deployed from the same factory store
|
|
// contracts in the same cache. The cache a proxy instance uses can be
|
|
// changed. The cache uses the sha3 hash of a contract's bytecode to
|
|
// lookup the address
|
|
pragma solidity ^0.5.0;
|
|
|
|
contract DSProxyCache {
|
|
mapping(bytes32 => address) cache;
|
|
|
|
function read(bytes _code) public view returns (address) {
|
|
bytes32 hash = keccak256(_code);
|
|
return cache[hash];
|
|
}
|
|
|
|
function write(bytes _code) public returns (address target) {
|
|
assembly {
|
|
target := create(0, add(_code, 0x20), mload(_code))
|
|
switch iszero(extcodesize(target))
|
|
case 1 {
|
|
// throw if contract failed to deploy
|
|
revert(0, 0)
|
|
}
|
|
}
|
|
bytes32 hash = keccak256(_code);
|
|
cache[hash] = target;
|
|
}
|
|
} |