CRYPTO NEWS

Analyst Puts Bitcoin Bottom At $50,000, Here’s Why

With bitcoin rallying, all the focus has been on predicting where the price of the asset will be by the end of the year. The digital asset is undoubtedly going to enter a period where various crashes will send the price down, popularly known as a bear market. Not a lot of attention has been paid to where the price of the asset might bottom out when the market inevitably goes into another bear market.

This usually long stretch of low momentum has seen bitcoin lose 94%, 87%, and 84% of its peak value respectively in the last three bear markets. One recurring theme of the bear markets has been the diminishing percentages of total value lost. At this rate, it is expected that BTC will see between 75% and 80% loss from its peak this cycle. Market analyst Justin Bennett uses this to predict where BTC will bottom out next.

The Next Bitcoin Bottom

Bennett put the next bitcoin bottom at $50,000 after analyzing the possible price movements of the digital asset. With the current cycle, the analyst sees the price of bitcoin hitting $200,000 before the bull run is over, hence a 75% to 80% pullback in a bear market will see the bottom of the asset land around the $50,000 range.

Related Reading | Bitcoin Leads Charge Of Large Cap Altcoin Dominance In October

This bottom is solely based on the cryptocurrency hitting the price range that Bennett expects the asset to peak at by the end of the rally. If BTC does not hit this price point before the bull rally is over then we might see a BTC bottom land at a much lower price range.

BTC goes into the red ahead of Friday opening | Source: BTCUSD on TradingView.com

Bennett’s pullback analysis has a lot of credit given that markets are historically known to see lower pullbacks as assets mature. So the 75% to 80% mark does resonate with what the market is known to do. However, if the price of BTC falls short of Bennett’s prediction or doesn’t move the needle much from its current price point, then the BTC bottom may land in the $10,000 to $15,000 range using the pullback analysis.

The Peak Before The Fall

Bennett’s analysis did not focus solely on the crash of the digital asset. He put forward his argument for the price of BTC at $200,000 using technical analysis of the market. The analyst points to Fibonacci extensions as indicators of where the price of bitcoin may peak during this cycle.

For the Fibonacci extensions, comparisons between the 2.272 and 2.414 extensions from previous cycles have both given a target area which the asset had hit both times. Going by this, Bennett sees the asset peaking between $207,000 and $270,000 before the current cycle is over.

Related Reading | Bitcoin New All-Time Cleared, $100,000 Straight Ahead?

Moving forward, the analyst plans to use the monthly RSI to time market exits “Notice how BTC tends to end cycles when the monthly RSI reaches above 90,” Bennett says. “It’s also exhibited a double top pattern each cycle, which leads me to believe it happens again.”

Bennett plans to use a combination of net unrealized profit/loss (NUPL) and the monthly RSI to slowly exit the asset over the next couple of months.

Featured image from YouTube, chart from TradingView.com

How to compute keccak256 hash of a JSON element?

I am trying to implement a Merkle tree which is supposed to generate a Merkle proof which would get verified by this contract: contract SimpleRewardDistributor { event Claimed(uint256 index, address account, uint256 amount); address public immutable token; bytes32 public immutable merkleRoot; // This is a packed array of booleans. mapping(uint256 => bool) private claimedMap; constructor(address::Listen

I am trying to implement a Merkle tree which is supposed to generate a Merkle proof which would get verified by this contract:

contract SimpleRewardDistributor {     event Claimed(uint256 index, address account, uint256 amount);      address public immutable token;     bytes32 public immutable merkleRoot;      // This is a packed array of booleans.     mapping(uint256 => bool) private claimedMap;      constructor(address token_, bytes32 merkleRoot_) public {         token = token_;         merkleRoot = merkleRoot_;     }      function isClaimed(uint256 index) public view returns (bool) {         return claimedMap[index];     }      function _setClaimed(uint256 index) private {         claimedMap[index] = true;     }      function claim(uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof) external {         require(!isClaimed(index), 'MerkleDistributor: Drop already claimed.');          // Verify the merkle proof.         bytes32 node = keccak256(abi.encodePacked(index, account, amount));         console.log("Keccak256 of abi.encodePacked(index, account, amount) (variable node) is: ");         console.logBytes32(node);         require(MerkleProof.verify(merkleProof, merkleRoot, node), 'MerkleDistributor: Invalid proof.');          // Mark it claimed and send the token.         _setClaimed(index);         require(IERC20(token).transfer(account, amount), 'MerkleDistributor: Transfer failed.');          emit Claimed(index, account, amount);     } } 

The library for Merkle proofs used in the contract is the one from OpenZeppelin:

/**  * @dev These functions deal with verification of Merkle trees (hash trees),  */ library MerkleProof {     /**      * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree      * defined by `root`. For this, a `proof` must be provided, containing      * sibling hashes on the branch from the leaf to the root of the tree. Each      * pair of leaves and each pair of pre-images are assumed to be sorted.      */     function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {         bytes32 computedHash = leaf;          for (uint256 i = 0; i < proof.length; i++) {             bytes32 proofElement = proof[i];              if (computedHash <= proofElement) {                 // Hash(current computed hash + current element of the proof)                 computedHash = keccak256(abi.encodePacked(computedHash, proofElement));             } else {                 // Hash(current element of the proof + current computed hash)                 computedHash = keccak256(abi.encodePacked(proofElement, computedHash));             }         }          // Check if the computed hash (root) is equal to the provided root         return computedHash == root;     } } 

I want to load the Merkle tree up with the contents of the following JSON file:

{"distribution":[{"index":0,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x1eca955e9b65e00000"}},{"index":1,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x100bd33fb98ba00000"}},{"index":2,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x19196a6eebbddc0000"}},{"index":3,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x218e59c465becc0000"}},{"index":4,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x28fb9b8a8a53500000"}},{"index":5,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x0a922b2ad8812c0000"}},{"index":6,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x2723c346ae18080000"}},{"index":7,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x2288269d0783d40000"}},{"index":8,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x204148a38e0d6c0000"}},{"index":9,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x0b6255df5f50080000"}},{"index":10,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x26d07efe782bb00000"}},{"index":11,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x02df85d331a7b40000"}},{"index":12,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x2f000ac26fe7ac0000"}},{"index":13,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x212d34c57c2b100000"}},{"index":14,"address":"0xcf","amount":{"type":"BigNumber","hex":"0x2c65e880c084ec0000"}}],"privateKeys":[{"index":0,"address":"0xcf","privateKey":"0xcf"},{"index":1,"address":"0xcf","privateKey":"0xcf"},{"index":2,"address":"0xcf","privateKey":"0xcf"},{"index":3,"address":"0xcf","privateKey":"0xcf"},{"index":4,"address":"0xcf","privateKey":"0xcf"},{"index":5,"address":"0xcf","privateKey":"0xcf"},{"index":6,"address":"0xcf","privateKey":"0xcf"},{"index":7,"address":"0xcf","privateKey":"0xcf"},{"index":8,"address":"0xcf","privateKey":"0xcf"},{"index":9,"address":"0xcf","privateKey":"0xcf"},{"index":10,"address":"0xcf","privateKey":"0xcf"},{"index":11,"address":"0xcf","privateKey":"0xcf"},{"index":12,"address":"0xcf","privateKey":"0xcf"},{"index":13,"address":"0xcf","privateKey":"0xcf"},{"index":14,"address":"0xcf","privateKey":"0xcf"}]} 

Here’s the code I have so far:

const keccak256 = require('keccak256') // hard-coding keccak256 hashing in this implementation  class MerkleTreeNode {   constructor(hash)   {     this.hash = hash;     this.rightSiblingPointer = undefined;     this.leftSiblingPointer = undefined;   }    setRightSibling(rightSiblingPointer)   {     this.rightSiblingPointer = rightSiblingPointer;   }    setLeftSibling(leftSiblingPointer)   {     this.leftSiblingPointer = leftSiblingPointer;   }    getRightSibling()   {     return this.rightSiblingPointer;   }    getLeftSibling()   {     return this.leftSiblingPointer;   } }  class MerkleTree {   constructor(data)   {     this.data = data;     this.merkleRootPointer = undefined;     create_merkle_tree(this.data);   }    create_merkle_tree(data)   {     merkleTreeLeafs = []     for (var i = 0; i < data.length; i++)     {       newMerkleTreeNode = new MerkleTreeNode(keccak256(data[i]));     }   } } 

Notice that I can pass anything to the data parameter to the constructor. But even if I pass just the distribution key of the JSON, I won’t be able to use the keccak256 function since I would get an error about an invalid type (I tried).

How can I go about doing this so that the smart contract can verify the Merkle proof I will eventually generate?

Analyst Puts Bitcoin Bottom At $50,000, Here’s Why

Shopping cart
There are no products in the cart!
Continue shopping
0