diff --git a/app/background/node/service.js b/app/background/node/service.js index 9000b8dce..6d0af1719 100644 --- a/app/background/node/service.js +++ b/app/background/node/service.js @@ -237,6 +237,7 @@ export class NodeService extends EventEmitter { listen: this.networkName === 'regtest', // improves remote rpc dev/testing chainMigrate: 3, walletMigrate: 2, + walletIcannlockup: true, maxOutbound: 4, compactTreeOnInit: true, }); diff --git a/app/pages/Auction/BidActionPanel/Reserved.js b/app/pages/Auction/BidActionPanel/Reserved.js index 472875b5b..20eccb315 100644 --- a/app/pages/Auction/BidActionPanel/Reserved.js +++ b/app/pages/Auction/BidActionPanel/Reserved.js @@ -1,26 +1,48 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import { shell } from 'electron'; import { AuctionPanel, } from '../../../components/AuctionPanel'; -import {I18nContext} from "../../../utils/i18n"; +import { I18nContext } from "../../../utils/i18n"; + +const INFO_URL = 'https://heytx.substack.com/p/the-happening-event-for-handshake'; export default class Reserved extends Component { static propTypes = { domain: PropTypes.object.isRequired, name: PropTypes.string.isRequired, + locked: PropTypes.bool.isRequired, }; static contextType = I18nContext; render() { + const { t } = this.context; + const { locked } = this.props; + return (
- {this.context.t('reservedText')} + {locked ? t('lockedText') : t('reservedText')}
- {this.context.t('reservedTimestamp')} + {locked ? + <> + + {t('lockedDescription')} + +

+ shell.openExternal(INFO_URL)} + > + {t('learnMore')} + +

+ + : t('reservedTimestamp') + }
); diff --git a/app/pages/Auction/BidActionPanel/index.js b/app/pages/Auction/BidActionPanel/index.js index 0cf0c1cf0..f4b4a10c1 100644 --- a/app/pages/Auction/BidActionPanel/index.js +++ b/app/pages/Auction/BidActionPanel/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { withRouter } from 'react-router'; import { connect } from 'react-redux'; import c from 'classnames'; -import { isAvailable, isBidding, isClosed, isOpening, isReserved, isReveal } from '../../../utils/nameHelpers'; +import { isAvailable, isBidding, isClosed, isOpening, isReserved, isLockedUp, isReveal } from '../../../utils/nameHelpers'; import * as watchingActions from '../../../ducks/watching'; import OpenBid from './OpenBid'; import BidNow from './BidNow'; @@ -81,9 +81,10 @@ class BidActionPanel extends Component { renderActionPanel() { const {domain} = this.props; const name = this.props.match.params.name; + const locked = isLockedUp(domain); - if (isReserved(domain)) { - return ; + if (isReserved(domain) || locked) { + return ; } if (this.isOwned()) { diff --git a/app/pages/Auction/domains.scss b/app/pages/Auction/domains.scss index 6e6ffd052..2ac267157 100644 --- a/app/pages/Auction/domains.scss +++ b/app/pages/Auction/domains.scss @@ -86,6 +86,7 @@ font-size: 1.25rem; font-weight: 600; padding: .4rem 0 .2rem; + text-transform: capitalize; } &__description { diff --git a/app/pages/Auction/index.js b/app/pages/Auction/index.js index 5c623f943..bfd5b6524 100644 --- a/app/pages/Auction/index.js +++ b/app/pages/Auction/index.js @@ -17,6 +17,7 @@ import { isComingSoon, isOpening, isReserved, + isLockedUp, isReveal, } from '../../utils/nameHelpers'; import BidActionPanel from './BidActionPanel'; @@ -138,7 +139,7 @@ export default class Auction extends Component { renderAuctionRight = () => { const {domain} = this.props; - if (isReserved(domain)) { + if (isReserved(domain) || isLockedUp(domain)) { return ; } @@ -273,7 +274,7 @@ export default class Auction extends Component { return (
{title}:
-
{content}
+
{content?.toLowerCase?.()}
{description}
); @@ -313,6 +314,8 @@ export default class Auction extends Component { {t('reservedCTAText')} ); + } else if (isLockedUp(domain)) { + status = t('locked'); } else if (isOpening(domain)) { status = t('opening'); description = t('biddingSoon'); diff --git a/app/utils/nameHelpers.js b/app/utils/nameHelpers.js index 5292a41d5..2966ff80c 100644 --- a/app/utils/nameHelpers.js +++ b/app/utils/nameHelpers.js @@ -25,7 +25,7 @@ export const isAvailable = name => { return false; } - if (start.reserved) { + if (start.reserved || start.locked) { return false; } @@ -61,6 +61,26 @@ export const isReserved = name => { return !!start.reserved; }; +export const isLockedUp = name => { + const {start} = name || {}; + const {info} = name || {}; + + // Maybe already claimed + if (isClosed(name)) + return false; + + // Not available if start is undefined + if (!start) { + return false; + } + + if (info) { + return false; + } + + return !!start.locked; +} + export const isOpening = name => checkState(name, states.OPENING); export const isBidding = name => checkState(name, states.BIDDING); export const isReveal = name => checkState(name, states.REVEAL); diff --git a/locales/en.json b/locales/en.json index 204614fd5..eab155eef 100644 --- a/locales/en.json +++ b/locales/en.json @@ -213,6 +213,8 @@ "loadingBalance": "Loading balance...", "loadingNDomains": "Loading %s domains...", "locked": "LOCKED", + "lockedDescription": "The Handshake network activated a soft fork in 2023 that locked a subset of the reserved names to remain locked up (unavailable for auction) till 2028.", + "lockedText": "Locked by the ICANN Soft Fork", "locktime": "Locktime", "lockup": "Lockup", "logDownloadSuccess": "Log file saved to %s.",