pragma ever-solidity >= 0.68.0; pragma AbiHeader time; pragma AbiHeader expire; pragma AbiHeader pubkey; import "../../../contracts/access/abstract/Ownable.tsol"; import "../../../contracts/factory/abstract/FactoryWithPlatform.tsol"; import "../../../contracts/libraries/UtilityErrors.tsol"; import "../../../contracts/libraries/UtilityGas.tsol"; import "./FactoryPlatform.tsol"; contract FactoryWithPlatformExample is FactoryWithPlatform, Ownable { uint32 private static _nonce; function _getTargetBalanceInternal() internal view override (FactoryWithPlatform, Ownable) returns (uint128) { return UtilityGas.INITIAL_BALANCE; } constructor( optional(address) _initialOwner, optional(address) _remainingGasTo ) public reserveAcceptAndRefund(_getTargetBalanceInternal(), _remainingGasTo, msg.sender) validAddressOrNull(_initialOwner, UtilityErrors.INVALID_NEW_OWNER) { address initialOwner = _initialOwner.hasValue() ? _initialOwner.get() : msg.sender; _setOwnerInternal(initialOwner); } function getDeployParams(uint32 _id) external pure responsible returns (TvmCell) { return { value: 0, flag: MsgFlag.REMAINING_GAS, bounce: false } abi.encode(_id); } function deploy( TvmCell _deployParams, optional(address) _remainingGasTo ) external override reserveAndRefund(_getTargetBalanceInternal(), _remainingGasTo, msg.sender) validTvmCell(_deployParams, UtilityErrors.INVALID_DEPLOY_PARAMS) validAddressOrNull(_remainingGasTo, UtilityErrors.INVALID_GAS_RECIPIENT) { TvmCell data = tvm.buildStateInit({ code: _getPlatformCodeInternal(), contr: FactoryPlatform, pubkey: 0, varInit: { _id: abi.decode(_deployParams, uint32), _factory: address(this) } }); address instance = new FactoryPlatform{ stateInit: data, value: 2 ever, flag: MsgFlag.SENDER_PAYS_FEES, bounce: false }( _getInstanceCodeInternal(), _remainingGasTo.hasValue() ? _remainingGasTo.get() : msg.sender ); emit InstanceDeployed( instance, _deployParams, _getInstanceVersionInternal(), tvm.hash(_getInstanceCodeInternal()), msg.sender ); } function _getInstanceAddressInternal(TvmCell _deployParams) internal view override returns (address) { return address( tvm.hash( tvm.buildStateInit({ code: _getPlatformCodeInternal(), contr: FactoryPlatform, pubkey: 0, varInit: { _id: abi.decode(_deployParams, uint32), _factory: address(this) } }) ) ); } }