user7238: I'm thinking on a way to create a cNFT that requires 'proof of ownership' to be minted and own by a wallet, by proof of ownership I refer to something the receipt owns and can pass to others or loss, like a house or a car (let's imagine that the Oracle for that is piece of cake to implement) and when these things change owners or are destroyed in a way that satisfies an oracle the cNFT returns(?) to the owner of the Policy ID (or are invalidated somehow allowing them to be minted again).
I know cNFTs cannot be passed unless the wallet owner approves a transaction where these assets are moves to another Cardano ADA wallet address, so when the current owner gives up ownership of the things used in an ownership challenge the minted cNFT should change hands too without depending on the current cNFT owner.
Furthermore, I know smart contracts can own assets, but I don't know if wallets can own smart contracts, or even if owning a smart contract that owns a cNFT is the way to go. Is there a recommended way to go about something like this?

user6763: To my understanding, by "proof of ownership" you are referring to the user owning a physical object, and this smart contract should keep track of the real-world ownership via NFTs.
before I keep answering there is an important key concept that cannot be ignored
You do not have access to the entire blockchain data while using a validator
let me explain:
in Solidity, by standard, you have access to something like
MyTokenContract.balanceOf( address )

where "address" might not even ever have interacted with the smart contract.
in Plutus, you could access such information only via an oracle.
Without oracle, you can only access information regarding the current transaction or previous transactions if the relevant data is explicitly exposed via the Datum (which is meant to be the state of the smart contract).
the balanceOf is only an example, but for this reason, you cannot move (or block) other user's assets via smart contract.
simulate the account model
the "smart contract that owns the cNFT" is the way to go.
this is because this way you are "centralizing" the NFT ownership to the smart contract.
you could then have a map from Address (or PublicKeyHash) to MintingPolicyHash (which is the policy-id of your NFT) in your state (Datum)
so that only that address has the control of that NFT in that smart contract,
but the smart contract can do whatever he wants with the NFT.
own a smart contract
You can't really "own" a smart contract but you could implement what I like to call "God-mode" for a specific Address (or PublicKeyHash)
this can be done in your smart contract logic like so:
{-# LANGUAGE OverloadedStrings #-}
-- OverloadedStrings needet to easly construct a constant PubKeyHash

import Plutus.V1.Ledger.Contexts as Ctx
import Ledger.Crypto ( PubKeyHash )

scLogic :: MyDatum -> MyRedeemer -> ScriptContext -> Bool
scLogic datum redeemer ctx =
    if Ctx.txSignedBy (Ctx.scriptContextTxInfo ctx) (PubKeyHash "<owner public key hash (hex)>")

    then True -- the owner is signing the Tx, god-mode active
    
    else -- implement smart contract logic for anyone else


7238: <p>I'm thinking on a way to create a cNFT that requires 'proof of ownership' to be minted and own by a wallet, by proof of ownership I refer to something the receipt owns and can pass to others or loss, like a house or a car (let's imagine that the Oracle for that is piece of cake to implement) and when these things change owners or are destroyed in a way that satisfies an oracle the cNFT returns(?) to the owner of the Policy ID (or are invalidated somehow allowing them to be minted again).</p>
<p>I know cNFTs cannot be passed unless the wallet owner approves a transaction where these assets are moves to another Cardano ADA wallet address, so when the current owner gives up ownership of the things used in an ownership challenge the minted cNFT should change hands too without depending on the current cNFT owner.</p>
<p>Furthermore, I know smart contracts can own assets, but I don't know if wallets can own smart contracts, or even if owning a smart contract that owns a cNFT is the way to go. Is there a recommended way to go about something like this?</p>
 6763: <p>To my understanding, by &quot;proof of ownership&quot; you are referring to the user owning a physical object, and this smart contract should keep track of the real-world ownership via NFTs.</p>
<p>before I keep answering there is an important key concept that cannot be ignored</p>
<h4><strong>You do not have access to the entire blockchain data while using a validator</strong></h4>
<p>let me explain:</p>
<p>in <strong>Solidity</strong>, by standard, you have access to something like</p>
<pre><code>MyTokenContract.balanceOf( address )
</code></pre>
<p>where &quot;address&quot; might not even ever have interacted with the smart contract.</p>
<p>in <strong>Plutus</strong>, you could access such information only via an oracle.</p>
<p>Without oracle, you can only access information regarding the <strong>current</strong> transaction <strong>or</strong> previous transactions if the relevant data is explicitly exposed via the Datum (which is meant to be the state of the smart contract).</p>
<p>the <code>balanceOf</code> is only an example, but for this reason, you cannot move (or block) other user's assets via smart contract.</p>
<h2>simulate the account model</h2>
<p>the &quot;smart contract that owns the cNFT&quot; is the way to go.
this is because this way you are &quot;centralizing&quot; the NFT ownership to the smart contract.</p>
<p>you could then have a map from <code>Address</code> (or <code>PublicKeyHash</code>) to <code>MintingPolicyHash</code> (which is the policy-id of your NFT) in your state (Datum)</p>
<p>so that only that address has the control of that NFT in that smart contract,</p>
<p>but the smart contract can do whatever he wants with the NFT.</p>
<h2>own a smart contract</h2>
<p>You can't really &quot;own&quot; a smart contract but you could implement what I like to call &quot;God-mode&quot; for a specific <code>Address</code> (or <code>PublicKeyHash</code>)</p>
<p>this can be done in your smart contract logic like so:</p>
<pre><code>{-# LANGUAGE OverloadedStrings #-}
-- OverloadedStrings needet to easly construct a constant PubKeyHash

import Plutus.V1.Ledger.Contexts as Ctx
import Ledger.Crypto ( PubKeyHash )

scLogic :: MyDatum -&gt; MyRedeemer -&gt; ScriptContext -&gt; Bool
scLogic datum redeemer ctx =
    if Ctx.txSignedBy (Ctx.scriptContextTxInfo ctx) (PubKeyHash &quot;&lt;owner public key hash (hex)&gt;&quot;)

    then True -- the owner is signing the Tx, god-mode active
    
    else -- implement smart contract logic for anyone else
</code></pre>
