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')}
);
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.",