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/UpgradableByRequestWithData.tsol"; import "../factory/FactoryInstance.tsol"; contract UpgradableByRequestWithDataExample is FactoryInstance, UpgradableByRequestWithData { uint32 private _extra; 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 getExtra() external view responsible returns (uint32) { return { value: 0, flag: MsgFlag.REMAINING_GAS, bounce: false } _extra; } function upgrade( uint32 _version, TvmCell _code, TvmCell _data, address _remainingGasTo ) external override reserveAndRefund(_getTargetBalanceInternal(), _remainingGasTo, msg.sender) onlyUpgrader validTvmCell(_code, UtilityErrors.INVALID_CODE) { TvmCell data = abi.encode( _id, _version, _getCurrentVersionInternal(), _factory, _getUpgraderInternal(), _data ); 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, TvmCell data ) = abi.decode(_data, ( uint32, uint32, uint32, address, address, TvmCell )); _extra = abi.decode(data, uint32); _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); } }