github.com/deroproject/derosuite@v2.1.6-1.0.20200307070847-0f2e589c7a2b+incompatible/blockchain/inputmaturity/inputmaturity.go (about)

     1  // Copyright 2017-2018 DERO Project. All rights reserved.
     2  // Use of this source code in any form is governed by RESEARCH license.
     3  // license can be found in the LICENSE file.
     4  // GPG: 0F39 E425 8C65 3947 702A  8234 08B2 0360 A03A 9DE8
     5  //
     6  //
     7  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
     8  // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     9  // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
    10  // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    11  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    12  // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    13  // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    14  // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
    15  // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    16  
    17  package inputmaturity
    18  
    19  import "time"
    20  import "github.com/deroproject/derosuite/config"
    21  
    22  //this file implements the logic to detect whether an input is mature or still locked
    23  //This function is crucial as any bugs can have catastrophic effects
    24  //this function is used both by the core blockchain and wallet
    25  //TODO we need to check the edge cases
    26  func Is_Input_Mature(current_chain_height uint64, input_block_height uint64, locked_to_height uint64, sigtype uint64) bool {
    27  
    28  	// current_chain_height must be greater or equal to input height
    29  	if current_chain_height < input_block_height { // wrong cases reject
    30  		return false
    31  	}
    32  
    33  	// all miner txs end up here
    34  	if sigtype == 0 { // miner tx will also always unlock 60 blocks in future
    35  		if current_chain_height >= (input_block_height + config.MINER_TX_AMOUNT_UNLOCK) {
    36  			return true
    37  		}
    38  		return false
    39  	}
    40  
    41  	// 99.99 % normal tx cases come here
    42  	if locked_to_height == 0 { // input is not locked, so it must be unlocked in 8 blocks
    43  		if current_chain_height >= (input_block_height + (config.NORMAL_TX_AMOUNT_UNLOCK)) {
    44  			return true
    45  		}
    46  		return false
    47  	}
    48  
    49  	// input_block_height is no longer useful
    50  
    51  	//  if we are here input was locked to specific height or time
    52  	if locked_to_height < config.CRYPTONOTE_MAX_BLOCK_NUMBER { // input was locked to specific block height
    53  		if current_chain_height >= locked_to_height {
    54  			return true
    55  		}
    56  		return false
    57  	}
    58  
    59  	// anything above LIMIT is time based lock
    60  	// input was locked to specific time in epoch
    61  	if locked_to_height < (uint64(time.Now().UTC().Unix())) {
    62  		return true
    63  	}
    64  
    65  	return false // reject time based locks if not mature
    66  }