- Added a new
PricesNamespace
with three new methods:getTokenPriceByAddress()
,getTokenPriceBySymbol()
,getHistoricalPriceByAddress
, andgetHistoricalPriceBySymbol()
. Access these methods viaalchemy.prices
.
- Added networks for
FLOW
.
- Added networks for
ROOTSTOCK
.
- Fixed webhook network parsing in
getAllWebhooks
method for all supported networks.
- Fixed createWebhook's
skip_empty_messages
param.
- Added networks for
WORLDCHAIN
.
- Added networks for
SONEIUM
andBERACHAIN
. Note that these are primarily forCoreNamespace
methods. Not all namespaces will work with these networks.
- Addressed security vulnerabilities by adding overrides for
elliptic
andws
dependencies. Specifically:- Updated
elliptic
to version6.5.7
(latest) to fix vulnerabilities related to EDDSA signature length checks and ECDSA BER-encoded signatures. - Updated
ws
to version7.5.10
to mitigate a potential DoS vulnerability. The latest major version ofws
is8.x
, however,7.5.10
is the most up-to-date version compatible withethers v5
, which depends on7.x
versions ofws
.
- Updated
- Fixed a bug where the
openSeaMetadata?.safelistRequestStatus
was undefined in theNft
object that resulted in aCannot read properties of undefined
error (#416)
- Added networks for
SHAPE
,LINEA
,FANTOM
,ZETACHAIN
,ARBNOVA
,BLAST
,MANTLE
,SCROLL
,GNOSIS
,BNB
,AVAX
,CELO
,METIS
,OPBNB
. Note that these are primarily forCoreNamespace
methods. Not all namespaces will work these networks. - App IDs are now a required property when calling
NotifyNamespace.createWebhook()
withWebhookType.GRAPHQL
. This is not a Typescript breaking change, but rather a run-time breaking change. Calling the endpoint without an App ID will now throw an error instead of returning a 503.
- Fixed a bug with
NotifyNamespace.createWebhook()
when usingWebhookType.GRAPHQL
. Also added the option useskipEmptyMessages
when creating graphQL webhooks to skip empty blocks. - Updated axios version to remove security warning (#443).
- Fixed a bug where the
openSeaMetadata?.safelistRequestStatus
was undefined in theNft
object that resulted in aCannot read properties of undefined
error (#416) - Added support
connectionInfoOverrides
field in theAlchemy
constructor. This allows you to override the ethers.jsConnectionInfo
object and specify custom connection information for the underlyingJsonRpcProvider
.
- Added support for Zksync Mainnet and Sepolia via the
Network.ZKSYNC_MAINNET
andNetwork.ZKSYNC_SEPOLIA
enums.
- Added support for Arbitrum and Optimism Sepolia webhook creation.
- API error messages return the actual error instead of [Object object]
- Added support for Polygon Amoy network via the
Network.MATIC_AMOY
enum.
- Upgraded the
axios
dependency tov1.6.5
, fixing a vulnerable version #397. Thanks @mpsq for the contribution!
- Added endpoints for
isAirdropNft()
andreportSpam()
inNftNamespace
. - Added a missing
marketplaceAddress
field to theNftSale
inNftNamespace.getNftSales()
. - Fixed an incorrect field name for
bannerImageUrl
inOpenSeaCollectionMetadata
. Deprecated the old field nameimageBannerUrl
. - Added support for Base networks in
NotifyNamespace
.
- Added support for Optimism Sepolia and Base Sepolia via the
Network.OPT_SEPOLIA
andNetwork.BASE_SEPOLIA
enums.
- For a full list of changes to V3 from V2, please visit: https://docs.alchemy.com/reference/alchemy-sdk-v2-to-v3-migration-guide. There, you can also find the API reference for v2 endpoints as well. V3 primarily involves changes to use the V3 NFT API.
- Added support for Arbitrum Sepolia network via the
Network.ARB_SEPOLIA
enum.
- Fixed a bug in the
Log
object where theremoved
field was not included in the response.
- Add support for Base
- Added a new method
CoreNamespace.isContractAddress()
to easily check if an address is a contract or EOA. The method accepts a string address and returns a boolean value indicating if the given address is a contract address or not.
- Fixed a bug where
GetOwnersForContractResponse
was missing thepageKey
field.
- Add the
refreshCache
parameter to NFT rarity endpoints to allow users to update stale rarity values. - Add the
includeCount
parameter to getOwnersForContract.
- Fixed a bug with in
NftNamespace.getNftSales()
in which there was a typo indecimal
field of theNftSaleFeeData
object. The field is now correctly nameddecimals
, anddecimal
is marked deprecated to avoid a breaking change.
- Added redundancy to
CoreNamespace.getTokensForOwner()
to handle failures when fetching token metadata. - Added support for the
acquiredAt
field for orderedgetNftsForOwner
queries. Only available when specifyingorderBy: NftOrdering.TRANSFERTIME
in the request. - Added the
NftSaleMarketplace.BLUR
marketplace enum to theNftNamespace.getNftSales()
method return. - Added support for the
validAt
response field toNftNamespace.getNftSales()
.
- Fixed a bug with
NotifyNamespace
when creating webhooks on ETH_SEPOLIA, OPT_GOERLI, and ARB_GOERLI. - Fixed a bug with
Wallet.populateTransaction()
where the method would never resolve. - Fixed a bug with
NftNamespace.getMintedNfts()
andNftNamespace.getTransfersForOwner()
where the method would always throw an error for certain addresses (#318).
- Moved the
exports.default
field to be the last field. This fixed a bug introduced in2.8.1
that prevented certain frameworks from building (#313).
- Fixed a bug where the SDK was not compatible with
moduleResolution: bundler
when usingtypescript
atv5.0
(#302). Thanks @florrdv! - Fixed a bug with
getTransfersForOwner()
andgetTransfersForContract()
methods in theNftNamespace
, where some NFTs would not be returned if the NFT was transferred multiple times.
Added PolygonZkEvm Mainnet and Testnet limited support to the sdk
- Added
CustomGraphqlWebhook
to be used with theNotifyNamespace
. This webhook uses graphql to track any event on every block.
- Added support for a
pageKey
andpageSize
parameter inNftNamespace.getOwnersforNft
to allow for pagination of the results.
- Added additional descriptive tokenTypes in NFT- and contract-level metadata, for contracts which don't support any NFT standard.
- Added the
title
field toContractForOwner
to represent the title of the token held by the owner. - Fixed a bug where the
media
field inContractForOwner
was aMedia
object rather than aMedia[]
array. - Added support for the Eth Sepolia network via the
Network.ETH_SEPOLIA
enum.
- Added the
NftMetadataUpdateWebhook
to be used with theNotifyNamespace
. This webhook tracks all ERC721 and ERC1155 token metadata updates.
- Added
TransactNamespace.simulateAssetChangesBundle()
to simulate a list of transactions in sequence and return a list of asset changes. - Added
TransactNamespace.simulateExecutionBundle()
to simulate a list of transactions in sequence and return a list of decoded logs and traces. - Added
NftNamespace.getContractMetadataBatch()
to get the metadata associated with multiple NFT contracts in a single request.
- Added exports for Ethers.js types and interfaces used by the SDK.
- Added the
pageSize
parameter to theNftNamespace.getContractsForOwner()
method.
- Added a missing
gas
field in theDebugTransaction
interface to specify the gas provided for a transaction execution. - Fixed a bug with
NftNamespace.getMintedNfts()
,NftNamespace.getTransfersForOwner()
, andNftNamespace.getTransfersForContract()
where the method would incorrectly error if the specified address had no transfers. - Added the
BigNumber
ethers export. You can access this by importingBigNumber
along with the other exports in the package.
- Added the
CoreNamespace.getTokensForOwner()
method to get all the token balances and token metadata for a given address. - Added the
wyvern
andcryptopunks
marketplaces in theNftSaleMarketplace
enum to theNftNamespace.getNftSales()
method. - Added the
blockHash
field to theOwnedNftsResponse
returned byNftNamespace.getNftsForOwner()
to track the block hash that the request was based on.
- Added the
NftNamespace.getTransfersForOwner()
method to get all NFT transfers to or from a provided owner address. - Added the
NftNamespace.getTransfersForContract()
method to all the NFT transfers for a provided NFT contract address. - Deprecated the
GetMintedNftsResponse
interface in favor of theTransfersNftResponse
. TheTransfersNftResponse
contains the same properties as theGetMintedNftsResponse
and includes additional fields about the transfer.
- Added
TransactNamespace.simulateAssetChanges()
to simulate a transaction and return a list of asset changes. - Added
TransactNamespace.simulateExecution()
to simulate a transaction and return a list of decoded logs and traces.
- Added support for passing in a
null
tokenId
when using NFT Webhook Filters, which allows you to listen to all token ids in a collection. - Added
NftNamespace.getMintedNfts()
to fetch all the NFTs an owner address minted, optionally filtered by a set of specific NFT contracts. - Added the option to pass in an
EventFilter
with multiple addresses to theCoreNamespace.getLogs()
method. - Fixed a bug where the
protocolFee
was not included in the response forNftNamespace.getNftSales()
. Deprecated the existingmarketplaceFee
property in favor of the newprotocolFee
property.
- Added the
DebugNamespace
to the top-levelAlchemy
object. TheDebugNamespace
is used to replay and inspect transactions and mined blocks in greater detail.
- Added the
tokenUriTimeoutInMs
option toNftNamespace.getNftsForContract()
to specify the timeout duration for fetching an NFT's underlying metadata. - Fixed a bug where using
AlchemySubscriptions.PENDING_TRANSACTIONS
with a string array input would throw an error (#222). - Added support for the
refreshCache
option inNftNamespace.getNftMetadata()
. This option is now available when using theoptions
overload. The original method without theoptions
overload is now deprecated. - Added support for the
requestTimeout
option in theAlchemySettings
object to configure a timeout forNftNamespace
andNotifyNamespace
methods. Thanks @Abbaskt! - Added the
contractDeployer
anddeployedBlockNumber
into theNftContract
object. Methods that return NFTs such asNftNamespace.getNftsForOwner()
andNftNamespace.getContractsForOwner()
now include this information under thecontract
field.
- Added
NftNamespace.getContractsForOwner()
to fetch all NFT contracts for a specified owner address.
- Fixed a bug in
NftNamespace.getNftsForOwner()
where theopenSea
metadata was not included in the returned NFT. - Marked the
NftExcludeFilters
type as deprecated. Please useNftFilters
instead. - Added support for the
orderBy
param toNftNamespace.getNftsForOwner()
andNftNamespace.getContractsForOwner()
.
- Fixed a bug where
newHeads
subscriptions would error and crash when reconnecting to the websocket. - Fixed a bug where certain subscriptions would not reconnect after the websocket reconnected.
- Added exports for
toUtf8Bytes
andtoUtf8String
inUtils
.
- Fixed a typo with the
AlchemySettings.batchRequests
property.
- Added support for ENS resolution to the
NotifyNamespace
andWebsocketNamespace
methods. - Added the
batchRequests
setting inAlchemySettings
. Enabling this setting will automatically batch and send json-rpc requests to reduce network overhead. - Included new export for the
Interface
class from ethers to simplify encoding ABI when usingeth_call
. - Added support for the
NftNamespace.getNftMetadataBatch()
method to fetch metadata for multiple NFTs in a single call. - Added support for the
NftNamespace.getNftSales()
method to fetch NFT sales across different marketplaces. Thanks @xeno097!
- Fixed a bug where
AlchemyConfig.getWebsocketProvider()
was not exported as a public method. This method allows you get the underlyingWebsocketProvider
that is implemented by ethers. - Added the
NftNamespace.summarizeNftAttributes()
method to get the summary of attribute prevalence for all NFTs in a contract. - Added the
NftNamespace.searchContractMetadata()
method to search for a keyword across ERC721 and ERC1155 contract metadata. - Added support for ENS resolution on several
CoreNamespace
methods. You should now be able to pass in an ENS domain into any param that requires an owner address. - Added the
CoreNamespace.resolveName()
andCoreNamespace.lookupAddress()
methods to resolve and lookup ENS domains and their owner addresses. - Fixed a bug where the
Accept-Encoding
header was incorrectly included in requests that originated from the browser (#174). - Added the
openSea
response toNftNamespace.getContractMetadata()
to match the REST endpoint (#162).
- Added the
NotifyNamespace
to the top-levelAlchemy
object. TheNotifyNamespace
is used to perform CRUD operations on webhooks in the Notify API. - Added the
alchemy_minedTransactions
subscription event to theWebsocketNamespace
. This subscription emits full transaction objects or hashes that are mined on the network based on provided filters. - Added the
NftNamespace.computeRarity()
method to get the rarity attributes of the provided NFT. Thanks @xeno097!
- Added the
AIDROPS
enum toNftNamespace.getNftsForOwner()
. - Added the
spamInfo
field to the response forgetNftsForOwner()
andgetNftsForContract()
. - Fixed a bug where type declarations were not available when using
NodeNext
module resolution. Thanks @quentinverlhac! - Marked Ropsten, Rinkeby, and Kovan
Network
enums as deprecated. Please switch over to Sepolia.
- POTENTIALLY BREAKING: Fixed a typing bug where the
totalSupply
field in anNftContract
should have typestring
instead ofnumber
. - Updated the
Nft
class to include the contract metadata in theNft.contract
field. - Added commonly used utility methods from ethers.js into a top-level
Utils
export. - Added the
NftNamespace.verifyNftOwnership()
method to replace the deprecatedcheckNftOwnership()
method. - Added
Contract
andContractFactory
exports from ethers into the top-level exports.
- Added support for
withTokenBalances
inNftNamespace.getOwnersForContract()
. - Added support for the
erc20
token type and pagination forCoreNamespace.getTokenBalances()
. - Added
bytes
field to theMedia
object in the NFT metadata responses to indicate the size of the media in bytes. Note that thesize
field is not supported by the backend and will be removed in the next version.
- Added a
size
field to theMedia
object in the NFT metadata responses to indicate the size of the media in bytes. - Bumped
@ethersproject
dependencies tov5.7.0
to supportsafe
andfinalized
blocks.
- Added support for the
pageSize
parameter inGetNftsForOwnerOptions
to specify the number of NFTs fetched when usingalchemy.nft.getNftsForOwner()
. - Added support for a Wallet object. This object is identical to the Ethers
Wallet
class. - Added support for Arbitrum Goerli network via the
Network.ARB_GOERLI
enum. - Added support for the AStar Mainnet network via the
Network.ASTAR_MAINNET
enum. - Added typed request/response overloads for
CoreNamespace.getAssetTransfers()
for when thewithMetadata
param is true. - Added support the
tokenUriTimeoutInMs
parameter ongetNftsForOwner()
,getNftMetadata()
, andgetNftsForContract()
.
- Added the
transact
namespace for functionality relating to sending transactions. This includes the Flashbots methodssendPrivateTransaction
andcancelPrivateTransaction
.
- Removed the deprecated
TOKEN
enum fromAssetTransfersCategory
. - Added support for Optimism Goerli network via the
Network.OPT_GOERLI
enum. - Added the
pageSize
parameter inGetNftsForContractOptions
to specify the number of NFTs fetched when usingalchemy.nft.getNftsForContract
. - Added correct
withMetadata
typing toAssetTransfersResponse
.
- Added an optional
url
setting toAlchemySettings
to allow specifying a custom hardcoded URL to send all requests to. - Fixed a bug where the SDK would incorrectly include a gzip header in browser environments
- Top level package has moved from
@alch/alchemy-sdk
toalchemy-sdk
for convenience. New command to install isnpm install alchemy-sdk
- Updated instantiation syntax:
initializeAlchemy(settings)
is nownew Alchemy(settings)
- Added three namespaces under the Alchemy object:
core
,nft
, andws
. All Ethers.js provider methods and Alchemy Enhanced APIs (other than NFT) are undercore
. - Moved top-level methods under the Alchemy object. Instead of
getNftsByOwner(alchemy, 'vitalik.eth')
, now methods are called usingalchemy.nft.getNftsByOwner('vitalik.eth')
- Ethers.js Alchemy Provider methods are now directly embedded under
alchemy.core
- Ethers.js WebSocket Provider methods are now directly embedded under
alchemy.ws
- The settings object is now a config module under
alchemy.config
. - If necessary, the full Ethers.js Provider is now available under
alchemy.config.getProvider()
as a promise to reduce bundle size. - If necessary, the full WebSocket Provider is now available under
alchemy.config.getWebSocketProvider()
as a promise to reduce bundle size. - Dynamic imports for large methods (in particular, Ethers.js methods) are now supported. Initial package size for the Alchemy SDK is 20kB, and will only download Ethers.js packages when a relevant method is called.
- Methods including Collection in the NFT package have been renamed to
Contract
: for instance,getNftsForCollection
is nowgetNftsForContract
.