v2.0.1
First major release since 1.15.7. Requires Node ≥ 22. ARQL is still deprecated, but re-implemented over GraphQL, two runtime dependencies are gone, and the browser build is now genuine ESM.
⚠️ Breaking changes
Node 18 and 20 are no longer supported. engines is now >=22. Both are past end-of-life (Node 20 EOL'd April 2026).
Malformed base64 now throws. base64-js has been replaced with the platform's native atob/btoa. The old library performed no validation — invalid characters silently decoded to corrupt bytes. Anything reaching Arweave.utils.b64UrlToBuffer with invalid input now raises instead of returning plausible-looking garbage. Valid input is byte-for-byte identical.
arconnect is no longer a dependency. The injected-wallet types are now exported from this package directly:
import type { ExternalWallet, WalletPermission } from "arweave";If you imported those from arconnect solely because arweave-js pulled it in, install it yourself or switch to the exports above.
arql() throws on queries it cannot express. Previously it returned whatever the gateway sent. See below.
ARQL (deprecated) now runs on GraphQL
Arweave nodes removed ARQL support — ar_arql_db.erl no longer exists in the node software — so POST /arql returns 404 everywhere. Both affected methods silently returned the 404's HTML body as a string while declaring Promise<string[]>, which meant silo.get() was fetching transaction id "<".
Both keep their signatures and are re-implemented over GQL:
arweave.arql(query)— supports the original grammar (and,or,equals, withfromandtomapping to owner and recipient), expandingorinto multiple queries and unioning results. Anything outside that grammar throws.arweave.transactions.search(tag, value)— GQL-backed with cursor pagination.
Both remain @deprecated. Query GraphQL directly for anything new: https://gql-guide.arweave.net
Browser ESM
The web build now emits real ES modules. In 1.15.7 it was CommonJS despite being intended as ESM, so it could only be consumed through a bundler. It can now be loaded directly:
<script type="importmap">
{
"imports": {
"arweave": "https://unpkg.com/arweave@2.0.1/web/index.js",
"bignumber.js": "https://unpkg.com/bignumber.js@9.1.2/bignumber.mjs"
}
}
</script>
<script type="module">
import Arweave from 'arweave';
const arweave = Arweave.init({});
</script>The import map is needed because bignumber.js is left as a bare specifier. Both files can be self-hosted — no CDN required. See the README for the self-hosted form.
Other changes
- Runtime dependencies reduced to
asn1.jsandbignumber.js - Removed the
ReadableStreamasync-iterator shim; browsers supportfor awaitnatively - Silo transaction lookup now uses GQL
- TypeScript 6,
@types/node24