This guide aims to capture some of the high-level differences between v5 and v6 to help those migrating an existing app and those already familiar with v5 that just need a quick primer.
The biggest differnce in v6 is the use of modern ES6 features, so a lot of changes are largely internal.
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 avilable 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 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.