pragma ever-solidity >= 0.68.0; pragma AbiHeader time; pragma AbiHeader expire; pragma AbiHeader pubkey; import "locklift/src/console.tsol"; import "../../../contracts/libraries/UtilityErrors.tsol"; import "../../../contracts/libraries/UtilityGas.tsol"; import "../../../contracts/upgrade/abstract/UpgradableByRequest.tsol"; import "../factory/FactoryInstance.tsol"; contract UpgradableByRequestExample is FactoryInstance, UpgradableByRequest { function _getTargetBalanceInternal() internal view override (FactoryInstance, UpgradableByRequestBase) returns (uint128) { return UtilityGas.INITIAL_BALANCE; } constructor(address _remainingGasTo) public FactoryInstance(_remainingGasTo) { _setUpgraderInternal(_factory); _setCurrentVersionInternal(1, 0); } function upgrade( uint32 _version, TvmCell _code, address _remainingGasTo ) external override reserveAndRefund(_getTargetBalanceInternal(), _remainingGasTo, msg.sender) onlyUpgrader validTvmCell(_code, UtilityErrors.INVALID_CODE) { TvmCell data = abi.encode( _id, _version, _getCurrentVersionInternal(), _factory, _getUpgraderInternal() ); tvm.setcode(_code); tvm.setCurrentCode(_code); _onUpgrade(data); } function _onUpgrade(TvmCell _data) private { tvm.resetStorage(); ( uint32 id, uint32 currentVersion, uint32 previousVersion, address factory, address upgrader ) = abi.decode(_data, ( uint32, uint32, uint32, address, address )); _id = id; _factory = factory; _setCurrentVersionInternal(currentVersion, previousVersion); _setUpgraderSilent(upgrader); console.log(format("New version: {}", _getCurrentVersionInternal())); } function _getDeployParamsInternal() internal view override returns (TvmCell) { return abi.encode(_id); } }