One of the biggest changes in v6 is that the BigNumber class has been replaced with the built-in ES2020 BigInt offered by modern JavaScript environments.
There is plenty of online documentation to get you started with JavaScript ES2020 BigInt. Keep in mind, just like BigNumber, a ES2020 BigInt can only operate on integers.
The FixedNumber class still exists for performing fixed-point maths.
The Contract is an ES6 Proxy, which means it can resolve method names at run-time.
In v5, in the case of an ambiguous method, it was necessary to look up a method by its canonical normalized signature. In v6 the signature does not need to be normalized and the Typed API provides a cleaner way to access the desired method.
In v5, duplicate definitions also injected warnings into the console, since there was no way to detect them at run-time.
In v5, contracts contained a series of method buckets, which then in turn had all signatures and non-ambiguous names attached to them to perform less-common operations.
In v6, the methods each have their own less-common operations attached directly to them.
In v5, the project was maintained as a large set of sub-packages managed as a monorepo.
In v6 all imports are available in the root package, and for those who wish to have finer-grained control, the pkg.exports makes certain folders available directly.
In addition to all the ethers.providers.* being moved to ethers.*, the biggest change developers need to keep in mind is that Web3Provider (which historically was used to wrap link-web3 providers) is now called BrowserProvider which is designed to wrap EIP-1193 providers, which is the standard that both modern Web3.js and injected providers offer.
The StaticJsonRpcProvider in v5 is now integrated into the v6 JsonRpcProvider directly. When connecting to a network which cannot change its network, it is much more efficient to disable the automatic safety check ethers performs.
Since the fees for Ethereum chains has become more complicated, all Fee parameters in v6 were coalesced into a single `.getFeeData` method. While `gasPrice` is no longer widely used in modern networks, when using a legacy network, it is available using that method.
The transaction helpers present in v5 were all wrapped into a Transaction class, which can handle any supported transaction format to be further processed
The Logger class has been replaced by several Error utility functions.
The checkProperties and shallowCopy have been removed in favor of using .map and Object.assign.