pragma ever-solidity >= 0.68.0; import "../../../contracts/platform/Platform.tsol"; import "../../../contracts/libraries/MsgFlag.tsol"; import "../../../contracts/utils/RandomNonce.tsol"; contract PlatformDeployer is RandomNonce { uint8 constant DEFAULT_PLATFORM_TYPE = 1; uint128 constant DEFAULT_PLATFORM_DEPLOY_VALUE = 0.1 ever; TvmCell public platformCode; TvmCell public platformBasedImage; constructor ( TvmCell _platformCode, TvmCell _platformBasedImage ) public { tvm.accept(); platformCode = _platformCode; platformBasedImage = _platformBasedImage; } function expectedAddress( address root, uint32 id, uint8 platformType ) public view returns (address) { TvmBuilder initialData; initialData.store(id); return address( tvm.hash( _buildState( root, platformType, initialData.toCell() ) ) ); } function deployPlatformBased( uint32 id, uint32 notId, uint8 platformType ) public view { tvm.accept(); deploy(address(this), id, notId, platformType); } function deployNotFromRoot( address root, uint32 id, uint32 notId, uint8 platformType ) public view { tvm.accept(); deploy(root, id, notId, platformType); } function deploy( address root, uint32 id, uint32 notId, uint8 platformType ) private view { TvmBuilder initialData; initialData.store(id); TvmBuilder params; params.store(notId); new Platform{ stateInit: _buildState(root, platformType, initialData.toCell()), value: DEFAULT_PLATFORM_DEPLOY_VALUE, flag: MsgFlag.SENDER_PAYS_FEES }( platformBasedImage, params.toCell(), msg.sender ); } function _buildState( address root, uint8 platformType, TvmCell initialData ) private view returns (TvmCell) { return tvm.buildStateInit({ contr: Platform, varInit: { root: root, platformType: platformType, initialData: initialData, platformCode: platformCode }, pubkey: 0, code: platformCode }); } }