pragma ever-solidity >= 0.62.0; pragma AbiHeader expire; pragma AbiHeader time; pragma AbiHeader pubkey; import "./TIP4_1/TIP4_1Nft.tsol"; import "./TIP4_2/TIP4_2Nft.tsol"; import "./TIP4_3/TIP4_3Nft.tsol"; import './interfaces/IBurnableCollection.tsol'; contract NftFlagTransferable is TIP4_1Nft, TIP4_2Nft, TIP4_3Nft { bool _transferable; uint8 constant not_transferable = 108; constructor( address owner, address sendGasTo, uint128 remainOnNft, string json, uint128 indexDeployValue, uint128 indexDestroyValue, TvmCell codeIndex, bool transferable ) TIP4_1Nft( owner, sendGasTo, remainOnNft ) TIP4_2Nft ( json ) TIP4_3Nft ( indexDeployValue, indexDestroyValue, codeIndex ) public { tvm.accept(); _transferable = transferable; } function isTransferable() external view responsible returns (bool) { return {value: 0, flag: 64, bounce: false} (_transferable); } function _beforeTransfer( address /*to*/, address sendGasTo, mapping(address => CallbackParams) /*callbacks*/ ) internal virtual override(TIP4_1Nft, TIP4_3Nft) { require(_transferable, not_transferable); TIP4_3Nft._destructIndex(sendGasTo); } function _afterTransfer( address /*to*/, address /*sendGasTo*/, mapping(address => CallbackParams) /*callbacks*/ ) internal virtual override(TIP4_1Nft, TIP4_3Nft) { TIP4_3Nft._deployIndex(); } function _beforeChangeOwner( address /*oldOwner*/, address /*newOwner*/, address sendGasTo, mapping(address => CallbackParams) /*callbacks*/ ) internal virtual override(TIP4_1Nft, TIP4_3Nft) { require(_transferable, not_transferable); TIP4_3Nft._destructIndex(sendGasTo); } function _afterChangeOwner( address /*oldOwner*/, address /*newOwner*/, address /*sendGasTo*/, mapping(address => CallbackParams) /*callbacks*/ ) internal virtual override(TIP4_1Nft, TIP4_3Nft) { TIP4_3Nft._deployIndex(); } function _beforeChangeManager( address /*oldManager*/, address /*newManager*/, address /*sendGasTo*/, mapping(address => CallbackParams) /*callbacks*/ ) internal virtual override { require(_transferable, not_transferable); } function _afterChangeManager( address oldManager, address newManager, address sendGasTo, mapping(address => CallbackParams) callbacks ) internal virtual override { oldManager; newManager; sendGasTo; callbacks; } function burn( address sendGasTo, address callbackTo, TvmCell callbackPayload ) external view virtual onlyManager { tvm.accept(); IBurnableCollection(_collection).acceptNftBurn{ value: 0, flag: 128 + 32, bounce: false }( _id, _owner, _manager, sendGasTo, callbackTo, callbackPayload ); } }