Decred Journal — January 2021
Image: Overflow Dissipation by @saender
Happy Birthday, Decred!
Behind are five years of non-stop development and delivery on the promise of decentralization, one pragmatic step at a time. January was no different:
- v1.6 is out, check the Hidden Hydra section below for details of the release.
- Ticket price and Proof of Stake participation continued rising to hit new highs.
- The turnout record for a Politeia proposal was broken in January, and again already in February, going all the way to 70% participation!
- Continued funding for DCRDEX was almost unanimously approved, Decred in Depth and the Decred Arabia team also had proposals approved.
- The Journal finally has its own Politeia proposal (shared with junior partner Politeia Digest) which would see funding secured for 2021, and it’s already being voted on.
Hidden Hydra is here!
The long-awaited v1.6 aka Hidden Hydra is finally here! This is probably the biggest upgrade in Decred’s history with several major and numerous smaller upgrades across all software projects. All changes are listed in the detailed release notes so here we will only highlight the big ones:
- Private transactions are now accessible through the Decrediton graphical user interface. It works by mixing coins and making it extremely difficult to trace them and spy on your balance or activity. This feature is critical for protecting the privacy of regular users and especially voters, whose privacy improves security of the entire network. It also protects the fungibility principle in Decred’s Constitution. The chosen implementation (StakeShuffle) has the beautiful properties of keeping coin supply auditable at all times, relying on simple cryptography and achieving high privacy thanks to smart integration with the staking system and large mixing volume.
- New VSP architecture greatly improves experience of using Voting Service Providers, which are used by roughly half of all voters that don’t run voting wallets 24/7. No accounts to create and remember, no redeem scripts to back up, no email to share, no addresses reused, and optional mixing support — all make staking easier and more private.
- Decentralized treasury control will transfer the power to approve or reject spending from the Treasury into the hands of Decred stakeholders. The required consensus changes will be voted on in the coming months and activate if approved.
- DCRDEX bringing secure, private and fair exchange, where you control the keys at all times and the exchange never holds any coins. Private information is protected in the best way possible — by not collecting it. The combination of pseudorandom order matching within epochs, requiring on-chain funds and rate limits prevents bad behavior like high-frequency trading, front-running, order spoofing and faking the trading volume. And the exchange doesn’t take any trading fees.
And here are the high level steps to upgrade:
- check out the new release page for an overview of new features and download links, or watch the video overview (v1.6 features start at 21:00)
- verify the downloads (the routine is not fun but it ensures the files have not been tampered with!)
- read the release notes and pay attention to downgrade warnings — it will not be possible to use previous versions after blockchain and wallet files have been upgraded
- learn about mixing with @Exitus’ short video tutoral
- buy tickets the vspd way from within Decrediton by choosing a VSP from the drop-down and the number of tickets — and leave it open until the transaction is mined and the VSP fee is paid (may take up to 20 min). If you see “Error” on tickets, re-sync fixes it, found in the ticket status tab.
- set your vote choice for the upcoming consensus rule change vote to enable decentralized treasury. To learn how it works, read the proposal for a general concept and the DCP for latest technical details. If you’re new to Decred governance, see @Checkmate’s quick governance walkthrough video.
- watch network’s upgrade and consensus vote progress here or here
- currently using DCRDEX requires some technical skills but this will be simplified in the next releases. In the meantime you can follow this guide by @richardred
There are some known issues with buying tickets in Decrediton v1.6.0 that will be fixed in the upcoming patch release.
The work reported below has the “merged to master” status unless noted otherwise. It means that the work is completed, reviewed, and integrated into the source code that advanced users can build and run, but is not yet available in release binaries for regular users.
January’s updates to dcrd are a good example of what users building from source can get today without waiting for the next release.
The main effort of the month was to prepare, thoroughly review and test several epic changes towards multi-peer block downloading, although the changes are generally useful for simplifying the code and unlocking future optimizations:
- completely reworked block indexing and processing to use headers-first semantics and support out of order processing of block data
- reworked UTXO handling to work on a per-outpoint basis instead of at a transaction level
- sync model reworked to use header announcements. The small 180-byte headers will be downloaded before any block data, and then only the needed blocks will be downloaded. This optimizes traffic, removes the concept of “orphan blocks”, and opens the door for future enhancements.
- preparations for implementing UTXO cache
- finalized DCP-0006 document describing technical details of the upcoming Decentralized Treasury consensus change
- added 3 new HTTPS seeders to reduce dependency on decred.org domain
- the deprecated version 1 cfilters were removed in favor of the more efficient v2 (“compact filters” power Decred’s awesome SPV tech for light clients)
- added TLS client authentication using client certificates (more flexible than user+password)
- added RSA 4096 bit key support to gencerts tool
- new commands to invalidate arbitrary blocks and reconsider arbitrary blocks for validation (allows easier testing and smoother upgrades in the future)
- prevent duplicate pending connections to the same IP address and port
- miscellaneous updates to test code, logging, docs, dependencies, minor fixes, etc
A total of 47 PRs from 10 contributors were merged, adding 12K and deleting 7K lines of code.
- introduce Age-Partitioned Bloom Filters to significantly reduce memory used for tracking what data other peers are known to have
- VSP client was rewritten to improve background processing and support recovery of fee payment information after seed restores
- narrowed rules of what is considered a possible CoinJoin (used when detecting wallet’s mixed account during recovery from seed)
The above changes were also backported to the v1.6 release.
- new page showing a list of unspent outputs (UTXOs)
- show VSPs in random order
- update ticket status on starts, restarts, and seed restores
- removed usage of CSRF tokens when communicating to Politeia, to prevent privacy leaks
- auto-detect if the wallet used mixing in the past
- UI hints for RFP proposals and submissions
- updated translations
- a few updates to Trezor support
- more automated UI tests
- ~24 bug fixes and 3 UI tweaks
Most of the above changes were included in the v1.6 release and the rest will land in the v1.6.1 patch release.
- UI for setting up and verifying TOTP codes for 2FA
- show basic proposal rules before the Submit button
- removed calls to dcrdata from politeiavoter command-line tool
- sending of ticket’s parent transaction was made mandatory as it greatly reduces the chance of ticket broadcast errors
- updated dependencies
vspd version 1.0.0 is now tagged and all VSP operators should upgrade their mainnet deployment.
v1.0.0 marks the beginning of a proper release process, where VSP operators should only ever run tagged releases in production (until now, vspd has still been in dev and operators have just been deploying whatever was latest master).
- various improvements for config handling, errors, and HTTP redirects
- support for reverse proxy deployments
- NiceHash support
- shutdown fixes and dependency updates
Three key topics in January were to fix remaining issues for the v0.1.4 patch (which was part of the collective v1.6 release), continue development towards the next v0.2 milestone, and manage the proposal for the next development phase.
- allow the user to export and import account data (mainly private keys)
- support switching from unencrypted to an encrypted BTC wallet
- client-side fee rate limits
- sample config files
- validate max fee rate at match time to partially prevent the server from maliciously assigning a too high fee
- fixed several issues with address validation, wallet locking, login, etc, and backported them to the v0.1.4 release
A total of 32 PRs from 7 contributors were merged, adding 3K and deleting 1K lines of code.
Congratulations to the DCRDEX team with the stunning 98% Yes votes!
- initial StakeShuffle support: when enabled, generating receiving addresses for the mixed account and sending funds from the change account are disabled
- Privacy UI pages: introduction, help popup, display of unmixed balance, CSPP server details, mixing progress, etc
- Politeia proposals support: see a list of proposals and their vote status, open a specific proposal and receive notifications on new proposals, vote start and finish
- debug page to view details about connected peers
- option to create a watch-only wallet from the splash screen
- more specific notifications for ticket vote and revocation transactions
To enable the above features, mixing and Politeia support were added to the dcrlibwallet base library and can now be reused by dcrios and godcr.
- notifications for cfilters fetching progress
- implemented UI and setup for StakeShuffle mixing
- added app Settings and Wallet settings pages
- new UI for Sign message and Verify message pages
- updated headers on pages for a better UX
- API for overlaying widgets was added to the Gio library and has been used to achieve the intended UI design and behavior on the Wallets page
- a more efficient streaming encoding of CSV exports
- reorganized modules for v6 development cycle
- display Swap Contract and Swap Redemption labels for atomic swap transactions
- updated to match Rosetta spec v1.4.8, which requires to track per-account unspent coins
- partial update for v1.6 release (Privacy and LN coming next)
Status as of Jan 20 update:
- Decrediton integration is awaiting review, it will make tickets easier to load into the app
- F-Droid builds are being investigated
- Blue Oak license was chosen but this may change to fit F-Droid’s requirements
- compact filter support is in progress but it needs a lot of work (this is the most privacy-preserving way to obtain address information, the same as used by SPV wallets)
- dcrseeder received fixes for peer tracking and graceful shutdown
- release tool was updated to v1.6 and used by multiple developers to reproduce release builds
- Bug Bounty program reported that it has processed a total of 150 submissions and 14 were eligible for a payout
- development help is welcome for dcronchain.com — the app is based on Nuxt.js (Vue.js derivative)
Community stats as of Feb 1:
- Twitter followers: 41,801 (+481)
- Reddit subscribers: 10,201 (+150)
- Matrix #general users: 344 (+57)
- Discord users: 1,917 (+194)
- Telegram users: 2,428 (+90)
- YouTube subscribers: 4,320 (+20), views: 169K (+4K)
- LinkedIn followers: 962 (+18)
- GitHub dcrd stars: 575 (+5), forks: 249 (+2)
Unusual changes detected among the tracked accounts:
- @decredproject Twitter had a second inflow of followers by almost +500 after a previous +400 (coming after 1.5 years of almost no changes)
- Matrix chats got +20% and Discord +11% users
- Telegram reversed after 6 months of decline and gained +4% users
- DecredTrading Telegram got another +26%
- CoinMarketCap project page somehow added +8K watchers (+45%)
- @Checkmate got another +13% followers (to 4K) and posted 1K tweets (~34/day) third month in a row
- Russian VK page is posting updates again after a long period of inactivity, thank you the new maintainer
In January the Treasury received 11,878 DCR and spent 6,750 DCR. Using January’s daily average DCR/USD rate of $54.25, this is $644K received and $366K spent. At December’s average daily rate of $31.07, the USD figure billed for past work is $210K. As of Feb 10, the Treasury balance is 647,942 DCR (64.3 million USD at $99.26).
Four proposals were submitted in January, and by Journal publication in early Feb they had all finished voting:
- DCRDEX Phase 2 development proposal set new records in terms of support from the ticket pool, with 53% of the eligible tickets turning out to vote almost unanimously yes (98.2%)! This proposal approved a budget of $245,000 to develop a set of features including support for SPV wallets, ETH and ERC-20 token trading, more Bitcoin forks, and Decrediton integration.
- Decred in Depth podcast is going to be under new management, and doing it live, after a proposal from @elima_iii was approved with 86.3% approval and 28% turnout — this covers 24–36 episodes at $500/episode.
- A new research proposal from @ammarooni requested $17,500 to write and publish a book, Decentralized Credits: The Digitization of Money and State — this proposal was narrowly rejected in early Feb, with 57% approval and record turnout of 70%.
- The Decred Arabia team requested $6,200 for six months’ funding. This proposal was approved in early Feb with 96% support and turnout of 55%, making it the proposal with the second highest turnout (ahead of the DCRDEX phase 2 proposal, which has gone from the new record-setter to 3rd in a few weeks).
It looks like the surge in ticket price and PoS participation has also resulted in an increased level of Politeia engagement on the part of the people who hold tickets.
A further two proposals were submitted in early February, for Decred Journal 2021 (max budget $39,000) and Open Source Research 2021 (max budget $40,000). The Decred Journal proposal offers an opportunity to leave more formal and immutable feedback than usual, and you can also (if you’ve got tickets) vote to continue funding the Journal!
@buck54321 drafted a pre-proposal for Decred Eco, a GUI application manager to install, configure and update a growing list of Decred-related software without touching the command line (think of what Steam does for games).
@Checkmate and @pavel have clarified the status of dcronchain.com proposal: the project is alive, development continues when time is available, and it is not being replaced by checkonchain.com. All known proposal updates have been collected here.
Politeia Digest returned with a catch-up issue 40 which also covered December proposals.
Hashrate: January’s hashrate opened at ~348 Ph/s and closed ~406 Ph/s, bottoming at 283 Ph/s and peaking at 545 Ph/s throughout the month. Pool hashrate distribution as of Feb 1: UUPool 33%, Poolin 29%, Antpool 18%, easy2mine 9.4%, F2Pool 5.2%, BTC.com 2%, Huobipool 1.9%, Luxor 1.1%, CoinMine 0.04%.
Staking: 30-day average ticket price was 173.23 DCR (+9.3). The price varied between 149.9–212.3 DCR. Locked amount was 6.55–7.12 million DCR, which corresponded to 52.53–56.71% of the available supply participating in PoS.
We once again had record high numbers this month both in terms of ticket price 212.28 DCR (with a new USD ATH) and also stake participation of 56.71%!
Nodes: Throughout January there was an average of 116 public listening nodes and 235 total nodes according to dcr.farm. Average version distribution for January: 22% dcrd v1.5.2, 14% dcrd v1.6.0, 13% dcrd v1.6 dev and RC builds, 13% dcrd v1.5.1, 4% dcrd v1.7 dev builds, 3.6% dcrd v1.5.0, 2.3% dcrd v1.5 dev and RC builds, 0.4% dcrd v1.4, 10% dcrwallet v1.5.1, 7% dcrwallet v1.6.0, 1% dcrwallet v1.6 dev and RC builds, 1% dcrwallet v1.5, 0.6% dcrwallet v1.4, 8% others.
Decred’s Lightning Network had 28 nodes (+4), 47 channels (+5) with a total capacity of 8.3 DCR (-0.4), as of Feb 1. @jholdstock’s network map has moved to a new domain. LN capacity is becoming more important as more LN features are exposed to end users via Decrediton GUI. Thank you to all LN operators for running the nodes!
In his second blockchain analysis report @richardred followed how the freshly mined coins are flowing through mining pools, their miners and eventually hitting exchange addresses. The report updates on the progress of developing the tooling, and shares visualizations of address/transaction clusters and the flow of funds. The main focus of the report is on the 5 clusters which received the most Coinbase DCR in 2019–2020, and the 5 which received the most DCR from these transactions. These clusters were thought to represent mining pools and their users, but examination of how they are structured indicated variability in function, with some appearing to belong to individuals. A total of 4,852 distinct clusters (with more than 1 address each) can be taken as a rough guess at the number of different individuals/wallets who mined DCR in this period.
dcr.farm added support for vspd on a new subdomain vsp.dcr.farm. In early Feb decredvoting.com and dcrpool.ibitlin.com also upgraded to support vspd. The latter offers a bonus Telegram bot to watch tickets.
As of writing 10 out of 17 VSPs have upgraded to vspd. VSP operators please be aware that users of Decrediton v1.6 will see the list of new vspd instances as a recommended option, which means VSPs that upgrade sooner may steal some users from the slower ones!
Brazilian Monnos announced the addition of DCR to their portfolio. The platform allows to trade crypto for BRL fiat, copy strategies of other traders (“social trading”), and plans to issue crypto payment cards. As of writing DCR deposits are not available but buying, trading, and withdrawing might work.
Binance had DCR deposits and withdrawals disabled for 30+ hours starting roughly 12 hours after v1.6 was released.
Warning: the authors of the Decred Journal have no idea about the trustworthiness of any of the services above. Please do your own research before trusting your personal information or assets to any entity.
Monde PR’s achievements for January:
- created/pitched 2 stories to finance and crypto publications
- responded to 3 requests for comments
- secured 3 media interviews
News coverage secured by Monde PR:
- an article in Cointelegraph featuring commentary from @jy-p on the effects of a CBDC takeover (syndicated to 25 news outlets including Investing.com and Cointelegraph Brazil). The comments were also used in 3 subsequent news stories, in Cointelegraph (syndicated to 9 news outlets), World Stock Market and Etherdesk.
- the Decred v1.6 release was covered by Bitcoin Exchange Guide, Crypto Mode (syndicated to Crypto News BTC), 8btc, Explica, Crypto Briefing (syndicated to 6 news outlets including Techtelegraph) and Invezz (syndicated to 4 news outlets including CCNC).
- an article in Modern Consensus featuring commentary from @jy-p on the GameStop/Robinhood incident
- Jan 22 — Gate.io AMA — Internet. @elian answered questions about Decred from Gate.io Spanish community in their Telegram channel. Around 25 people participated in the Q&A and had a chance to win $10 in DCR (total $50).
- Decred blockchain analysis — Part 2 PoW wow by @richardred (blockcommons.red)
- Crypto Commons 2020 review and v1.0 changelog by @richardred (blockcommons.red)
The cryptocommons.cc book received a major update covering selected developments from 2020, and these were also written up as a standalone blog post in the style of an annual review. The idea is that people who already read Peer Production on the Crypto Commons can get the update without reading it all again. While the full post is 18,000 words long there is also a tweet thread version that’s much shorter. Regular readers of the Relevant External section will recognize many of the same stories. One of the main themes of the update is divergence of the “open source movement”, with disillusionment apparently growing among people working on more corporate-dominated projects. This contrasts with the crypto space where the number of open source projects, and funding mechanisms for these, are growing in scale and diversity. While the bear market was hard for many projects and saw their efforts scaled back, others were able to continue without a care, and there are still a steady stream of new funding initiatives being trialled.
- Decred News Update, Jan 24th, 2021–1.6 imminent, Decred Eco, metric highs, proposals, new content! by @Exitus (youtube)
- Staked Podcast — Interview with Crypto N Culture aka Your Bitcoin Baby Daddy (youtube)
- Staked Podcast — Interview with Emaad Pervez (youtube) — this one used a more professional approach and helped to convince one proposal commenter
- Decred coin analysis — Light at the end of the tunnel; Hidden Hydra! by DubDigital (youtube)
- The Decred DEX — A better DEX design? with Jake Yocom-Piatt and Nick Gregory for Coinscrum (youtube, slightly shorter version was reuploaded in Feb)
- Decred governance walkthrough feat. on-chain analyst Checkmate (youtube)
Art and fun:
- v1.6 release tweet came with a fresh quality animation
- another release animation with fewer bits was made for the older audience
- What did you do for the Decred DAO?
- Iterating privacy — in Spanish by @francov_
- The Decred structure — in Spanish by @francov_
- Decred Journal December 2020 was translated to Arabic (@arij, @abdulrahman4), Chinese (@Dominic), and Spanish (@francov_). Thank you all for your persistence!
Other non-English content:
- v1.6 release was covered in Cointelegraph in Spanish
Comm systems news:
- Element app (Android client for the Matrix chat protocol used by Decred community) was temporarily taken down from Google Play Store. F-Droid version is less vulnerable to such incidents.
- Signal users can show their love for Stakey by installing a special sticker pack
Selected Reddit posts:
- Decred was mentioned in a report on central bank issued stablecoins published by a large holding corporation MetLife
- how Dash’s marketing expenses compare to Decred’s
- “If you could change one thing in how Decred was made, what would it be?”
- what the future of Politeia could look like
- which programming languages are used at Decred
- yet another “isn’t it dangerous that anyone can vote on code changes?” question collected many thorough answers
- a few other recurring topics have surfaced: turning Decred into DeFi, naming sub-DCR units, and everyone’s favorite idea to rename Decred to something less negative inevitably became the month’s most commented thread
Selected Twitter discussions:
- @geostone noted that Decred does not belong to any “feature tokens” yet has many of their features
- @ammarooni points out that Ray Dalio’s latest thoughts recognize the lack of Bitcoin’s adaptability
People who love DCR, really love it :) DCRDEX a big fundamental and market structure catalyst, after brutal bear. Layer in DCR privacy and it’s now one of the most sovereign venues to swap coin.
Now people just stacking tickets, and stacking sats, via DCR. (@cburniske)
In January DCR was trading between USD 39.80–69.00 / BTC 0.0013–0.0020. The average daily rate was $54.25.
A colorful chart by @Checkmate showed how DCR has not followed 5 bigger coins in their decline against BTC and even made some gains.
Decred update in Our Network newsletter issue 56 by @Checkmate and @PermabullNino highlights the highest ever inflow of DCR into tickets that supported a doubling in DCR/BTC price. Indicator of price at which DCR was staked shows that only 17% of all staking occurred above $40, suggesting that stakers are in a reasonable profit in USD terms. DCR/BTC breakeven level for stakers is estimated around 0.004 BTC, above which ~60% of all stakers will be in profit.
checkonchain.com added Unrealized Profit and Loss oscillator that measures the difference between Spot and Realized price as a ‘sentiment’ measure on how much profit is in the system. @PermabullNino joined to improve the site and posted a quick walkthrough of some interesting charts. For intance, USD Lifetime Ticket Price has acted as a historical bull/bear line that was cleared in January.
DCRDEX has traded a total of 1.3M DCR and 1.9K BTC over almost 4 months since launch. On average that is roughly 12K DCR / 17 BTC per 24 hours.
Bitcoin Core 0.21.0 has been released with big highlights including Taproot consensus rules (allows more flexible smart contracts and better privacy) implemented as a soft fork, and support for serving BIP157 compact filters. The latter was proposed in May 2017 and offered a big improvement to security and privacy of light wallets, compared to popular Electrum and wallets relying on central servers to fetch data without validating the full blockchain. In December 2018 the risk of Electrum middleware materialized and around $4M worth of BTC was stolen by hackers. A less obvious problem is the collection of private address and transaction data by ~90 Electrum servers that continues to this day.
Light wallets based on compact filters talk to full nodes without middlemen and don’t have these risks. Decred added their initial support in Sep 2018 and it was exposed to all users in Feb 2019. The second generation of this tech was added in May 2020 at the consensus level and integrated into wallets in Jan 2021.
American miner Marathon Patent Group joined DMG Blockchain Solutions to create a “cooperative mining pool”. To benefit the industry, the pool will include “clean block mining” proprietary tech that will “specifically omit any transactions deemed risky by Walletscore, and which may not meet OFAC standards”. r/Bitcoin discussed possible countermeasures and claims made by the companies.
Firo (formerly Zcoin) suffered a 51% attack where the attacker deposited 866K FIRO to Binance, sold them for other coins which they withdrew, then broadcast about 1 day’s worth of blocks which wiped out the attacker’s deposits. The Firo devs responded by triggering a “Lelantus” switch that prevented the attacker from anonymizing their FIRO (which was helpfully all stored in one address), and released an update which blacklisted the attacker’s address and added a new rule limiting max reorg depth to 5. While the network updated the attacker and honest miners engaged in a hash war, with the attacker trying to mine enough blocks to stay ahead so they could spend their ill-gotten gains.
BitMEX Research caused a stir when they tweeted that Bitcoin had experienced a small double-spend. It was helpfully clarified by Hasu and others that this was not a malicious double-spend attack but rather a benign event where a user happened to be bumping the fee on their transaction when a stale block occurred and the original transaction was expunged from the blockchain.
Yearn Finance voted to inflate the YFI supply by 20% to fund future development. YFI has been heralded for its “fair launch” which put all tokens in the hands of liquidity miners, but now they have voted to dedicate 20% to development some months later. As part of the run-up to the vote lead Yearn Finance developer Andre Cronje wrote about how building in DeFi sucks.
Reddit subreddit r/wallstreetbets broke into the mainstream with a retail-powered short squeeze that attracted global press coverage and cost the hedge funds which were caught out $20 billion, before Robinhood and the other platforms which had enabled it pulled the rug by preventing users from opening new positions.
Microblogging service Parler has tested a new level of censorship in January. Taking down of apps from Google and Apple stores was nothing new, but a quick deplatforming by 2FA, identity, database providers and ultimately Amazon Web Services, showed pretty much everything that can go wrong when centralized solutions are naively used to build a less censored environment. Hopefully, developers and node operators will learn from this and prepare for such events in advance.
Google suspended the Element app without notice. Upon clarification request their representative explained that “the suspension was triggered by a report of extremely abusive content accessible on the matrix.org server”. As usual in such cases, the exact instance of content was not referenced for the public’s verification that the strike was fair. The app was restored ~1 hour later. A more positive interpretation is that this was a gentle reminder to reduce dependency on the ephemeral Google Play, and switch to F-Droid or self-hosted APKs.
About This Issue
This is issue 34 of Decred Journal. Index of all issues, mirrors, and translations is available here.
Most information from third parties is relayed directly from source after a minimal sanity check. The authors of the Decred Journal have no ability to verify all claims. Please beware of scams and do your own research.
Credits (alphabetical order):
- writing and editing: bee, degeri, jholdstock, l1ndseymm, richardred
- reviews and feedback: davecgh, dnldd, elian, Exitus, oshorefueled
- title image: saender
- funding: Decred Treasury
UPDATED 2021–02–11 to correct how DCRDEX works and use term StakeShuffle instead of CoinShuffle++ (the latter is only one part of the system). You can find exact changes here.