Compare commits

..
994 Commits
Author SHA1 Message Date
grenadeandClaude Opus 5 0480bfcbc5 build: packageInfo at 14.0.3-quantus.3, as published
Lock Threads / lock (push) Has been cancelled
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-16 22:13:53 +03:00
grenadeandClaude Opus 5 a5157ef592 build: version the forks 14.0.3-quantus.3, on @quantus/crypto 0.3.0
The post-quantum-only change is a breaking one for every consumer. The keyring
and util-crypto surfaces both shrink, so it gets its own version rather than a
republish of quantus.2. @quantus/crypto moves to ^0.3.0, the version the
extension already resolves (wormhole addresses and nullifiers), so the two
share one copy of the WASM.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-16 21:10:31 +03:00
grenadeandClaude Opus 5 e1d88c6f63 feat!: post-quantum only: remove ed25519, sr25519, ecdsa and ethereum keys
KeypairType is now 'dilithium65' | 'dilithium87'. Upstream's four types are
gone with their primitives, not merely unoffered. Each falls to Shor's
algorithm, and a keyring that can hold such a key invites someone to keep funds
under it, inside a tool whose premise is that this is unsafe.

This was deferred until post-quantum signing was proven end to end (real
transfers on Heisenberg, a real mainnet wallet in the extension), so that
tearing out half of util-crypto could not muddy the diagnosis of a first
rejected extrinsic. That has happened.

util-crypto, removed:
- ed25519/, sr25519/, secp256k1/, and signature/ (signatureVerify, which only
  knew those three; dilithiumVerify is the verifier);
- hd/ethereum and hd/ledger;
- key/fromPath and keyHdkd{Ecdsa,Ed25519,Sr25519}, the junction derivation;
- address/derive (sr25519 soft derivation);
- mnemonic/toMiniSecret, Substrate's classical seeding.

util-crypto, kept because none of it holds a key:
- ethereumEncode, isEthereumAddress and isEthereumChecksum. @polkadot/types and
  the identicon renderer format 20-byte addresses with them, and a wallet has
  to be able to show an Ethereum address to recognise and refuse one.
  ethereumEncode now refuses a secp256k1 public key, saying why.
- evm ↔ substrate address conversion (its blake2/keccak hasher moved out of
  secp256k1/ into address/), derived and multi addresses, BIP39, and suri
  parsing.

keyring:
- Only ML-DSA arms remain. The default type is dilithium65.
- Every entry point (constructor, createFromUri, createFromPair, addFromAddress
  and, above all, createFromJson for a backup the user chose) refuses a
  quantum-unsafe type with "<type> keys are not quantum-safe and cannot be held
  here", not "unknown crypto type", which reads like a bug in this software.
- pair.verify handles ML-DSA, a bare signature or signature ‖ publicKey, under
  a context that defaults to the empty raw-bytes one. Derivation and VRF
  refuse.
- The test keyring is the Quantus dev accounts (crystal_alice, dilithium_bob,
  crystal_charlie: ML-DSA-87 from seeds of 0, 1 and 2) in place of sr25519
  Alice…Ferdie and ethereum Alith…Faith.

Fixed along the way: addFromAddress passed the decoded address as a public key.
That is the same bytes on Substrate. Here it is the account id, a hash of the
key, so every watch-only account reported the hash of its own address. It now
carries the address as an account id.

Specs:
- Upstream's per-scheme keyring specs (index, pair, encode, decode, toJson,
  vrf, suri, testingPairs) are replaced by keyring.spec.ts. It covers refusals
  at every entry point (including a polkadot{.js} ed25519 JSON backup), the
  dev-account addresses, watch-only addresses, JSON round trips for both
  schemes, verify in both signature forms and failing under the wrong context
  or signer, and the absence of derivation and VRF.
- The "classical paths unchanged" pins in the ML-DSA specs are gone with the
  paths.
- The BIP39 vectors toEntropy.spec used moved from sr25519/ to
  mnemonic/bip39Vectors.spec.ts.

yarn test: 2747 passing, 0 failing. yarn lint: clean.

hw-ledger and hw-ledger-transports remain. They are device transports holding
no primitives, and nothing consumes them.

Closes #6. Refs #1: signatureVerify is gone rather than made to take a
context; dilithiumVerify is the replacement.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-16 21:05:52 +03:00
grenadeandClaude Opus 5 7f23d0a609 fix: gate quantum-safe chains in the wallet, not in the network list
Filtering `filterAvailable` by `isQuantumSafe` removed Polkadot and Kusama from
`selectableNetworks`, and `@polkadot/types-known` throws for a chain it holds
upgrade history for but cannot find:

    Error: Unable to find info for chain kusama
      at mapRaw (@polkadot/types-known/upgrades/index.js:13:15)

which made `@polkadot/api` fail at *import* — nothing to do with Quantus, and
not diagnosable from the message.

The mistake was gating a library primitive. These lists say what Substrate
knows about; what a wallet offers is the wallet's decision, and `isQuantumSafe`
stays exported so the extension can make it in its own chain list. Keeping them
complete also means a pasted Polkadot address still decodes and renders as what
it is — recognisable, and therefore refusable. A wallet that cannot decode an
address it will not accept can only say "invalid", which reads as a typo rather
than a warning.

`index.spec.ts` is restored from upstream with only the testnet-exposure and
shared-prefix deltas re-applied, since its network-ordering assertions had
started passing vacuously once Polkadot and Kusama left the list.

Also corrects Heisenberg's token symbol to HEI; `system_properties` on
wss://a1-heisenberg.quantus.cat says HEI, not QTC.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-15 14:14:58 +03:00
rob thijssenandClaude Opus 5 49f3442e5c build: version the forked packages 14.0.3-quantus.1, not upstream's 14.0.3
Publishing under upstream's exact version was not merely confusing in a lockfile
— it was unsafe.

@polkadot/util-crypto pins @polkadot/networks at an exact version, and
@polkadot/keyring pins util-crypto the same way. With every fork numbered
14.0.3, a consumer that forgot one resolution would have yarn quietly satisfy
that pin from npm: the *unforked* upstream package, installing cleanly, with no
Quantus network entry or no isDilithium, and nothing to indicate anything was
wrong until something failed much later for an unrelated-looking reason.

Renaming the forks makes that a resolution failure instead. Verified by deleting
the @polkadot/networks resolution in quantus/ui and running an install:

  YN0082: @polkadot/networks@npm:14.0.3-quantus.1: No candidates found

Unforked dependencies keep upstream's numbers — @polkadot/util, x-bigint,
x-randomvalues, wasm-* — because they come from npm and should.

Published with `--tag quantus`, which npm requires for a prerelease version and
which is the honest dist-tag anyway: these are not upstream's `latest`. The tag
is informational, since consumers pin by tarball URL. The old 14.0.3 artifacts
have been deleted from the registry so nothing can resolve to them.

Refs quantus/extension#2

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-15 11:27:59 +03:00
rob thijssenandClaude Opus 5 b39241c840 build: take @quantus/crypto from the Gitea registry, not a symlink
Replaces the `link:../wasm/packages/quantus-crypto/build` resolution with an
npmScopes entry routing @quantus to https://git.lair.cafe/api/packages/quantus/npm/.

Routing the whole scope is safe here because we own every name in it. The forked
@polkadot packages cannot be handled the same way — most of that scope is
unforked and lives on npm — which is why downstream repos pin those to tarball
URLs instead.

The symlink approach had run out of road. node resolves a portal or link to its
realpath, so a consumer's transitive dependencies then resolve inside the *linked
package's* tree, where workspace entries point at source directories with no
exports map. That cost one workaround here and four in quantus/ui.

Reads from the registry are anonymous; publishing uses
`pass gitea/package-publisher-token`. Note that a version cannot be overwritten
in place — npm refuses — so republishing is delete-then-publish, which that token
can also do.

Refs quantus/extension#2

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-15 11:08:27 +03:00
rob thijssenandClaude Opus 5 74e1e0cc6a feat(util-crypto): export quantus-cli wallet files
The counterpart to the importer, and the thing that stops it being a one-way
door. Without it an extension backup is readable only by polkadot-js-format
tooling, so a user who brought a wallet in could not take it back out.

The assumption that blocked this — that we cannot write the CLI format because we
do not store a mnemonic — turns out to be false. The format has a null-mnemonic
shape and the CLI writes one itself for every raw-seed wallet; crystal_alice,
which `quantus developer create-test-wallets` produces, has exactly that
alongside `derivation_path: "m/"`.

Verified against quantus-cli 2.2.2 rather than inferred. Exports of both schemes
were written into ~/.quantus/wallets and the CLI listed them with the correct
address, scheme and human checkphrase, showed them under `wallet view`, and
answered `export --format mnemonic` with "Mnemonic phrase is not available for
this wallet" — which is a correct statement about the file, and only reachable by
deriving the Argon2 key, opening the AES-GCM box and parsing the payload. Those
probes were removed; the committed test round-trips through our own importer,
since CI has no CLI.

What a null-mnemonic export costs the user is exactly one thing, and it is not
spending: the CLI cannot re-export a phrase from it or derive further accounts.
That is the honest consequence of never storing a phrase we showed once, and it
is the same position a raw-seed CLI wallet is already in.

Argon2 parameters match the CLI's rather than being raised. They travel in the
file and the CLI reads them, so in principle anything works — but "in principle"
is load-bearing there, and a wallet a slightly older CLI cannot open is worse
than a conservatively tuned KDF. Salt and nonce are fresh per export.

metadata.exported_by marks the file, so a CLI maintainer reading a bug report can
tell where it came from without inferring from shape.

Refs quantus/common#8

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-15 10:33:20 +03:00
rob thijssenandClaude Opus 5 e55352aa4e feat(util-crypto): import quantus-cli wallet files
A must-have per the UX decision in quantus/extension#8: the extension has to be
able to take a wallet a user already has. My earlier recommendation against this
was withdrawn — the reasoning was that a file importer would pull the mnemonic
into storage, which is a property of an implementation rather than of the format.
This one derives and discards.

Converts at the edge rather than teaching the keyring a second container.
Decrypt (Argon2id -> AES-256-GCM), take the key material, and hand back a plain
keypair for the caller to re-encrypt as the extension's own PKCS8 under a
password the user chooses. decodePair does not learn about Argon2 and the keyring
keeps exactly one on-disk format.

The CLI stores a mnemonic in every HD wallet. This returns `hadMnemonic` and not
the phrase — the posture is that a storage password unlocks signing and nothing
on disk regenerates the tree, and an import must leave us holding exactly what
importing the same mnemonic by hand would leave us holding. Matching upstream,
which stores key material only.

No new dependencies: @noble/hashes/argon2 was already a util-crypto dependency
and AES-GCM is WebCrypto. Async only because WebCrypto has no synchronous form,
which is a second reason this belongs at the edge — createFromJson is sync and
should stay so.

Three things are refused rather than worked around:

Argon2 parameters are read from the file, not assumed. They are stored because
they are expected to change, and a build that hardcoded m=19456,t=2,p=1 would
reject a correct password on an older or newer wallet — the least useful thing it
could say.

Non-empty kyber_ciphertext/kyber_public_key, and any encryption_version other
than 2, are refused with a message. Those fields are an ML-KEM envelope mode that
is planned or optional; decrypting by the path we know and ignoring them would
fail later and more confusingly, most likely as a bad-password error.

The address sits outside the encrypted blob, so it is the one field an attacker
can edit without the password. cliWalletAddressMatches is exposed separately so
a caller can say "this file's address does not match its key" rather than
"wrong password" — a user can act on the difference.

Fixtures are genuine CLI 2.2.2 output, not blobs this repo encrypted; testing a
decoder against its own encryption proves only self-consistency. They contain no
secret: the mnemonic inside each is the public Substrate dev phrase and the
password is empty, which is the only reason committing a decryptable wallet is
acceptable. The strongest test reaches the same account two ways — through the
CLI container and by deriving from that phrase ourselves.

Refs quantus/common#7

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-15 09:44:07 +03:00
rob thijssenandClaude Opus 5 f7dc72e32c feat(keyring,util-crypto): BIP44 derivation for ML-DSA, in place of junctions
createFromUri now derives ML-DSA pairs from the mnemonic along a hardened BIP44
path rather than from a seed along a junction chain. Lattice keys have no public
derivability, so there is no soft junction to emulate and the chain's own
Pair::derive refuses for the same reason.

The path is m/44'/189189'/<account>'/0'/<0 for 87 | 1 for 65>'. Two things about
it are unusual and both are deliberate: the account index sits at the third level
rather than the last, and the trailing index carries the scheme rather than an
address index. It is what quantus-cli and the mobile wallet already derive, so
anything else produces addresses no other Quantus tool can find.

The ML-DSA branch sits before the existing seeding, not after, because that
seeding is the wrong one for us. mnemonicToMiniSecret is Substrate's variant and
the default reach in this file; using it here yields a perfectly well-formed key
for an account nobody owns. We need the 64-byte BIP39 seed and the HMAC-SHA512
chain keyed with "Dilithium seed", which is what the hdwallet crate does.

Accepted suri forms are nothing (account 0, matching quantus-cli's default),
//<n> for an account index, and //m/44'/… for a full path. Everything else
throws. That matters more than it looks: the syntax was built for curve
junctions, where /foo is soft and //foo hard over arbitrary bytes, and quietly
reinterpreting //Alice as something would hand back an address no other tool
derives and no seed phrase obviously recovers.

A raw hex seed is taken undederived — that is how the dev-genesis accounts are
defined — and combining one with a derivation path is refused rather than
guessed, since whether such a seed is the master or already derived is
unanswerable.

pair.derive() refuses with its own message. Not "not implemented" but not
possible: a child would have to come from this pair's key material, and ML-DSA
keys are not derivable from one another at all. The caller needs the mnemonic, so
the error says so rather than being generically unhelpful.

Verified against quantus-cli for both schemes from the public Substrate dev
phrase, plus index separation, explicit paths agreeing with indices, passphrase
sensitivity, and every refusal.

Refs quantus/common#4

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-15 08:56:20 +03:00
rob thijssenandClaude Opus 5 506b77351c fix(keyring): make account backup and restore work for ML-DSA pairs
Before this, an exported Quantus account could not be imported by anything.
decodePair located its divider by trying the two secret lengths every curve
scheme uses, 64 then 32; an ML-DSA secret is 4032 or 4896 bytes, so neither
matched and restore threw "Invalid encoding divider found in body". That is a
data-durability bug rather than a convenience one, which is why it lands before
any build lets a user create an account.

decodePair now takes an optional secretLength. The caller passes it rather than
this function searching for the divider: searching would work almost always and
fail catastrophically when it did not, since PAIR_DIV is five bytes and a
4032-byte secret contains a false match about once in 270 million keys — and the
result would be a silently wrong key rather than an error. The public key is read
as the remainder, because its length also varies and the body ends there.

The harder half is ordering. createFromJson returns a *locked* pair and callers
read pair.address off it long before any password appears. Every other scheme
manages because the address is the public key; an ML-DSA account id is a one-way
Poseidon2 hash and the public key is inside the encrypted blob. So PairInfo gains
an optional accountId, carried as data and used for the address while locked,
which decodePkcs8 clears once the real key arrives.

It also checks them against each other, and that check is not paranoia. For the
curve schemes a JSON file with an edited `address` field cannot decode at all.
Here it decodes perfectly and yields a pair reporting an address its key does not
control — a user would see someone else's address in their own wallet and believe
they held it. Pinned by a test that tampers exactly that field.

One more silent-wrong-key path closed: decodePkcs8 decided "secret key or seed?"
by length, so a 4032-byte ML-DSA secret took the seed branch and was fed to keygen
as entropy, producing a valid and entirely wrong key. The type knows the answer,
so it is asked.

Refs quantus/common#3

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-15 08:50:56 +03:00
rob thijssenandClaude Opus 5 2bffbc62bc feat(keyring,util-crypto): ML-DSA arms for createPair, alongside the curve ones
Wires @quantus/crypto into the four TYPE_* maps, so a keyring pair of type
dilithium65/dilithium87 can be created, addressed, signed with and verified.
The curve arms are untouched: quantus/common#6 removes them, but only once
post-quantum signing is proven end to end, so that a rejected first extrinsic has
two suspects rather than three.

util-crypto gains thin dilithium/ wrappers so keyring composes primitives the way
it already does for ed25519, rather than reaching into @quantus/crypto directly.

TYPE_ADDRESS is the interesting arm. Every other entry is identity or a cheap
re-encoding because on Substrate the address *is* the public key; ML-DSA takes
1952 or 2592 bytes to 32 with no way back. dilithiumVerify therefore mirrors the
runtime's Verify::verify rather than inventing anything: split sig||pk, hash the
embedded public key, check it equals the account being verified against, and only
then check the signature. Skipping the account check would accept a valid
signature from *some* key rather than *the* key, which is the whole property.

TYPE_PREFIX gets 0 for dilithium87 and 1 for dilithium65. For the curve types
those index Substrate's MultiSignature; here they index the runtime's
DilithiumSignatureScheme — a different enum reached by the same withType
mechanism, so nothing upstream of createPair needs to know.

Signing takes a mandatory context, which is quantus/common#5 arriving early
because the two are inseparable: TYPE_SIGNATURE cannot have an ML-DSA arm without
one. There is deliberately no default. Extrinsics on spec >= 148 verify under
QUANTUS_EXTRINSIC and earlier ones under the empty context, and the wrong choice
is a valid signature the chain rejects, indistinguishable locally. Only the
caller knows the spec version.

The curve sign functions are wrapped rather than passed by reference: ed25519Sign
and sr25519Sign take a third argument of their own (onlyJs), and letting it line
up with the context slot would silently reinterpret a Uint8Array as a boolean.

VRF signing refuses for ML-DSA. The construction fakes a VRF from an ordinary
signature, which is sound only given properties ML-DSA's signature does not have;
producing something that looks like a VRF proof and cannot be verified as one is
worse than refusing.

Two runtime whitelists sat behind the KeypairType union and silently rejected the
new types — the Keyring constructor and createFromJson. The compiler cannot see
those, and the first failed at construction with a message listing four types.
Both now use one named KEYPAIR_TYPES so the next change to the union has a single
place to look and the message cannot drift from the check.

Verified against quantus-cli, not against ourselves: keyring.addFromSeed with 32
zero bytes yields crystal_alice's address, signs to the runtime's wire length,
verifies under the extrinsic context and fails under the spec-147 one, and
another account's signature is rejected for it.

Refs quantus/common#2, quantus/common#5

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-10 18:43:25 +03:00
rob thijssenandClaude Opus 5 c616a0d949 feat(networks): offer only chains whose accounts are post-quantum
Deployments built on this fork should gate on chains using PQ algorithms, so
`availableNetworks` and `selectableNetworks` now exclude anything whose
standardAccount is a discrete-log scheme. *25519, Ed25519, Sr25519 and secp256k1
are all broken at once by Shor's algorithm, so a chain using one has no
quantum-safe account type to offer whatever else is true of it. A null
standardAccount counts as unsafe: unknown is not the same as safe, and being
wrong in that direction means a user holding funds under a recoverable key.

`allNetworks` is deliberately left complete. Gating what we offer must not gate
what we can read — a pasted Polkadot address has to render as a Polkadot address
so it can be recognised and refused. A wallet that cannot decode an address it
will not accept can only say "invalid", which reads as a typo rather than as a
warning.

Five upstream tests asserted the shape of a list that now holds two entries
instead of a hundred and fifty. Each is rewritten to assert the rule that
displaced it rather than deleted:
  - starting order 0/2/42 and tail 'ZERO'/'Zeitgeist' become "offers only
    post-quantum chains", plus an explicit test that non-PQ chains remain
    decodable, since that distinction is the whole design
  - the ledger slip44 check becomes its inverse: nothing offered should claim
    hardware support, because no PQ chain has a Ledger app — the devices speak
    ed25519 over the Substrate app. knownLedger is left intact rather than
    emptied so a rebase has nothing to reconcile; it simply matches nothing
  - the Polkadot field fixture becomes the Quantus one

Refs quantus/common#1

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-10 18:28:13 +03:00
rob thijssenandClaude Opus 5 6ed8b1ea6d feat(util-crypto,networks): open KeypairType to ML-DSA, register Quantus
Adds dilithium65 and dilithium87 to KeypairType, and Quantus to the network
registry at SS58 prefix 189.

Two types rather than one because the parameter set is not an implementation
detail: it selects the signature enum variant byte the chain reads off the wire,
it selects the trailing hardened index of the derivation path, and it fixes the
key and signature lengths. New accounts use dilithium65; dilithium87 is legacy,
used by accounts predating the recorded scheme and by the dev-genesis accounts,
so it is supported but never chosen.

Opening the union turns every table keyed by KeypairType into a type error,
which is the point — it enumerates precisely the places needing a post-quantum
answer. Where that answer is not written yet, assertSubstrateType() expresses the
gap as a named, typed refusal at the call site rather than a silent undefined
from an object index. It throws rather than degrading because all of these paths
produce key material or an address, and a wrong-but-plausible value means funds
at an address nobody controls. Call sites disappear as quantus/common#2 and #4
land. keyFromPath throws for the same reason: silently ignoring a derivation
path would hand back the parent key under a child's name.

Quantus is appended to the registry rather than merged — @substrate/ss58-registry
does not carry it and nothing occupies prefixes 185..195, so there is nothing to
override, and appending means a registry bump cannot silently drop it.
standardAccount is 'ml-dsa', a value upstream's closed union does not allow,
hence the widened KnownSubstrate; it is load-bearing, since a missing
standardAccount makes toExpanded mark the network isIgnored.

Testnets are first-class in this fork. Upstream drops any testnet from
availableNetworks however complete its entry is, which suits a production chain
picker and not us: Quantus is under active development and a wallet that cannot
reach Heisenberg can only be tested against real funds. The exception is an
allowlist (exposedTestnet) rather than removing the rule — removing it exposed
all fifteen of upstream's testnets too, moving the sorted tail from 'ZERO' to
'ZERO Alphaville', which is a change we have no reason to make. isTestnet is
still reported honestly so consumers can label or filter; we just stop deciding
for them.

Genesis hashes come from blackbeard.observer's config, which records their
provenance: mainnet read from the node with chain_getBlockHash(0) on 2026-09-09,
its launch day, and explicitly not the staging chain that telemetry calls
"Quantus Staging Mainnet". Symbol and decimals (QTC, 12) agree between the
chain's chain_spec.rs and the Dart SDK's AppConstants.

Three upstream tests encoded rules this fork no longer follows. Each is rewritten
to assert the new rule rather than deleted:
  - genesis entries for testnets are now allowed, for ones we opted into
  - an exposed testnet must still be labelled a testnet, since a user cannot tell
    play money from real money by looking at an address
  - one network per SS58 prefix stops holding when a chain has a testnet;
    mainnet and Heisenberg are both 189 because an address is valid on either,
    and consumers key on genesisHash rather than prefix

Refs quantus/common#1

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f
2026-09-10 14:50:49 +03:00
github-actions[bot] 9281daa14c [CI Skip] release/stable 14.0.3
Lock Threads / lock (push) Has been cancelled
skip-checks: true
2026-03-23 12:53:26 +00:00
Tarik Gul c7ed69fe55 14.0.3 (#2025) 2026-03-23 14:48:13 +02:00
github-actions[bot] 22a1246672 [CI Skip] bump/beta 14.0.3-0-x
skip-checks: true
2026-03-22 21:42:26 +00:00
Francis O'Brien 4a5b6acc78 Fix(hw-ledger): reset transport on operation errors and add explicit disconnect API (#2024)
* fix(hw-ledger): close transport on withApp errors

* feat(hw-ledger): add disconnect method to close active transport connection
2026-03-22 17:37:13 -04:00
github-actions[bot] 152d4609a4 [CI Skip] release/stable 14.0.2
skip-checks: true
2026-03-16 18:24:20 +00:00
Tarik Gul 4ab957e568 14.0.2 (#2023) 2026-03-16 20:19:11 +02:00
github-actions[bot] 610c8bb15f [CI Skip] bump/beta 14.0.2-1-x
skip-checks: true
2026-03-13 20:55:22 +00:00
AndreasGassmann 372d460f1a fix(util-crypto): use correct x/y getters in secp256k1Expand (#2018) 2026-03-13 16:50:22 -04:00
github-actions[bot] a8732a99aa [CI Skip] bump/beta 14.0.2-0-x
skip-checks: true
2026-03-12 16:59:11 +00:00
Tarik Gul 8d3cb0eb6b Set headers to 2026 (#2021) 2026-03-12 18:53:56 +02:00
github-actions[bot] fe0886be23 [CI Skip] release/stable 14.0.1
skip-checks: true
2025-12-09 08:34:53 +00:00
rajk93 bac357ae10 14.0.1 (#2014)
* 14.0.1

* chore: update CHANGELOG.md
2025-12-09 14:01:18 +05:30
github-actions[bot] 4ab7a5bfe0 [CI Skip] bump/beta 13.5.10-1-x
skip-checks: true
2025-12-09 07:34:50 +00:00
rajk93 440b146a24 fix(x-randomvalues): prioritize native RN modules over polyfilled crypto (#2013) 2025-12-09 13:01:07 +05:30
github-actions[bot] ae0735ccda [CI Skip] bump/beta 13.5.10-0-x
skip-checks: true
2025-12-08 13:13:55 +00:00
Paul Miller 57551b38a0 sr25519: switch from wasm to micro-sr25519 (#1971)
* sr25519: switch from wasm to micro-sr25519

* commit yarn lockfile

* Update to scure/sr25519 v0.2

* Fix build

* Commit
2025-12-08 18:40:16 +05:30
github-actions[bot] bf63a0ebf6 [CI Skip] release/stable 13.5.9
skip-checks: true
2025-11-25 08:17:11 +00:00
rajk93 d78344d000 13.5.9 (#2012) 2025-11-25 13:43:32 +05:30
github-actions[bot] 169a702c88 [CI Skip] bump/beta 13.5.9-0-x
skip-checks: true
2025-11-25 08:02:38 +00:00
rajk93 b4d73ef49a chore: bump polkadot dependencies (#2011) 2025-11-25 13:28:57 +05:30
github-actions[bot] 21ef853fbd [CI Skip] release/stable 13.5.8
skip-checks: true
2025-11-11 06:04:48 +00:00
rajk93 a4d940cb69 13.5.8 (#2010) 2025-11-11 11:31:13 +05:30
github-actions[bot] 6423537dbe [CI Skip] bump/beta 13.5.8-0-x
skip-checks: true
2025-11-11 04:05:17 +00:00
rajk93 61125b3582 chore: bump polkadot dependencies (#2009) 2025-11-11 09:31:28 +05:30
github-actions[bot] 7d77f89f34 [CI Skip] release/stable 13.5.7
skip-checks: true
2025-10-13 14:54:53 +00:00
Valentin Fernandez bee7204f95 13.5.7 (#2008) 2025-10-13 11:51:23 -03:00
github-actions[bot] bb0715ec2f [CI Skip] bump/beta 13.5.7-0-x
skip-checks: true
2025-10-13 14:24:21 +00:00
Valentin Fernandez 2212f31f9a Revert "Set pbkdf2Encode rounds to default to 210,000 (#1983)" (#2007)
This reverts commit e5e6bdd814.
2025-10-13 11:20:32 -03:00
github-actions[bot] 047840319e [CI Skip] release/stable 13.5.6
skip-checks: true
2025-08-26 16:49:24 +00:00
Arjun Porwal 3fbf0b98c2 13.5.6 (#2004) 2025-08-26 13:45:40 -03:00
github-actions[bot] e6b0411e9c [CI Skip] bump/beta 13.5.6-2-x
skip-checks: true
2025-08-26 14:00:47 +00:00
Valentin Fernandez 6e8199bab7 Bump @polkadot/wasm deps (#2002)
* bump  deps

* small tweak
2025-08-26 10:56:53 -03:00
github-actions[bot] 8ca4525570 [CI Skip] bump/beta 13.5.6-1-x
skip-checks: true
2025-08-22 14:13:55 +00:00
henrikdent 0c3a71145a Add DENTNet ledger support (via generic Polkadot app) (#1942) 2025-08-22 11:10:05 -03:00
github-actions[bot] 9c1be4f19b [CI Skip] bump/beta 13.5.6-0-x
skip-checks: true
2025-08-20 15:59:22 +00:00
Tarik GulandValentin Fernandez e5e6bdd814 Set pbkdf2Encode rounds to default to 210,000 (#1983)
* Set pbkdf2Encode rounds to default to 210,000

* Cap amount of rounds to 2048 when onlyJS = true to prevent overflow issues.

* Patch tests to use a consistent amount of encoding rounds.

* lint

* Add additional docs

* lint

---------

Co-authored-by: Valentin Fernandez <tinchofernandez8@gmail.com>
2025-08-20 12:55:25 -03:00
github-actions[bot] 55a3201bd5 [CI Skip] release/stable 13.5.5
skip-checks: true
2025-08-11 15:47:48 +00:00
Valentin Fernandez de2538c18d 13.5.5. (#2000) 2025-08-11 12:44:05 -03:00
github-actions[bot] e8dced9fed [CI Skip] bump/beta 13.5.5-0-x
skip-checks: true
2025-08-04 17:54:26 +00:00
José Molina ColmeneroandValentin Fernandez 0afe1144d1 Add ledger support for Mythos (#1969)
* Add ledger support for Mythos

* Fix linting issues

* Remove Mythos from prevLedgerRecord

* allow mythos ss58

* ss58 Exceptions list

---------

Co-authored-by: Valentin Fernandez <tinchofernandez8@gmail.com>
2025-08-04 14:50:37 -03:00
github-actions[bot] 5a04d67bb2 [CI Skip] release/stable 13.5.4
skip-checks: true
2025-07-28 16:16:48 +00:00
Arjun Porwal 41481c1e3a 13.5.4 (#1999) 2025-07-28 21:43:02 +05:30
github-actions[bot] 8a8b583f81 [CI Skip] bump/beta 13.5.4-0-x
skip-checks: true
2025-07-28 15:59:37 +00:00
SalinaandBeqa Abuladze 03c8169cd9 Add Creditcoin3 support to Generic Ledger App (#1985)
* Update genesis.ts with creditcoin3 geneis hash

* Update defaults.ts with a Creditcoin3

* Update ledger.ts with creditcoin3

* Update defaults.ts to move creditcoin3 in sorted order

* chore: move creditcoin3 to genericLedgerApps

* chore: add cc3 testnet, drynet and devnet

* chore: yarn lint

---------

Co-authored-by: Beqa Abuladze <beqaabuladze.00@gmail.com>
2025-07-28 21:25:51 +05:30
github-actions[bot] f9ee358442 [CI Skip] release/stable 13.5.3
skip-checks: true
2025-07-01 15:36:43 +00:00
rajk93 ef5cfc728c 13.5.3 (#1996) 2025-07-01 12:32:55 -03:00
github-actions[bot] 88b8a54018 [CI Skip] bump/beta 13.5.3-2-x
skip-checks: true
2025-07-01 14:46:07 +00:00
rajk93 8c666725b2 chore: update polkadot dependencies (#1995) 2025-07-01 11:42:12 -03:00
github-actions[bot] daabdfac45 [CI Skip] bump/beta 13.5.3-1-x
skip-checks: true
2025-06-30 10:23:33 +00:00
Arjun Porwal 538359fd49 Add Optional Strict Input Checking to u8aToU8a (#1994)
* fix: add error handling for null and undefined inputs in u8aToU8a function

* fix: update u8aToU8a function to handle null/undefined inputs with strict checking

* docs: update documentation for u8aToU8a
2025-06-30 15:49:42 +05:30
github-actions[bot] df044669e2 [CI Skip] bump/beta 13.5.3-0-x
skip-checks: true
2025-06-18 16:10:04 +00:00
Arjun Porwal 60374f417a Update scrypt parameter validation (#1993)
* feat: update scrypt parameter validation to use ALLOWED_PARAMS

* fix: lint
2025-06-18 21:36:13 +05:30
github-actions[bot] 5235009f4c [CI Skip] release/stable 13.5.2
skip-checks: true
2025-06-17 14:57:41 +00:00
Valentin Fernandez 21bfff5a51 13.5.2 (#1992) 2025-06-17 11:54:01 -03:00
github-actions[bot] 963025daab [CI Skip] bump/beta 13.5.2-2-x
skip-checks: true
2025-06-17 04:38:45 +00:00
rajk93 ec7ef17b64 chore: add error handling for secure rng in react native (#1991) 2025-06-17 10:04:59 +05:30
github-actions[bot] ef94fed1fe [CI Skip] bump/beta 13.5.2-1-x
skip-checks: true
2025-06-13 13:20:09 +00:00
Arjun Porwal 43ac361806 Add input length validation in scryptFromU8a function (#1990)
* fix: add input length validation in scryptFromU8a function

* fix: improve input validation in scryptFromU8a function

* fix: linting

* fix: update default Scrypt parameters for improved security

* revert: 9070615

* fix: remove dymanic calculation
2025-06-13 10:16:25 -03:00
github-actions[bot] 2bc18cfdbb [CI Skip] bump/beta 13.5.2-0-x
skip-checks: true
2025-05-26 12:10:45 +00:00
Radek Bochenek be7df03e7c feat: add Liberland support to Generic Ledger App (#1989) 2025-05-26 08:06:55 -04:00
github-actions[bot] 0ae44ed34e [CI Skip] release/stable 13.5.1
skip-checks: true
2025-05-19 15:50:11 +00:00
Tarik Gul 09d54ea200 13.5.1 (#1988) 2025-05-19 18:46:33 +03:00
github-actions[bot] 457ea1a0b7 [CI Skip] bump/beta 13.4.5-1-x
skip-checks: true
2025-05-19 15:20:57 +00:00
Tarik Gul 972363a5bb Bump yarn to 4.9.1 (#1987) 2025-05-19 18:17:15 +03:00
github-actions[bot] e59fe6fd22 [CI Skip] bump/beta 13.4.5-0-x
skip-checks: true
2025-05-19 04:16:27 +00:00
Tarik Gul 35f9f4468b Ledger ECDSA signing support (#1986)
* Ledger ECDSA signing support

* Updates inline docs

* linter
2025-05-19 07:12:41 +03:00
github-actions[bot] 802174d6ad [CI Skip] release/stable 13.4.4
skip-checks: true
2025-04-14 13:38:40 +00:00
Valentin Fernandez d690abea02 13.4.4 (#1984) 2025-04-14 10:35:01 -03:00
github-actions[bot] 26a762ae2e [CI Skip] bump/beta 13.4.4-0-x
skip-checks: true
2025-04-11 11:40:53 +00:00
Tarik Gul 9d49bcde75 Improve objectSpread function property handling (#1982)
* Improve objectSpread function property handling

* fix linter
2025-04-11 14:37:13 +03:00
github-actions[bot] 8b0f5bf46e [CI Skip] release/stable 13.4.3
skip-checks: true
2025-02-17 17:14:33 +00:00
Tarik Gul a75d8761da 13.4.3 (#1981) 2025-02-17 19:10:53 +02:00
github-actions[bot] a58fb0bbff [CI Skip] bump/beta 13.4.3-0-x
skip-checks: true
2025-02-17 16:45:40 +00:00
Valentin Fernandez 0467c410c8 Rollback ws change on x-ws (#1980) 2025-02-17 11:41:53 -05:00
github-actions[bot] 095095074e [CI Skip] release/stable 13.4.2
skip-checks: true
2025-02-17 14:32:08 +00:00
Tarik Gul 18a6764841 13.4.2 (#1979) 2025-02-17 16:28:27 +02:00
github-actions[bot] 0e0de687c3 [CI Skip] bump/beta 13.4.2-0-x
skip-checks: true
2025-02-17 14:14:17 +00:00
Valentin Fernandez 6197a897aa Cast ws as global.WebSocket (#1978) 2025-02-17 09:10:28 -05:00
github-actions[bot] 0f7954a89b [CI Skip] release/stable 13.4.1
skip-checks: true
2025-02-17 01:55:44 +00:00
Tarik Gul e056618d2e 13.4.1 (#1977)
* 13.4.1

* Update changelog
2025-02-17 03:51:57 +02:00
github-actions[bot] 82a485cc9c [CI Skip] bump/beta 13.3.2-4-x
skip-checks: true
2025-02-16 17:40:17 +00:00
Valentin Fernandezandtarikgul 2cbea7bf8d Fix Misclassification of ECDSA Signatures in verifyMultisig() (#1973)
* Fix multisignature routing to properly detect signature type

* Improve testing suite

* update dep in tests

* lint

* revert changes to tests

* Add reprocible test

---------

Co-authored-by: tarikgul <tariksnow37@gmail.com>
2025-02-16 12:36:35 -05:00
github-actions[bot] 748f670351 [CI Skip] bump/beta 13.3.2-3-x
skip-checks: true
2025-02-12 20:13:38 +00:00
Valentin Fernandez 5b2749073f Fix: Use ws library in Node.js 22+ for Better WebSocket Error Handling (#1976)
* Fallback to ws library on NodeJS 22+

* Add github issue reference to docs
2025-02-12 15:09:56 -05:00
github-actions[bot] a328ab4409 [CI Skip] bump/beta 13.3.2-2-x
skip-checks: true
2025-02-05 11:45:04 +00:00
Valentin Fernandez e25bb48ba9 Allow keyringPair to create using a mnemonic wordlist (#1974) 2025-02-05 06:41:14 -05:00
github-actions[bot] 8456870148 [CI Skip] bump/beta 13.3.2-1-x
skip-checks: true
2025-01-17 17:42:50 +00:00
Tarik Gul 6f8caad80f Bump dev to 0.83.2 (#1972)
* Bump dev to 0.83.1

* Test deno version

* test with deno 2.1.4

* correct version

* 1.46.3

* Up to 0.83.2
2025-01-17 19:39:05 +02:00
github-actions[bot] 25fe5f4e27 [CI Skip] bump/beta 13.3.2-0-x
skip-checks: true
2025-01-06 16:23:17 +00:00
Tarik Gul da2edf0aa0 Bump yarn to 4.6.0 (#1967) 2025-01-06 18:16:58 +02:00
github-actions[bot] eb7b24f9aa [CI Skip] release/stable 13.3.1
skip-checks: true
2025-01-06 14:53:56 +00:00
Tarik Gul f4e93cf2c2 13.3.1 (#1966) 2025-01-06 16:47:34 +02:00
github-actions[bot] 85b2da734c [CI Skip] bump/beta 13.2.4-0-x
skip-checks: true
2025-01-02 15:43:59 +00:00
Tarik Gul 5d03be1084 Fix toLocaleString for v22.12 (#1965)
* Fix toLocaleString for v22.12

* fix ci

* Update tests, and cleanup solution

* remove ar locale
2025-01-02 17:37:40 +02:00
Tarik Gul 2261862097 2025 (#1963)
* 2025

* Set CI version so header passes
2025-01-01 20:53:24 +02:00
github-actions[bot] 20d3af56ec [CI Skip] release/stable 13.2.3
skip-checks: true
2024-11-11 15:30:23 +00:00
Tarik Gul 367633a612 13.2.3 (#1960) 2024-11-11 17:24:04 +02:00
github-actions[bot] b127f678e9 [CI Skip] bump/beta 13.2.3-1-x
skip-checks: true
2024-11-11 15:06:22 +00:00
Tarik Gul 3404ad2945 Bump dev to 0.82.1 (#1959) 2024-11-11 16:59:56 +02:00
github-actions[bot] 4059615d66 [CI Skip] bump/beta 13.2.3-0-x
skip-checks: true
2024-11-05 14:54:53 +00:00
Dmitrii Novikov be9739ee9f Add Vara support to Generic Ledger App (#1958)
* add 'Vara' support to the Generic Ledger App

* add 'Vara Testnet' support to the Generic Ledger App

* remove testnet entry
2024-11-05 09:48:22 -05:00
github-actions[bot] 6ec09907a2 [CI Skip] release/stable 13.2.2
skip-checks: true
2024-10-28 15:40:57 +00:00
Tarik Gul 677a778833 13.2.2 (#1956) 2024-10-28 17:35:01 +02:00
github-actions[bot] fa90f0a747 [CI Skip] bump/beta 13.2.2-2-x
skip-checks: true
2024-10-28 14:02:14 +00:00
Wil Wade e721c4f508 Add Frequency to the Generic Ledger App (#1955) 2024-10-28 09:56:24 -04:00
github-actions[bot] 7f5bd09322 [CI Skip] bump/beta 13.2.2-1-x
skip-checks: true
2024-10-23 13:32:49 +00:00
Leonardo Razovic 5d6244fc0b feat: add Polimec (#1945) 2024-10-23 09:26:59 -04:00
github-actions[bot] 58f12c4257 [CI Skip] bump/beta 13.2.2-0-x
skip-checks: true
2024-10-22 14:30:05 +00:00
Tarik Gul 038d20b5e7 Bump yarn to 4.5.1 (#1953) 2024-10-22 17:24:18 +03:00
github-actions[bot] c9d8c52567 [CI Skip] release/stable 13.2.1
skip-checks: true
2024-10-21 12:56:29 +00:00
Tarik Gul 3b85773636 13.2.1 (#1952) 2024-10-21 15:50:45 +03:00
github-actions[bot] 269740b775 [CI Skip] bump/beta 13.1.2-6-x
skip-checks: true
2024-10-21 03:07:39 +00:00
Tarik Gul fc732b8c44 Bump dev to 0.81.2 (#1951) 2024-10-21 06:01:55 +03:00
github-actions[bot] 2c4deb3f9d [CI Skip] bump/beta 13.1.2-5-x
skip-checks: true
2024-10-21 02:48:41 +00:00
Tarik Gul ebcb6857ad Bump polkadot/wasm to 7.4.1 (#1950) 2024-10-21 05:42:43 +03:00
github-actions[bot] 0ff31d7980 [CI Skip] bump/beta 13.1.2-4-x
skip-checks: true
2024-10-16 22:22:44 +00:00
Tarik Gul d897f25546 Update ws and deps (#1949)
* Update ws and deps

* fix tests
2024-10-17 01:16:53 +03:00
github-actions[bot] 3c431d5a01 [CI Skip] bump/beta 13.1.2-3-x
skip-checks: true
2024-10-16 15:10:34 +00:00
Tarik Gul 55ae71125d Update ledger deps (#1948) 2024-10-16 18:04:38 +03:00
github-actions[bot] fcd8cee7f6 [CI Skip] bump/beta 13.1.2-2-x
skip-checks: true
2024-10-16 14:12:27 +00:00
Tarik Gul 8aa4e60c4c Bump yarn to 4.5.0 (#1946) 2024-10-16 17:06:39 +03:00
github-actions[bot] 85665dfa20 [CI Skip] bump/beta 13.1.2-1-x
skip-checks: true
2024-10-16 13:49:06 +00:00
Tarik Gul 5f8f3e6309 Fix Deno CI Build (#1947) 2024-10-16 16:43:10 +03:00
github-actions[bot] 166845e367 [CI Skip] bump/beta 13.1.2-0-x
skip-checks: true
2024-09-18 12:33:52 +00:00
Cameron Fairchild 7c7233efd1 Add bittensor to genericLedgerApps (#1941)
* add bittensor to genericLedgerApps

* add CLA to the knownLedger obj
2024-09-18 08:28:02 -04:00
github-actions[bot] cb7f0da916 [CI Skip] release/stable 13.1.1
skip-checks: true
2024-09-16 13:04:16 +00:00
Tarik Gul 7d654c236f 13.1.1 (#1943)
* 13.0.3

* Make release for 13.1.1

* fix changelog
2024-09-16 15:58:19 +03:00
github-actions[bot] 6b4d9aac29 [CI Skip] bump/beta 13.0.3-9-x
skip-checks: true
2024-09-11 18:10:00 +00:00
Tarik Gul 4f863ddc29 Bump yarn to 4.1.1 (#1940) 2024-09-11 21:04:06 +03:00
github-actions[bot] a4a85a3a5d [CI Skip] bump/beta 13.0.3-8-x
skip-checks: true
2024-09-11 17:48:28 +00:00
Tarik Gul 2a6669c25d Add Encointer and adjust tests (#1939) 2024-09-11 20:42:39 +03:00
github-actions[bot] cb4c9fd90a [CI Skip] bump/beta 13.0.3-7-x
skip-checks: true
2024-08-30 14:58:36 +00:00
Jakub Pánik 28beb44374 HydraDX -> Hydration rebrand (#1923)
* hydration rebrand

* Update packages/hw-ledger/src/defaults.ts
2024-08-30 10:52:42 -04:00
github-actions[bot] 4a4847b032 [CI Skip] bump/beta 13.0.3-6-x
skip-checks: true
2024-08-30 12:54:02 +00:00
Tarik Gul 506c20a900 Update ss58 (#1937) 2024-08-30 15:48:15 +03:00
github-actions[bot] 736656f34f [CI Skip] bump/beta 13.0.3-5-x
skip-checks: true
2024-08-29 13:39:47 +00:00
Tarik Gul 31274916f9 Bump dev, and typescript (#1936) 2024-08-29 16:33:50 +03:00
github-actions[bot] 6e1afdc2f8 [CI Skip] bump/beta 13.0.3-4-x
skip-checks: true
2024-08-14 21:06:32 +00:00
Tarik Gul fd26d223be Bump yarn to 4.4.0 (#1935) 2024-08-15 00:00:35 +03:00
github-actions[bot] 86d8c81c27 [CI Skip] bump/beta 13.0.3-3-x
skip-checks: true
2024-08-14 19:54:56 +00:00
Tarik Gul 2de22cbb31 Update all deps that can do patch releases (#1934) 2024-08-14 22:49:01 +03:00
github-actions[bot] c1b8098b9e [CI Skip] bump/beta 13.0.3-2-x
skip-checks: true
2024-07-22 17:36:18 +00:00
Tarik Gul ee0ed25a83 Bump @substrate/ss58-registry to 1.49.0 (#1932) 2024-07-22 20:30:33 +03:00
github-actions[bot] 7ef452bdf0 [CI Skip] bump/beta 13.0.3-1-x
skip-checks: true
2024-07-20 20:52:54 +00:00
Tarik Gul eb41ab5bed Revert slip44 change (#1931) 2024-07-20 23:47:07 +03:00
github-actions[bot] 6947b1e4d9 [CI Skip] bump/beta 13.0.3-0-x
skip-checks: true
2024-07-16 04:48:46 +00:00
Tarik Gul 527b4f0eeb Remove slip44, and replace with POLKADOT_SLIP (#1930) 2024-07-16 07:42:57 +03:00
github-actions[bot] 44f7443d13 [CI Skip] release/stable 13.0.2
skip-checks: true
2024-07-13 00:18:37 +00:00
Tarik Gul 2b800577a5 13.0.2 (#1929)
* 13.0.2

* credit
2024-07-13 03:12:51 +03:00
github-actions[bot] c9ca01e96b [CI Skip] bump/beta 13.0.2-0-x
skip-checks: true
2024-07-12 23:22:45 +00:00
Lovish Arora ca93f3337f Add peaq support for ledger (#1928) 2024-07-12 19:16:57 -04:00
github-actions[bot] 557a681fe9 [CI Skip] release/stable 13.0.1
skip-checks: true
2024-07-12 17:51:16 +00:00
Tarik Gul 97b1fdf089 13.0.1 (#1927)
* 13.0.1

* Fix changelog
2024-07-12 13:45:20 -04:00
github-actions[bot] 9971684972 [CI Skip] bump/beta 12.6.3-13-x
skip-checks: true
2024-07-12 16:29:52 +00:00
Tarik Gul 04ab9dd77d Bump yarn to 4.3.1 (#1926) 2024-07-12 19:23:58 +03:00
github-actions[bot] b2bf9f4d53 [CI Skip] bump/beta 12.6.3-12-x
skip-checks: true
2024-07-12 15:59:29 +00:00
Tarik Gulandbee344 4d629fd8ce Add support for latest ledger app (#1925)
* Update ledger deps

* Update code to fit within interface

* additional changes

* fix import

* Get a working version with ledger

* Add metaUrl

* Ensure no breaking changes by keeping legacy Ledger class

* Update to include signWithMetadata

* lint

* Ensure error code is part of the message

* Update interface

* Fix address

* remove wrapped bytes for sign with metadata

* rolled back derivation path changes

* Update naming

* Fix inline docs

* Deprecate Ledger

---------

Co-authored-by: bee344 <alberto.penayo@parity.io>
2024-07-12 11:53:35 -04:00
github-actions[bot] 37fa211fdb [CI Skip] bump/beta 12.6.3-11-x
skip-checks: true
2024-05-14 00:45:17 +00:00
Tarik Gul a4a9a3dead Bump yarn to 4.2.2 (#1922) 2024-05-14 03:39:22 +03:00
github-actions[bot] e025195a9b [CI Skip] bump/beta 12.6.3-10-x
skip-checks: true
2024-05-14 00:21:30 +00:00
Tarik Gul 744e4c72d5 Bump @polkadot/dev to 0.79.1 w/ topo sort (#1921) 2024-05-14 03:15:44 +03:00
github-actions[bot] f23f0944a8 [CI Skip] bump/beta 12.6.3-9-x
skip-checks: true
2024-04-08 17:31:00 +00:00
Tarik Gul 6e28612f34 Update ci to checkout and setup_node v4 (#1918) 2024-04-08 20:25:08 +03:00
github-actions[bot] 57b0601f9b [CI Skip] bump/beta 12.6.3-8-x
skip-checks: true
2024-03-26 01:12:02 +00:00
Tarik Gul ee9d76639c Bump yarn to 4.1.1 (#1915) 2024-03-26 03:06:57 +02:00
github-actions[bot] db25938ad7 [CI Skip] bump/beta 12.6.3-7-x
skip-checks: true
2024-02-17 14:09:08 +00:00
Tarik Gul 175b0ef307 chore(yarn): update yarn to 4.1.0 (#1913) 2024-02-17 16:03:52 +02:00
github-actions[bot] 944c50d015 [CI Skip] bump/beta 12.6.3-6-x
skip-checks: true
2024-02-17 02:04:09 +00:00
Tarik Gul 191db8ea10 ci: add user (TarikGul) to auto-approve (#1914) 2024-02-17 03:58:55 +02:00
github-actions[bot] 095db555ba [CI Skip] bump/beta 12.6.3-5-x
skip-checks: true
2024-01-24 06:17:12 +00:00
Jaco a23989ca9d Bump deps (#1912) 2024-01-24 08:11:46 +02:00
github-actions[bot] a82ebdf6f9 [CI Skip] bump/beta 12.6.3-4-x
skip-checks: true
2024-01-09 07:35:28 +00:00
Jaco e6fbf01aa1 Comments around pair encode/decode 1-3 (#1910)
* Comments around pair generation 1-3

* Encoding comments
2024-01-09 09:30:21 +02:00
github-actions[bot] 00876f0b64 [CI Skip] bump/beta 12.6.3-3-x
skip-checks: true
2024-01-08 13:13:36 +00:00
Jaco 22aab4a4e6 2024 (#1909) 2024-01-08 15:08:27 +02:00
github-actions[bot] 6971012f4a [CI Skip] bump/beta 12.6.3-2-x
skip-checks: true
2023-12-19 10:31:18 +00:00
Jaco fc217b66ce Bump dev (#1905) 2023-12-19 12:26:12 +02:00
github-actions[bot] fb42e8f7ee [CI Skip] bump/beta 12.6.3-1-x
skip-checks: true
2023-12-19 08:48:01 +00:00
Jaco b4e3ed0a42 Bump dev w/ sideEffects adjustments (#1904) 2023-12-19 10:42:57 +02:00
github-actions[bot] e1218157a3 [CI Skip] bump/beta 12.6.3-0-x
skip-checks: true
2023-12-19 08:20:52 +00:00
Jaco 2dc171639d Bump dev w/ detectPackage adjustments (#1903)
* Bump dev w/ detectPackage adjustments

* Fix spec import

* Adjust line flow
2023-12-19 10:15:38 +02:00
github-actions[bot] 4da1e8ba62 [CI Skip] release/stable 12.6.2
skip-checks: true
2023-12-18 09:47:28 +00:00
Jaco d498ad4424 12.6.2 (#1902) 2023-12-18 11:42:21 +02:00
github-actions[bot] 9a9650261b [CI Skip] bump/beta 12.6.2-1-x
skip-checks: true
2023-12-18 08:35:49 +00:00
Jaco 6dfff0d40c Bump yarn berry, bump deps (#1901) 2023-12-18 10:30:39 +02:00
github-actions[bot] 0770bed5fd [CI Skip] bump/beta 12.6.2-0-x
skip-checks: true
2023-12-12 05:39:14 +00:00
Jaco 6fde7bc5a0 Bump dev deps (w/ TS 5.3.3.) (#1900)
* Bump dev deps (w/ TS 5.3.3.)

* Deno override to any

* Exdplicit around esm.sh work-around
2023-12-12 07:33:59 +02:00
github-actions[bot] f55e88c116 [CI Skip] release/stable 12.6.1
skip-checks: true
2023-11-18 05:02:49 +00:00
Jaco abd4cfdd1f 12.6.1 (#1897) 2023-11-18 06:57:34 +02:00
github-actions[bot] f261ea2924 [CI Skip] bump/beta 12.5.2-10-x
skip-checks: true
2023-11-17 19:50:01 +00:00
Jaco f14d2681b1 Fix build for esm/cjs warning additions (#1896) 2023-11-17 21:44:51 +02:00
github-actions[bot] b9be030f12 [CI Skip] bump/beta 12.5.2-9-x
skip-checks: true
2023-11-17 19:14:46 +00:00
Chris bc103d9479 Get rid of warnings for dual esm and cjs packages of the same version (#1890)
* Get rid of warnings for dual esm and cjs packages of the same version

* Add command line flag for suppressing ESM CJS warnings when all packages are of the same version
2023-11-17 21:09:29 +02:00
github-actions[bot] c76c754741 [CI Skip] bump/beta 12.5.2-8-x
skip-checks: true
2023-11-17 14:40:49 +00:00
Jaco bd21e730b3 Adjust isRiscV helper to check for PVM\0 bytes (#1895)
* Adjust `isRiscV` helper to check for `PVM\0` bytes

* Also check for ELF

* Adjust tests

* Update description
2023-11-17 16:35:32 +02:00
github-actions[bot] a2cfdb8ca7 [CI Skip] bump/beta 12.5.2-7-x
skip-checks: true
2023-11-17 10:16:21 +00:00
Jaco 4857de9f38 Bump wasm + slight adj. to logger process.env (#1894)
* Bump wasm + slight adj. to logger process.env

* Adjust for Deno

* Adjust globalThis definition

* Adjust
2023-11-17 12:10:53 +02:00
github-actions[bot] d525b8c92d [CI Skip] bump/beta 12.5.2-6-x
skip-checks: true
2023-11-17 08:40:25 +00:00
Jaco 2afbce2652 Bump dev deps, drop Node 16 (#1892)
* Bump dev deps, drop Node 16

* Rebuild networks
2023-11-17 10:35:10 +02:00
github-actions[bot] 3c7525649e [CI Skip] bump/beta 12.5.2-5-x
skip-checks: true
2023-10-23 08:36:24 +00:00
Jaco 6ebcc2dd6d Bump dev deps (#1888) 2023-10-23 11:30:02 +03:00
github-actions[bot] 120438d7e6 [CI Skip] bump/beta 12.5.2-4-x
skip-checks: true
2023-10-15 10:50:18 +00:00
Jaco f5f1bc6f4f Bump TS (#1887) 2023-10-15 13:43:48 +03:00
github-actions[bot] 28d5302fd6 [CI Skip] bump/beta 12.5.2-3-x
skip-checks: true
2023-10-11 08:58:45 +00:00
Jaco 773cc29b11 Bump deps (#1886) 2023-10-11 11:51:04 +03:00
github-actions[bot] a20c7eb2e5 [CI Skip] bump/beta 12.5.2-2-x
skip-checks: true
2023-10-03 06:07:45 +00:00
Jaco 487d0d9a57 Bump dev deps (#1884)
* Bump dev deps

* CHANGELOG
2023-10-03 09:01:15 +03:00
github-actions[bot] a910e9ce6f [CI Skip] bump/beta 12.5.2-1-x
skip-checks: true
2023-09-23 17:44:23 +00:00
Jaco 1062de7aa8 Bump deps (#1883) 2023-09-23 20:36:41 +03:00
github-actions[bot] 4cabc67b24 [CI Skip] bump/beta 12.5.2-0-x
skip-checks: true
2023-09-23 14:03:03 +00:00
Yaroslav Bolyukin 13bc84e30b Add quartz support for ledger, update unique slip-0044 identifier (#1882)
* build: bump ledger-substrate dependency

* fix: update slip-0044 id for unique

* feat(ledger): add quartz support

* build: update yarn.lock
2023-09-23 16:56:57 +03:00
github-actions[bot] 67fe7738d8 [CI Skip] release/stable 12.5.1
skip-checks: true
2023-09-15 05:53:02 +00:00
Jaco 13c6b4e553 12.5.1 (#1881) 2023-09-15 08:45:57 +03:00
github-actions[bot] 9306f9db92 [CI Skip] bump/beta 12.4.3-7-x
skip-checks: true
2023-09-14 18:24:39 +00:00
Leonardo Custodio 62a30f258e Ledger support (#1879) 2023-09-14 21:18:10 +03:00
github-actions[bot] 81609aba59 [CI Skip] bump/beta 12.4.3-6-x
skip-checks: true
2023-09-14 05:19:48 +00:00
Jaco 301d73d13f Bump deps (w/ ledger) (#1880) 2023-09-14 08:13:48 +03:00
github-actions[bot] 92abf4463d [CI Skip] bump/beta 12.4.3-5-x
skip-checks: true
2023-09-06 10:02:03 +00:00
peetzweg/ b018f78b77 adds isRiscV guard function similar to isWasm (#1878) 2023-09-06 12:55:36 +03:00
github-actions[bot] 608117f04a [CI Skip] bump/beta 12.4.3-4-x
skip-checks: true
2023-08-31 05:13:47 +00:00
Jaco 2ac00565b0 Bump deps (#1877) 2023-08-31 08:07:35 +03:00
github-actions[bot] 673a59af58 [CI Skip] bump/beta 12.4.3-3-x
skip-checks: true
2023-08-30 09:13:53 +00:00
Jaco aa394fe7cd Explicit note for test genesis (standalone or para) (#1876)
* Explicit note for test genesis (standalone or para)

* Add test for testnet exclusions

* Extract keys
2023-08-30 12:07:29 +03:00
github-actions[bot] ee7f2cc7f5 [CI Skip] bump/beta 12.4.3-2-x
skip-checks: true
2023-08-30 08:32:15 +00:00
Jaco da6efc821e Add additional comments on type interfaces (#1875) 2023-08-30 11:25:10 +03:00
github-actions[bot] a3b884d437 [CI Skip] bump/beta 12.4.3-1-x
skip-checks: true
2023-08-30 06:37:14 +00:00
Jaco 560c054750 Bump dev deps (#1874) 2023-08-30 09:31:15 +03:00
github-actions[bot] 09621d0010 [CI Skip] bump/beta 12.4.3-0-x
skip-checks: true
2023-08-24 05:17:05 +00:00
Jaco 37a81d9594 Bump deps (noble hashes/curves) (#1873)
* Bump deps (noble hashes/curves)

* Adjust dep range
2023-08-24 08:10:54 +03:00
github-actions[bot] 62182bae03 [CI Skip] release/stable 12.4.2
skip-checks: true
2023-08-23 09:55:33 +00:00
Jaco 2ee03a5f81 12.4.2 (#1872) 2023-08-23 12:48:09 +03:00
github-actions[bot] 7a5a88a135 [CI Skip] bump/beta 12.4.2-5-x
skip-checks: true
2023-08-23 09:09:55 +00:00
Jaco f4e0e2111f Extend u8aToBuffer check with hasBuffer (#1871)
* Extend u8aToBuffer check with hasBuffer

* CHANGELOG

* Always return Uint8Array

* New instance of fallback
2023-08-23 12:01:59 +03:00
github-actions[bot] aac902011e [CI Skip] bump/beta 12.4.2-4-x
skip-checks: true
2023-08-23 08:29:44 +00:00
Jaco a030330808 Additional test cleanups (#1870)
* Additional test cleanups

* More compact test loops

* Correct float expected values

* Adjust
2023-08-23 11:23:45 +03:00
github-actions[bot] d108beafd4 [CI Skip] bump/beta 12.4.2-3-x
skip-checks: true
2023-08-23 06:21:04 +00:00
Jaco 90e20ed4d2 Some small test loop cleanups (#1869) 2023-08-23 09:14:55 +03:00
github-actions[bot] 723ec10fa1 [CI Skip] bump/beta 12.4.2-2-x
skip-checks: true
2023-08-22 17:56:58 +00:00
Jaco cf9082e03a Adjust BE u8aTo{Bn, BigInt, Number} check (#1868)
* Adjust BE u8aTo{Bn, BigInt, Numer} check

* Adjust function names (liberal find-and-replace)
2023-08-22 20:50:50 +03:00
github-actions[bot] 3dce4fe04a [CI Skip] bump/beta 12.4.2-1-x
skip-checks: true
2023-08-22 17:16:39 +00:00
Jaco 55ebc4f0d9 Check sign flag for i{8, 16, 32, ...} conversions (#1867)
* Check sign flag for i{8, 16, 32, ...} conversions

* Ensure negative path is tested on i32 perf

* CHANGELOG

* Comment check on top-most signed bit

* toBn test array

* toNumber uses exposed toBn tests

* Re-use tests in toBn

* Re-use expectations inside bnToU8a

* Remove explicit BE (swap to non-optimal reverse)

* Adjust

* Remove defunct "only BE" comment

* typo

* Use bnToU8a tests in biToU8a

* Flatten tests

* Additional tests

* Additional tests
2023-08-22 20:08:30 +03:00
github-actions[bot] ce2122e9fa [CI Skip] bump/beta 12.4.2-0-x
skip-checks: true
2023-08-20 06:55:29 +00:00
Jaco 0fb55fe633 Bump deps (#1865) 2023-08-20 09:49:19 +03:00
github-actions[bot] adca13bc8c [CI Skip] release/stable 12.4.1
skip-checks: true
2023-08-17 12:30:06 +00:00
Jaco b939c3593c 12.4.1 (#1864) 2023-08-17 15:21:30 +03:00
github-actions[bot] aa70b81a89 [CI Skip] bump/beta 12.3.3-12-x
skip-checks: true
2023-08-17 09:04:14 +00:00
Jaco f3e1d6beda Bump deps (#1863)
* Bump deps

* Adjust Buffer* types
2023-08-17 11:56:46 +03:00
github-actions[bot] 754bc4dc21 [CI Skip] bump/beta 12.3.3-11-x
skip-checks: true
2023-08-16 09:28:29 +00:00
Jaco a8df82dfe0 Update internal buffer types (#1862)
* Update internal buffer types

* u8aToBuffer/isBuffer does not require Buffer type

* Re-add BufferObj equals
2023-08-16 12:22:18 +03:00
github-actions[bot] 4ff56f5cfe [CI Skip] bump/beta 12.3.3-10-x
skip-checks: true
2023-08-16 08:18:29 +00:00
Jaco 1fd9f04458 Bump dev (#1861)
* Bump dev

* Adjust linting
2023-08-16 11:12:06 +03:00
github-actions[bot] a28306f487 [CI Skip] bump/beta 12.3.3-9-x
skip-checks: true
2023-08-16 06:23:08 +00:00
Jaco 19941bcb61 Bump deps (#1860) 2023-08-16 09:16:49 +03:00
github-actions[bot] 2cb85866ab [CI Skip] bump/beta 12.3.3-8-x
skip-checks: true
2023-08-01 13:10:02 +00:00
Jaco 8556de1fa2 Bump dev deps (#1859) 2023-08-01 16:02:08 +03:00
github-actions[bot] 143d070d21 [CI Skip] bump/beta 12.3.3-7-x
skip-checks: true
2023-07-27 11:13:56 +00:00
Jaco 2a53b1121e Bump deps (#1857) 2023-07-27 14:06:32 +03:00
github-actions[bot] 0733137f79 [CI Skip] bump/beta 12.3.3-6-x
skip-checks: true
2023-07-21 06:45:20 +00:00
Jaco cc918660cb Bump deps (#1856) 2023-07-21 09:38:52 +03:00
github-actions[bot] 3527f8c7d9 [CI Skip] bump/beta 12.3.3-5-x
skip-checks: true
2023-07-15 07:04:24 +00:00
Jaco 41caf2fd6d Bump dev (w/ ts-eslint updates) (#1854)
* Bump dev (w/ ts-eslint updates)

* Adjust ipfs compat check
2023-07-15 09:57:35 +03:00
github-actions[bot] d407513dd1 [CI Skip] bump/beta 12.3.3-4-x
skip-checks: true
2023-07-06 07:35:28 +00:00
Jaco bd76349552 Bump deps (#1853)
* Bump deps

* Rebuild networks test
2023-07-06 10:29:31 +03:00
github-actions[bot] 0ec894b732 [CI Skip] bump/beta 12.3.3-3-x
skip-checks: true
2023-06-27 08:42:17 +00:00
Jaco be4cb52dd3 Bump deps (#1851)
* Bump deps

* Update
2023-06-27 11:36:14 +03:00
github-actions[bot] 456eaeeb94 [CI Skip] bump/beta 12.3.3-2-x
skip-checks: true
2023-06-21 06:22:14 +00:00
Jaco 0ec50b6159 Support for signRaw on Ledger SubstrateApp (#1849)
* Support for signRaw on Ledger SubstrateApp

* Adjust with callback return

* Ensure message is wrapped before signing
2023-06-21 09:15:10 +03:00
github-actions[bot] 98336fd2e5 [CI Skip] bump/beta 12.3.3-1-x
skip-checks: true
2023-06-21 05:30:22 +00:00
Jaco 7b3bbd3ef2 Bump deps (#1850) 2023-06-21 08:24:21 +03:00
github-actions[bot] 49afd1fe09 [CI Skip] bump/beta 12.3.3-0-x
skip-checks: true
2023-06-16 06:42:19 +00:00
Jaco 0df17104d5 Use import.meta.url instead of process.cwd() (#1847) 2023-06-16 09:35:40 +03:00
github-actions[bot] db8434559e [CI Skip] release/stable 12.3.2
skip-checks: true
2023-06-12 05:27:44 +00:00
Jaco eaf9d97ae3 12.3.2 (#1846) 2023-06-12 08:20:17 +03:00
github-actions[bot] 3e6d86b768 [CI Skip] release/stable 12.3.1
skip-checks: true
2023-06-11 06:26:55 +00:00
Jaco 8aab41648e 12.3.1 (#1845) 2023-06-11 09:20:32 +03:00
github-actions[bot] 4a535c08c7 [CI Skip] bump/beta 12.2.3-3-x
skip-checks: true
2023-06-10 08:09:54 +00:00
Jaco 715486d54e Additional adjustments to keyring types (#1844) 2023-06-10 11:01:23 +03:00
github-actions[bot] 1073dc14aa [CI Skip] bump/beta 12.2.3-2-x
skip-checks: true
2023-06-10 04:50:38 +00:00
Jaco 5cca95e855 Adjust object index typings (#1843)
* Adjust object index typings

* Update packages/util/src/is/childClass.ts

* Expand meta definition

* Extend meta with extension info

* Adjust

* CHANGELOG
2023-06-10 07:44:28 +03:00
github-actions[bot] 942b623273 [CI Skip] bump/beta 12.2.3-1-x
skip-checks: true
2023-06-06 05:37:49 +00:00
Jaco eea99656ad Only allow padding characters in base64 strings (#1842)
* Only allow padding characters in base64 strings

* Explicit padding sequence error
2023-06-06 08:31:44 +03:00
github-actions[bot] 04b6df9ac5 [CI Skip] bump/beta 12.2.3-0-x
skip-checks: true
2023-06-05 18:29:35 +00:00
Carlo Sala d5132b56de feat(networks): add zeitgeist Ledger support (#1840)
* feat(networks): add zeitgeist Ledger support

* fix(networks): update test
2023-06-05 21:23:31 +03:00
github-actions[bot] 1fdc2c8dae [CI Skip] release/stable 12.2.2
skip-checks: true
2023-06-04 09:06:26 +00:00
Jaco b6a2693e5f 12.2.2 (#1839) 2023-06-04 11:58:18 +03:00
github-actions[bot] 8b3687e062 [CI Skip] bump/beta 12.2.2-7-x
skip-checks: true
2023-06-04 08:30:55 +00:00
Jaco 3a8429b687 Bump noble/{curves, hashes} (#1838) 2023-06-04 11:24:40 +03:00
github-actions[bot] 26e9b01198 [CI Skip] bump/beta 12.2.2-6-x
skip-checks: true
2023-06-02 10:51:44 +00:00
Jaco 76d71d946d Bump deps (w/ TS 5.1) (#1837)
* Bump deps (w/ TS 5.1)

* Adjust fallback

* Revert promisify adjustments
2023-06-02 13:44:54 +03:00
github-actions[bot] 0ebc7bd374 [CI Skip] bump/beta 12.2.2-5-x
skip-checks: true
2023-05-30 08:57:58 +00:00
Jaco d94c126744 Apply missing count assignment in for loops (#1836) 2023-05-30 11:50:04 +03:00
github-actions[bot] 86597dcb17 [CI Skip] bump/beta 12.2.2-4-x
skip-checks: true
2023-05-28 07:53:44 +00:00
Jaco 1be682827b Bump deps (incl Ledger) (#1835) 2023-05-28 10:47:42 +03:00
github-actions[bot] 081b6b4f2b [CI Skip] bump/beta 12.2.2-3-x
skip-checks: true
2023-05-25 07:37:17 +00:00
Jaco 7dc38e78cf jg-bump-deps (#1834) 2023-05-25 10:29:17 +03:00
github-actions[bot] dcf214f250 [CI Skip] bump/beta 12.2.2-2-x
skip-checks: true
2023-05-21 09:48:48 +00:00
Jaco 2e82528e1b Bump dev (w/ eslint config adj) (#1832) 2023-05-21 12:42:39 +03:00
github-actions[bot] 090b91910f [CI Skip] bump/beta 12.2.2-1-x
skip-checks: true
2023-05-18 09:05:38 +00:00
Jaco 058d197646 Adjust tsconfig usage (w/ latest dev) (#1831) 2023-05-18 11:59:17 +03:00
github-actions[bot] 0fca8904e6 [CI Skip] bump/beta 12.2.2-0-x
skip-checks: true
2023-05-18 05:35:04 +00:00
Jaco 0bf7bc416a Bump dev deps (#1830) 2023-05-18 08:29:07 +03:00
github-actions[bot] ea08763307 [CI Skip] release/stable 12.2.1
skip-checks: true
2023-05-13 08:25:36 +00:00
Jaco 5272645abe 12.2.1 (#1829) 2023-05-13 11:17:53 +03:00
Jaco e5373c35c8 Unroll u8aToBigInt loops (#1821)
* Unroll u8aToBigInt loops

* Bump dev

* Rolling tests
2023-05-13 10:51:46 +03:00
github-actions[bot] b73b96e412 [CI Skip] bump/beta 12.1.3-2-x
skip-checks: true
2023-05-06 09:00:28 +00:00
Jaco 18d24bf509 Bump dev (#1827) 2023-05-06 11:52:33 +03:00
github-actions[bot] fe230f143f [CI Skip] bump/beta 12.1.3-1-x
skip-checks: true
2023-05-05 07:07:53 +00:00
Jaco 6357c1e040 Update Constructor interface params (#1823)
* Update Constructor interface params

* Adjust

* Adjust
2023-05-05 10:01:56 +03:00
github-actions[bot] 1876efe13e [CI Skip] bump/beta 12.1.3-0-x
skip-checks: true
2023-05-05 06:46:01 +00:00
Jaco 9de142b5f6 Bump deps (#1826) 2023-05-05 09:39:58 +03:00
github-actions[bot] e5cb0ba2b4 [CI Skip] release/stable 12.1.2
skip-checks: true
2023-05-01 16:14:41 +00:00
Jaco dba5d3e7b3 Fix typings for isChildClass (#1824)
* Fix typings for isChildClass

* Adjust
2023-05-01 19:08:41 +03:00
github-actions[bot] 8ccfecfff8 [CI Skip] bump/beta 12.1.2-0-x
skip-checks: true
2023-04-29 10:42:54 +00:00
Jaco f2e79ffe67 Align u8aToBigInt tests with u8aToBn (#1820)
* Align u8aToBigInt tests with u8aToBn

* Remove unused import
2023-04-29 13:33:53 +03:00
github-actions[bot] e7f595a11f [CI Skip] release/stable 12.1.1
skip-checks: true
2023-04-29 05:50:45 +00:00
Jaco 770471aef0 12.1.1 (#1819) 2023-04-29 08:44:25 +03:00
github-actions[bot] 6b1ff0036e [CI Skip] bump/beta 12.0.2-2-x
skip-checks: true
2023-04-28 06:13:30 +00:00
Jaco fee81b89ac Bump deps (#1818) 2023-04-28 09:07:41 +03:00
github-actions[bot] c4d5b8e1ae [CI Skip] bump/beta 12.0.2-1-x
skip-checks: true
2023-04-26 09:36:39 +00:00
Jaco 5674b1df67 Bump deps w/ export ordering (#1817) 2023-04-26 12:29:21 +03:00
github-actions[bot] 5ccb3e85f8 [CI Skip] bump/beta 12.0.2-0-x
skip-checks: true
2023-04-24 04:59:26 +00:00
Jaco 785a23433d Flatten Buffer | Uint8Array types (#1816)
* Flatten Buffer | Uint8Array types

* Remove dangling Buffer references

* CHANGELOG

* Adjust
2023-04-24 07:53:31 +03:00
github-actions[bot] bead42ca5f [CI Skip] release/stable 12.0.1
skip-checks: true
2023-04-22 07:44:07 +00:00
Jaco 2d2a1a5989 12.0.1 (#1815)
* 12.0.1

* Inline xxhash single-use

* Adjust comments
2023-04-22 10:37:53 +03:00
github-actions[bot] db4dde0a57 [CI Skip] bump/beta 11.1.4-19-x
skip-checks: true
2023-04-21 08:23:53 +00:00
Jaco b5d83f8836 Allow wordlist? param to mnemonic* functions (#1814) 2023-04-21 11:16:43 +03:00
github-actions[bot] cdf6cc6096 [CI Skip] bump/beta 11.1.4-18-x
skip-checks: true
2023-04-21 07:34:55 +00:00
Jaco dfd07e04d4 Align x-randomvalues with webCrypto (#1782)
* Align x-randomvalues with webCrypto

* Deno export from browser

* export * for x-ws

* export * from RN

* CHANGELOG
2023-04-21 10:27:30 +03:00
github-actions[bot] f5a3a6fd73 [CI Skip] bump/beta 11.1.4-17-x
skip-checks: true
2023-04-21 07:18:16 +00:00
Jaco 51a7263d38 Bump dev (w/ Node 16+ only) (#1813)
* Bump dev (w/ Node 16+ only)

* Lint

* Fix build
2023-04-21 10:10:27 +03:00
github-actions[bot] e3b11360ab [CI Skip] bump/beta 11.1.4-16-x
skip-checks: true
2023-04-20 06:58:05 +00:00
Jaco b4bed3d801 Bump deps (#1812) 2023-04-20 09:52:10 +03:00
github-actions[bot] 1f8b573d81 [CI Skip] bump/beta 11.1.4-15-x
skip-checks: true
2023-04-15 11:37:12 +00:00
Jaco a0e5d48208 CHANGELOG (#1811) 2023-04-15 14:30:49 +03:00
github-actions[bot] 6ce32b8039 [CI Skip] bump/beta 11.1.4-14-x
skip-checks: true
2023-04-15 11:15:05 +00:00
Jaco 3ee810904e Adjust isCodec with better API alignment (#1810)
* Adjust isCodec with better API alignment

* Adjust tests

* Remove test dupes
2023-04-15 14:07:44 +03:00
github-actions[bot] ed73a7912b [CI Skip] bump/beta 11.1.4-13-x
skip-checks: true
2023-04-14 07:28:50 +00:00
Jaco 4ec2cf9e43 Small adjustment to x-* exports (#1809) 2023-04-14 10:22:53 +03:00
github-actions[bot] 38ac05203e [CI Skip] release/beta 11.1.4-12
skip-checks: true
2023-04-13 13:13:49 +00:00
Jaco bb6a2b4468 Add missing peerDependencies for x-randomvalues (#1808)
* Add missing peerDependencies for x-randomvalues

* publish
2023-04-13 16:07:34 +03:00
github-actions[bot] 3c9b20e902 [CI Skip] release/beta 11.1.4-11
skip-checks: true
2023-04-13 11:39:47 +00:00
Jaco e1a2ea49cb x-randomvalues w/ shared base64 decoding (#1807)
* x-randomvalues w/ shared base64 decoding

* Adjust

* npm publish
2023-04-13 14:33:45 +03:00
github-actions[bot] 892004563f [CI Skip] bump/beta 11.1.4-10-x
skip-checks: true
2023-04-13 06:20:56 +00:00
Jaco efe4ce8d9d Allow for wordlists in JS bip39 functions (#1805) 2023-04-13 09:14:45 +03:00
github-actions[bot] f0f561e243 [CI Skip] bump/beta 11.1.4-9-x
skip-checks: true
2023-04-12 19:52:44 +00:00
Shamilkhan 56e34586b3 Add genesis hash for Cere Network (#1806)
* Add genesis hash for Cere Network

* Put Cere Network in correct alphabet order

* Rename CereNetwork to Cere
2023-04-12 22:46:39 +03:00
github-actions[bot] 667fe8fb17 [CI Skip] bump/beta 11.1.4-8-x
skip-checks: true
2023-04-12 11:09:35 +00:00
Jaco 3fd8074877 Add missing bip39 wordlists (only en is used) (#1803) 2023-04-12 14:01:27 +03:00
github-actions[bot] 91a2eac220 [CI Skip] release/beta 11.1.4-7
skip-checks: true
2023-04-12 10:04:21 +00:00
Jaco 455ae2ccde Use @noble/curves (secp256k1 + ed25519) (#1776)
* Use @noble/curves (secp256k1 only for now)

* Re-add canonical signatures (now lowS)

* Swap tweetnacl usage for ed25519

* Adjust previously failing tests

* Adjust test for ethereum encoding

* hasBigInt for ed25519 operations

* CHANGELOG

* Publich beta to npm for size check
2023-04-12 12:58:17 +03:00
github-actions[bot] 9d43b787fd [CI Skip] bump/beta 11.1.4-6-x
skip-checks: true
2023-04-12 09:45:36 +00:00
Jaco 29551e46b0 Import box functionality from tweetnacl (#1785)
* Import box functionality from tweetnacl

* Remove box/boxOpen functionality

* Additional comment

* Import secretbox test vectors

* Allow empty base64 input

* Combine non-xor crypto_stream usage with xor

* Adjust

* inline let

* Rename tests, extract test vectors

* Adjust chnages comments

* Remove box keypair

* Remove rng set operation

* Inline adjust

* Verify adjustment
2023-04-12 12:39:31 +03:00
Jaco 103745f845 Trace tweetnacl usage (Step 5: secretbox & .open available) (#1802) 2023-04-12 12:25:41 +03:00
Jaco cd7a32cf1f Trace tweetnacl usage (step 4: apply TS types) (#1801) 2023-04-12 12:11:40 +03:00
Jaco 5004d1d79f Trace tweetnacl usage (step 3: comment all code) (#1800) 2023-04-12 11:42:15 +03:00
Jaco 2607203925 Trace tweetnacl usage (step 2: move to TS) (#1799) 2023-04-12 11:39:17 +03:00
Jaco 5abab5bf13 Trace tweetnacl usage (step 1: raw initial import) (#1798) 2023-04-12 11:35:50 +03:00
github-actions[bot] a990b4e40f [CI Skip] bump/beta 11.1.4-5-x
skip-checks: true
2023-04-12 08:14:47 +00:00
Jaco 997f8f6a51 Align x-bigint extraction with other x-* (#1797) 2023-04-12 11:08:48 +03:00
github-actions[bot] 23e055869c [CI Skip] bump/beta 11.1.4-4-x
skip-checks: true
2023-04-11 12:00:36 +00:00
Jaco de85d063a4 Bump dev (w/ lint updates) (#1795)
* Bump dev (w/ lint updates)

* Bump dev

* Adjust behavior for global setting

* Adjust versionDetect expectations
2023-04-11 14:52:49 +03:00
github-actions[bot] 5964f790b5 [CI Skip] bump/beta 11.1.4-3-x
skip-checks: true
2023-04-10 07:27:42 +00:00
Jaco a767ef68ca Bump dev (w/ eslint adjustments) (#1794) 2023-04-10 10:21:33 +03:00
github-actions[bot] c096a4981d [CI Skip] bump/beta 11.1.4-2-x
skip-checks: true
2023-04-08 08:09:52 +00:00
Jaco 7dcdef17c3 Bump TypeScript (#1793)
* Bump TypeScript

* Bump dev

* Bump dev, no npm:
2023-04-08 11:02:20 +03:00
github-actions[bot] ef839a7a42 [CI Skip] bump/beta 11.1.4-1-x
skip-checks: true
2023-04-04 05:40:36 +00:00
Jaco 7bf1706994 Update lock wf (#1791) 2023-04-04 08:31:58 +03:00
github-actions[bot] 2999987fb0 [CI Skip] bump/beta 11.1.4-0-x
skip-checks: true
2023-04-02 07:01:09 +00:00
Jaco 6ba45086b5 Move type-only imports (w/ verbatimModuleSyntax) (#1790) 2023-04-02 09:53:43 +03:00
github-actions[bot] e3c51d4b6b [CI Skip] release/stable 11.1.3
skip-checks: true
2023-04-01 07:04:11 +00:00
Jaco 1295c85df3 11.1.3 (#1789) 2023-04-01 09:58:20 +03:00
github-actions[bot] 14d66c32de [CI Skip] bump/beta 11.1.3-4-x
skip-checks: true
2023-03-31 06:24:39 +00:00
Jaco b794d22ac4 Allow empty string as valid base32/base58/base64 decoder input (#1788)
* Allow empty string as valid base32/base58/base64 decoder input

* Remove empty failure

* Validation with optional validation flag

* Empty validation
2023-03-31 09:18:38 +03:00
github-actions[bot] edb62407e2 [CI Skip] bump/beta 11.1.3-3-x
skip-checks: true
2023-03-31 05:14:41 +00:00
Jaco 45b040fbf8 Additional __PURE__ annotations (#1787)
* Additional __PURE__ annotations

* Revert as const (This _could_ yield breaking external changes)
2023-03-31 08:08:01 +03:00
github-actions[bot] 777b823317 [CI Skip] bump/beta 11.1.3-2-x
skip-checks: true
2023-03-29 04:28:57 +00:00
Cameron Fairchild c5ef717398 Add bittensor details (#1783)
* add with todo

* update genesis hash

* remove from ledger

* remove from ledger
2023-03-29 07:21:56 +03:00
github-actions[bot] 98f0933da5 [CI Skip] bump/beta 11.1.3-1-x
skip-checks: true
2023-03-25 15:52:28 +00:00
Jaco 493d0df0c1 Add repo dev req. for Node.js (#1779) 2023-03-25 17:46:33 +02:00
github-actions[bot] 5d8e92f17c [CI Skip] bump/beta 11.1.3-0-x
skip-checks: true
2023-03-25 10:57:53 +00:00
Jaco 2ce178cad2 Bump dev (w/ some node:test adjustments) (#1778) 2023-03-25 12:51:53 +02:00
github-actions[bot] 9ccac88372 [CI Skip] release/stable 11.1.2
skip-checks: true
2023-03-25 07:20:00 +00:00
Jaco 0aa441de96 11.1.2 (#1777)
* 11.1.2

* Bump dev

* Bump deps
2023-03-25 09:14:10 +02:00
github-actions[bot] 78941a3cde [CI Skip] bump/beta 11.1.2-3-x
skip-checks: true
2023-03-24 08:37:26 +00:00
Jaco 514570a5fb Additional hw-ledger cleanups (#1775)
* Additional hw-ledger cleanups

* Rename ledgerName
2023-03-24 10:29:45 +02:00
github-actions[bot] ad2da94408 [CI Skip] bump/beta 11.1.2-2-x
skip-checks: true
2023-03-24 08:14:57 +00:00
Jaco 803edbb8cc Small Ledger process dedupe (#1774)
* Small Ledger process dedupe

* Add yarn.lock
2023-03-24 10:08:45 +02:00
github-actions[bot] 94692cbbb4 [CI Skip] bump/beta 11.1.2-1-x
skip-checks: true
2023-03-24 07:43:44 +00:00
Jaco 0a27c23439 Specific per-method JSDoc for hw-ledger (#1773)
* Specific per-method JSDoc for hw-ledger

* Adjust, less types floating around
2023-03-24 09:36:42 +02:00
github-actions[bot] 0a1cfb15ef [CI Skip] bump/beta 11.1.2-0-x
skip-checks: true
2023-03-23 09:17:47 +00:00
Jaco cd494d7de0 Expand error details on invalid publicKey (#1772) 2023-03-23 11:11:53 +02:00
github-actions[bot] 4f5029118e [CI Skip] release/stable 11.1.1
skip-checks: true
2023-03-18 12:18:29 +00:00
Jaco 2df8d01186 11.1.1 (#1771) 2023-03-18 14:12:07 +02:00
github-actions[bot] f1b3240728 [CI Skip] bump/beta 11.0.3-9-x
skip-checks: true
2023-03-18 10:30:36 +00:00
Mikhail Fedosov 748b26924e feat: add 3dpass network (#1769) 2023-03-18 12:24:39 +02:00
github-actions[bot] 26f6572f29 [CI Skip] bump/beta 11.0.3-8-x
skip-checks: true
2023-03-18 10:04:15 +00:00
Jaco 8e3a75ed8d Bump deps (& remove unused overrides) (#1770) 2023-03-18 11:58:18 +02:00
github-actions[bot] c13d1b4ae6 [CI Skip] bump/beta 11.0.3-7-x
skip-checks: true
2023-03-17 06:14:08 +00:00
Jaco 17388b7865 Bump to TS 5.0 (#1768)
* Bump to TS 5.0

* Fix build
2023-03-17 08:06:31 +02:00
github-actions[bot] 85785be8cf [CI Skip] bump/beta 11.0.3-6-x
skip-checks: true
2023-03-17 05:29:15 +00:00
Jaco 211af1f999 Bump dev deps (#1767) 2023-03-17 07:22:49 +02:00
github-actions[bot] b8116fcf5a [CI Skip] bump/beta 11.0.3-5-x
skip-checks: true
2023-03-15 15:12:53 +00:00
Jaco 79593b0a70 Bump dev (#1766)
* Bump dev

* Change ref types
2023-03-15 17:06:07 +02:00
github-actions[bot] 4ecf53dcf4 [CI Skip] bump/beta 11.0.3-4-x
skip-checks: true
2023-03-15 12:08:22 +00:00
Jaco 5652023c5a Bump dev (#1765) 2023-03-15 14:02:11 +02:00
github-actions[bot] f6e667df26 [CI Skip] bump/beta 11.0.3-3-x
skip-checks: true
2023-03-14 11:19:14 +00:00
Jaco aeac277590 Remove stale workflow (#1764) 2023-03-14 13:05:34 +02:00
github-actions[bot] dca3f17b1c [CI Skip] bump/beta 11.0.3-2-x
skip-checks: true
2023-03-14 07:56:38 +00:00
Jaco b22b225252 Remove support for encrypt/decrypt on keypair (#1762)
* Remove support for encrypt/decrupt on keypair

* Update Keypair type

* Remove encrypt/decrypt tests

* Remove ed2curve dependency

* Remove export

* Adjust nobody
2023-03-14 09:41:49 +02:00
github-actions[bot] 6d1944bef9 [CI Skip] bump/beta 11.0.3-1-x
skip-checks: true
2023-03-14 07:32:48 +00:00
Jaco 357b5feb2e Adjust x-global type definitions (#1763)
* Adjust x-global type definitions

* Re-add Record<string, unknown>

* Adjust for deno
2023-03-14 09:20:50 +02:00
github-actions[bot] 354a2a4eaa [CI Skip] bump/beta 11.0.3-0-x
skip-checks: true
2023-03-12 10:14:34 +00:00
Jaco 3fd61e678a Bump dev (#1761)
* Bump dev

* Adjust dev/node/test/node.d.ts imports

* Adjust extensionless import

* Additional adjustments
2023-03-12 12:01:35 +02:00
github-actions[bot] 71d2802f00 [CI Skip] release/stable 11.0.2
skip-checks: true
2023-03-11 07:00:52 +00:00
Jaco 816e30fb0a 11.0.2 (#1760) 2023-03-11 08:49:14 +02:00
github-actions[bot] 77c6177c9a [CI Skip] bump/beta 11.0.2-4-x
skip-checks: true
2023-03-10 06:44:17 +00:00
Jaco 9f97924d33 Update GH actions (#1758) 2023-03-10 08:32:08 +02:00
github-actions[bot] d7d8edcc9b [CI Skip] bump/beta 11.0.2-3-x
skip-checks: true
2023-03-09 14:57:30 +00:00
Jaco d6047e38d3 Align tsconfig to allow moduleResolution: nodenext (#1757)
* Align tsconfig to allow moduleResolution: nodenext

* Revert node.d.ts reference types
2023-03-09 16:42:46 +02:00
github-actions[bot] 5f44768796 [CI Skip] bump/beta 11.0.2-2-x
skip-checks: true
2023-03-09 09:16:23 +00:00
Jaco 9c224f5076 Use .js imports in src (#1756)
* Use .js imports in src

* Revert node/test/node -> node/test/node.d.ts (for now)

* util-crypto

* Additional

* Adjust tsconfig aliases

* Bump dev
2023-03-09 11:04:03 +02:00
github-actions[bot] bcb7861d88 [CI Skip] bump/beta 11.0.2-1-x
skip-checks: true
2023-03-06 12:29:43 +00:00
Jaco 0b85a4d5e2 Bump dev deps (#1755) 2023-03-06 14:17:56 +02:00
github-actions[bot] c17ef47548 [CI Skip] bump/beta 11.0.2-0-x
skip-checks: true
2023-03-05 12:08:14 +00:00
Jaco df7f533491 jg-rm-babel-config (#1754) 2023-03-05 13:52:42 +02:00
github-actions[bot] 500a38e1ab [CI Skip] release/stable 11.0.1
skip-checks: true
2023-03-04 15:01:52 +00:00
Jaco 3437fb65cd 11.0.1 (#1753)
* 11.0.1

* Re-adjust for ws usage

* Correct dev dependencies

* Bump dev
2023-03-04 16:50:01 +02:00
Jaco 3d43aba4a1 Swap x-ws to use ws (#1749)
* Swap x-ws to use ws

* Revert swc usage

* Remove unneeded --env to test
2023-03-04 15:02:04 +02:00
github-actions[bot] 7cd5204fb7 [CI Skip] bump/beta 10.4.3-9-x
skip-checks: true
2023-03-03 09:30:06 +00:00
Jaco 3fdf3b5523 Bump dev & update gh workflows (#1752) 2023-03-03 11:24:21 +02:00
github-actions[bot] 8fd0fe846f [CI Skip] bump/beta 10.4.3-8-x
skip-checks: true
2023-03-01 11:20:36 +00:00
Jaco 130a59fb02 Align gh workflows (#1751)
* Align gh workflows

* continue-on-error: true
2023-03-01 13:13:43 +02:00
github-actions[bot] e6aec6d178 [CI Skip] bump/beta 10.4.3-7-x
skip-checks: true
2023-02-28 09:51:47 +00:00
Jaco 6fb73f3124 Add __PURE__ annotations for x-* exports (#1750) 2023-02-28 11:46:56 +02:00
github-actions[bot] ea96abc1a4 [CI Skip] bump/beta 10.4.3-6-x
skip-checks: true
2023-02-27 09:46:00 +00:00
Jaco 9c08fa6206 Bump dev deps (#1748)
* Bump dev deps

* Bump dev
2023-02-27 11:39:53 +02:00
github-actions[bot] 8edb2abe30 [CI Skip] bump/beta 10.4.3-5-x
skip-checks: true
2023-02-25 09:18:47 +00:00
Jaco 3e2c3a6ed8 Move test cryptoWaitReady top-level (#1747)
* Move test cryptoWaitReady top-level

* Add missing mod.ts

* Revert mod.ts add

* Add types reference for tests

* Adjust

* adjust

* node:fs & node:path
2023-02-25 11:13:51 +02:00
github-actions[bot] 1e35c5cd25 [CI Skip] bump/beta 10.4.3-4-x
skip-checks: true
2023-02-24 08:15:05 +00:00
Jaco 40dc599acc Remove usage of {describe, it}.each (#1746)
* Remove usage of {describe, it}.each

* Bump dev

* Reference test types once per module
2023-02-24 10:10:07 +02:00
github-actions[bot] d1d6fc631c [CI Skip] bump/beta 10.4.3-3-x
skip-checks: true
2023-02-22 07:20:28 +00:00
Jaco 28c6139068 Bump deps (#1745)
* Bump deps

* Bump dev
2023-02-22 09:13:21 +02:00
github-actions[bot] b00d8573fd [CI Skip] bump/beta 10.4.3-2-x
skip-checks: true
2023-02-20 15:42:30 +00:00
Jaco 6afebd70d0 Bump dev deps (#1744) 2023-02-20 17:37:21 +02:00
github-actions[bot] 1f4d423682 [CI Skip] bump/beta 10.4.3-1-x
skip-checks: true
2023-02-19 14:10:41 +00:00
Jaco 57718cacfb Small adjustment to test command params (#1743) 2023-02-19 16:06:23 +02:00
github-actions[bot] b51d4e13fb [CI Skip] bump/beta 10.4.3-0-x
skip-checks: true
2023-02-19 09:37:24 +00:00
Jaco 08af19e2d5 Bump deps (#1742) 2023-02-19 11:32:55 +02:00
github-actions[bot] 9830457c9a [CI Skip] release/stable 10.4.2
skip-checks: true
2023-02-19 08:15:26 +00:00
Jaco 4619ab6668 10.4.2 (#1741)
* 10.4.2

* dep up changelog entry
2023-02-19 10:11:47 +02:00
github-actions[bot] d886c02b23 [CI Skip] bump/beta 10.4.2-8-x
skip-checks: true
2023-02-18 11:13:59 +00:00
Jaco 7d745661b7 Bump deps (#1740)
* Bump deps

* lint fixes
2023-02-18 13:10:13 +02:00
github-actions[bot] da9c2bc10b [CI Skip] bump/beta 10.4.2-7-x
skip-checks: true
2023-02-16 12:53:16 +00:00
Carlo Sala eab8d44487 feat(networks): support ledger for pendulum (#1739) 2023-02-16 14:49:31 +02:00
github-actions[bot] 19ecae37dd [CI Skip] bump/beta 10.4.2-6-x
skip-checks: true
2023-02-15 14:44:23 +00:00
Jaco 3d3e46cb77 Adjust performance compare (#1738) 2023-02-15 16:40:39 +02:00
github-actions[bot] e09027e83d [CI Skip] bump/beta 10.4.2-5-x
skip-checks: true
2023-02-15 09:58:19 +00:00
Jaco c544e0b478 Bump deps (#1737) 2023-02-15 11:53:55 +02:00
github-actions[bot] f914061365 [CI Skip] bump/beta 10.4.2-4-x
skip-checks: true
2023-02-15 07:19:59 +00:00
Jaco 55e4e8209e Fix CI release workflow (#1736) 2023-02-15 09:15:27 +02:00
Jaco 193c9ebb37 Reset global formatBalance test side effects (#1735) 2023-02-15 08:07:56 +02:00
Jaco 5d67d92454 Use latest LTS for CI scripts (#1734) 2023-02-14 10:46:54 +02:00
github-actions[bot] 3a0d566f60 [CI Skip] bump/beta 10.4.2-3-x
skip-checks: true
2023-02-13 17:44:09 +00:00
Jaco 675f1e71b5 Bump dev (#1733) 2023-02-13 19:40:12 +02:00
github-actions[bot] 4bbf38c7e4 [CI Skip] bump/beta 10.4.2-2-x
skip-checks: true
2023-02-13 08:30:36 +00:00
Jaco fd76246c11 Enufer u8aToU8a(Buffer) return non-Buffer instance (#1731) 2023-02-13 10:26:46 +02:00
github-actions[bot] 0b14539a98 [CI Skip] bump/beta 10.4.2-1-x
skip-checks: true
2023-02-12 11:54:19 +00:00
Jaco 09b1a0e6e3 Bump dev (#1730) 2023-02-12 13:50:35 +02:00
github-actions[bot] 03e64c9120 [CI Skip] bump/beta 10.4.2-0-x
skip-checks: true
2023-02-12 10:58:52 +00:00
Jaco f848c87fde Remove it.concurrent (jest advises against use) (#1729) 2023-02-12 12:55:02 +02:00
github-actions[bot] 46a05b6a60 [CI Skip] release/stable 10.4.1
skip-checks: true
2023-02-12 09:19:44 +00:00
Jaco a9f671b501 10.4.1 (#1728) 2023-02-12 11:14:33 +02:00
github-actions[bot] f1187f5981 [CI Skip] bump/beta 10.3.2-6-x
skip-checks: true
2023-02-11 15:55:56 +00:00
Jaco 4134bf8a85 Bump deps (#1727) 2023-02-11 17:52:08 +02:00
github-actions[bot] 4709a62c0b [CI Skip] bump/beta 10.3.2-5-x
skip-checks: true
2023-02-07 13:11:55 +00:00
Jaco 900cf21bc5 Bump deps (#1726) 2023-02-07 15:08:02 +02:00
github-actions[bot] fa8229de06 [CI Skip] bump/beta 10.3.2-4-x
skip-checks: true
2023-02-07 13:00:21 +00:00
Aleš Ferlan 913bf65dab feat: allow setting of thousand/decimal separators (#1722)
* feat: allow setting of thousand/decimal separators

* fix: add file header and fix lint errors

* fix: move getSeparator to format
2023-02-07 14:56:27 +02:00
Carlo Sala 769b953983 feat(networks): support ledger for picasso (#1725) 2023-02-07 14:55:00 +02:00
github-actions[bot] 2949e12c55 [CI Skip] bump/beta 10.3.2-3-x
skip-checks: true
2023-02-05 12:11:05 +00:00
Jaco 1664a8d8a2 Bump dev (#1724) 2023-02-05 14:05:53 +02:00
github-actions[bot] ab71a25b96 [CI Skip] bump/beta 10.3.2-2-x
skip-checks: true
2023-02-05 07:55:38 +00:00
Jaco 02c1a95ea1 Bump dev (#1723) 2023-02-05 09:51:48 +02:00
github-actions[bot] 3ee6830c0e [CI Skip] bump/beta 10.3.2-1-x
skip-checks: true
2023-02-03 08:52:36 +00:00
Jaco 642724ab6d Bump deps (incl. TS) (#1721) 2023-02-03 10:48:19 +02:00
github-actions[bot] 022756e6dd [CI Skip] bump/beta 10.3.2-0-x
skip-checks: true
2023-02-03 08:02:56 +00:00
Jaco e29003f51e Add isClass helper (#1720)
* Add isClass helper

* add isOnFunction helper
2023-02-03 09:59:18 +02:00
github-actions[bot] e5c2f8f529 [CI Skip] release/stable 10.3.1
skip-checks: true
2023-01-28 07:12:58 +00:00
Jaco f7ce22b158 10.3.1 (#1719) 2023-01-28 09:09:21 +02:00
github-actions[bot] 0028d212e4 [CI Skip] bump/beta 10.2.7-10-x
skip-checks: true
2023-01-27 08:21:32 +00:00
Jaco 719c48f8f2 Bump dev (#1718)
* Bump dev

* Bump dev
2023-01-27 10:17:59 +02:00
github-actions[bot] b137f8ec8b [CI Skip] bump/beta 10.2.7-9-x
skip-checks: true
2023-01-26 08:25:25 +00:00
Jaco e93b7a3626 Expose sqrt(MAX_SAFE_INTEGER) for bi/bn (#1717) 2023-01-26 10:20:59 +02:00
github-actions[bot] 7bf2d220dd [CI Skip] bump/beta 10.2.7-8-x
skip-checks: true
2023-01-26 08:09:51 +00:00
Jaco 7efa20c066 Adjust internal character maps to operate on Uint8Array (#1685)
* Adjust internal character maps to operate on Uint8Array

* Use Uint8Array

* Actual perf testing

* Rename perf exports

* Expose specs in own tsconfig (circular)
2023-01-26 10:06:18 +02:00
Jaco f2afcfc1a7 Adjust internal character maps to operate on Uint8Array (#1685)
* Adjust internal character maps to operate on Uint8Array

* Use Uint8Array

* Actual perf testing

* Rename perf exports

* Expose specs in own tsconfig (circular)
2023-01-26 10:05:15 +02:00
github-actions[bot] 45e2a560a9 [CI Skip] bump/beta 10.2.7-7-x
skip-checks: true
2023-01-26 07:35:14 +00:00
Jaco 5b5cdae9ff Align bigint constans with those in BN (#1716) 2023-01-26 09:31:41 +02:00
github-actions[bot] 5147f64a64 [CI Skip] bump/beta 10.2.7-6-x
skip-checks: true
2023-01-25 12:51:44 +00:00
Mohsan Riaz 0116a3f1f7 Add Ternoa for ledger hardware support (#1711)
* added ternoa to hw-ledger defaults

* added Ternoa to networks defaults

* linter fixes

* re-run-CI
2023-01-25 14:48:01 +02:00
github-actions[bot] 01839b5f63 [CI Skip] bump/beta 10.2.7-5-x
skip-checks: true
2023-01-25 08:46:20 +00:00
Jaco 18d02f49fd Bump deps (w/ CHANGELOG) (#1715) 2023-01-25 10:42:41 +02:00
github-actions[bot] 12e2a44935 [CI Skip] bump/beta 10.2.7-4-x
skip-checks: true
2023-01-25 07:31:14 +00:00
Jaco 9c47980c68 Bump deps (#1714)
* Bump deps

* Bump dev

* networks rebuild
2023-01-25 09:27:36 +02:00
github-actions[bot] 14f7a5c0bb [CI Skip] bump/beta 10.2.7-3-x
skip-checks: true
2023-01-23 06:51:38 +00:00
Jaco f512f4aa27 Adjust Ledger check naming (#1713) 2023-01-23 08:47:47 +02:00
github-actions[bot] 4b9d4fa935 [CI Skip] bump/beta 10.2.7-2-x
skip-checks: true
2023-01-22 06:58:27 +00:00
Jaco 35288e81e1 Expand arrayChunk tests (#1712)
* Expand arrayChunk tests

* Bump deps

* Remove duplicated LICENSE files (copied by build)

* Bump dev
2023-01-22 08:54:33 +02:00
github-actions[bot] f95fa2e60d [CI Skip] bump/beta 10.2.7-1-x
skip-checks: true
2023-01-15 08:49:22 +00:00
Jaco 0c62a8a676 Bump dev (#1709) 2023-01-15 10:45:31 +02:00
github-actions[bot] 346989211c [CI Skip] bump/beta 10.2.7-0-x
skip-checks: true
2023-01-15 08:21:36 +00:00
Jaco ba2453457d Bump deps (#1708) 2023-01-15 10:17:14 +02:00
github-actions[bot] 9c4d409e66 [CI Skip] release/stable 10.2.6
skip-checks: true
2023-01-13 14:21:32 +00:00
Jaco 5f9e345dd4 Drop stray console.error log (#1707) 2023-01-13 16:17:51 +02:00
github-actions[bot] bf141cd874 [CI Skip] release/stable 10.2.5
skip-checks: true
2023-01-13 13:59:30 +00:00
Jaco 08bf4b7eb2 Bugfix for formatBalance (forceUnit), result < 0 (#1706)
* Bugfix for formatBalance (forceUnit), result < 0

* Deps up
2023-01-13 15:54:40 +02:00
github-actions[bot] 42daac5327 [CI Skip] release/stable 10.2.4
skip-checks: true
2023-01-13 07:49:02 +00:00
Jaco 694fb8b241 10.2.4 (#1705) 2023-01-13 09:44:39 +02:00
github-actions[bot] b0b69c27dc [CI Skip] bump/beta 10.2.4-1-x
skip-checks: true
2023-01-12 10:10:49 +00:00
Jaco b57bcdc38f Bump deps (#1704) 2023-01-12 12:06:11 +02:00
github-actions[bot] 4fd4178ce9 [CI Skip] bump/beta 10.2.4-0-x
skip-checks: true
2023-01-11 13:49:51 +00:00
Jaco 39403fcfe7 formatBalance withAll/withZero (#1703) 2023-01-11 15:45:19 +02:00
github-actions[bot] 955605b2b0 [CI Skip] release/stable 10.2.3
skip-checks: true
2023-01-07 13:05:49 +00:00
Jaco d291a76798 10.2.3 (#1702) 2023-01-07 15:02:13 +02:00
github-actions[bot] aa12647ef6 [CI Skip] bump/beta 10.2.3-0-x
skip-checks: true
2023-01-07 10:16:23 +00:00
Jaco ceff8cc9ff Adjust Buffer check (#1701)
* Adjust Buffer check

* Adjust
2023-01-07 12:12:43 +02:00
github-actions[bot] 0b11d5b9c1 [CI Skip] release/stable 10.2.2
skip-checks: true
2023-01-06 10:28:35 +00:00
Jaco a1afff886b 10.2.2 (#1700) 2023-01-06 12:25:00 +02:00
github-actions[bot] 08785c3ae6 [CI Skip] bump/beta 10.2.2-9-x
skip-checks: true
2023-01-06 08:42:26 +00:00
Alex Sedighi 438fc8bd86 fix Nodle's known network name (#1699) 2023-01-06 10:38:38 +02:00
github-actions[bot] 6531bf1e36 [CI Skip] bump/beta 10.2.2-8-x
skip-checks: true
2023-01-03 12:42:26 +00:00
Jaco c066593d7a Bump deps (#1698) 2023-01-03 14:38:45 +02:00
github-actions[bot] 66f777ece9 [CI Skip] bump/beta 10.2.2-7-x
skip-checks: true
2023-01-01 08:25:34 +00:00
Jaco 3fe6be655d Update headers for 2023 (#1697) 2023-01-01 10:21:43 +02:00
github-actions[bot] 3810e392dd [CI Skip] bump/beta 10.2.2-6-x
skip-checks: true
2022-12-26 07:56:29 +00:00
Jaco 3dd4c8d6e5 Bump dev (#1696) 2022-12-26 09:52:49 +02:00
github-actions[bot] 7611ec8b01 [CI Skip] bump/beta 10.2.2-5-x
skip-checks: true
2022-12-17 11:26:20 +00:00
Jaco 82d8207f48 Bump @noble/hashes (#1695) 2022-12-17 13:22:42 +02:00
github-actions[bot] b2575437e4 [CI Skip] bump/beta 10.2.2-4-x
skip-checks: true
2022-12-14 06:10:22 +00:00
Jaco 1ee92c356a Bump dev (w/ deprecation warnings) (#1694) 2022-12-14 08:06:40 +02:00
github-actions[bot] 372e4cc59b [CI Skip] bump/beta 10.2.2-3-x
skip-checks: true
2022-12-13 08:02:41 +00:00
Jaco f1eb7ee489 Adjust TS target (#1693)
* Adjust TS target

* es2020
2022-12-13 09:58:52 +02:00
github-actions[bot] 039b849713 [CI Skip] bump/beta 10.2.2-2-x
skip-checks: true
2022-12-08 07:02:09 +00:00
Jaco 8913c70205 Remove CC (#1692) 2022-12-08 08:57:45 +02:00
github-actions[bot] 352c2df232 [CI Skip] bump/beta 10.2.2-1-x
skip-checks: true
2022-12-08 06:28:19 +00:00
Jaco 2994c594fc Bump TS (#1691)
* Bump TS

* Add ss registry compare
2022-12-08 08:24:41 +02:00
github-actions[bot] 29dba0a55f [CI Skip] bump/beta 10.2.2-0-x
skip-checks: true
2022-12-07 13:51:36 +00:00
Jaco 2d89b5b493 Update token retrieval (#1690) 2022-12-07 15:47:51 +02:00
github-actions[bot] 72bdf6cbae [CI Skip] release/stable 10.2.1
skip-checks: true
2022-12-04 09:45:10 +00:00
Jaco f7d2bf9d11 10.2.1 (#1687) 2022-12-04 11:41:20 +02:00
github-actions[bot] 8275f3bc54 [CI Skip] bump/beta 10.1.15-3-x
skip-checks: true
2022-12-03 09:08:03 +00:00
Jaco 058786689e Bump @polkadot/wasm (#1686) 2022-12-03 11:04:22 +02:00
github-actions[bot] 3d4b0018c0 [CI Skip] bump/beta 10.1.15-2-x
skip-checks: true
2022-12-02 08:04:26 +00:00
Jaco fa593ef1fc Add /*#__PURE__*/ annotations (#1684) 2022-12-02 09:59:59 +02:00
github-actions[bot] 179ca120fa [CI Skip] bump/beta 10.1.15-1-x
skip-checks: true
2022-12-02 07:46:24 +00:00
Jaco 984a4a1ae8 Adjust has{Buffer, Process} checks w/ globalThis (#1683) 2022-12-02 09:42:41 +02:00
github-actions[bot] 1ad77eb58c [CI Skip] bump/beta 10.1.15-0-x
skip-checks: true
2022-12-02 07:09:25 +00:00
Carlo 928eef865a feat(networks): support ledger for ajuna (#1682)
* chore(hw-ledger): update ledger-substrate to latest

* feat(networks): support ledger for ajuna
2022-12-02 09:04:58 +02:00
github-actions[bot] 16ea0d2ddb [CI Skip] release/stable 10.1.14
skip-checks: true
2022-11-27 07:04:52 +00:00
Jaco 203321c83e 10.1.14 (#1681) 2022-11-27 09:01:20 +02:00
github-actions[bot] f42721d545 [CI Skip] bump/beta 10.1.14-0-x
skip-checks: true
2022-11-26 15:55:01 +00:00
Jaco 9846e97d73 Bump deps (#1680)
* Bump deps

* Update network json compare
2022-11-26 17:49:56 +02:00
github-actions[bot] cc5ab430b5 [CI Skip] release/stable 10.1.13
skip-checks: true
2022-11-20 08:56:39 +00:00
Jaco 33b8d410b4 10.1.13 (#1678) 2022-11-20 10:53:06 +02:00
github-actions[bot] d9c2ed85bf [CI Skip] bump/beta 10.1.13-2-x
skip-checks: true
2022-11-19 11:31:58 +00:00
Jaco 6602421cfe Cleanup ledger-substrate path imports (#1677)
* Cleanup leadger-substrate path imports

* Adjust
2022-11-19 13:28:23 +02:00
github-actions[bot] cf61061863 [CI Skip] bump/beta 10.1.13-1-x
skip-checks: true
2022-11-19 06:47:21 +00:00
Jaco b47d83fd3c Bump deps (#1676) 2022-11-19 08:42:33 +02:00
github-actions[bot] 37e8d53a12 [CI Skip] bump/beta 10.1.13-0-x
skip-checks: true
2022-11-18 12:49:49 +00:00
Carlo fc667b7b72 feat(networks): support ledger for origintrail (#1674)
* chore(hw-ledger): update ledger-substrate to latest

* feat(networks): support ledger for origintrail
2022-11-18 14:44:46 +02:00
github-actions[bot] a020835039 [CI Skip] release/stable 10.1.12
skip-checks: true
2022-11-13 08:29:00 +00:00
Jaco 9cf963170d 10.1.12 (#1673) 2022-11-13 10:25:32 +02:00
github-actions[bot] 291d609dba [CI Skip] bump/beta 10.1.12-5-x
skip-checks: true
2022-11-09 12:16:11 +00:00
Jaco a6fa8cec17 `Bump deps (#1672)
* `Bump deps

* networks build
2022-11-09 14:11:28 +02:00
github-actions[bot] c4b95c7b52 [CI Skip] bump/beta 10.1.12-4-x
skip-checks: true
2022-11-05 15:38:35 +00:00
Jaco d5243f3527 Bump dev deps (#1671) 2022-11-05 17:34:56 +02:00
github-actions[bot] d71e34188e [CI Skip] bump/beta 10.1.12-3-x
skip-checks: true
2022-11-02 08:27:31 +00:00
Jaco 3f0f443124 Adjust deno deps imports (#1670) 2022-11-02 10:23:38 +02:00
github-actions[bot] 074879c7a7 [CI Skip] bump/beta 10.1.12-2-x
skip-checks: true
2022-10-30 08:14:05 +00:00
Jaco 516af6f81e Bump dev (#1669) 2022-10-30 10:09:48 +02:00
github-actions[bot] 4ee1446823 [CI Skip] bump/beta 10.1.12-1-x
skip-checks: true
2022-10-22 07:23:29 +00:00
Jaco 88850918b9 Bump dev (#1668) 2022-10-22 10:19:54 +03:00
github-actions[bot] 11ed1c4249 [CI Skip] bump/beta 10.1.12-0-x
skip-checks: true
2022-10-19 05:13:54 +00:00
Jaco 0be13f451d Bump deps (#1667) 2022-10-19 08:09:41 +03:00
github-actions[bot] f7e431adf9 [CI Skip] release/stable 10.1.11
skip-checks: true
2022-10-15 09:54:21 +00:00
Jaco 6efca949cc 10.1.11 (#1666) 2022-10-15 12:50:55 +03:00
github-actions[bot] 80ed10201f [CI Skip] bump/beta 10.1.11-2-x
skip-checks: true
2022-10-15 09:04:56 +00:00
Jaco 6763d1c062 Bump dev (w/ jest) (#1665) 2022-10-15 12:01:15 +03:00
github-actions[bot] 2c1efaa7a0 [CI Skip] bump/beta 10.1.11-1-x
skip-checks: true
2022-10-14 07:01:10 +00:00
Jaco d0fd445c06 Bump deps (#1664)
* Bump deps

* Bump deps
2022-10-14 09:57:35 +03:00
github-actions[bot] f1c84da0b0 [CI Skip] bump/beta 10.1.11-0-x
skip-checks: true
2022-10-07 06:48:06 +00:00
Jaco a5e68db05f Bump dev (#1663) 2022-10-07 09:43:47 +03:00
github-actions[bot] 60c0e81314 [CI Skip] release/stable 10.1.10
skip-checks: true
2022-10-07 04:37:47 +00:00
Jaco f72be29dbf 10.1.10 (#1662) 2022-10-07 07:34:02 +03:00
github-actions[bot] f301a57122 [CI Skip] bump/beta 10.1.10-5-x
skip-checks: true
2022-10-07 04:04:29 +00:00
Jaco 9523e6b0d3 Correct numberToHex(0) conversion (#1661) 2022-10-07 07:00:46 +03:00
github-actions[bot] b17bfbaf34 [CI Skip] bump/beta 10.1.10-4-x
skip-checks: true
2022-10-07 03:49:18 +00:00
Jaco 669d8b1a84 Ensure {bn, n}ToHex respects bitLength with 0 values (#1660) 2022-10-07 06:45:49 +03:00
github-actions[bot] b7815d43a5 [CI Skip] bump/beta 10.1.10-3-x
skip-checks: true
2022-10-05 08:39:36 +00:00
Jaco 7622c8b151 Bump deps (#1658)
* Bump deps

* Run tests
2022-10-05 11:35:41 +03:00
github-actions[bot] 37bc63b130 [CI Skip] bump/beta 10.1.10-2-x
skip-checks: true
2022-09-30 05:52:23 +00:00
Jaco 43f9676341 Bump deps (#1657) 2022-09-30 08:48:43 +03:00
github-actions[bot] 1283be6c19 [CI Skip] bump/beta 10.1.10-1-x
skip-checks: true
2022-09-28 10:48:35 +00:00
Jaco cdd6314a4f Bump TS (#1656) 2022-09-28 13:44:46 +03:00
github-actions[bot] 8d027717bb [CI Skip] bump/beta 10.1.10-0-x
skip-checks: true
2022-09-24 06:10:20 +00:00
Jaco dec9bbff49 Bump dev (#1655) 2022-09-24 09:05:51 +03:00
github-actions[bot] 536eef02c5 [CI Skip] release/stable 10.1.9
skip-checks: true
2022-09-24 05:32:50 +00:00
Jaco 3b51154d60 10.1.9 (#1654) 2022-09-24 08:29:24 +03:00
github-actions[bot] f5767e3def [CI Skip] bump/beta 10.1.9-3-x
skip-checks: true
2022-09-23 09:24:05 +00:00
Jaco 29057558ac CHANGELOG (#1653) 2022-09-23 12:20:29 +03:00
github-actions[bot] e591a75988 [CI Skip] bump/beta 10.1.9-2-x
skip-checks: true
2022-09-23 08:22:36 +00:00
Guilane DENGUIR 2fdc1679f2 feat(VTB): Added support for VTB blockchain (#1651)
* feat(VTB): Added support for VTB blockchain

* fix(lint): sorted struct alphabetically
2022-09-23 11:17:55 +03:00
github-actions[bot] 35f6a51a6b [CI Skip] bump/beta 10.1.9-1-x
skip-checks: true
2022-09-22 07:14:37 +00:00
Jaco 640bab086e Bump deps (#1652) 2022-09-22 10:11:01 +03:00
github-actions[bot] 5f9ffca721 [CI Skip] bump/beta 10.1.9-0-x
skip-checks: true
2022-09-17 07:17:42 +00:00
Jaco 2fd9d18910 Bump dev (#1650) 2022-09-17 10:13:13 +03:00
github-actions[bot] 7782eef6e3 [CI Skip] release/stable 10.1.8
skip-checks: true
2022-09-17 06:26:53 +00:00
Jaco 0c477e15c4 10.1.8 (#1649) 2022-09-17 09:22:50 +03:00
github-actions[bot] f39820e9c0 [CI Skip] bump/beta 10.1.8-7-x
skip-checks: true
2022-09-14 08:22:20 +00:00
Jaco 35d1a8e57f Bump deps (#1648) 2022-09-14 11:19:00 +03:00
github-actions[bot] 83567b75c5 [CI Skip] bump/beta 10.1.8-6-x
skip-checks: true
2022-09-13 10:37:41 +00:00
Carlos Medeiros 501d0fa249 add hydradx to knownLedger (#1647)
*update `@zondax/ledger-substrate`

* add hydradx to knownLedger
2022-09-13 13:33:59 +03:00
github-actions[bot] 014702ca16 [CI Skip] bump/beta 10.1.8-5-x
skip-checks: true
2022-09-12 05:59:33 +00:00
Jaco b53d34b41f Bump deps (#1645)
* Bump deps

* ss58 tests

* Bump dev
2022-09-12 08:56:04 +03:00
github-actions[bot] 47d995b88d [CI Skip] bump/beta 10.1.8-4-x
skip-checks: true
2022-09-09 06:04:13 +00:00
Jaco cedba4af0c Bump deps (#1644) 2022-09-09 09:00:38 +03:00
github-actions[bot] df8d84467b [CI Skip] bump/beta 10.1.8-3-x
skip-checks: true
2022-09-07 11:02:13 +00:00
Carlo SalaandJaco c289a83b16 feat: add darwinia to knownLedger (#1643)
Co-authored-by: Jaco <jacogr@gmail.com>
2022-09-07 13:58:25 +03:00
github-actions[bot] a869ba7793 [CI Skip] bump/beta 10.1.8-2-x
skip-checks: true
2022-09-07 10:31:33 +00:00
Jaco 4f4ce3549e Bump deps & CHANGELOG (#1642)
* Bump deps & CHANGELOG

* Downgrade rollup node-resolve
2022-09-07 13:27:13 +03:00
github-actions[bot] ce55d5b7d8 [CI Skip] bump/beta 10.1.8-1-x
skip-checks: true
2022-09-06 12:16:25 +00:00
Carlo Sala 10997a6d73 feat(networks): add phala and khala to knownLedger (#1641)
* chore: update `@zondax/ledger-substrate`

* feat(networks): add phala and khala to knownLedger
2022-09-06 15:12:41 +03:00
github-actions[bot] ebe30a2880 [CI Skip] bump/beta 10.1.8-0-x
skip-checks: true
2022-09-04 04:36:57 +00:00
Jaco b4963cc6bd Expose xxhashAsHex JS tests (#1640) 2022-09-04 07:33:07 +03:00
github-actions[bot] 304f7ad124 [CI Skip] release/stable 10.1.7
skip-checks: true
2022-09-02 08:30:00 +00:00
Jaco 9777bca5d4 10.1.7 (#1639) 2022-09-02 11:26:06 +03:00
github-actions[bot] 4c379e85cc [CI Skip] bump/beta 10.1.7-3-x
skip-checks: true
2022-09-02 08:18:45 +00:00
Jaco 4ee83d3d29 Hoist Ledger interface wrapError (#1638) 2022-09-02 11:15:11 +03:00
github-actions[bot] 40d6a388b2 [CI Skip] bump/beta 10.1.7-2-x
skip-checks: true
2022-08-31 05:53:00 +00:00
Jaco 31f4940ec6 Bump deps (#1637) 2022-08-31 08:48:06 +03:00
github-actions[bot] 1ac50696ca [CI Skip] bump/beta 10.1.7-1-x
skip-checks: true
2022-08-26 15:04:48 +00:00
Jaco 1ca5ff48a0 Pin Github actions (#1636) 2022-08-26 18:00:25 +03:00
github-actions[bot] 8253272901 [CI Skip] bump/beta 10.1.7-0-x
skip-checks: true
2022-08-26 12:54:03 +00:00
Jaco 82c38e9805 Bump TS (#1635) 2022-08-26 15:50:21 +03:00
github-actions[bot] 509834c491 [CI Skip] release/stable 10.1.6
skip-checks: true
2022-08-23 17:59:07 +00:00
Jaco d713a7a116 10.1.6 (#1633)
* 10.1.6

* Promise.resolve() for asyn calls

* Fix tests

* Extra testnet
2022-08-23 20:55:38 +03:00
github-actions[bot] d24e14aa5e [CI Skip] release/stable 10.1.5
skip-checks: true
2022-08-21 05:35:18 +00:00
Jaco b1a4a87926 10.1.5 (#1632) 2022-08-21 08:31:51 +03:00
github-actions[bot] 05e0d36a0e [CI Skip] bump/beta 10.1.5-1-x
skip-checks: true
2022-08-19 08:28:26 +00:00
Jaco 5599a8877c Add new @zondax/ledger-substrate (#1631) 2022-08-19 11:24:47 +03:00
github-actions[bot] 2d850c5ac4 [CI Skip] bump/beta 10.1.5-0-x
skip-checks: true
2022-08-19 07:51:21 +00:00
Jaco 82ba3fb9b1 Bump deps (#1630)
* Bump deps

* Responsebase import

* Do Ledger creation via newSubstrateApp
2022-08-19 10:47:44 +03:00
github-actions[bot] 0aae0e2bc2 [CI Skip] release/stable 10.1.4
skip-checks: true
2022-08-12 08:47:28 +00:00
Jaco 2bcea83e0a 10.1.4 (#1629)
* 10.1.4

* Bump deps
2022-08-12 11:43:55 +03:00
github-actions[bot] 20e126759e [CI Skip] bump/beta 10.1.4-2-x
skip-checks: true
2022-08-12 06:57:47 +00:00
Jaco 566127bcb6 Bump dev (#1628)
* Bump dev

* Adjust deno version

* bn.js import_map
2022-08-12 09:53:00 +03:00
github-actions[bot] b50ee462da [CI Skip] bump/beta 10.1.4-1-x
skip-checks: true
2022-08-10 11:52:51 +00:00
Jaco a3cd2de56d Master build fixes, CHANGELOG (#1627) 2022-08-10 14:48:35 +03:00
pan 7f60123417 add bifrost kusama (#1626) 2022-08-07 17:34:53 +03:00
github-actions[bot] bb124813dc [CI Skip] bump/beta 10.1.4-0-x
skip-checks: true
2022-08-07 08:55:28 +00:00
Jaco 652ede8ce7 Bump dev (#1625) 2022-08-07 11:51:50 +03:00
github-actions[bot] 52d2d38051 [CI Skip] release/stable 10.1.3
skip-checks: true
2022-08-05 13:32:13 +00:00
Jaco 65f627c0dc 10.1.3 (#1624) 2022-08-05 16:28:45 +03:00
github-actions[bot] 9ecf29b83b [CI Skip] bump/beta 10.1.3-5-x
skip-checks: true
2022-08-05 06:02:22 +00:00
Jaco 97b84977b7 Bump dev (#1623) 2022-08-05 08:58:55 +03:00
github-actions[bot] f9315c307f [CI Skip] bump/beta 10.1.3-4-x
skip-checks: true
2022-08-04 07:48:59 +00:00
Jaco c08c947abf Convert assert to if + throw (remaining occurences) (#1622)
* Convert assert to if + throw (remaining occurences)

* Adjust for readability

* CHANGELOG
2022-08-04 10:45:10 +03:00
github-actions[bot] 2d4509c32a [CI Skip] bump/beta 10.1.3-3-x
skip-checks: true
2022-08-03 08:00:59 +00:00
Jaco c6e18b1a9e Optimization of flatten 0 case (#1621)
* Optimizationf or flatten 0 case

* Remove wayward .123deno
2022-08-03 10:57:24 +03:00
github-actions[bot] 515a77781f [CI Skip] bump/beta 10.1.3-2-x
skip-checks: true
2022-08-02 07:56:00 +00:00
Jaco 55d2c149f7 Adjust logger constant map (#1620) 2022-08-02 10:52:23 +03:00
github-actions[bot] 43b959ad1f [CI Skip] bump/beta 10.1.3-1-x
skip-checks: true
2022-08-02 04:35:44 +00:00
Jaco 6708b34a01 Bump deps (#1619) 2022-08-02 07:32:07 +03:00
github-actions[bot] a9a9214f3b [CI Skip] bump/beta 10.1.3-0-x
skip-checks: true
2022-07-30 04:50:00 +00:00
Jaco 8bd77c97a0 Allow errors on GH actions (#1618) 2022-07-30 07:45:49 +03:00
github-actions[bot] ed70e5c65f [CI Skip] release/stable 10.1.2
skip-checks: true
2022-07-29 10:09:28 +00:00
Jaco ca6f157007 10.1.2 (#1617) 2022-07-29 13:06:02 +03:00
github-actions[bot] 6c30e328bb [CI Skip] bump/beta 10.1.2-1-x
skip-checks: true
2022-07-28 08:18:33 +00:00
Jaco 1f6f3c67a8 Bump deps (#1616) 2022-07-28 11:14:19 +03:00
github-actions[bot] d19e2c8469 [CI Skip] bump/beta 10.1.2-0-x
skip-checks: true
2022-07-26 12:06:54 +00:00
Jaco 92f479e0e5 Bump ss58registry (#1615)
* Bump ss58registry

* Adjust
2022-07-26 15:02:34 +03:00
github-actions[bot] 25f9444c53 [CI Skip] release/stable 10.1.1
skip-checks: true
2022-07-21 05:37:00 +00:00
Jaco 6d46f8b24e 10.1.1 (#1614) 2022-07-21 08:33:15 +03:00
github-actions[bot] 0189cdabe9 [CI Skip] bump/beta 10.0.3-19-x
skip-checks: true
2022-07-20 08:51:57 +00:00
Jaco 9d61c2c96c Adjust spread check for .entries() (#1613) 2022-07-20 11:47:55 +03:00
github-actions[bot] 6599b41155 [CI Skip] bump/beta 10.0.3-18-x
skip-checks: true
2022-07-20 08:27:48 +00:00
Jaco 9c05257046 Add ability to spread Map entries (optimization) (#1612) 2022-07-20 11:23:26 +03:00
github-actions[bot] 41e2e67fd0 [CI Skip] bump/beta 10.0.3-17-x
skip-checks: true
2022-07-20 06:39:06 +00:00
Jaco 092fbdd923 Align property & lazy signatures (getName & self) (#1611)
* Align property & lazy signatures (getName & self)

* Adjust tests
2022-07-20 09:34:13 +03:00
github-actions[bot] c1cdc80169 [CI Skip] bump/beta 10.0.3-16-x
skip-checks: true
2022-07-19 19:07:58 +00:00
Jaco 306bbdea12 Pass internal this through on objectProperties (#1610)
* Pass internal this through on objectProperties

* Fix property test
2022-07-19 22:03:26 +03:00
github-actions[bot] f41519e185 [CI Skip] bump/beta 10.0.3-15-x
skip-checks: true
2022-07-19 15:33:00 +00:00
Carlo Sala 1a3fd344b5 feat(ledger): add interlay and unique (#1609) 2022-07-19 18:28:30 +03:00
github-actions[bot] f798c1dbd5 [CI Skip] bump/beta 10.0.3-14-x
skip-checks: true
2022-07-19 08:58:31 +00:00
Jaco 813d358999 hexToU8a lookup optimizations (#1608)
* hexToU8a lookup optimizations

* Non-aligned test
2022-07-19 11:55:01 +03:00
github-actions[bot] e85eb35413 [CI Skip] bump/beta 10.0.3-13-x
skip-checks: true
2022-07-19 05:36:50 +00:00
Jaco 8a50cba394 Additional assert cleanups (#1604) 2022-07-19 08:33:22 +03:00
github-actions[bot] 20f030e987 [CI Skip] bump/beta 10.0.3-12-x
skip-checks: true
2022-07-19 05:28:13 +00:00
Jaco 4a683f41d3 Dev bump (w/ additional deno overrides) (#1607) 2022-07-19 08:23:42 +03:00
github-actions[bot] ea7f59ab73 [CI Skip] bump/beta 10.0.3-11-x
skip-checks: true
2022-07-18 14:54:47 +00:00
Jaco 60498f7f36 Dev bump (#1606) 2022-07-18 17:49:02 +03:00
github-actions[bot] 9ad0c46417 [CI Skip] bump/beta 10.0.3-10-x
skip-checks: true
2022-07-18 13:45:34 +00:00
Jaco 0fc140f838 Additional speed optimizations (#1605) 2022-07-18 16:41:53 +03:00
github-actions[bot] cd63bb695d [CI Skip] bump/beta 10.0.3-9-x
skip-checks: true
2022-07-18 11:55:15 +00:00
Jaco 7eac688074 Small performance adjustments for Uint8Array indexing (#1603) 2022-07-18 14:51:39 +03:00
github-actions[bot] 820a5e4077 [CI Skip] bump/beta 10.0.3-8-x
skip-checks: true
2022-07-18 11:13:19 +00:00
Jaco bc0f69aef0 Create public/secret pairs on add to keyring (#1602)
* Create public/secret pairs on add to keyring

* Remove comment sort

* Adjust pre-compute comment

* Adjust tests

* Fix expectation
2022-07-18 14:09:38 +03:00
github-actions[bot] 5074adf690 [CI Skip] bump/beta 10.0.3-7-x
skip-checks: true
2022-07-18 09:31:32 +00:00
Jaco 8461d105d6 Adjust nobody zero-key pair with pre-computed address (#1601) 2022-07-18 12:27:56 +03:00
github-actions[bot] cd246e2381 [CI Skip] bump/beta 10.0.3-6-x
skip-checks: true
2022-07-17 13:39:12 +00:00
Jaco 8a499bf1bf Bump ss58registry (#1600)
* Bump ss58registry

* Adjust networks deps
2022-07-17 16:35:42 +03:00
github-actions[bot] 5b2ec8e4d6 [CI Skip] bump/beta 10.0.3-5-x
skip-checks: true
2022-07-16 12:44:01 +00:00
Jaco 4a06d1382f Adjust isAscii check to disallow \t, \n, & \r characters (#1599)
* Adjust `isAscii` check to disallow `\t`, `\n`, & `\r` characters

* Readability (& unused code removal)

* Only > & <
2022-07-16 15:40:30 +03:00
github-actions[bot] 66ac9e15a6 [CI Skip] bump/beta 10.0.3-4-x
skip-checks: true
2022-07-16 08:58:10 +00:00
Jaco 0e55357053 Add arrayUnzip (#1598) 2022-07-16 11:54:02 +03:00
github-actions[bot] b4b80bbf67 [CI Skip] bump/beta 10.0.3-3-x
skip-checks: true
2022-07-15 08:13:43 +00:00
Jaco 4355b9b066 Bump deps (w/ @noble/secp256k1) (#1597) 2022-07-15 11:10:00 +03:00
github-actions[bot] 5c92e095ff [CI Skip] bump/beta 10.0.3-2-x
skip-checks: true
2022-07-11 13:35:08 +00:00
Jaco 4fedd594f1 Dedupe sqrt tests between bi/bn (#1596) 2022-07-11 16:31:41 +03:00
github-actions[bot] 6f05fa6634 [CI Skip] bump/beta 10.0.3-1-x
skip-checks: true
2022-07-11 05:19:12 +00:00
Jaco 856e93f4a0 Bump dev (#1595) 2022-07-11 08:15:26 +03:00
github-actions[bot] 195e42ec11 [CI Skip] bump/beta 10.0.3-0-x
skip-checks: true
2022-07-10 08:38:48 +00:00
Jaco 16e90aadfc Fix .123trigger 2022-07-10 11:35:16 +03:00
github-actions[bot] bcdf5ba26e [CI Skip] release/stable 10.0.2
skip-checks: true
2022-07-10 06:28:02 +00:00
Jaco ae9a04e557 Work-around for Jest + dynamic imports (#1594)
* Work-around for Jest + dynamic imports

* CHANGELOG

* 10.0.2
2022-07-10 09:24:11 +03:00
github-actions[bot] 4b37a82fb3 [CI Skip] bump/beta 10.0.2-1-x
skip-checks: true
2022-07-08 21:22:55 +00:00
Jaco 1b69bb9dfa Bump dev deps (#1593) 2022-07-09 00:19:36 +03:00
github-actions[bot] e8f703f850 [CI Skip] bump/beta 10.0.2-0-x
skip-checks: true
2022-07-08 13:34:11 +00:00
Jaco 3ad4455fe1 Adjust eslint config (#1592) 2022-07-08 16:30:50 +03:00
github-actions[bot] 1f6a263a8e [CI Skip] release/stable 10.0.1
skip-checks: true
2022-07-08 05:31:28 +00:00
Jaco 73073529bb 10.0.1 (#1591) 2022-07-08 08:28:07 +03:00
github-actions[bot] e1bdac1ba5 [CI Skip] bump/beta 9.7.3-17-x
skip-checks: true
2022-07-08 04:47:55 +00:00
Jaco 56c619944c Bump deps (#1590)
* Bump deps

* Rebump
2022-07-08 07:44:35 +03:00
github-actions[bot] 4c60b98b07 [CI Skip] bump/beta 9.7.3-16-x
skip-checks: true
2022-07-07 14:50:24 +00:00
Jaco 2f9f007547 CHANGELOG (#1589) 2022-07-07 17:46:30 +03:00
github-actions[bot] d00184fff7 [CI Skip] bump/beta 9.7.3-15-x
skip-checks: true
2022-07-07 14:33:54 +00:00
Carlo Sala e1e3a1699f feat(networks): add ledger support for Aleph Zero (#1588) 2022-07-07 17:30:29 +03:00
github-actions[bot] 90a1837978 [CI Skip] bump/beta 9.7.3-14-x
skip-checks: true
2022-07-07 07:53:03 +00:00
Jaco c96ad1a34e Align BigInt functions with BN (option handling) (#1587)
* Align BigInt functions with BN (option handling)

* CHANGELOG

* Pass bitLength parameter
2022-07-07 10:49:40 +03:00
github-actions[bot] b1eda9efe9 [CI Skip] bump/beta 9.7.3-13-x
skip-checks: true
2022-07-07 07:31:23 +00:00
kaelnewandfengwenjun 2184ae8511 add ledger support for stafi (#1569)
Co-authored-by: fengwenjun <kael@fengwenjun.com>
2022-07-07 10:27:34 +03:00
github-actions[bot] ce94314992 [CI Skip] bump/beta 9.7.3-12-x
skip-checks: true
2022-07-07 07:18:28 +00:00
Jaco eea3596847 Bump deps (#1586) 2022-07-07 10:14:14 +03:00
github-actions[bot] 37e78f7abd [CI Skip] bump/beta 9.7.3-11-x
skip-checks: true
2022-07-07 05:35:56 +00:00
Jaco 4bb2c83213 Adjust exports (#1585) 2022-07-07 08:31:58 +03:00
github-actions[bot] 3828d941a9 [CI Skip] bump/beta 9.7.3-10-x
skip-checks: true
2022-07-07 04:57:20 +00:00
Jaco c92d5cfb20 Remove deprecated call signatures (#1584) 2022-07-07 07:54:07 +03:00
github-actions[bot] 70d2250b3b [CI Skip] bump/beta 9.7.3-9-x
skip-checks: true
2022-07-06 17:37:27 +00:00
Jakub Pánik a46279876f Add HydraDX parachain to genesis (#1583) 2022-07-06 20:34:05 +03:00
github-actions[bot] 4267c4ac76 [CI Skip] bump/beta 9.7.3-8-x
skip-checks: true
2022-07-06 11:04:00 +00:00
Jaco e09dfcffbe Adjust issue template (#1582) 2022-07-06 14:00:36 +03:00
github-actions[bot] b722291de2 [CI Skip] bump/beta 9.7.3-7-x
skip-checks: true
2022-07-06 09:54:00 +00:00
Jaco 4367bb0f68 Adjust for available ESM-only dependencies (#1581)
* Adjust for available ESM-only dependencies

* Flags for jest (sadly, still required mid-2022)
2022-07-06 12:50:36 +03:00
github-actions[bot] 1d71f67e2a [CI Skip] bump/beta 9.7.3-6-x
skip-checks: true
2022-07-05 21:22:56 +00:00
Jaco 2d4995b16e Additional CI actions (#1580) 2022-07-06 00:19:30 +03:00
github-actions[bot] b96cfd36cf [CI Skip] bump/beta 9.7.3-5-x
skip-checks: true
2022-07-05 07:42:41 +00:00
Jaco 9f53838626 Bump dev deps (#1579) 2022-07-05 10:38:50 +03:00
github-actions[bot] 478dd6ccd9 [CI Skip] bump/beta 9.7.3-4-x
skip-checks: true
2022-07-05 07:04:53 +00:00
Jaco fd313c2e91 Push to deno 2022-07-05 10:01:25 +03:00
github-actions[bot] 66b58ea5f2 [CI Skip] bump/beta 9.7.3-3-x
skip-checks: true
2022-07-05 06:59:07 +00:00
Jaco 66acbe04af Adjust deno exports in x-* (#1578)
* Adjust deno exports in x-*

* Adjust versionDetect
2022-07-05 09:55:57 +03:00
github-actions[bot] 2194cc58d7 [CI Skip] bump/beta 9.7.3-2-x
skip-checks: true
2022-07-05 05:38:54 +00:00
Jaco 768f64aec7 Push to deno repo 2022-07-05 08:35:29 +03:00
github-actions[bot] 2176bedd50 [CI Skip] bump/beta 9.7.3-1-x
skip-checks: true
2022-07-04 09:38:31 +00:00
Jaco 8273eb5441 Switch on TS isolatedModules (#1577) 2022-07-04 12:35:03 +03:00
github-actions[bot] 76af1b8822 [CI Skip] bump/beta 9.7.3-0-x
skip-checks: true
2022-07-04 07:23:50 +00:00
Jaco 80eb70a382 Adjust some usages to not require @types/node (#1576) 2022-07-04 10:20:24 +03:00
github-actions[bot] 7e01b2b256 [CI Skip] release/stable 9.7.2
skip-checks: true
2022-07-04 06:15:29 +00:00
Jaco b30bed8707 9.7.2 (#1575) 2022-07-04 09:12:22 +03:00
github-actions[bot] d79813065f [CI Skip] bump/beta 9.7.2-0-x
skip-checks: true
2022-07-04 04:57:36 +00:00
Jaco 7e12949146 Bump deps (#1574) 2022-07-04 07:54:12 +03:00
github-actions[bot] 5ca6575245 [CI Skip] release/stable 9.7.1
skip-checks: true
2022-07-01 14:45:17 +00:00
Jaco 4cadf3bcb7 9.7.1 (#1572) 2022-07-01 17:40:21 +03:00
github-actions[bot] 81f8f16b98 [CI Skip] bump/beta 9.6.3-1-x
skip-checks: true
2022-06-30 11:38:33 +00:00
Jaco 8edfb1139f Bump dev deps (#1570) 2022-06-30 14:35:05 +03:00
github-actions[bot] 69d1d896d1 [CI Skip] bump/beta 9.6.3-0-x
skip-checks: true
2022-06-28 07:56:25 +00:00
Jaco 3bc62adf6f Sprinkle in readonly on array inputs (#1568) 2022-06-28 10:52:57 +03:00
github-actions[bot] 691a8e9b18 [CI Skip] release/stable 9.6.2
skip-checks: true
2022-06-25 05:26:53 +00:00
Jaco fc812590e5 Fix hexToU8a where 0x is not correctly converted (#1567)
* Fix `hexToU8a` where `0x` is not correctly converted

* 9.6.2

* CHANGELOG
2022-06-25 08:23:36 +03:00
github-actions[bot] 05499abcd5 [CI Skip] bump/beta 9.6.2-2-x
skip-checks: true
2022-06-23 17:05:08 +00:00
Jaco e375dd8a9d Bump dev (w/ deno build fix) (#1566) 2022-06-23 20:01:35 +03:00
github-actions[bot] 3269883e8f [CI Skip] bump/beta 9.6.2-1-x
skip-checks: true
2022-06-23 11:19:10 +00:00
Jaco c99129ee06 Rebump dev 2022-06-23 14:14:53 +03:00
github-actions[bot] 2514e107bf [CI Skip] bump/beta 9.6.2-0-x
skip-checks: true
2022-06-23 11:08:07 +00:00
Jaco 3c34a0e1f2 Bump dev 2022-06-23 14:04:35 +03:00
github-actions[bot] f704e371c8 [CI Skip] release/stable 9.6.1
skip-checks: true
2022-06-23 08:14:26 +00:00
Jaco 97e3443e74 9.6.1 (#1565) 2022-06-23 11:10:14 +03:00
github-actions[bot] a84e101666 [CI Skip] release/beta 9.5.2-19
skip-checks: true
2022-06-23 07:56:55 +00:00
Jaco a799918d58 Bump wasm & dev (#1564) 2022-06-23 10:53:26 +03:00
github-actions[bot] 429390fb62 [CI Skip] release/beta 9.5.2-18
skip-checks: true
2022-06-22 11:38:19 +00:00
Jaco 05d0109b72 Bump dev (w/ 3rd-part from esm.sh) (#1563) 2022-06-22 14:34:06 +03:00
github-actions[bot] 02b1429979 [CI Skip] release/beta 9.5.2-17
skip-checks: true
2022-06-22 10:46:27 +00:00
Jaco 6e1853d01f Bump dev (w/ deno ensure filename fixes) (#1562) 2022-06-22 13:42:58 +03:00
github-actions[bot] aa9c406d01 [CI Skip] release/beta 9.5.2-16
skip-checks: true
2022-06-22 10:10:41 +00:00
Jaco f9ec44823d Added mapping for @noble/secp256k1 to deno.land/x (#1561) 2022-06-22 13:07:12 +03:00
github-actions[bot] 54218651f9 [CI Skip] release/beta 9.5.2-15
skip-checks: true
2022-06-22 08:56:23 +00:00
Jaco 571c9eff6a Bump dev (& ignore perf tests on CI) (#1560) 2022-06-22 11:52:18 +03:00
github-actions[bot] 5b7333b8dd [CI Skip] release/beta 9.5.2-14
skip-checks: true
2022-06-22 08:17:21 +00:00
Jaco 938fa8b967 Bump dev (w/ publish updates) (#1559) 2022-06-22 11:13:18 +03:00
github-actions[bot] b99a69871e [CI Skip] release/beta 9.5.2-13
skip-checks: true
2022-06-22 06:45:47 +00:00
Jaco b1da8f575b Trigger deno build 2022-06-22 09:40:32 +03:00
github-actions[bot] a960aaf6ae [CI Skip] release/beta 9.5.2-12
skip-checks: true
2022-06-22 06:34:30 +00:00
Jaco f88c647ad0 Bump deps (#1558)
* Bump deps

* 3rd party bumps
2022-06-22 09:30:31 +03:00
github-actions[bot] 7ff11925d9 [CI Skip] release/beta 9.5.2-11
skip-checks: true
2022-06-21 13:03:57 +00:00
Jaco cb5a588489 Bump dev (w/ stable deno publish) (#1557)
* Bump dev (w/ stable deno publish)

* Adjust

* Bump dev
2022-06-21 15:59:46 +03:00
github-actions[bot] 09019224e3 [CI Skip] release/beta 9.5.2-10
skip-checks: true
2022-06-21 04:49:51 +00:00
Jaco 2d7031831a Bump TS to 4.7.4 (#1556) 2022-06-21 07:44:57 +03:00
github-actions[bot] faf7ea2b17 [CI Skip] release/beta 9.5.2-9
skip-checks: true
2022-06-21 03:32:33 +00:00
Jaco af973de694 Bump deps (#1555) 2022-06-21 06:28:19 +03:00
github-actions[bot] dfede866b2 [CI Skip] release/beta 9.5.2-8
skip-checks: true
2022-06-20 14:11:41 +00:00
Jaco 0f0b243815 Adjust isNull & isUndefined checks (#1554) 2022-06-20 17:06:35 +03:00
github-actions[bot] 29f53fe906 [CI Skip] release/beta 9.5.2-7
skip-checks: true
2022-06-20 13:30:11 +00:00
Jaco 225c250634 Adjust asserts (#1548)
* Adjust asserts

* Fix linting & build
2022-06-20 16:26:07 +03:00
github-actions[bot] c871e9d735 [CI Skip] release/beta 9.5.2-6
skip-checks: true
2022-06-20 10:19:45 +00:00
Jaco b42ead28e5 Optimize isAsicc check (#1553) 2022-06-20 13:15:00 +03:00
github-actions[bot] db0581c051 [CI Skip] release/beta 9.5.2-5
skip-checks: true
2022-06-20 08:54:49 +00:00
Jaco e7ac095ace Slight improvment to hexToU8a (#1552) 2022-06-20 11:49:41 +03:00
github-actions[bot] a7d9fc48e9 [CI Skip] release/beta 9.5.2-4
skip-checks: true
2022-06-20 08:34:19 +00:00
Jaco 3db2990ce7 Change Date.now() to performance.now() (#1551)
* Change Date.now() to performance.now()

* Adjust
2022-06-20 11:29:59 +03:00
github-actions[bot] 4b7cda243b [CI Skip] release/beta 9.5.2-3
skip-checks: true
2022-06-20 05:13:47 +00:00
Jaco c4ceeb8382 Additional float conversion tests (#1550) 2022-06-20 08:09:51 +03:00
github-actions[bot] 540971d388 [CI Skip] release/beta 9.5.2-2
skip-checks: true
2022-06-19 18:33:38 +00:00
Jaco b4d65a1c49 floatToU8a adjustment (#1549) 2022-06-19 21:29:34 +03:00
github-actions[bot] 4fd4660853 [CI Skip] release/beta 9.5.2-1
skip-checks: true
2022-06-19 07:22:23 +00:00
Jaco 4b46c179b2 floatToU8a & u8aToFloat (#1547)
* floatToU8a & u8aToFloat

* test for asserts
2022-06-19 10:17:35 +03:00
github-actions[bot] 3c6d297ecd [CI Skip] release/beta 9.5.2-0
skip-checks: true
2022-06-18 18:37:12 +00:00
Jaco 4a6e620acc Adjust isUndefined check (#1546) 2022-06-18 21:33:19 +03:00
github-actions[bot] 50b494ee2e [CI Skip] release/stable 9.5.1
skip-checks: true
2022-06-18 11:21:50 +00:00
Jaco 5b551ca976 9.5.1 (#1545) 2022-06-18 14:18:04 +03:00
github-actions[bot] 5f2a0e25f9 [CI Skip] release/beta 9.4.2-25
skip-checks: true
2022-06-18 10:35:02 +00:00
Jaco 4edb0f00b6 Adjust asserts (#1544) 2022-06-18 13:31:25 +03:00
github-actions[bot] 096c772d7d [CI Skip] release/beta 9.4.2-24
skip-checks: true
2022-06-18 06:02:51 +00:00
Jaco d771d4c243 Performance test for isCodec vs instanceof (#1543) 2022-06-18 08:58:59 +03:00
github-actions[bot] e038c36719 [CI Skip] release/beta 9.4.2-23
skip-checks: true
2022-06-17 06:28:47 +00:00
Jaco 19c8799986 Additional property tests (#1542) 2022-06-17 09:25:01 +03:00
github-actions[bot] e7f642e7fb [CI Skip] release/beta 9.4.2-22
skip-checks: true
2022-06-17 04:59:00 +00:00
Jaco 90e05a7907 Adjust objectProperties with key in that check (#1541) 2022-06-17 07:55:08 +03:00
github-actions[bot] 1ad961eb93 [CI Skip] release/beta 9.4.2-21
skip-checks: true
2022-06-16 18:38:27 +00:00
Jaco 8549f1fe89 Adjust isAscii str vs u8a loops (#1540) 2022-06-16 21:34:35 +03:00
github-actions[bot] 0be212bd49 [CI Skip] release/beta 9.4.2-20
skip-checks: true
2022-06-16 14:18:23 +00:00
Jaco 2dd2f78f7e Use \d in regex (as applicable) (#1539)
* Use \d in regex (as applicable)

* Adjust
2022-06-16 17:13:34 +03:00
github-actions[bot] d5ce0ff4d1 [CI Skip] release/beta 9.4.2-19
skip-checks: true
2022-06-16 13:52:39 +00:00
Jaco 4d887e889a Adjust testing for uppercase words in stringCamelCase (#1538)
* Adjust testing for uppercase words in stringCamelCase

* Use \d

* Revert
2022-06-16 16:47:52 +03:00
github-actions[bot] 1113d09315 [CI Skip] release/beta 9.4.2-18
skip-checks: true
2022-06-16 13:12:24 +00:00
Jaco b774b7804b Small camelCase conversion adjustments (#1537)
* Small camelCase conversion adjustments

* Remove unused exports

* Extract formatRuns
2022-06-16 16:07:45 +03:00
github-actions[bot] 6c1b0e7346 [CI Skip] release/beta 9.4.2-17
skip-checks: true
2022-06-16 11:56:18 +00:00
Jaco 68ba664c4c hexToU8a adjustments (#1536)
* hexToU8a adjustments

* Adjust test
2022-06-16 14:51:34 +03:00
github-actions[bot] c3c4ceab8b [CI Skip] release/beta 9.4.2-16
skip-checks: true
2022-06-16 08:34:08 +00:00
Jaco fff30601a0 Unroll u8aToBn loops (#1535)
* Unroll u8aToBn loops

* Adjust with additional xor shortcuts

* Adjust mult -> shift (where below u32)

* assertUnreachable

* Add u8aToNumber
2022-06-16 11:29:23 +03:00
github-actions[bot] cfb5d24a87 [CI Skip] release/beta 9.4.2-15
skip-checks: true
2022-06-15 18:51:31 +00:00
Jaco 7ce4ed1504 Cleanup comments (#1534) 2022-06-15 21:47:23 +03:00
github-actions[bot] 5a00b146fc [CI Skip] release/beta 9.4.2-14
skip-checks: true
2022-06-15 18:22:28 +00:00
Jaco 1a73a3407e Adjust option extraction for helpers (#1533)
* Adjust option extraction for helpers

* Adjust
2022-06-15 21:17:07 +03:00
github-actions[bot] 0db66346a6 [CI Skip] release/beta 9.4.2-13
skip-checks: true
2022-06-14 04:28:47 +00:00
Jaco a07bfe1234 Bump dev (#1532) 2022-06-14 07:24:11 +03:00
github-actions[bot] 5feb233abc [CI Skip] release/beta 9.4.2-12
skip-checks: true
2022-06-13 05:15:51 +00:00
Jaco 16951c6feb Bump 3rd-party deps 2022-06-13 08:11:43 +03:00
github-actions[bot] 22aa8d7adb [CI Skip] release/beta 9.4.2-11
skip-checks: true
2022-06-12 08:16:35 +00:00
Jaco dfaf954f75 Update issue template (#1530) 2022-06-12 11:12:07 +03:00
github-actions[bot] 78911607e8 [CI Skip] release/beta 9.4.2-10
skip-checks: true
2022-06-12 06:15:23 +00:00
Jaco cdcc331e6e Additional internal comments for exposed functions (#1529) 2022-06-12 09:11:12 +03:00
github-actions[bot] 882b29eebd [CI Skip] release/beta 9.4.2-9
skip-checks: true
2022-06-11 20:37:42 +00:00
Jaco de5c9a1594 Inline function for min/max creator (#1528) 2022-06-11 23:33:42 +03:00
github-actions[bot] 2fc26b5533 [CI Skip] release/beta 9.4.2-8
skip-checks: true
2022-06-11 15:21:18 +00:00
Jaco 6d795ecc5d Shared helper function for bn/bi min/max compares (#1527)
* Shared helper function for bn/bi min/max compares

* min/max test
2022-06-11 18:17:21 +03:00
github-actions[bot] a0c3aa3059 [CI Skip] release/beta 9.4.2-7
skip-checks: true
2022-06-11 14:32:46 +00:00
Jaco e30bac1ed6 Test for sqrt(MAX_SAFE_INT) (w/ comments for excluded functions) (#1526)
* Test for sqrt(MAX_SAFE_INT) (w/ comments for excluded functions)

* Adjust {bi, bn}{Max, Min} with factory
2022-06-11 17:28:55 +03:00
github-actions[bot] 50a061eab3 [CI Skip] release/beta 9.4.2-6
skip-checks: true
2022-06-11 07:52:58 +00:00
Jaco f2064f059f Additional @internal markers (#1525) 2022-06-11 10:48:51 +03:00
github-actions[bot] 768cd68146 [CI Skip] release/beta 9.4.2-5
skip-checks: true
2022-06-11 05:43:44 +00:00
Jaco 0a5bfdca5e Bump deps (& issue template) (#1524) 2022-06-11 08:39:52 +03:00
github-actions[bot] 3ec2f6dcb2 [CI Skip] release/beta 9.4.2-4
skip-checks: true
2022-06-10 11:53:05 +00:00
Jaco 0f2a3a142f CHANGELOG (#1523) 2022-06-10 14:48:56 +03:00
github-actions[bot] 6f5a706ec9 [CI Skip] release/beta 9.4.2-3
skip-checks: true
2022-06-10 10:56:44 +00:00
pan 7e0f917c2b update bifrost genesis hash (#1521) 2022-06-10 13:52:50 +03:00
github-actions[bot] 99731a6664 [CI Skip] release/beta 9.4.2-2
skip-checks: true
2022-06-07 06:02:06 +00:00
Jaco 7765476a26 Use bitwise not as Math.floor replacement (#1518)
* Use bitwise not as Math.floor replacement

* No objectSpread in extractTime

* Flatten extractTime calls
2022-06-07 08:58:11 +03:00
github-actions[bot] 2cd9633afe [CI Skip] release/beta 9.4.2-1
skip-checks: true
2022-06-07 05:47:38 +00:00
Jaco 72749d083f Bump deps (#1519) 2022-06-07 08:43:50 +03:00
github-actions[bot] 9ede85f99a [CI Skip] release/beta 9.4.2-0
skip-checks: true
2022-06-06 06:00:31 +00:00
Carlo SalaandJaco d6a390beb4 add Composable support for ledger (#1515)
* fix(networks): move centrifuge to new parachain chain

* feat: add composable support for ledger

* Update packages/networks/src/defaults/genesis.ts

Co-authored-by: Jaco <jacogr@gmail.com>
2022-06-06 08:55:46 +03:00
github-actions[bot] a14bec79f8 [CI Skip] release/stable 9.4.1
skip-checks: true
2022-06-04 05:10:26 +00:00
Jaco c0de5ac3c8 9.4.1 (#1514) 2022-06-04 08:05:32 +03:00
github-actions[bot] 8d7f810556 [CI Skip] release/beta 9.3.2-4
skip-checks: true
2022-06-04 04:48:08 +00:00
Jaco 5c6526a6bd Bump deps (#1513) 2022-06-04 07:44:30 +03:00
github-actions[bot] e9635ab75b [CI Skip] release/beta 9.3.2-3
skip-checks: true
2022-06-03 15:57:54 +00:00
Jaco e946243b6f Additional performance tests (#1512) 2022-06-03 18:53:57 +03:00
github-actions[bot] ca6a4177b5 [CI Skip] release/beta 9.3.2-2
skip-checks: true
2022-06-03 07:24:22 +00:00
Jaco 7817311f84 Bump dev deps (#1511) 2022-06-03 10:20:26 +03:00
github-actions[bot] 77659aae2a [CI Skip] release/beta 9.3.2-1
skip-checks: true
2022-06-01 05:18:41 +00:00
Jaco 7cc619fbb0 Add nextTick (#1510)
* Add nextTick

* ss58Registry test results
2022-06-01 08:14:42 +03:00
github-actions[bot] 887654049e [CI Skip] release/beta 9.3.2-0
skip-checks: true
2022-05-30 07:51:32 +00:00
Jaco d07b79f578 Bump TS (#1508)
* Bump TS

* Override
2022-05-30 10:46:38 +03:00
github-actions[bot] cefeb0bb51 [CI Skip] release/stable 9.3.1
skip-checks: true
2022-05-29 06:27:05 +00:00
Jaco 1d675ec803 9.3.1 (#1507) 2022-05-29 09:23:01 +03:00
github-actions[bot] 7596dfa65c [CI Skip] release/beta 9.2.2-16
skip-checks: true
2022-05-28 10:40:10 +00:00
Jaco 508e997c64 Bump deps (#1506) 2022-05-28 13:35:56 +03:00
github-actions[bot] 89563ee05c [CI Skip] release/beta 9.2.2-15
skip-checks: true
2022-05-27 08:15:04 +00:00
Jaco 8b72584d53 Add compactFromU8aLim (Remove extraneous *Strict) (#1505)
* Add compactFromU8aLim (Remove extraoneous *Strict)

* Fix build
2022-05-27 11:10:56 +03:00
github-actions[bot] 4ae62c114b [CI Skip] release/beta 9.2.2-14
skip-checks: true
2022-05-27 06:20:09 +00:00
Jaco 823fb51d18 Use for loop in string{Came, Pascal}Case conversions (#1504)
* Use for loop in string{Came, Pascal}Case conversions

* Missing +-= (removed as test)
2022-05-27 09:15:56 +03:00
github-actions[bot] a840b815bd [CI Skip] release/beta 9.2.2-13
skip-checks: true
2022-05-25 07:06:12 +00:00
Jaco fbf973dc2a Add u8a-only strict variants (#1503) 2022-05-25 10:02:01 +03:00
github-actions[bot] 2698f6779f [CI Skip] release/beta 9.2.2-12
skip-checks: true
2022-05-25 04:30:46 +00:00
Jaco 3b5de80c54 Compact loop unrolling (#1502) 2022-05-25 07:26:07 +03:00
github-actions[bot] 041f5a7c2b [CI Skip] release/beta 9.2.2-11
skip-checks: true
2022-05-24 15:32:58 +00:00
Jaco cb8f1130af No indirection via isCompact call (#1501) 2022-05-24 18:28:43 +03:00
github-actions[bot] f480df7504 [CI Skip] release/beta 9.2.2-10
skip-checks: true
2022-05-24 15:00:08 +00:00
Jaco 51763d3bf9 Adjust instanceof checks (#1500) 2022-05-24 17:56:01 +03:00
github-actions[bot] d2b7e88060 [CI Skip] release/beta 9.2.2-9
skip-checks: true
2022-05-24 14:31:54 +00:00
Jaco b20df563ce Buffer short-circuit (onlky convert when non-Uint8Array) (#1499) 2022-05-24 17:27:47 +03:00
github-actions[bot] 5ada180d66 [CI Skip] release/beta 9.2.2-8
skip-checks: true
2022-05-24 13:47:16 +00:00
Jaco a4256de444 Small u8aToU8a optimizations (#1498)
* Small u8aToU8a optimizations

* Slight order adjustments

* Adjust
2022-05-24 16:42:58 +03:00
github-actions[bot] bce5553a4b [CI Skip] release/beta 9.2.2-7
skip-checks: true
2022-05-24 11:44:49 +00:00
Carlo Sala 670743cbcf some changes to KnownLedger (#1497)
* add `nodle-para` chain

* add astar and polkadex to KnownLedger

* remove `nodle-chain`
2022-05-24 14:39:50 +03:00
github-actions[bot] ffed9ceb6d [CI Skip] release/beta 9.2.2-6
skip-checks: true
2022-05-22 08:44:56 +00:00
Jaco bbacb1b80a Bump deps (#1496) 2022-05-22 11:40:09 +03:00
github-actions[bot] 5ea38c9898 [CI Skip] release/beta 9.2.2-5
skip-checks: true
2022-05-20 12:21:52 +00:00
Jaco 7177722a49 Fix buffer imports (#1495) 2022-05-20 15:17:39 +03:00
github-actions[bot] 6083923604 [CI Skip] release/beta 9.2.2-4
skip-checks: true
2022-05-20 10:04:53 +00:00
Jaco 7a3e1c23aa Internal bip32 mnemonicGenerate takes numWords param (#1494)
* Internal bip32 mnemonicGenerate takes numWords param

* Bump deps

* Calculate Calculate strength

* Remove duplicated assert
2022-05-20 13:00:07 +03:00
github-actions[bot] cab50dbf7a [CI Skip] release/beta 9.2.2-3
skip-checks: true
2022-05-20 09:01:11 +00:00
Jaco 9964b308ce Small readability cleanups (#1493) 2022-05-20 11:56:01 +03:00
github-actions[bot] 247a0e7227 [CI Skip] release/beta 9.2.2-2
skip-checks: true
2022-05-20 06:07:23 +00:00
Jaco f2dba8aff8 Small typo cleanups (#1492) 2022-05-20 09:02:32 +03:00
github-actions[bot] 2ef18335e3 [CI Skip] release/beta 9.2.2-1
skip-checks: true
2022-05-20 05:59:47 +00:00
Jaco fa0818d088 Small addressToEvm non-local change (#1491) 2022-05-20 08:55:58 +03:00
github-actions[bot] 2106626f22 [CI Skip] release/beta 9.2.2-0
skip-checks: true
2022-05-16 09:17:38 +00:00
Carlo Sala fceab0becc add parallel to KnownLedger (#1490) 2022-05-16 12:13:31 +03:00
github-actions[bot] bdf42368f7 [CI Skip] release/stable 9.2.1
skip-checks: true
2022-05-13 19:21:22 +00:00
Jaco 36ab5ea5e2 9.2.1 (#1489) 2022-05-13 22:16:25 +03:00
github-actions[bot] c5c8469038 [CI Skip] release/beta 9.1.2-11
skip-checks: true
2022-05-13 08:24:30 +00:00
Jaco 83d0121a28 Additional deprecations (#1488)
* Additional deprecations

* Unsigned shift

* Adjust

* offset calc
2022-05-13 11:19:20 +03:00
github-actions[bot] aff74ebde3 [CI Skip] release/beta 9.1.2-10
skip-checks: true
2022-05-13 06:46:09 +00:00
Jaco be4619ba3d MArk deprecated function signatures (#1487) 2022-05-13 09:40:43 +03:00
github-actions[bot] 17bc2e9fa0 [CI Skip] release/beta 9.1.2-9
skip-checks: true
2022-05-13 05:39:36 +00:00
Jaco 66e2382f26 Re-add top-level cryptoWaitReady (#1486) 2022-05-13 08:34:53 +03:00
github-actions[bot] 6c299f81c6 [CI Skip] release/beta 9.1.2-8
skip-checks: true
2022-05-13 04:33:17 +00:00
Nantian a4fcba6ff6 add acala ledger config (#1485) 2022-05-13 07:29:10 +03:00
github-actions[bot] 1a3507366e [CI Skip] release/beta 9.1.2-7
skip-checks: true
2022-05-12 09:18:43 +00:00
Jaco 65939dbe9d Signed conversion on empty u8a (#1484) 2022-05-12 12:14:34 +03:00
github-actions[bot] 6914411232 [CI Skip] release/beta 9.1.2-6
skip-checks: true
2022-05-12 07:59:10 +00:00
Jaco c79f46aaa2 Bump to beta @polkadot/wasm-* (#1483) 2022-05-12 10:55:00 +03:00
github-actions[bot] cea09b2c8b [CI Skip] release/beta 9.1.2-5
skip-checks: true
2022-05-12 05:14:44 +00:00
Jaco bc23ed9fc9 Bump deps (#1482) 2022-05-12 08:09:53 +03:00
github-actions[bot] a4f286e89a [CI Skip] release/beta 9.1.2-4
skip-checks: true
2022-05-10 07:02:34 +00:00
Jaco f112f9eb5e Bump deps (#1480) 2022-05-10 09:57:45 +03:00
github-actions[bot] 010552ca44 [CI Skip] release/beta 9.1.2-3
skip-checks: true
2022-05-09 09:54:37 +00:00
Jaco 9ae4b1066e Change all occurences of .substr(...) to .substring(...) (#1479) 2022-05-09 12:50:13 +03:00
github-actions[bot] 1a57abde6e [CI Skip] release/beta 9.1.2-2
skip-checks: true
2022-05-09 08:11:13 +00:00
Jaco cf4b44940e Bump dev (#1478) 2022-05-09 11:05:53 +03:00
github-actions[bot] 81e19aace4 [CI Skip] release/beta 9.1.2-1
skip-checks: true
2022-05-07 08:58:12 +00:00
Jaco 7341c32df5 Optimize u8aToHex with direct (non-hex) conversion (#1477)
* Optimize `u8aToHex` with direct (non-hex) conversion

* Adjust compactFromU8a tests
2022-05-07 11:54:08 +03:00
github-actions[bot] bb1ed6cfcd [CI Skip] release/beta 9.1.2-0
skip-checks: true
2022-05-05 06:07:20 +00:00
Jaco 55dcfb5e18 Bump @polkadot/dev (#1476) 2022-05-05 09:03:33 +03:00
github-actions[bot] 2fe9e5a125 [CI Skip] release/stable 9.1.1
skip-checks: true
2022-04-30 05:30:01 +00:00
Jaco e24385213d 9.1.1 (#1473) 2022-04-30 08:25:32 +03:00
github-actions[bot] 9cd81a23e7 [CI Skip] release/beta 9.0.2-11
skip-checks: true
2022-04-30 05:08:24 +00:00
Jaco 64348860cb Bump dev (#1472) 2022-04-30 08:04:24 +03:00
github-actions[bot] ecfceb5d0a [CI Skip] release/beta 9.0.2-10
skip-checks: true
2022-04-29 11:28:19 +00:00
Jaco cc840c37a2 Bump TS (#1471) 2022-04-29 14:24:27 +03:00
github-actions[bot] 527af12b0f [CI Skip] release/beta 9.0.2-9
skip-checks: true
2022-04-29 05:40:33 +00:00
Jaco 9f2b98d5a8 New Rococo genesis (#1470)
* New Rococo genesis

* CHANGELOG
2022-04-29 08:35:39 +03:00
github-actions[bot] 4bd767fb62 [CI Skip] release/beta 9.0.2-8
skip-checks: true
2022-04-28 10:18:44 +00:00
Jaco cff29dfd2d Jg type comments (#1469)
* Add some field-level comments on the keyring

* CHANGELOG
2022-04-28 13:13:32 +03:00
github-actions[bot] d26b80905c [CI Skip] release/beta 9.0.2-7
skip-checks: true
2022-04-27 17:26:43 +00:00
Carlo Sala 4249679882 feat(networks): add statemint to KnownLedger (#1467)
* feat(networks): add statemint

* feat(hw-ledger): add statemint
2022-04-27 20:21:27 +03:00
github-actions[bot] ff27055808 [CI Skip] release/beta 9.0.2-6
skip-checks: true
2022-04-27 06:57:00 +00:00
Jaco 54f8acb27f Bump @polkadot/dev (#1466) 2022-04-27 09:51:59 +03:00
github-actions[bot] 017bebe8bb [CI Skip] release/beta 9.0.2-5
skip-checks: true
2022-04-24 09:21:21 +00:00
Jaco 89f5670d8b Bump @polkadot/dev (#1464) 2022-04-24 12:17:18 +03:00
github-actions[bot] b9e2293bee [CI Skip] release/beta 9.0.2-4
skip-checks: true
2022-04-20 17:40:13 +00:00
xx networkandBernardo Cardoso 3b45418e47 Add xxnetwork genesis hash and ledger app (#1463)
* Add xxnetwork genesis hash and ledger app

* Update test

Co-authored-by: Bernardo Cardoso <bernardo@xx.network>
2022-04-20 20:35:20 +03:00
github-actions[bot] 6af7f6ef24 [CI Skip] release/beta 9.0.2-3
skip-checks: true
2022-04-19 14:02:14 +00:00
Jaco a0b85ee7f8 Bump deps (#1462) 2022-04-19 16:58:00 +03:00
github-actions[bot] 2e0c6c3368 [CI Skip] release/beta 9.0.2-2
skip-checks: true
2022-04-14 04:21:59 +00:00
Jaco 1d36284369 Adjust isHex performance test (#1461) 2022-04-14 07:18:01 +03:00
github-actions[bot] 94788692bb [CI Skip] release/beta 9.0.2-1
skip-checks: true
2022-04-13 05:37:51 +00:00
Jaco 1f3f5d5980 Adjust detectPackage formatting (#1460) 2022-04-13 08:33:37 +03:00
github-actions[bot] 90c2638221 [CI Skip] release/beta 9.0.2-0
skip-checks: true
2022-04-12 05:02:30 +00:00
Jaco 98e02a0baa Bump deps (#1459) 2022-04-12 07:58:00 +03:00
724 changed files with 73576 additions and 17394 deletions
-30
View File
@@ -1,30 +0,0 @@
8
2.6.2
2.12.2
5.2.2
5.2.3
5.4.2
5.4.3
5.4.4
5.5.2
5.6.2
5.6.3
5.9.2
6.0.2
6.0.3
6.0.4
6.0.5
7.0.2
7.0.3
7.1.2
7.8.2
7.9.2
8.0.2
8.0.3
8.0.4
8.0.5
8.1.2
8.2.2
8.3.2
8.3.3
-21
View File
@@ -1,21 +0,0 @@
checks:
argument-count:
config:
threshold: 5
method-complexity:
config:
threshold: 7
method-count:
config:
threshold: 25
method-lines:
config:
threshold: 30
exclude_patterns:
- "**/*.spec.js"
- "**/*.spec.ts"
- "packages/networks/src/substrate.ts"
- "packages/util/src/is/utf8.ts"
- "packages/x-noble-hashes/src/**.ts"
- "packages/x-noble-secp256k1/src/**.ts"
-2
View File
@@ -1,2 +0,0 @@
packages/x-noble-hashes/**/*.ts
packages/x-noble-secp256k1/**/*.ts
-22
View File
@@ -1,22 +0,0 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
const base = require('@polkadot/dev/config/eslint.cjs');
module.exports = {
...base,
ignorePatterns: [
...base.ignorePatterns
],
parserOptions: {
...base.parserOptions,
project: [
'./tsconfig.eslint.json'
]
},
rules: {
...base.rules,
// this seems very broken atm, false positives
'@typescript-eslint/unbound-method': 'off'
}
};
+86
View File
@@ -0,0 +1,86 @@
<!--
For general support, howto, coding and bundling questions, please
use the Substrate & Polkadot StackExchange at
https://substrate.stackexchange.com/
and get other ecosystem developers involved. This issues in this
repository are meant for the tracking of feature requests and bug
reports.
While all issues are looked at non-bug and non-features would take
quite a bit longer to get to and may yield less than satisfactory
responses in this format.
Additionally, please ensure you have done a search on the existing
and closed issues before logging a new request. This saves time on
all sides.
-->
* **I'm submitting a ...**
<!---
REQUIRED:
Classify the type of report your are submitting
-->
- [ ] Bug report
- [ ] Feature request
- [ ] Support request
- [ ] Other
* **What is the current behavior and expected behavior?**
<!---
REQUIRED:
If you're describing a bug, tell us what should happen. If you're
suggesting a change/improvement, tell us how it should work.
-->
* **What is the motivation for changing the behavior?**
<!---
OPTIONAL:
Suggest a motivation for the request or ideas how to implement the
addition or change
-->
* **Please tell us about your environment:**
<!---
REQUIRED:
Include as many relevant details about the environment in which you
experienced the issue. Also ensure that you have tested against the
latest stable releases if you believe this to be a bug
-->
- Version:
- Environment:
- [ ] Node.js
- [ ] Browser
- [ ] Other (limited support for other environments)
- Language:
- [ ] JavaScript
- [ ] TypeScript (include tsc --version)
- [ ] Other
+2 -2
View File
@@ -9,8 +9,8 @@ jobs:
if: "! startsWith(github.event.head_commit.message, '[CI Skip]') && (!github.event.pull_request || github.event.pull_request.head.repo.full_name == github.repository)"
runs-on: ubuntu-latest
steps:
- uses: jacogr/action-approve@master
- uses: jacogr/action-approve@795afd1dd096a2071d7ec98740661af4e853b7da
with:
authors: jacogr
authors: jacogr, TarikGul
labels: -auto
token: ${{ secrets.GH_PAT_BOT }}
+2 -2
View File
@@ -8,9 +8,9 @@ jobs:
merge:
runs-on: ubuntu-latest
steps:
- uses: jacogr/action-merge@master
- uses: jacogr/action-merge@d2d64b4545acd93b0a9575177d3d215ae3f92029
with:
checks: build,lint,test
checks: pr (build),pr (lint),pr (test)
labels: -auto
strategy: squash
token: ${{ secrets.GH_PAT_BOT }}
+5 -5
View File
@@ -10,16 +10,16 @@ jobs:
env:
YARN_ENABLE_SCRIPTS: false
steps:
- uses: dessant/lock-threads@v2
- uses: dessant/lock-threads@c1b35aecc5cdb1a34539d14196df55838bb2f836
with:
github-token: ${{ secrets.GH_PAT_BOT }}
issue-lock-inactive-days: '7'
issue-lock-comment: >
issue-inactive-days: '7'
issue-comment: >
This thread has been automatically locked since there has not been
any recent activity after it was closed. Please open a new issue
if you think you have a related problem or query.
pr-lock-inactive-days: '2'
pr-lock-comment: >
pr-inactive-days: '2'
pr-comment: >
This pull request has been automatically locked since there
has not been any recent activity after it was closed.
Please open a new issue for related bugs.
+13 -4
View File
@@ -3,17 +3,26 @@ on: [pull_request]
jobs:
pr:
continue-on-error: true
strategy:
matrix:
step: ['lint', 'test', 'build']
name: ${{ matrix.step }}
step: ['lint', 'test', 'build', 'deno']
runs-on: ubuntu-latest
env:
YARN_ENABLE_SCRIPTS: false
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 'lts/*'
- uses: denoland/setup-deno@v1
with:
# Deno v2 throws errors with specific types therefore we set it to the last version before v2
deno-version: v1.46.3
- name: ${{ matrix.step }}
if: always()
run: |
yarn install --immutable | grep -v 'YN0013'
deno --version
yarn install --immutable
yarn ${{ matrix.step }}
+8 -6
View File
@@ -10,20 +10,22 @@ jobs:
strategy:
matrix:
step: ['build:release']
name: ${{ matrix.step }}
runs-on: ubuntu-latest
env:
YARN_ENABLE_SCRIPTS: false
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
GH_PAT: ${{ secrets.GH_PAT }}
GH_RELEASE_GITHUB_API_TOKEN: ${{ secrets.GH_PAT }}
GH_PAT: ${{ secrets.GH_PAT_BOT }}
GH_RELEASE_GITHUB_API_TOKEN: ${{ secrets.GH_PAT_BOT }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GH_PAT }}
token: ${{ secrets.GH_PAT_BOT }}
- uses: actions/setup-node@v4
with:
node-version: 'lts/*'
- name: ${{ matrix.step }}
run: |
yarn install --immutable | grep -v 'YN0013'
yarn install --immutable
yarn ${{ matrix.step }}
-20
View File
@@ -1,20 +0,0 @@
name: Semgrep
on:
pull_request: {}
push:
branches:
- master
jobs:
check:
if: "! startsWith(github.event.head_commit.message, '[CI Skip]') && (!github.event.pull_request || github.event.pull_request.head.repo.full_name == github.repository)"
runs-on: ubuntu-latest
env:
YARN_ENABLE_SCRIPTS: false
steps:
- uses: actions/checkout@v2
- uses: returntocorp/semgrep-action@v1
with:
auditOn: push
publishToken: ${{ secrets.SEMGREP_APP_TOKEN }}
publishDeployment: 1395
-19
View File
@@ -1,19 +0,0 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '50 1/3 * * *'
jobs:
stale:
runs-on: ubuntu-latest
env:
YARN_ENABLE_SCRIPTS: false
steps:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GH_PAT_BOT }}
stale-issue-message: 'This issue has been open for 21 days with no activity and is not labelled as an enhancement. It will be closed in 7 days.'
stale-issue-label: 'stale'
exempt-issue-labels: '-size-l,-size-m,-size-s,-size-xl,-size-xs,[bug],ci'
days-before-stale: 21
days-before-close: 7
+3 -6
View File
@@ -1,13 +1,12 @@
--test-*
_book/
build/
build-cjs/
build-esm/
build-docs/
build-*/
coverage/
docs/.vuepress/dist/
node_modules/
tmp/
/import_map.json
/mod.ts
.DS_Store
.env.local
.env.development.local
@@ -26,6 +25,4 @@ npm-debug.log*
package-lock.json
yarn-debug.log*
yarn-error.log*
store.db
store.db.compacted
tsconfig.*buildinfo
+1 -1
View File
@@ -1,4 +1,4 @@
// Copyright 2017-2022 @polkadot/dev authors & contributors
// Copyright 2017-2026 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
module.exports = require('@polkadot/dev/config/prettier.cjs');
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-785
View File
File diff suppressed because one or more lines are too long
+948
View File
File diff suppressed because one or more lines are too long
+17 -6
View File
@@ -1,13 +1,24 @@
compressionLevel: mixed
enableGlobalCache: false
enableImmutableInstalls: false
enableProgressBars: false
logFilters:
- code: YN0013
level: discard
nodeLinker: node-modules
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
- path: .yarn/plugins/@yarnpkg/plugin-version.cjs
spec: "@yarnpkg/plugin-version"
yarnPath: .yarn/releases/yarn-4.9.1.cjs
yarnPath: .yarn/releases/yarn-3.2.0.cjs
# @quantus packages come from the Gitea registry. Safe as a whole-scope route
# because we own every name in it — unlike @polkadot, where routing the scope
# would send yarn looking for dozens of unforked packages that are not there.
#
# Reads are anonymous; publishing needs `pass gitea/package-publisher-token`.
npmScopes:
quantus:
npmRegistryServer: "https://git.lair.cafe/api/packages/quantus/npm/"
+763
View File
@@ -1,5 +1,768 @@
# CHANGELOG
## 14.0.3 Mar 23, 2026
Changes:
- Fix(hw-ledger): reset transport on operation errors and add explicit disconnect API ([#2024](https://github.com/polkadot-js/common/pull/2024))
## 14.0.2 Mar 16, 2026
Changes:
- Set headers to 2026 ([#2021](https://github.com/polkadot-js/common/pull/2021))
Contributed:
- fix(util-crypto): use correct x/y getters in secp256k1Expand ([#2018](https://github.com/polkadot-js/common/pull/2018)) (Thanks to https://github.com/AndreasGassmann)
## 14.0.1 Dec 9, 2025
Changes:
- fix(x-randomvalues): prioritize native RN modules over polyfilled crypto ([#2013](https://github.com/polkadot-js/common/pull/2013))
- sr25519: switch from wasm to micro-sr25519 ([#1971](https://github.com/polkadot-js/common/pull/1971))
## 13.5.9 Nov 25, 2025
Changes:
- Bump polkadot dependencies ([#2011](https://github.com/polkadot-js/common/pull/2011))
## 13.5.8 Nov 11, 2025
Changes:
- Bump @polkadot dependencies ([#2009](https://github.com/polkadot-js/common/pull/2009))
## 13.5.7 Oct 13, 2025
Changes:
- Revert "Set pbkdf2Encode rounds to default to 210,000" ([#2007](https://github.com/polkadot-js/common/pull/2007))
## 13.5.6 Aug 26, 2025
Changes:
- Set pbkdf2Encode rounds to default to 210,000 ([#1983](https://github.com/polkadot-js/common/pull/1983))
- Bump @polkadot/wasm deps ([#2002](https://github.com/polkadot-js/common/pull/2002))
Contributed:
- Add DENTNet to generic Polkadot app supported chains ([#1942](https://github.com/polkadot-js/common/pull/1942))
## 13.5.5 Aug 11, 2025
Changes:
- Add ledger support for Mythos ([#1969](https://github.com/polkadot-js/common/pull/1969))
## 13.5.4 July 28, 2025
Changes:
- Add Creditcoin3 support to Generic Ledger App ([#1985](https://github.com/polkadot-js/common/pull/1985))
## 13.5.3 July 1, 2025
Changes:
- Update polkadot dependencies ([#1995](https://github.com/polkadot-js/common/pull/1995))
- Add Optional Strict Input Checking to u8aToU8a ([#1994](https://github.com/polkadot-js/common/pull/1994))
- Update scrypt parameter validation ([#1993](https://github.com/polkadot-js/common/pull/1993))
## 13.5.2 Jun 17, 2025
Changes:
- fix: enhance error handling for secure random number generation in React Native ([#1991](https://github.com/polkadot-js/common/pull/1991))
- Add input length validation in scryptFromU8a function ([#1990](https://github.com/polkadot-js/common/pull/1990))
Contributed:
- Add Liberland support to Generic Ledger App ([#1989](https://github.com/polkadot-js/common/pull/1989))
## 13.5.1 May 19, 2025
Changes:
- Ledger ECDSA signing support ([#1986](https://github.com/polkadot-js/common/pull/1986))
- Bump yarn to 4.9.1 ([#1987](https://github.com/polkadot-js/common/pull/1987))
## 13.4.4 Apr 14, 2025
Changes:
- Improve objectSpread function property handling ([#1982](https://github.com/polkadot-js/common/pull/1982))
## 13.4.3 Feb 17, 2025
Changes:
- Rollback ws change in x-ws ([#1980](https://github.com/polkadot-js/common/pull/1980))
NOTE: this rollbacks changes made in ([#1976](https://github.com/polkadot-js/common/pull/1976)) to ensure websocket usage doesnt break in any downstream libs.
## 13.4.2 Feb 17, 2025
Changes:
- Cast ws as global.WebSocket ([#1978](https://github.com/polkadot-js/common/pull/1978))
## 13.4.1 Feb 16, 2025
Changes:
- Enable KeyringPair Creation with Custom Mnemonic Wordlists ([#1974](https://github.com/polkadot-js/common/pull/1974))
- Use ws library in Node.js 22+ for Better WebSocket Error Handling ([#1976](https://github.com/polkadot-js/common/pull/1976))
- Fix Misclassification of ECDSA Signatures in `verifyMultisig` ([#1973](https://github.com/polkadot-js/common/pull/1973))
- Bump dev to 0.83.2 ([#1972](https://github.com/polkadot-js/common/pull/1972))
- Bump yarn to 4.6.0 ([#1967](https://github.com/polkadot-js/common/pull/1967))
## 13.3.1 Jan 6, 2025
Changes:
- Give compatibility for nodejs v22
- Fix `getSeparator` which fixes toLocaleString ([#1965](https://github.com/polkadot-js/common/pull/1965))
- 2025 Headers ([#1963](https://github.com/polkadot-js/common/pull/1963))
## 13.2.3 Nov 11, 2024
Contributed:
- Add Vara support to the Generic Ledger App ([#1958](https://github.com/polkadot-js/common/pull/1958)) (Thanks to https://github.com/breathx)
Changes:
- Bump Dev to 0.82.1 ([#1959](https://github.com/polkadot-js/common/pull/1959))
## 13.2.2 Oct 28, 2024
Contributed:
- Add Polimec support to the Generic Ledger App ([#1945](https://github.com/polkadot-js/common/pull/1945)) (Thanks to https://github.com/lrazovic)
- Add Frequency to the Generic Ledger App ([#1955](https://github.com/polkadot-js/common/pull/1955)) (Thanks to https://github.com/wilwade)
Changes:
- Bump yarn to 4.5.1 ([#1953](https://github.com/polkadot-js/common/pull/1953))
## 13.2.1 Oct 21, 2024
Contributed:
- Add bittensor to genericLedgerApps (Thanks to https://github.com/camfairchild) ([#1941](https://github.com/polkadot-js/common/pull/1941))
Changes:
- Fix Deno CI Build ([#1947](https://github.com/polkadot-js/common/pull/1947))
- Bump yarn to 4.5.0 ([#1946](https://github.com/polkadot-js/common/pull/1946))
- Update Ledger Deps ([#1948](https://github.com/polkadot-js/common/pull/1948))
- Update WS and deps ([#1949](https://github.com/polkadot-js/common/pull/1949))
- Bump polkadot/wasm to 7.4.1 ([#1950](https://github.com/polkadot-js/common/pull/1950))
- Bump dev to 0.81.2 ([#1951](https://github.com/polkadot-js/common/pull/1951))
- Allows for CJS target in build
## 13.1.1 Sep 16, 2024
Contributed:
HydraDx - Hydration Rebrand Thanks to (https://github.com/jak-pan) ([#1923](https://github.com/polkadot-js/common/pull/1923))
Changes:
- Update all deps that have patch releases ([#1934](https://github.com/polkadot-js/common/pull/1934))
- Bump yarn to 4.4.1 ([#1940](https://github.com/polkadot-js/common/pull/1940))
- Update ss58-registry to 1.50.0 ([#1937](https://github.com/polkadot-js/common/pull/1937))
- Update dev and typescript ([#1936](https://github.com/polkadot-js/common/pull/1936))
- Add Encointer and Integritee to Ledger, and adjust tests ([#1939](https://github.com/polkadot-js/common/pull/1939))
- This PR added the addition of `genericLedgerApps` and `prevLedgerRecord` objects. They both combine into `ledgerApps` in `hw-ledger/defaults`.
## 13.0.2 July 12, 2024
Contributed:
- Add peaq support for ledger (Thanks to https://github.com/lavish0000)
## 13.0.1 July 12, 2024
Breaking Changes:
- Add Support for latest Ledger App
- This deprecates `class Ledger` in favor of `class LedgerGeneric`
- More info in the following PR ([#1925](https://github.com/polkadot-js/common/pull/1925))
Changes:
- Bump dev to 0.79.1
- Comments around pair encode/decode 1-3
- Bump ws, react-native, ss58Registry
- Bump yarn to 4.3.1
- Update CI to checkout and setup_node v4
## 12.6.2 Dec 18, 2023
Changes:
- Update to latest `@polkadot/wasm-crypto`
- Upgrade dependencies to latest versions
## 12.6.1 Nov 18, 2023
Contributed:
- Ledger support for Quartz (Thanks to https://github.com/CertainLach)
- Add flag to disable same-version esm/cjs warnings (Thanks to https://github.com/forgetso)
Changes:
- Adjust logger check for `process.env`
- Adjust `isRiscV` helper to check for `PVM\0` bytes
- Drop support for Node 16 (EOL 11 Sep 2023)
- Upgrade dependencies to latest stable versions
## 12.5.1 Sep 15, 2023
Contributed:
- Add `isRiskV` helper (Thanks to https://github.com/peetzweg)
- Ledger support for Enjin & Matrixchain (Thanks to https://github.com/leonardocustodio)
Changes:
- Expand interface type comments (assists in-editor helpers)
- Upgrade dependencies to latest stable versions
## 12.4.2 Aug 23, 2023
Changes:
- Fix `u8aTo{BigInt, Bn, Number}` for non-negative `i{8, 16, 32...}` inputs
- Extend `u8aToBuffer` with `hasBuffer` check
- Adjust util tests (extract input/output arrays)
## 12.4.1 Aug 17, 2023
Changes:
- Add support for Ledger `signRaw`, as exposed by lower-level
- Update code to use `?.` shortcuts where appropriate
- Adjust `u8aToBuffer` & `isBuffer` typings to not require `Buffer`
- Use `stringify/import.meta.url` helpers in specs
- Upgrade dependencies to latest stable versions
## 12.3.2 Jun 12, 2023
Changes:
- Adjust `SubstrateNetwork` typing with `HexString` genesisHash
- Re-export `Constructor<T>` type (deprecated, replaced with `Class<T>`)
## 12.3.1 Jun 11, 2023
Changes:
- Only allow padding characters in base64 strings
- Expand typings for keyring meta with known keys
- Adjust object index access for stricter tsconfig settings
## 12.2.2 Jun 4, 2023
Changes:
- Apply missing count assignment for `for (...)` loops
- Remove unused `@types/*` dev dependencies
- Upgrade dependencies to latest stable versions
## 12.2.1 May 13, 2023
Changes:
- Align `u8aToBigInt` tests with `u8aToBn`
- Unroll loops on most-frequently used paths for `u8aToBigInt`
- Add `module` to `package.json` export map (ESM-only)
- Upgrade dependencies to latest stable versions
## 12.1.2 May 1, 2023
Changes:
- Adjust typing for `isChildClass` & `Constructor` usage
## 12.1.1 Apr 29, 2023
Changes:
- Add shareable `identity` & `noop` functions
- Flatten `Buffer | Uint8Array` types (as used) to base-only `Uint8Array`
- Apply `readonly` specifiers to private class fields where applicable
- Adjust compilation output for `__internal__` class fields
- Remove unused types from `util`
- Upgrade dependencies to latest stable versions
## 12.0.1 Apr 22, 2023
Contributed:
- Add Cere genesisHash (Thanks to https://github.com/shamilkhan)
Changes:
- Swap secp256k1 functionality to `@noble/curves`
- Swap ed25519 functionality to `@noble/curves`
- Replace `tweetnacl` secretbox usage with slimmer local version
- Adjust `isCodec` helper with closer API alignment
- Initial steps to multi-language bip39 support
- Use Node webcrypto for Node `getRandomValues` support
- Upgrade dependencies to latest stable versions
- Drop support for Node 14 (EOL 30 Apr 2023)
## 11.1.3 Apr 1, 2023
Contributed:
- Add Bittensor genesisHash (Thanks to https://github.com/camfairchild)
Changes:
- Allow empty string as valid base32/base58/base64 decoder input
- Add additional/missing `/*#__PURE__*/` annotations
- Upgrade dependencies to latest stable versions
## 11.1.2 Mar 25, 2023
Changes:
- Expand error details for invalid publicKeys in secp256k1 compress/expand operations
- Expand `@polkadot/hw-ledger` with specific per-method JSDoc
- Upgrade dependencies to latest stable versions
## 11.1.1 Mar 18, 2023
Contributed:
- Add 3DPass genesisHash (Thanks to https://github.com/fedosov)
Changes:
- Remove support for encrypt/decrypt functionality on keypair
- Upgrade dependencies to latest stable versions
## 11.0.2 Mar 11, 2023
Changes:
- Use consistent `.js` imports in source files (TS moduleResolution)
- Remove TS resolveJsonModule option
- Upgrade to `@polkadot/wasm-crypto` 7.0.3
## 11.0.1 Mar 4, 2023
Changes:
- Change `@polkadot/x-ws` to use [ws](https://www.npmjs.com/package/ws) package (previous: `websocket`)
- Add `/*#__PURE__*/` annotations for `@polkadot/x-*` packages
- Swap TS -> JS compiler to use tsc (from babel)
- Adjust all tests to use `node:test` runner (ESM variants)
- Move `cryptoWaitReady()` top-level in test files
- Upgrade to `@polkadot/wasm-crypto` 7.0.1
## 10.4.2 Feb 19, 2023
Contributed:
- Ledger support for Pendulum (Thanks to https://github.com/carlosala)
Changes:
- Ensure `u8aToU8a` correctly unwraps Buffer value (check ordering)
- Upgrade dependencies to latest stable versions
## 10.4.1 Feb 12, 2023
Contributed:
- Locale support for number formatting (Thanks to https://github.com/alko89)
- Ledger support for Picasso (Thanks to https://github.com/carlosala)
Changes:
- Add `isClass` helper (checks if input is actual Class Constructor)
- Adjust `isChildClass` to rely on new `isClass`
- Upgrade dependencies to latest stable versions
## 10.3.1 Jan 28, 2023
Contributed:
- Ledger support for Ternoa (Thanks to https://github.com/mohsinriaz17)
Changes:
- Expand `arrayChunk` tests
- Adjust output for Ledger sanity checks
- Expand exported `bigint` constants to match with those in `BN`
- Adjust internal character maps to operate on `Uint8Array` instad of `Array<number>`
- Upgrade dependencies to latest stable versions
## 10.2.6 Jan 13, 2023
Changes:
- Drop stray `console.error` log (it really _is_ Friday 13th)
## 10.2.5 Jan 13, 2023
Changes:
- Bugfix for `formatBalance` (forceUnit) with `BN` inputs where output is less than 0
## 10.2.4 Jan 13, 2023
Changes:
- Add the `withAll` (default false) flag to `formatBalance` to format to max decimals
- Add the `withZero` (default true) flags to `formatBalance` to retain trailing zeros
## 10.2.3 Jan 7, 2023
Changes:
- Adjust `isBuffer` check on `xglobal` (no auto-polyfill detection on eg. parcel)
- Upgrade dependencies to latest stable versions
## 10.2.2 Jan 6, 2023
Contributed:
- Adjust Nodle Ledger mapping (Thanks to https://github.com/aliXsed)
Changes:
- Upgrade dependencies to latest stable versions
## 10.2.1 Dec 4, 2022
Contributed:
- Ledger support for Ajuna (Thanks to https://github.com/carlosala)
Changes:
- `has{Buffer, Process}` now checks on `globalThis` (helps bundlers with auto-injection)
- Add `/*#__PURE__*/` annotations for specific `export const something = someFunction(...)`
- Upgrade dependencies to latest stable versions
- Upgrade to `@polkadot/wasm-crypto` 6.4.1
## 10.1.14 Nov 27, 2022
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.13 Nov 20, 2022
Contributed:
- Ledger support for Origintrail (Thanks to https://github.com/carlosala)
Changes:
- Expand type descriptions around Ledger-based structures
- Upgrade dependencies to latest stable versions
## 10.1.12 Nov 13, 2022
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.11 Oct 15, 2022
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.10 Oct 7, 2022
Changes:
- Ensure `{bn, n, number}ToHex(0)` always respects `bitLength`
- Upgrade dependencies to latest stable versions
## 10.1.9 Sep 24, 2022
Contributed:
- Ledger support for VTB (Thanks to https://github.com/GuilaneDen)
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.8 Sep 17, 2022
Contributed:
- Ledger support for Darwinia, Phala & Khala (Thanks to https://github.com/carlosala)
- Ledger support for HydraX (Thanks to https://github.com/chcmedeiros)
Changes:
- Expand test cases
- Upgrade dependencies to latest stable versions
## 10.1.7 Sep 2, 2022
Changes:
- Hoist Ledger interface wrapError (internal adjustment)
- Upgrade dependencies to latest stable versions
## 10.1.6 Aug 23, 2022
Changes:
- Adjust `nextTick` with greater care for browser loops
- Upgrade dependencies to latest stable versions
## 10.1.5 Aug 21, 2022
Changes:
- Adjust `ledgerApps` to use new `@zondax/ledger-substrate` interfaces
- Upgrade dependencies to latest stable versions
## 10.1.4 Aug 12, 2022
Contributed:
- Ledger support for Kusama Bifrost (Thanks to https://github.com/awesomepan)
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.3 Aug 5, 2022
Changes:
- Optimization for empty `arrayFlatten` case
- Coding cleanups for logger (no `as` casting)
- Optiomizations in assertion checks
## 10.1.2 Jul 29, 2022
Changes:
- Upgrade dependencies to latest stable versions
## 10.1.1 Jul 21, 2022
Changes:
- Add `arrayUnzip` as reverse of `arrayZip`
- Adjust `objectSpread` to natively handle `Map` entries spreads
- Adjust `isAscii` check to disallow `\t`, `\n`, & `\r` characters
- Adjust `nobody` zero-key pair with pre-computed address
- Align `objectProperty` & `lazyMethod` call signatures (backwards compatible)
- Various internal speed optimizations
- Upgrade dependencies to latest stable versions
## 10.0.2 Jul 10, 2022
Changes:
- Adjust async import in `x-fetch` to be Jest-friendly
## 10.0.1 Jul 8, 2022
- **Breaking change** In this major version version previously deprecated function signatures have been removed. If still using the old forms for either `bnToHex`, `bnToU8a`, `formatBalance`, `hexToBn` or `u8aToBn`, please update and only pass through an options object as the second parameter.
Contributed:
- Ledger support for Stafi (Thanks to https://github.com/kaelnew)
- Ledger support for Aleph Zero (Thanks to https://github.com/carlosala)
- Add genesis for HydraDX parachain (Thanks to https://github.com/jak-pan)
Changes:
- Remove deprecated signatures for `bnToHex`, `bnToU8a`, `formatBalance`, `hexToBn`, `u8aToBn`
- Align option handling of `n*` (BigInt) functions with `bn*` (BN)
- Allow for usage without `@types/node` installed
- Adjust for available ESM-only dependencies
- Upgrade dependencies to latest stable versions
- Upgrade to `@polkadot/wasm-crypto` 6.2.3
## 9.7.2 Jul 4, 2022
Changes:
- Upgrade to `@polkadot/wasm-crypto` 6.2.2
## 9.7.1 Jul 1, 2022
Changes:
- Update signatures where `readonly` arrays are used
- Upgrade dependencies to latest stable versions
- Upgrade to `@polkadot/wasm-crypto` 6.2.1
## 9.6.2 Jun 25, 2022
Changes:
- Fix `hexToU8a` where `0x` is not correctly converted
## 9.6.1 Jun 23, 2022
Changes:
- Add `floatToU8a` and `u8aToFloat` (both 32 & 64-bit, le & be)
- Adjust `isUndefined` check (local variable available)
- Adjust use of `assert`, `isUndefined` & `isNull`
## 9.5.1 Jun 18, 2022
Contributed:
- Update Bifrost genesisHash (Thanks to https://github.com/awesomepan)
- Add Ledger support for Composable (Thanks to https://github.com/carlosala)
Changes:
- Add `u8aToNumber` (limited, <= 48 bits) function
- Use `~~` as bitwise/faster `Math.floor` replacement
- Remove unneeded `objectSpread` option expansions
- Optimize `hexToU8a` operations
- Optimize `stringCamelCase` operations
- Optimize `u8aToBn` operations
- Additional internal/external comments (as missing)
- Upgrade dependencies to latest stable versions
## 9.4.1 Jun 4, 2022
Changes:
- Add `nextTick` to `@polkadot/util` to defer execution to the queue
- Upgrade dependencies to latest stable versions
## 9.3.1 May 29, 2022
Contributed:
- Add Ledger support for Parallel (Thanks to https://github.com/carlosala)
- Add Ledger support for Astar & Polkadex (Thanks to https://github.com/carlosala)
Changes:
- Adjust `u8aToU8a` checks with better `isU8a` shortcut
- Adjust compact conversion with unrolled loops
- Adjust `string{Camel, Pascal}Case` with loop (no map)
- Add `compactFromU8aLim` variant with Uint8Array-only inputs
- Add `u8aConcatStrict` variant with Uint8Array-only inputs
- Internal code maintainability enhancements
- Upgrade dependencies to latest stable versions
## 9.2.1 May 13, 2022
Contributed:
- Add Ledger support for Acala (Thanks to https://github.com/ntduan)
Changes:
- Optimize `u8aToHex` with direct (non-hex) conversion
- Change all occurences of `.substr(...)` to `.substring(...)`
- Sync with upstream Substrate ss58 registry
- Mark deprecated function signatures (no removals)
- Re-enable auto init of `cryptoWaitReady()`
- Upgrade to `@polkadot/wasm-crypto` 6.1.1
## 9.1.1 Apr 30, 2022
Contributed:
- Add Ledger support for Statemint (Thanks to https://github.com/carlosala)
- Add Ledger support for xxnetwork (Thanks to https://github.com/xx-labs)
Changes:
- Adjust/dedupe output from `detectPackage`
- Adjust `isHex` performance test
- Add field-level comments to some `*Options` structures
- Add new Rococo genesisHash (reset)
## 9.0.1 Apr 9, 2022
- **Breaking change** In this major version the commonjs outputs are moved to a sub-folder. Since the export map and main field in package.json does reflect this change, there should be no usage changes. However the packages here will all need to be on the same version for internal linkage.
+34 -4
View File
@@ -1,47 +1,77 @@
1293 Jaco 9.0.1 (#1457)
1674 Jaco Bump deps (#1912)
47 Tarik Gul 14.0.3 (#2025)
13 Carlo Sala feat(networks): add zeitgeist Ledger support (#1840)
11 Valentin Fernandez 13.5.7 (#2008)
9 Antoine Estienne Add eth uri keyring test (#1291)
9 rajk93 14.0.1 (#2014)
6 Amaury Martiny Add tests from Rust (#283)
6 Jakub Pánik HydraDX -> Hydration rebrand (#1923)
5 Arjun Porwal 13.5.6 (#2004)
5 kwingram25 Add BN consts and timeToString (#610)
4 Adam Dossa Update Polymesh Genesis Hash (#1193)
4 Jakub Pánik Add basilisk 🐍 (#1396)
4 pan add bifrost kusama (#1626)
3 AndreasGassmann fix(util-crypto): use correct x/y getters in secp256k1Expand (#2018)
3 Luke Schoen docs: Fix example in readme since we use default imports (#243)
2 AndreasGassmann feat(dependencies): remove moment.js (#530)
2 Cameron Fairchild Add bittensor details (#1783)
2 Gav Wood Fix stake:unstake (#182)
2 Hyungsuk Kang Add cross client Encryption/Decryption (#496)
2 Jared Norris Add Sora network (#1306)
2 Kami Adding Westend genesis. (#1429)
2 Lovesh Harchandani Update genesis hash of Dock mainnet (#1436)
2 Nantian fix bigint type (#1079)
2 pan add bifrost (#1296)
2 Stefanie Doll Add missing dependencies to util-crypto (#424)
1 Agustinus Theodorus docs: fix typo in naclSeal docs. (#1005)
1 Aleš Ferlan feat: allow setting of thousand/decimal separators (#1722)
1 Alex Sedighi fix Nodle's known network name (#1699)
1 Alexander Krupenkin Added ECDSA keypair support (#589)
1 alexdniep added equilibrium slip44; added equilibrium genesis hash (#984)
1 amphineko chore: fix typo in versionDetect messages (#941)
1 Axel Chalon Simplify @polkadot/keyring KeyringPair (#419)
1 Brad Larson [FIX] Adjust error message (#646)
1 Carlos Medeiros add hydradx to knownLedger (#1647)
1 Chris Get rid of warnings for dual esm and cjs packages of the same version (#1890)
1 Dmitrii Novikov Add `Vara` support to Generic Ledger App (#1958)
1 Eliott Teissonniere add nodle ledger specs (#1089)
1 Francis O'Brien Fix(hw-ledger): reset transport on operation errors and add explicit disconnect API (#2024)
1 Guilane DENGUIR feat(VTB): Added support for VTB blockchain (#1651)
1 h4x3rotab Throws an error when signing with a locked keypair (#578)
1 Harry Liu Update README.md (#446)
1 henrikdent Add DENTNet ledger support (via generic Polkadot app) (#1942)
1 Hoon Kim replace plasm genesis with astar (#1397)
1 Hussein Ait-Lahcen Add Picasso Genesis Hash (#1261)
1 Igor Support genshiro network (#1148)
1 Jake Naviasky Add evmToAddress and addressToEvm crypto utils. (#705)
1 JesseAbram added check if valid address to docs (#440)
1 joe petrowski Add example for multisig address creation (#590)
1 José Molina Colmenero Add ledger support for Mythos (#1969)
1 kaelnew add ledger support for stafi (#1569)
1 Leonardo Custodio Ledger support (#1879)
1 Leonardo Razovic feat: add Polimec (#1945)
1 Lezek123 logger - wildcard include/exclude with DEBUG env (#932)
1 Lovish Arora Add peaq support for ledger (#1928)
1 Mario Neises remove redudant export (#257)
1 Miguel Hervas Add CFG Ledger Support (#1057)
1 Mikhail Fedosov feat: add 3dpass network (#1769)
1 Mohsan Riaz Add Ternoa for ledger hardware support (#1711)
1 nahuseyoum Reserving 65 for Aventus based on the new extended range (#871)
1 Nantian add acala ledger config (#1485)
1 Paul Miller sr25519: switch from wasm to micro-sr25519 (#1971)
1 peetzweg/ adds `isRiscV` guard function similar to isWasm (#1878)
1 qwer951123 Add acala genesis (#1161)
1 Radek Bochenek feat: add Liberland support to Generic Ledger App (#1989)
1 Raoul Millais Fix yarn add instructions in x-global README (#873)
1 Raymond Zhong Add Edgeware ledger app (#1006)
1 Reto Trinkler Adding 4 as address type of ss58 for Katal Chain (#639)
1 Rocco Musolino remove doc broken link (#697)
1 Salina Add Creditcoin3 support to Generic Ledger App (#1985)
1 Shamilkhan Add genesis hash for Cere Network (#1806)
1 Song Zhou Add in ability to encrypt/decrypt msg with keyring (#1070)
1 Thibaut Sardan add hasLedgerSupport prop to networks (#835)
1 Tomokazu Kozuma fix comment (#1119)
1 Tore19 Add stafi genesis hash (#1096)
1 Wei Tang ss58: add Kulupu prefix to the list (#595)
1 Wil Wade Add Frequency to the Generic Ledger App (#1955)
1 WoeOm Handing high precision scenes (#450)
1 xx network Add xxnetwork genesis hash and ledger app (#1463)
1 Yaroslav Bolyukin Add quartz support for ledger, update unique slip-0044 identifier (#1882)
1 Yuri Extra check for process for browser bundles (#923)
-7
View File
@@ -1,10 +1,3 @@
[![polkadotjs](https://img.shields.io/badge/polkadot-js-orange?logo=&style=flat-square)](https://polkadot.js.org)
![license](https://img.shields.io/badge/License-Apache%202.0-blue?logo=apache&style=flat-square)
[![npm](https://img.shields.io/npm/v/@polkadot/util?logo=npm&style=flat-square)](https://www.npmjs.com/package/@polkadot/util)
[![beta](https://img.shields.io/npm/v/@polkadot/util/beta?label=beta&logo=npm&style=flat-square)](https://www.npmjs.com/package/@polkadot/util)
[![maintainability](https://img.shields.io/codeclimate/maintainability-percentage/polkadot-js/common?logo=code-climate&style=flat-square)](https://codeclimate.com/github/polkadot-js/common)
[![coverage](https://img.shields.io/codeclimate/coverage/polkadot-js/common?logo=code-climate&style=flat-square)](https://codeclimate.com/github/polkadot-js/common)
# @polkadot/common
Various useful utility functions that are used across all projects in the [@polkadot](https://polkadot.js.org) namespace. It provides utility functions with additional safety checks, allowing not only for consistent coding, but also reducing the general boilerplate.
-4
View File
@@ -1,4 +0,0 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
module.exports = require('@polkadot/dev/config/babel-config-cjs.cjs');
+8
View File
@@ -0,0 +1,8 @@
// Copyright 2017-2026 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import baseConfig from '@polkadot/dev/config/eslint';
export default [
...baseConfig
];
+5
View File
@@ -0,0 +1,5 @@
{
"imports": {
"https://esm.sh/v90/@types/bn.js@~5.2/index.d.ts": "https://esm.sh/v90/@types/bn.js@5.1.0/index.d.ts"
}
}
-19
View File
@@ -1,19 +0,0 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
const config = require('@polkadot/dev/config/jest.cjs');
module.exports = Object.assign({}, config, {
moduleNameMapper: {
'@polkadot/hw-ledger-transports(.*)$': '<rootDir>/packages/hw-ledger-transports/src/node',
// eslint-disable-next-line sort-keys
'@polkadot/hw-ledger(.*)$': '<rootDir>/packages/hw-ledger/src/$1',
'@polkadot/keyring(.*)$': '<rootDir>/packages/keyring/src/$1',
'@polkadot/networks(.*)$': '<rootDir>/packages/networks/src/$1',
'@polkadot/util-(crypto)(.*)$': '<rootDir>/packages/util-$1/src/$2',
// eslint-disable-next-line sort-keys
'@polkadot/util(.*)$': '<rootDir>/packages/util/src/$1',
'@polkadot/x-(bigint|global)(.*)$': '<rootDir>/packages/x-$1/src/$2',
'@polkadot/x-(fetch|randomvalues|textdecoder|textencoder|ws)(.*)$': '<rootDir>/packages/x-$1/src/node'
}
});
+18 -10
View File
@@ -1,37 +1,45 @@
{
"author": "Jaco Greeff <jacogr@gmail.com>",
"bugs": "https://github.com/polkadot-js/common/issues",
"engines": {
"node": ">=18.14"
},
"homepage": "https://github.com/polkadot-js/common#readme",
"license": "Apache-2.0",
"packageManager": "yarn@3.2.0",
"packageManager": "yarn@4.9.1",
"private": true,
"repository": {
"type": "git",
"url": "https://github.com/polkadot-js/common.git"
},
"sideEffects": false,
"version": "9.0.1",
"type": "module",
"version": "14.0.3",
"versions": {
"git": "14.0.3",
"npm": "14.0.3"
},
"workspaces": [
"packages/*"
],
"scripts": {
"build": "polkadot-dev-build-ts",
"build:networks": "polkadot-dev-run-test packages/networks/src",
"build:release": "polkadot-ci-ghact-build",
"build:rollup": "polkadot-exec-rollup --config",
"clean": "polkadot-dev-clean-build",
"deno": "yarn polkadot-dev-deno-map && yarn build && deno check --import-map=import_map.json mod.ts",
"lint": "polkadot-dev-run-lint",
"networks:crosscheck": "polkadot-dev-run-test packages/networks/src/crosscheck",
"postinstall": "polkadot-dev-yarn-only",
"test": "polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns crosscheck --testPathIgnorePatterns toMiniSecretCmp",
"test:mnemonicCmp": "polkadot-dev-run-test packages/util-crypto/src/mnemonic/toMiniSecretCmp.spec.ts",
"test:one": "polkadot-dev-run-test --runInBand"
"test": "polkadot-dev-run-test --env browser",
"test:node": "polkadot-dev-run-test --env browser ^mnemonic/toMiniSecretCmp",
"test:one": "polkadot-dev-run-test --env browser"
},
"devDependencies": {
"@babel/core": "^7.17.9",
"@polkadot/dev": "^0.66.1",
"@types/jest": "^27.4.1"
"@polkadot/dev": "^0.83.3",
"@types/node": "^22.7.5"
},
"resolutions": {
"typescript": "^4.6.3"
"typescript": "^5.5.4"
}
}
-201
View File
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+8 -10
View File
@@ -1,13 +1,11 @@
{
"author": "Jaco Greeff <jacogr@gmail.com>",
"bugs": "https://github.com/polkadot-js/common/issues",
"contributors": [],
"engines": {
"node": ">=14.0.0"
"node": ">=18"
},
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/hw-ledger-transports#readme",
"license": "Apache-2.0",
"maintainers": [],
"name": "@polkadot/hw-ledger-transports",
"repository": {
"directory": "packages/hw-ledger-transports",
@@ -16,18 +14,18 @@
},
"sideEffects": false,
"type": "module",
"version": "9.0.1",
"version": "14.0.3",
"browser": "browser.js",
"main": "node.js",
"react-native": "react-native.js",
"dependencies": {
"@babel/runtime": "^7.17.9",
"@ledgerhq/hw-transport": "^6.24.1",
"@ledgerhq/hw-transport-webhid": "^6.24.1",
"@ledgerhq/hw-transport-webusb": "^6.24.1",
"@polkadot/util": "9.0.1"
"@ledgerhq/hw-transport": "^6.31.4",
"@ledgerhq/hw-transport-webhid": "^6.29.4",
"@ledgerhq/hw-transport-webusb": "^6.29.4",
"@polkadot/util": "14.0.3",
"tslib": "^2.8.0"
},
"optionalDependencies": {
"@ledgerhq/hw-transport-node-hid-singleton": "^6.26.0"
"@ledgerhq/hw-transport-node-hid-singleton": "^6.31.5"
}
}
+6 -18
View File
@@ -1,23 +1,11 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type Transport from '@ledgerhq/hw-transport';
import type { TransportDef } from './types';
import LedgerHid from '@ledgerhq/hw-transport-webhid';
import LedgerUsb from '@ledgerhq/hw-transport-webusb';
import LedgerWebHid from '@ledgerhq/hw-transport-webhid';
import LedgerWebUsb from '@ledgerhq/hw-transport-webusb';
import { createDefs } from './util.js';
export { packageInfo } from './packageInfo';
export { packageInfo } from './packageInfo.js';
export const transports: TransportDef[] = [
{
create: (): Promise<Transport> =>
LedgerWebUsb.create(),
type: 'webusb'
},
{
create: (): Promise<Transport> =>
LedgerWebHid.create(),
type: 'hid'
}
];
export const transports = /*#__PURE__*/ createDefs(['webusb', LedgerUsb], ['hid', LedgerHid]);
@@ -1,4 +0,0 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
export default [];
@@ -1,11 +0,0 @@
// Copyright 2017-2022 @polkadot/hw-ledger-transports authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
import { detectPackage } from '@polkadot/util';
import others from './detectOther';
import { packageInfo } from './packageInfo';
detectPackage(packageInfo, null, others);
@@ -0,0 +1,8 @@
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { createDefs } from './util.js';
export { packageInfo } from './packageInfo.js';
export const transports = /*#__PURE__*/ createDefs();
+4
View File
@@ -0,0 +1,4 @@
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
export * from './empty.js';
+5 -12
View File
@@ -1,17 +1,10 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type Transport from '@ledgerhq/hw-transport';
import type { TransportDef } from './types';
import LedgerHid from '@ledgerhq/hw-transport-node-hid-singleton';
export { packageInfo } from './packageInfo';
import { createDefs } from './util.js';
export const transports: TransportDef[] = [
{
create: (): Promise<Transport> =>
LedgerHid.create(),
type: 'hid'
}
];
export { packageInfo } from './packageInfo.js';
export const transports = /*#__PURE__*/ createDefs(['hid', LedgerHid]);
@@ -0,0 +1,11 @@
// Copyright 2017-2026 @polkadot/hw-ledger-transports authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
// (packageInfo imports will be kept as-is, user-editable)
import { detectPackage } from '@polkadot/util';
import { packageInfo } from './packageInfo.js';
detectPackage(packageInfo, null, []);
@@ -1,6 +1,6 @@
// Copyright 2017-2022 @polkadot/hw-ledger-transports authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger-transports authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '9.0.1' };
export const packageInfo = { name: '@polkadot/hw-ledger-transports', path: 'auto', type: 'auto', version: '14.0.3' };
@@ -1,8 +1,4 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { TransportDef } from './types';
export { packageInfo } from './packageInfo';
export const transports: TransportDef[] = [];
export * from './empty.js';
+10 -4
View File
@@ -1,11 +1,17 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import Transport from '@ledgerhq/hw-transport';
// CJS, so we use import * syntax
import type * as HwTransport from '@ledgerhq/hw-transport';
export type LedgerTypes = 'hid' | 'u2f' | 'webusb';
// u2f is deprecated an therefore not added
export type TransportType = 'hid' | 'webusb';
export type Transport = HwTransport.default;
export interface TransportDef {
/** Create a transport to be used in Ledger operations */
create (): Promise<Transport>;
type: LedgerTypes;
/** The type of the underlying transport definition */
type: TransportType;
}
+12
View File
@@ -0,0 +1,12 @@
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Transport, TransportDef, TransportType } from './types.js';
export function createDefs (...items: readonly [type: TransportType, Clazz: unknown][]): TransportDef[] {
return items.map(([type, Clazz]): TransportDef => ({
create: (): Promise<Transport> =>
(Clazz as Pick<TransportDef, 'create'>).create(),
type
}));
}
@@ -5,6 +5,9 @@
"outDir": "./build",
"rootDir": "./src"
},
"exclude": [
"**/mod.ts"
],
"references": [
{ "path": "../util/tsconfig.build.json" }
]
-201
View File
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+8 -11
View File
@@ -1,13 +1,11 @@
{
"author": "Jaco Greeff <jacogr@gmail.com>",
"bugs": "https://github.com/polkadot-js/common/issues",
"contributors": [],
"engines": {
"node": ">=14.0.0"
"node": ">=18"
},
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/hw-ledger#readme",
"license": "Apache-2.0",
"maintainers": [],
"name": "@polkadot/hw-ledger",
"repository": {
"directory": "packages/hw-ledger",
@@ -15,17 +13,16 @@
"url": "https://github.com/polkadot-js/common.git"
},
"sideEffects": [
"./detectPackage.js",
"./detectPackage.cjs"
"./packageDetect.js",
"./packageDetect.cjs"
],
"type": "module",
"version": "9.0.1",
"version": "14.0.3",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.17.9",
"@ledgerhq/hw-transport": "^6.24.1",
"@polkadot/hw-ledger-transports": "9.0.1",
"@polkadot/util": "9.0.1",
"@zondax/ledger-substrate": "^0.24.0"
"@polkadot/hw-ledger-transports": "14.0.3",
"@polkadot/util": "14.0.3",
"@zondax/ledger-substrate": "1.1.1",
"tslib": "^2.8.0"
}
}
+169
View File
@@ -0,0 +1,169 @@
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { SubstrateApp } from '@zondax/ledger-substrate';
import type { Transport, TransportDef, TransportType } from '@polkadot/hw-ledger-transports/types';
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerVersion } from './types.js';
import { newSubstrateApp } from '@zondax/ledger-substrate';
import { transports } from '@polkadot/hw-ledger-transports';
import { hexAddPrefix, u8aToBuffer, u8aWrapBytes } from '@polkadot/util';
import { LEDGER_DEFAULT_ACCOUNT, LEDGER_DEFAULT_CHANGE, LEDGER_DEFAULT_INDEX, LEDGER_SUCCESS_CODE } from './constants.js';
import { ledgerApps } from './defaults.js';
export { packageInfo } from './packageInfo.js';
type Chain = keyof typeof ledgerApps;
type WrappedResult = Awaited<ReturnType<SubstrateApp['getAddress' | 'getVersion' | 'sign']>>;
/** @internal Wraps a SubstrateApp call, checking the result for any errors which result in a rejection */
async function wrapError <T extends WrappedResult> (promise: Promise<T>): Promise<T> {
const result = await promise;
if (result.return_code !== LEDGER_SUCCESS_CODE) {
throw new Error(result.error_message);
}
return result;
}
/** @internal Best-effort transport cleanup after failed operations */
async function closeTransport (transport: Transport | null): Promise<void> {
if (transport) {
try {
await transport.close();
} catch {
// Ignore cleanup errors so the original failure is preserved.
}
}
}
/** @internal Wraps a sign/signRaw call and returns the associated signature */
function sign (method: 'sign' | 'signRaw', message: Uint8Array, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): (app: SubstrateApp) => Promise<LedgerSignature> {
return async (app: SubstrateApp): Promise<LedgerSignature> => {
const { signature } = await wrapError(app[method](account + accountOffset, change, addressIndex + addressOffset, u8aToBuffer(message)));
return {
signature: hexAddPrefix(signature.toString('hex'))
};
};
}
/**
* @name Ledger
*
* @description
* Legacy wrapper for a ledger app -
* - it connects automatically on use, creating an underlying interface as required
* - Promises reject with errors (unwrapped errors from @zondax/ledger-substrate)
* @deprecated Use LedgerGeneric for up to date integration with ledger
*/
export class Ledger {
readonly #ledgerName: string;
readonly #transportDef: TransportDef;
#app: SubstrateApp | null = null;
constructor (transport: TransportType, chain: Chain) {
const ledgerName = ledgerApps[chain];
const transportDef = transports.find(({ type }) => type === transport);
if (!ledgerName) {
throw new Error(`Unsupported Ledger chain ${chain}`);
} else if (!transportDef) {
throw new Error(`Unsupported Ledger transport ${transport}`);
}
this.#ledgerName = ledgerName;
this.#transportDef = transportDef;
}
/**
* Returns the address associated with a specific account & address offset. Optionally
* asks for on-device confirmation
*/
public async getAddress (confirm = false, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerAddress> {
return this.withApp(async (app: SubstrateApp): Promise<LedgerAddress> => {
const { address, pubKey } = await wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
return {
address,
publicKey: hexAddPrefix(pubKey)
};
});
}
/**
* Returns the version of the Ledger application on the device
*/
public async getVersion (): Promise<LedgerVersion> {
return this.withApp(async (app: SubstrateApp): Promise<LedgerVersion> => {
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await wrapError(app.getVersion());
return {
isLocked,
isTestMode,
version: [major, minor, patch]
};
});
}
/**
* Signs a transaction on the Ledger device
*/
public async sign (message: Uint8Array, accountOffset?: number, addressOffset?: number, options?: Partial<AccountOptions>): Promise<LedgerSignature> {
return this.withApp(sign('sign', message, accountOffset, addressOffset, options));
}
/**
* Signs a message (non-transactional) on the Ledger device
*/
public async signRaw (message: Uint8Array, accountOffset?: number, addressOffset?: number, options?: Partial<AccountOptions>): Promise<LedgerSignature> {
return this.withApp(sign('signRaw', u8aWrapBytes(message), accountOffset, addressOffset, options));
}
/**
* Closes any active transport connection
*/
public async disconnect (): Promise<void> {
const app = this.#app;
this.#app = null;
await closeTransport(app?.transport || null);
}
/**
* @internal
*
* Returns a created SubstrateApp to perform operations against. Generally
* this is only used internally, to ensure consistent behavior.
*/
async withApp <T> (fn: (app: SubstrateApp) => Promise<T>): Promise<T> {
let transport: Transport | null = null;
try {
if (!this.#app) {
transport = await this.#transportDef.create();
// We need this override for the actual type passing - the Deno environment
// is quite a bit stricter and it yields invalids between the two (specifically
// since we mangle the imports from .default in the types for CJS/ESM and between
// esm.sh versions this yields problematic outputs)
//
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
this.#app = newSubstrateApp(transport as any, this.#ledgerName);
}
return await fn(this.#app);
} catch (error) {
await closeTransport(this.#app?.transport || transport);
this.#app = null;
throw error;
}
}
}
+300
View File
@@ -0,0 +1,300 @@
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Transport, TransportDef, TransportType } from '@polkadot/hw-ledger-transports/types';
import type { AccountOptionsGeneric, LedgerAddress, LedgerSignature, LedgerVersion } from './types.js';
import { PolkadotGenericApp } from '@zondax/ledger-substrate';
import { transports } from '@polkadot/hw-ledger-transports';
import { hexAddPrefix, u8aToBuffer, u8aWrapBytes } from '@polkadot/util';
import { ledgerApps } from './defaults.js';
export { packageInfo } from './packageInfo.js';
type Chain = keyof typeof ledgerApps;
type WrappedResult = Awaited<ReturnType<PolkadotGenericApp['getAddress' | 'getVersion' | 'sign' | 'signWithMetadata']>>;
// FIXME This type is a copy of the `class ResponseError`
// imported from `@zondax/ledger-js`. Happens because ledger-js includes
// circular dependencies. This is a hack to avoid versioning issues
// with Deno.
interface ResponseError {
errorMessage: string
returnCode: number
}
/** @internal Wraps a PolkadotGenericApp call, checking the result for any errors which result in a rejection */
async function wrapError <T extends WrappedResult> (promise: Promise<T>): Promise<T> {
let result: T;
try {
result = await promise;
} catch (e: unknown) {
// We check to see if the propagated error is the newer ResponseError type.
// The response code use to be part of the result, but with the latest breaking changes from 0.42.x
// the interface and it's types have completely changed.
if ((e as ResponseError).returnCode) {
throw new Error(`${(e as ResponseError).returnCode}: ${(e as ResponseError).errorMessage}`);
}
throw new Error((e as Error).message);
}
return result;
}
/** @internal Best-effort transport cleanup after failed operations */
async function closeTransport (transport: Transport | null): Promise<void> {
if (transport) {
try {
await transport.close();
} catch {
// Ignore cleanup errors so the original failure is preserved.
}
}
}
/** @internal Wraps a signEd25519/signRawEd25519 call and returns the associated signature */
function sign (method: 'signEd25519' | 'signRawEd25519', message: Uint8Array, slip44: number, accountIndex = 0, addressOffset = 0): (app: PolkadotGenericApp) => Promise<LedgerSignature> {
const bip42Path = `m/44'/${slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
return async (app: PolkadotGenericApp): Promise<LedgerSignature> => {
const { signature } = await wrapError(app[method](bip42Path, u8aToBuffer(message)));
return {
signature: hexAddPrefix(signature.toString('hex'))
};
};
}
/** @internal Wraps a signEcdsa/signRawEcdsa call and returns the associated signature */
function signEcdsa (method: 'signEcdsa' | 'signRawEcdsa', message: Uint8Array, slip44: number, accountIndex = 0, addressOffset = 0): (app: PolkadotGenericApp) => Promise<LedgerSignature> {
const bip42Path = `m/44'/${slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
return async (app: PolkadotGenericApp): Promise<LedgerSignature> => {
const { r, s, v } = await wrapError(app[method](bip42Path, u8aToBuffer(message)));
const signature = Buffer.concat([r, s, v]);
return {
signature: hexAddPrefix(signature.toString('hex'))
};
};
}
/** @internal Wraps a signWithMetadataEd25519 call and returns the associated signature */
function signWithMetadata (message: Uint8Array, slip44: number, accountIndex = 0, addressOffset = 0, { metadata }: Partial<AccountOptionsGeneric> = {}): (app: PolkadotGenericApp) => Promise<LedgerSignature> {
const bip42Path = `m/44'/${slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
return async (app: PolkadotGenericApp): Promise<LedgerSignature> => {
if (!metadata) {
throw new Error('The metadata option must be present when using signWithMetadata');
}
const bufferMsg = Buffer.from(message);
const { signature } = await wrapError(app.signWithMetadataEd25519(bip42Path, bufferMsg, metadata));
return {
signature: hexAddPrefix(signature.toString('hex'))
};
};
}
/** @internal Wraps a signWithMetadataEcdsa call and returns the associated signature */
function signWithMetadataEcdsa (message: Uint8Array, slip44: number, accountIndex = 0, addressOffset = 0, { metadata }: Partial<AccountOptionsGeneric> = {}): (app: PolkadotGenericApp) => Promise<LedgerSignature> {
const bip42Path = `m/44'/${slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
return async (app: PolkadotGenericApp): Promise<LedgerSignature> => {
if (!metadata) {
throw new Error('The metadata option must be present when using signWithMetadata');
}
const bufferMsg = Buffer.from(message);
const { r, s, v } = await wrapError(app.signWithMetadataEcdsa(bip42Path, bufferMsg, metadata));
const signature = Buffer.concat([r, s, v]);
return {
signature: hexAddPrefix(signature.toString('hex'))
};
};
}
/**
* @name Ledger
*
* @description
* A very basic wrapper for a ledger app -
* - it connects automatically on use, creating an underlying interface as required
* - Promises reject with errors (unwrapped errors from @zondax/ledger-substrate-js)
*/
export class LedgerGeneric {
readonly #transportDef: TransportDef;
readonly #slip44: number;
/**
* The chainId is represented by the chains token in all lowercase. Example: Polkadot -> dot
*/
readonly #chainId?: string;
/**
* The metaUrl is seen as a server url that the underlying `PolkadotGenericApp` will use to
* retrieve the signature given a tx blob, and a chainId. It is important to note that if you would like to avoid
* having any network calls made, use `signWithMetadata`, and avoid `sign`.
*/
readonly #metaUrl?: string;
#app: PolkadotGenericApp | null = null;
constructor (transport: TransportType, chain: Chain, slip44: number, chainId?: string, metaUrl?: string) {
const ledgerName = ledgerApps[chain];
const transportDef = transports.find(({ type }) => type === transport);
if (!ledgerName) {
throw new Error(`Unsupported Ledger chain ${chain}`);
} else if (!transportDef) {
throw new Error(`Unsupported Ledger transport ${transport}`);
}
this.#metaUrl = metaUrl;
this.#chainId = chainId;
this.#slip44 = slip44;
this.#transportDef = transportDef;
}
/**
* @description Returns the address associated with a specific Ed25519 account & address offset. Optionally
* asks for on-device confirmation
*/
public async getAddress (ss58Prefix: number, confirm = false, accountIndex = 0, addressOffset = 0): Promise<LedgerAddress> {
const bip42Path = `m/44'/${this.#slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
return this.withApp(async (app: PolkadotGenericApp): Promise<LedgerAddress> => {
const { address, pubKey } = await wrapError(app.getAddressEd25519(bip42Path, ss58Prefix, confirm));
return {
address,
publicKey: hexAddPrefix(pubKey)
};
});
}
/**
* @description Returns the address associated with a specific ecdsa account & address offset. Optionally
* asks for on-device confirmation
*/
public async getAddressEcdsa (confirm = false, accountIndex = 0, addressOffset = 0) {
const bip42Path = `m/44'/${this.#slip44}'/${accountIndex}'/${0}'/${addressOffset}'`;
return this.withApp(async (app: PolkadotGenericApp): Promise<LedgerAddress> => {
const { address, pubKey } = await wrapError(app.getAddressEcdsa(bip42Path, confirm));
return {
address,
publicKey: hexAddPrefix(pubKey)
};
});
}
/**
* @description Returns the version of the Ledger application on the device
*/
public async getVersion (): Promise<LedgerVersion> {
return this.withApp(async (app: PolkadotGenericApp): Promise<LedgerVersion> => {
const { deviceLocked: isLocked, major, minor, patch, testMode: isTestMode } = await wrapError(app.getVersion());
return {
isLocked: !!isLocked,
isTestMode: !!isTestMode,
version: [major || 0, minor || 0, patch || 0]
};
});
}
/**
* @description Signs a transaction on the Ledger device. This requires the LedgerGeneric class to be instantiated with `chainId`, and `metaUrl`
*/
public async sign (message: Uint8Array, accountIndex?: number, addressOffset?: number): Promise<LedgerSignature> {
return this.withApp(sign('signEd25519', message, this.#slip44, accountIndex, addressOffset));
}
/**
* @description Signs a message (non-transactional) on the Ledger device
*/
public async signRaw (message: Uint8Array, accountIndex?: number, addressOffset?: number): Promise<LedgerSignature> {
return this.withApp(sign('signRawEd25519', u8aWrapBytes(message), this.#slip44, accountIndex, addressOffset));
}
/**
* @description Signs a transaction on the Ledger device with Ecdsa. This requires the LedgerGeneric class to be instantiated with `chainId`, and `metaUrl`
*/
public async signEcdsa (message: Uint8Array, accountIndex?: number, addressOffset?: number): Promise<LedgerSignature> {
return this.withApp(signEcdsa('signEcdsa', u8aWrapBytes(message), this.#slip44, accountIndex, addressOffset));
}
/**
* @description Signs a message with Ecdsa (non-transactional) on the Ledger device
*/
public async signRawEcdsa (message: Uint8Array, accountIndex?: number, addressOffset?: number): Promise<LedgerSignature> {
return this.withApp(signEcdsa('signRawEcdsa', u8aWrapBytes(message), this.#slip44, accountIndex, addressOffset));
}
/**
* @description Signs a transaction on the ledger device provided some metadata.
*/
public async signWithMetadata (message: Uint8Array, accountIndex?: number, addressOffset?: number, options?: Partial<AccountOptionsGeneric>): Promise<LedgerSignature> {
return this.withApp(signWithMetadata(message, this.#slip44, accountIndex, addressOffset, options));
}
/**
* @description Signs a transaction on the ledger device for an ecdsa signature provided some metadata.
*/
public async signWithMetadataEcdsa (message: Uint8Array, accountIndex?: number, addressOffset?: number, options?: Partial<AccountOptionsGeneric>) {
return this.withApp(signWithMetadataEcdsa(message, this.#slip44, accountIndex, addressOffset, options));
}
/**
* Closes any active transport connection
*/
public async disconnect (): Promise<void> {
const app = this.#app;
this.#app = null;
await closeTransport(app?.transport || null);
}
/**
* @internal
*
* Returns a created PolkadotGenericApp to perform operations against. Generally
* this is only used internally, to ensure consistent bahavior.
*/
async withApp <T> (fn: (app: PolkadotGenericApp) => Promise<T>): Promise<T> {
let transport: Transport | null = null;
try {
if (!this.#app) {
transport = await this.#transportDef.create();
// We need this override for the actual type passing - the Deno environment
// is quite a bit stricter and it yields invalids between the two (specifically
// since we mangle the imports from .default in the types for CJS/ESM and between
// esm.sh versions this yields problematic outputs)
//
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
this.#app = new PolkadotGenericApp(transport as any, this.#chainId, this.#metaUrl);
}
return await fn(this.#app);
} catch (error) {
await closeTransport(this.#app?.transport || transport);
this.#app = null;
throw error;
}
}
}
+6 -101
View File
@@ -1,103 +1,8 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { ResponseBase, SubstrateApp } from '@zondax/ledger-substrate';
import type { AccountOptions, LedgerAddress, LedgerSignature, LedgerTypes, LedgerVersion } from './types';
import { transports } from '@polkadot/hw-ledger-transports';
import { assert, u8aToBuffer } from '@polkadot/util';
import { LEDGER_DEFAULT_ACCOUNT, LEDGER_DEFAULT_CHANGE, LEDGER_DEFAULT_INDEX, LEDGER_SUCCESS_CODE } from './constants';
import { ledgerApps } from './defaults';
export { packageInfo } from './packageInfo';
type Chain = keyof typeof ledgerApps;
// A very basic wrapper for a ledger app -
// - it connects automatically, creating an app as required
// - Promises return errors (instead of wrapper errors)
export class Ledger {
#app: SubstrateApp | null = null;
#chain: Chain;
#transport: LedgerTypes;
constructor (transport: LedgerTypes, chain: Chain) {
// u2f is deprecated
assert(['hid', 'webusb'].includes(transport), () => `Unsupported transport ${transport}`);
assert(Object.keys(ledgerApps).includes(chain), () => `Unsupported chain ${chain}`);
this.#chain = chain;
this.#transport = transport;
}
public async getAddress (confirm = false, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerAddress> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerAddress> => {
const { address, pubKey } = await this.#wrapError(app.getAddress(account + accountOffset, change, addressIndex + addressOffset, confirm));
return {
address,
publicKey: `0x${pubKey}`
};
});
}
public async getVersion (): Promise<LedgerVersion> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerVersion> => {
const { device_locked: isLocked, major, minor, patch, test_mode: isTestMode } = await this.#wrapError(app.getVersion());
return {
isLocked,
isTestMode,
version: [major, minor, patch]
};
});
}
public async sign (message: Uint8Array, accountOffset = 0, addressOffset = 0, { account = LEDGER_DEFAULT_ACCOUNT, addressIndex = LEDGER_DEFAULT_INDEX, change = LEDGER_DEFAULT_CHANGE }: Partial<AccountOptions> = {}): Promise<LedgerSignature> {
return this.#withApp(async (app: SubstrateApp): Promise<LedgerSignature> => {
const buffer = u8aToBuffer(message);
const { signature } = await this.#wrapError(app.sign(account + accountOffset, change, addressIndex + addressOffset, buffer));
return {
signature: `0x${signature.toString('hex')}`
};
});
}
#getApp = async (): Promise<SubstrateApp> => {
if (!this.#app) {
const def = transports.find(({ type }) => type === this.#transport);
assert(def, () => `Unable to find a transport for ${this.#transport}`);
const transport = await def.create();
this.#app = ledgerApps[this.#chain](transport);
}
return this.#app;
};
#withApp = async <T> (fn: (app: SubstrateApp) => Promise<T>): Promise<T> => {
try {
const app = await this.#getApp();
return await fn(app);
} catch (error) {
this.#app = null;
throw error;
}
};
#wrapError = async <T extends ResponseBase> (promise: Promise<T>): Promise<T> => {
const result = await promise;
assert(result.return_code === LEDGER_SUCCESS_CODE, () => result.error_message);
return result;
};
}
// This is necessary to ensure users still have access to class Ledger even though its deprecated.
//
// eslint-disable-next-line deprecation/deprecation
export { Ledger } from './Ledger.js';
export { LedgerGeneric } from './LedgerGeneric.js';
+1 -1
View File
@@ -1,4 +1,4 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
export const LEDGER_DEFAULT_ACCOUNT = 0x80000000;
+20
View File
@@ -0,0 +1,20 @@
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
/// <reference types="@polkadot/dev-test/globals.d.ts" />
import { supportedApps } from '@zondax/ledger-substrate';
import { prevLedgerRecord } from './defaults.js';
describe('ledgerApps', (): void => {
for (const k of Object.keys(prevLedgerRecord)) {
it(`${k} is available in @zondax/ledger-substrate`, (): void => {
expect(
supportedApps.find(({ name }) =>
name === prevLedgerRecord[k]
)
).toBeDefined();
});
}
});
+63 -17
View File
@@ -1,23 +1,69 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type Transport from '@ledgerhq/hw-transport';
import type { SubstrateApp } from '@zondax/ledger-substrate';
// These map to the known name in the @zondax/ledger-substrate/supported_apps package
// but they do not reflect all ledger apps that are supported. Since ledger now has support for all
// substrate chains via the PolkadotGenericApp, any new chains that need ledger support can be added to
// `genericLedgerApps` below.
export const prevLedgerRecord: Record<string, string> = {
acala: 'Acala',
ajuna: 'Ajuna',
'aleph-node': 'AlephZero',
astar: 'Astar',
bifrost: 'Bifrost',
'bifrost-kusama': 'BifrostKusama',
centrifuge: 'Centrifuge',
composable: 'Composable',
darwinia: 'Darwinia',
'dock-mainnet': 'Dock',
edgeware: 'Edgeware',
enjin: 'Enjin',
equilibrium: 'Equilibrium',
genshiro: 'Genshiro',
hydradx: 'HydraDX',
'interlay-parachain': 'Interlay',
karura: 'Karura',
khala: 'Khala',
kusama: 'Kusama',
matrixchain: 'Matrixchain',
nodle: 'Nodle',
origintrail: 'OriginTrail',
parallel: 'Parallel',
peaq: 'Peaq',
pendulum: 'Pendulum',
phala: 'Phala',
picasso: 'Picasso',
polkadex: 'Polkadex',
polkadot: 'Polkadot',
polymesh: 'Polymesh',
quartz: 'Quartz',
sora: 'Sora',
stafi: 'Stafi',
statemine: 'Statemine',
statemint: 'Statemint',
ternoa: 'Ternoa',
unique: 'Unique',
vtb: 'VTB',
xxnetwork: 'XXNetwork',
zeitgeist: 'Zeitgeist'
};
import { newBifrostApp, newCentrifugeApp, newDockApp, newEdgewareApp, newEquilibriumApp, newGenshiroApp, newKusamaApp, newNodleApp, newPolkadotApp, newPolymeshApp, newSoraApp, newStatemineApp } from '@zondax/ledger-substrate';
// Any chains moving forward that are supported by the PolkadotGenericApp from ledger will input their names below.
export const genericLedgerApps = {
bittensor: 'Bittensor',
creditcoin3: 'Creditcoin3',
dentnet: 'DENTNet',
encointer: 'Encointer',
frequency: 'Frequency',
integritee: 'Integritee',
liberland: 'Liberland',
mythos: 'Mythos',
polimec: 'Polimec',
vara: 'Vara'
};
// These match up with the keys of the knownLedger object in the @polkadot/networks/defaults/ledger.ts
export const ledgerApps: Record<string, (transport: Transport) => SubstrateApp> = {
bifrost: newBifrostApp,
centrifuge: newCentrifugeApp,
'dock-mainnet': newDockApp,
edgeware: newEdgewareApp,
equilibrium: newEquilibriumApp,
genshiro: newGenshiroApp,
kusama: newKusamaApp,
'nodle-chain': newNodleApp,
polkadot: newPolkadotApp,
polymesh: newPolymeshApp,
sora: newSoraApp,
statemine: newStatemineApp
export const ledgerApps: Record<string, string> = {
...prevLedgerRecord,
...genericLedgerApps
};
-7
View File
@@ -1,7 +0,0 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { packageInfo as transportInfo } from '@polkadot/hw-ledger-transports/packageInfo';
import { packageInfo as utilInfo } from '@polkadot/util/packageInfo';
export default [transportInfo, utilInfo];
-11
View File
@@ -1,11 +0,0 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
import { detectPackage } from '@polkadot/util';
import others from './detectOther';
import { packageInfo } from './packageInfo';
detectPackage(packageInfo, null, others);
+3 -3
View File
@@ -1,6 +1,6 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import './detectPackage';
import './packageDetect.js';
export * from './bundle';
export * from './bundle.js';
+4
View File
@@ -0,0 +1,4 @@
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
export * from './index.js';
+13
View File
@@ -0,0 +1,13 @@
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
// (packageInfo imports will be kept as-is, user-editable)
import { packageInfo as transportInfo } from '@polkadot/hw-ledger-transports/packageInfo';
import { detectPackage } from '@polkadot/util';
import { packageInfo as utilInfo } from '@polkadot/util/packageInfo';
import { packageInfo } from './packageInfo.js';
detectPackage(packageInfo, null, [transportInfo, utilInfo]);
+2 -2
View File
@@ -1,6 +1,6 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '9.0.1' };
export const packageInfo = { name: '@polkadot/hw-ledger', path: 'auto', type: 'auto', version: '14.0.3' };
+20 -5
View File
@@ -1,27 +1,42 @@
// Copyright 2017-2022 @polkadot/hw-ledger authors & contributors
// Copyright 2017-2026 @polkadot/hw-ledger authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { HexString } from '@polkadot/util/types';
export type LedgerTypes = 'hid' | 'u2f' | 'webusb';
/**
* Legacy Type that works with the `Ledger` class.
*/
export interface AccountOptions {
/** The index of the account */
account: number;
/** The index of the address */
addressIndex: number;
/** The change to apply */
change: number;
}
export interface AccountOptionsGeneric extends AccountOptions {
/** Option for PolkadotGenericApp.signWithMetadata */
metadata: Buffer;
}
export interface LedgerAddress {
/** The ss58 encoded address */
address: string;
publicKey: string;
/** The hex-encoded publicKey */
publicKey: HexString;
}
export interface LedgerSignature {
/** A hex-encoded signature, as generated by the device */
signature: HexString;
}
export interface LedgerVersion {
/** Indicator flag for locked status */
isLocked: boolean;
/** Indicator flag for testmode status */
isTestMode: boolean;
version: [number, number, number];
/** The software version for this device */
version: [major: number, minor: number, patch: number];
}
+4
View File
@@ -5,6 +5,10 @@
"outDir": "./build",
"rootDir": "./src"
},
"exclude": [
"**/*.spec.ts",
"**/mod.ts"
],
"references": [
{ "path": "../hw-ledger-transports/tsconfig.build.json" },
{ "path": "../util/tsconfig.build.json" }
+16
View File
@@ -0,0 +1,16 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "..",
"outDir": "./build",
"rootDir": "./src",
"emitDeclarationOnly": false,
"noEmit": true
},
"include": [
"**/*.spec.ts"
],
"references": [
{ "path": "../hw-ledger/tsconfig.build.json" }
]
}
-201
View File
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+10 -11
View File
@@ -1,14 +1,12 @@
{
"author": "Jaco Greeff <jacogr@gmail.com>",
"bugs": "https://github.com/polkadot-js/common/issues",
"contributors": [],
"description": "Keyring management",
"engines": {
"node": ">=14.0.0"
"node": ">=18"
},
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/keyring#readme",
"license": "Apache-2.0",
"maintainers": [],
"name": "@polkadot/keyring",
"repository": {
"directory": "packages/keyring",
@@ -16,19 +14,20 @@
"url": "https://github.com/polkadot-js/common.git"
},
"sideEffects": [
"./detectPackage.js",
"./detectPackage.cjs"
"./packageDetect.js",
"./packageDetect.cjs"
],
"type": "module",
"version": "9.0.1",
"version": "14.0.3-quantus.3",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.17.9",
"@polkadot/util": "9.0.1",
"@polkadot/util-crypto": "9.0.1"
"@polkadot/util": "14.0.3",
"@polkadot/util-crypto": "14.0.3-quantus.3",
"@quantus/crypto": "^0.3.0",
"tslib": "^2.8.0"
},
"peerDependencies": {
"@polkadot/util": "9.0.1",
"@polkadot/util-crypto": "9.0.1"
"@polkadot/util": "14.0.3",
"@polkadot/util-crypto": "14.0.3"
}
}
+11 -9
View File
@@ -1,14 +1,16 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { Keyring } from './keyring';
// all external
// eslint-disable-next-line deprecation/deprecation
export { decodeAddress, encodeAddress, setSS58Format } from '@polkadot/util-crypto';
export * from './defaults';
export { createPair } from './pair';
export { packageInfo } from './packageInfo';
export { createTestKeyring } from './testing';
export { createTestPairs } from './testingPairs';
// all named
export { Keyring } from './keyring.js';
export { packageInfo } from './packageInfo.js';
export { createPair } from './pair/index.js';
export { createTestKeyring } from './testing.js';
export { createTestPairs } from './testingPairs.js';
export { Keyring };
// all starred
export * from './defaults.js';
+1 -1
View File
@@ -1,4 +1,4 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
// default substrate dev phrase
-7
View File
@@ -1,7 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { packageInfo as utilInfo } from '@polkadot/util/packageInfo';
import { packageInfo as cryptoInfo } from '@polkadot/util-crypto/packageInfo';
export default [utilInfo, cryptoInfo];
-11
View File
@@ -1,11 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
import { detectPackage } from '@polkadot/util';
import others from './detectOther';
import { packageInfo } from './packageInfo';
detectPackage(packageInfo, null, others);
-576
View File
@@ -1,576 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KeyringPair$Json } from './types';
import { hexToU8a, stringToU8a } from '@polkadot/util';
import { base64Decode, cryptoWaitReady, encodeAddress, randomAsU8a, setSS58Format } from '@polkadot/util-crypto';
import { decodePair } from './pair/decode';
import Keyring from '.';
describe('keypair', (): void => {
beforeEach(async (): Promise<void> => {
await cryptoWaitReady();
});
describe('ed25519', (): void => {
const publicKeyOne = new Uint8Array([47, 140, 97, 41, 216, 22, 207, 81, 195, 116, 188, 127, 8, 195, 230, 62, 209, 86, 207, 120, 174, 251, 74, 101, 80, 217, 123, 135, 153, 121, 119, 238]);
const publicKeyTwo = new Uint8Array([215, 90, 152, 1, 130, 177, 10, 183, 213, 75, 254, 211, 201, 100, 7, 58, 14, 225, 114, 243, 218, 166, 35, 37, 175, 2, 26, 104, 247, 7, 81, 26]);
const seedOne = stringToU8a('12345678901234567890123456789012');
const seedTwo = hexToU8a('0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60');
let keyring: Keyring;
beforeEach((): void => {
keyring = new Keyring({ ss58Format: 42, type: 'ed25519' });
keyring.addFromSeed(seedOne, {});
});
it('adds the pair', (): void => {
expect(
keyring.addFromSeed(seedTwo, {}).publicKey
).toEqual(publicKeyTwo);
});
it('creates via a dev seed', (): void => {
expect(
keyring.addFromUri('//Alice').address
).toEqual('5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu');
});
it('creates a ed25519 pair via mnemonicToSeed', (): void => {
expect(
keyring.addFromUri(
'seed sock milk update focus rotate barely fade car face mechanic mercy'
).address
).toEqual('5DkQP32jP4DVJLWWBRBoZF2tpWjqFrcrTBo6H5NcSk7MxKCC');
});
it('adds from a mnemonic, with correct ss58', (): void => {
setSS58Format(20); // this would not be used
keyring.setSS58Format(2); // this would be used
const pair = keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card', {});
expect(pair.address).toEqual('HSLu2eci2GCfWkRimjjdTXKoFSDL3rBv5Ey2JWCBj68cVZj');
expect(encodeAddress(pair.publicKey)).toEqual('35cDYtPsdG1HUa2n2MaARgJyRz1WKMBZK1DL6c5cX7nugQh1');
});
it('allows publicKeys retrieval', (): void => {
keyring.addFromSeed(seedTwo, {});
expect(
keyring.getPublicKeys()
).toEqual([publicKeyOne, publicKeyTwo]);
});
it('allows retrieval of a specific item', (): void => {
expect(
keyring.getPair(publicKeyOne).publicKey
).toEqual(publicKeyOne);
});
it('allows adding from JSON', (): void => {
expect(
keyring.addFromJson(
JSON.parse('{"address":"5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua","encoded":"0xb4a14995d25ab609f3686e9fa45f1fb237cd833f33f00d4b12c51858ca070d96972e47d73aae5eeb0fc06f923826cf0943fdb02c2c2ee30ef52a7912663053940d1da4da66b3a3f520ae07422c1c94b2d95690fca9d1f4a997623bb2923a8833280e19e7f72c3c5cfa343974e60e2b3dc53b404fdaf330756daad5e4e3","encoding":{"content":"pkcs8","type":"xsalsa20-poly1305","version":"0"},"meta":{"isTesting":true,"name":"alice"}}') as KeyringPair$Json
).publicKey
).toEqual(
new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79])
);
});
it('signs and verifies', (): void => {
const MESSAGE = stringToU8a('this is a message');
const pair = keyring.getPair(publicKeyOne);
const signature = pair.sign(MESSAGE);
expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
});
it('signs and verifies (withType)', (): void => {
const MESSAGE = stringToU8a('this is a message');
const pair = keyring.getPair(publicKeyOne);
const signature = pair.sign(MESSAGE, { withType: true });
expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
});
});
describe('sr25519', (): void => {
const publicKeyOne = new Uint8Array([116, 28, 8, 160, 111, 65, 197, 150, 96, 143, 103, 116, 37, 155, 217, 4, 51, 4, 173, 250, 93, 62, 234, 98, 118, 11, 217, 190, 151, 99, 77, 99]);
const publicKeyTwo = hexToU8a('0x44a996beb1eef7bdcab976ab6d2ca26104834164ecf28fb375600576fcc6eb0f');
const seedOne = stringToU8a('12345678901234567890123456789012');
const seedTwo = hexToU8a('0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60');
let keyring: Keyring;
beforeEach((): void => {
keyring = new Keyring({ ss58Format: 42, type: 'sr25519' });
keyring.addFromSeed(seedOne, {});
});
it('creates with dev phrase when only path specified', (): void => {
expect(
keyring.createFromUri('//Alice').address
).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
});
it('creates with integer derivations', (): void => {
// MAX_SAFE_INTEGER
expect(
keyring.createFromUri('//9007199254740991').address
).toEqual('5CDsyNZyqxLpHnTvknr68anUcYoBFjZbFKiEJJf4prB75Uog');
// MAX_SAFE_INTEGER + extra digits
expect(
keyring.createFromUri('//900719925474099999').address
).toEqual('5GHj2D7RG2m2DXYwGSDpXwuuxn53G987i7p2EQVDqP4NYu4q');
});
it('creates via dev seed (2-byte encoding)', (): void => {
keyring.setSS58Format(252);
expect(
keyring.addFromUri('//Alice').address
).toEqual('xw8P6urbSAronL3zZFB7dg8p7LLSgKCUFDUgjohnf1iP434ic');
});
it('adds the pair', (): void => {
expect(
keyring.addFromSeed(seedTwo, {}).publicKey
).toEqual(publicKeyTwo);
});
it('adds from a mnemonic', (): void => {
keyring.setSS58Format(2);
expect(
keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card', {}).address
).toEqual('FSjXNRT2K1R5caeHLPD6WMrqYUpfGZB7ua8W89JFctZ1YqV');
});
it('allows publicKeys retrieval', (): void => {
keyring.addFromSeed(seedTwo, {});
expect(
keyring.getPublicKeys()
).toEqual([publicKeyOne, publicKeyTwo]);
});
it('allows retrieval of a specific item', (): void => {
expect(
keyring.getPair(publicKeyOne).publicKey
).toEqual(publicKeyOne);
});
it('allows adding from JSON', (): void => {
expect(
keyring.addFromJson(
JSON.parse('{"address":"5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua","encoded":"0xb4a14995d25ab609f3686e9fa45f1fb237cd833f33f00d4b12c51858ca070d96972e47d73aae5eeb0fc06f923826cf0943fdb02c2c2ee30ef52a7912663053940d1da4da66b3a3f520ae07422c1c94b2d95690fca9d1f4a997623bb2923a8833280e19e7f72c3c5cfa343974e60e2b3dc53b404fdaf330756daad5e4e3","encoding":{"content":"pkcs8","type":"xsalsa20-poly1305","version":"0"},"meta":{"isTesting":true,"name":"alice"}}') as KeyringPair$Json
).publicKey
).toEqual(
new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79])
);
});
it('signs and verifies', (): void => {
const MESSAGE = stringToU8a('this is a message');
const pair = keyring.getPair(publicKeyOne);
const signature = pair.sign(MESSAGE);
expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
});
it('signs and verifies (withType)', (): void => {
const MESSAGE = stringToU8a('this is a message');
const pair = keyring.getPair(publicKeyOne);
const signature = pair.sign(MESSAGE, { withType: true });
expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
});
});
describe('ecdsa', (): void => {
const seedOne = 'potato act energy ahead stone taxi receive fame gossip equip chest round';
const seedTwo = hexToU8a('0x3c74be003bd9a876be439949ccf2b292bd966c94959a689173b295b326cd6da7');
const publicKeyOne = hexToU8a('0x02c6b6c664db5ef505477bba1cf2f1789c98796b9bb5fa21abd0ac4589bed980e7');
const publicKeyTwo = hexToU8a('0x021da683b913fb28c979ba3e5f1881415cef4b1f58a5d05ed3610a2995e7b4943c');
const addressKeyOne = hexToU8a('0x0cfd0dd2c59a9987b9848919163931b6a42283ffd3d91e92c98b522525a7038f');
let keyring: Keyring;
beforeEach((): void => {
keyring = new Keyring({ ss58Format: 42, type: 'ecdsa' });
keyring.addFromMnemonic(seedOne, {});
});
it('creates with dev phrase when only path specified', (): void => {
expect(
keyring.createFromUri('//Alice').address
).toEqual('5C7C2Z5sWbytvHpuLTvzKunnnRwQxft1jiqrLD5rhucQ5S9X');
});
it('adds the pair', (): void => {
expect(
keyring.addFromSeed(seedTwo, {}).publicKey
).toEqual(publicKeyTwo);
});
it('adds from a mnemonic', (): void => {
keyring.setSS58Format(2);
expect(
keyring.addFromMnemonic('moral movie very draw assault whisper awful rebuild speed purity repeat card').address
).toEqual('DrRE1KAcs4pCicX8yJPh7YxkLPQ2vXnCFSVRPQfx38KjEFe');
});
it('allows publicKeys retrieval', (): void => {
keyring.addFromSeed(seedTwo, {});
expect(
keyring.getPublicKeys()
).toEqual([publicKeyOne, publicKeyTwo]);
});
it('allows retrieval of a specific item', (): void => {
expect(
keyring.getPair(addressKeyOne).publicKey
).toEqual(publicKeyOne);
});
it('allows adding from JSON', (): void => {
expect(
keyring.addFromJson(
JSON.parse('{"address":"5DzMsaYFhmpRdErWrP6K6PD7UXzYoeETToSBUrZSvxasqWRz","encoded":"0xa192d39b42bc1601bf61df31039a554228593fadf870bc837b658a5114627aca199fff596260c95fe8994c66a47636cf0270aa08f402ba5541038753960d00e6c3af5e239ec58fb1eef3db7d6bc266f4853bdfe4ed17122d9092d879014d53980d2ee57f6f55a88c38836447d8645008e8815379626addc8f81f80cd49a2","encoding":{"content":"pkcs8","type":"xsalsa20-poly1305","version":"2"},"meta":{}}') as KeyringPair$Json
).address
).toEqual('5DzMsaYFhmpRdErWrP6K6PD7UXzYoeETToSBUrZSvxasqWRz');
});
it('allows creation from JSON', (): void => {
keyring.setSS58Format(2);
const pair = keyring.createFromJson(
JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}') as KeyringPair$Json
);
expect(pair.address).toEqual('DHL8HKFuTTR55JzzLmkJRCAfPBbuevKaT9cXikxbEV97Ko8');
expect(pair.publicKey).toEqual(hexToU8a('0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad'));
});
it('fails toJson() when password is incorrect', (): void => {
const pair = keyring.createFromJson(
JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}') as KeyringPair$Json
);
expect(
() => pair.toJson('invalid')
).toThrow(/Unable to decode using the supplied passphrase/);
});
it('pass toJson() when password is correct', (): void => {
const pair = keyring.createFromJson(
JSON.parse('{"address":"0x02fde629668eb2bcc7d748f40a7e597f7c7b363498ff3db31f03ce4854937883ad","encoded":"qIhAhKqtf2iyEoWEr8nmBdksSI8EHHCpgJHToqd6Pl8AgAAAAQAAAAgAAADDZ//fj/BRRj+0+bl1KAlYgoPJp6nEUwiw0fVqO2BW4mjEgQ+iWwJEgDf1JUtecbzOlfhTXBzqX/dIYzLgUADrF4EFEPpboCWiU1iN7W/3DM1cOTRVvTGcbdIqW//z3axhz961qzeJVUIFgllwGe/euLUPIlKbIkiN/CsRYdQ=","encoding":{"content":["pkcs8","ecdsa"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"ecdsa","tags":[],"whenCreated":1600925898271}}') as KeyringPair$Json
);
expect(
() => pair.toJson('testing')
).not.toThrow();
});
it('encodes a pair toJSON (and decodes)', (): void => {
const pair = keyring.createFromUri('moral movie very draw assault whisper awful rebuild speed purity repeat card');
const json = pair.toJson('password');
expect(json.address).toEqual('0x03ddca309bd5fedd01f914d6fb76f23aa848a2a520802159215dba5085d7863619');
expect(json.encoding).toEqual({
content: ['pkcs8', 'ecdsa'],
type: ['scrypt', 'xsalsa20-poly1305'],
version: '3'
});
const newPair = keyring.createFromJson(json);
expect(newPair.publicKey).toEqual(pair.publicKey);
expect(
() => newPair.unlock('password')
).not.toThrow();
});
it('signs and verifies', (): void => {
const MESSAGE = stringToU8a('this is a message');
const pair = keyring.getPair(addressKeyOne);
const signature = pair.sign(MESSAGE);
expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
});
it('signs and verifies (withType)', (): void => {
const MESSAGE = stringToU8a('this is a message');
const pair = keyring.getPair(addressKeyOne);
const signature = pair.sign(MESSAGE, { withType: true });
expect(pair.verify(MESSAGE, signature, pair.publicKey)).toBe(true);
expect(pair.verify(MESSAGE, signature, randomAsU8a())).toBe(false);
expect(pair.verify(new Uint8Array(), signature, pair.publicKey)).toBe(false);
});
});
describe('ethereum', (): void => {
// combine mnemonic with derivation path
const PHRASE = 'seed sock milk update focus rotate barely fade car face mechanic mercy' + '/m/44\'/60\'/0\'/0/0';
const PRIV_KEY_ONE = '0x070dc3117300011918e26b02176945cc15c3d548cf49fd8418d97f93af699e46';
const ETH_ADDRESS_ONE = '0x31ea8795EE32D782C8ff41a5C68Dcbf0F5B27f6d';
const ETH_ADDRESS_TWO = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
let keyring: Keyring;
beforeEach((): void => {
keyring = new Keyring({ type: 'ethereum' });
});
it('creates with dev phrase from the private key', (): void => {
const pair = keyring.addFromSeed(hexToU8a(PRIV_KEY_ONE));
expect(
pair.address
).toEqual(ETH_ADDRESS_ONE);
});
it('creates with dev phrase from the private key in createFromUri', (): void => {
const pair = keyring.createFromUri(PRIV_KEY_ONE);
expect(
pair.address
).toEqual(ETH_ADDRESS_ONE);
});
it('creates with dev phrase with derivation path specified', (): void => {
const pair = keyring.createFromUri(PHRASE);
expect(
pair.address
).toEqual(ETH_ADDRESS_ONE);
});
it('creates with dev phrase with derivation path specified - addFromUri', (): void => {
expect(
keyring.addFromUri(PHRASE).address
).toEqual(ETH_ADDRESS_ONE);
});
it('creates with dev phrase with derivation path specified - addFromUri with type', (): void => {
const keyringUntyped = new Keyring();
expect(
keyringUntyped.addFromUri(PHRASE, {}, 'ethereum').address
).toEqual(ETH_ADDRESS_ONE);
});
it('encodes a pair toJSON (and decodes)', (): void => {
const pair = keyring.createFromUri(PHRASE);
const json = pair.toJson('password');
expect(json.address).toEqual('0x0381351b1b46d2602b0992bb5d5531f9c1696b0812feb2534b6884adc47e2e1d8b'); // this is the public key (different from address for ethereum)
expect(json.encoding).toEqual({
content: ['pkcs8', 'ethereum'],
type: ['scrypt', 'xsalsa20-poly1305'],
version: '3'
});
const newPair = keyring.createFromJson(json);
expect(newPair.publicKey).toEqual(pair.publicKey);
expect(
() => newPair.unlock('password')
).not.toThrow();
});
it('encodes a pair toJSON and back', (): void => {
const pairOriginal = keyring.createFromUri(PHRASE);
const json = pairOriginal.toJson('password');
const pair = keyring.addFromJson(
json
);
expect(pair.address).toEqual(ETH_ADDRESS_ONE);
pair.decodePkcs8('password');
expect(pair.isLocked).toBe(false);
expect(pair.address).toBe(ETH_ADDRESS_ONE);
});
it('allows adding from JSON', (): void => {
const pair = keyring.addFromJson(
JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}') as KeyringPair$Json
);
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
expect(pair.address).toEqual(ETH_ADDRESS_TWO);
pair.decodePkcs8('password');
expect(pair.isLocked).toBe(false);
expect(pair.publicKey).toEqual(hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077'));
expect(pair.address).toBe(ETH_ADDRESS_TWO);
});
it('allows for signing/verification', (): void => {
const MESSAGE = stringToU8a('just some test message');
const signer = keyring.createFromUri(PHRASE);
const verifier = keyring.addFromJson(
JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}') as KeyringPair$Json
);
const signature = signer.sign(MESSAGE);
const dummyPublic = verifier.publicKey.slice();
dummyPublic[dummyPublic.length - 1] = 0;
expect(verifier.verify(MESSAGE, signature, signer.publicKey)).toBe(true);
expect(verifier.verify(MESSAGE, signature, dummyPublic)).toBe(false);
expect(verifier.verify(new Uint8Array(), signature, signer.publicKey)).toBe(false);
});
it('allows for signing/verification (withType)', (): void => {
const MESSAGE = stringToU8a('just some test message');
const signer = keyring.createFromUri(PHRASE);
const verifier = keyring.addFromJson(
JSON.parse('{"address":"KWCv1L3QX9LDPwY4VzvLmarEmXjVJidUzZcinvVnmxAJJCBou","encoded":"U8qFEaghhmNV2PgFhjqzmhyUy37Ok7abfFU2MNsBd0sAgAAAAQAAAAgAAAA3+NniKogzNphiMNueB1X0sGA07B6CaXWfpXPx45iSXoTTprwzU5mOoSqUWO0GKHROI72LN+uJ8Yfv6Ll6JOOV3VPKfoVoFmYm+zDrrMPa0gk5E5kUuSijxADcE6zUrliPVr0Ix/qaghu5SJ7RtWDQLBf4Hp86SJ8Gg6gTSSk=","encoding":{"content":["pkcs8","ethereum"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{}}') as KeyringPair$Json
);
const signature = signer.sign(MESSAGE, { withType: true });
const dummyPublic = verifier.publicKey.slice();
dummyPublic[dummyPublic.length - 1] = 0;
expect(verifier.verify(MESSAGE, signature, signer.publicKey)).toBe(true);
expect(verifier.verify(MESSAGE, signature, dummyPublic)).toBe(false);
expect(verifier.verify(new Uint8Array(), signature, signer.publicKey)).toBe(false);
});
});
describe('raw pair add/create', (): void => {
const json = JSON.parse('{"address":"5PjeoaQzCoYbSi42aQRKB3Sx18StCaEAzCbGEEbWbZyfKS3H","encoded":"JQUl8ZpoXv2OMkL9TPylLmcIye2cYhaS9INICbFgZTsAgAAAAQAAAAgAAAAr/0hJOOzokIdBG71TstigLABX9D5xGD7L37ySxtjDrVRg26LL90jLQ47quT9o3bq6ppXMVL6USk7Q4p3WU66bojTFuCDyhpYRhNbUqU6s0rD3S4bhv9lG+pG9vQ4eD5PVQUvxdANmJpYuDg45nrTmsMC5AHGdFGkHW/LHnkmbFid1cvPYkdiBoef5CIEdoly512pxMupVxnJWF1NT","encoding":{"content":["pkcs8","sr25519"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"name":"hello"}}') as KeyringPair$Json;
const decoded = decodePair('1', base64Decode(json.encoded), json.encoding.type);
const keyring = new Keyring({ ss58Format: 44 });
it('creates a pair from a private/public combo', (): void => {
const pair = keyring.createFromPair(decoded, json.meta, 'sr25519');
expect(pair.address).toEqual('5PjeoaQzCoYbSi42aQRKB3Sx18StCaEAzCbGEEbWbZyfKS3H');
expect(pair.isLocked).toEqual(false);
expect(pair.meta.name).toEqual('hello');
});
it('adds a pair from a private/public combo', (): void => {
keyring.addFromPair(decoded, json.meta, 'sr25519');
const pair = keyring.getPairs()[0];
expect(pair.address).toEqual('5PjeoaQzCoYbSi42aQRKB3Sx18StCaEAzCbGEEbWbZyfKS3H');
expect(pair.isLocked).toEqual(false);
expect(pair.meta.name).toEqual('hello');
});
});
describe('util', (): void => {
let keyring: Keyring;
beforeEach((): void => {
keyring = new Keyring({ ss58Format: 42 });
});
it('can re-encode an address to Polkadot live', (): void => {
expect(
keyring.encodeAddress('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', 0)
).toEqual('15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5');
});
it('can re-encode an address to keyring default', (): void => {
expect(
keyring.encodeAddress('15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5')
).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
});
});
describe('version 2 JSON', (): void => {
const PAIR = '{"address":"5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu","encoded":"0xee8f236e2ac3217ce689692a4afc612220dc77fddaed0482f8f95136a7c3e034cccfbc495410a6e9b2439904974ed1d207abeca536ff6985ceb78edeeb3dc343e561c184c488101af8811d1331430b4ccf0e96ef507132e5132964e8564232e7100d973c5bee7b231dd0c8ad5273f3501515a422c8d7ed9d20a73c0ed17c98ee4588e54844bb73052dcad81f7a1094613d63c162fec7446c88b1fae70e","encoding":{"content":["pkcs8","sr25519"],"type":"xsalsa20-poly1305","version":"2"},"meta":{"genesisHash":"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e","name":"json v2","tags":[],"whenCreated":1595243159596}}';
const PASS2 = 'versionTwo';
const PASS3 = 'versionThree';
let keyring: Keyring;
beforeEach((): void => {
keyring = new Keyring({ ss58Format: 42 });
});
it('can decode from a version 2 JSON file', (): void => {
const pair = keyring.addFromJson(JSON.parse(PAIR) as KeyringPair$Json);
pair.decodePkcs8(PASS2);
const json = pair.toJson(PASS3);
expect(pair.isLocked).toBe(false);
expect(pair.address).toBe('5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu');
expect(json.encoding).toEqual({
content: ['pkcs8', 'sr25519'],
type: ['scrypt', 'xsalsa20-poly1305'],
version: '3'
});
pair.decodePkcs8(PASS3);
expect(pair.address).toEqual('5CczAE5AmGrZ93MeVhha3Ywam7j9dKB7cArnH7gtrXcMFJvu');
});
});
describe('version 3 JSON (hex)', (): void => {
const PAIR = '{"address":"FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH","encoded":"0xcd238963070cc4d6806053ee1ac500c7add9c28732bb5d434a332f84a91d9be0008000000100000008000000cf630a1113941b350ddd06697e50399183162e5e9a0e893eafc7f5f4893a223dca5055706b9925b56fdb4304192143843da718e11717daf89cf4f4781f94fb443f61432f782d54280af9eec90bd3069c3cc2d957a42b7c18dc2e9497f623735518e0e49b58f8e4db2c09da3a45dbb935659d015fc94b946cba75b606a6ff7f4e823f6b049e2e6892026b49de02d6dbbd64646fe0933f537d9ea53a70be","encoding":{"content":["pkcs8","sr25519"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"version3","tags":[],"whenCreated":1595277797639}}';
const PASS3 = 'version3';
let keyring: Keyring;
beforeEach((): void => {
keyring = new Keyring({ ss58Format: 2 });
});
it('can decode from a version 3 JSON file', (): void => {
const pair = keyring.addFromJson(JSON.parse(PAIR) as KeyringPair$Json);
pair.decodePkcs8(PASS3);
expect(pair.isLocked).toBe(false);
expect(pair.address).toBe('FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH');
});
});
describe('version 3 JSON (base64)', (): void => {
const PAIR = '{"address":"FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH","encoded":"ILjSgYaGvq1zaCz/kx+aqfLaHBjLXz0Qsmr6RnkOVU4AgAAAAQAAAAgAAAB5R2hm5kgXyc0NQYFxvMU4zCdjB+ugs/ibEooqCvuudbaeKn3Ee47NkCqU1ecOJV+eeaVn4W4dRvIpj5kGmQOGsewR+MiQ/B0G9NFh7JXV0qcPlk2QMNW1/mbJrTO4miqL448BSkP7ZOhUV6HFUpMt3B9HwjiRLN8RORcFp0ID/Azs4Jl/xOpXNzbgQGIffWgCIKTxN9N1ku6tdlG4","encoding":{"content":["pkcs8","sr25519"],"type":["scrypt","xsalsa20-poly1305"],"version":"3"},"meta":{"genesisHash":"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe","name":"version3","tags":[],"whenCreated":1595277797639,"whenEdited":1595278378596}}';
const PASS3 = 'version3';
let keyring: Keyring;
beforeEach((): void => {
keyring = new Keyring({ ss58Format: 2 });
});
it('can decode from a version 3 JSON file', (): void => {
const pair = keyring.addFromJson(JSON.parse(PAIR) as KeyringPair$Json);
pair.decodePkcs8(PASS3);
expect(pair.isLocked).toBe(false);
expect(pair.address).toBe('FLiSDPCcJ6auZUGXALLj6jpahcP6adVFDBUQznPXUQ7yoqH');
});
});
});
+4 -4
View File
@@ -1,10 +1,10 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import './detectPackage';
import './packageDetect.js';
import { Keyring } from './bundle';
import { Keyring } from './bundle.js';
export * from './bundle';
export * from './bundle.js';
export default Keyring;
+139
View File
@@ -0,0 +1,139 @@
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
/// <reference types="@polkadot/dev-test/globals.d.ts" />
import type { KeypairType } from '@polkadot/util-crypto/types';
import { contextForSpec } from '@quantus/crypto';
import { u8aConcat } from '@polkadot/util';
import { cryptoWaitReady, decodeAddress, dilithiumSizes } from '@polkadot/util-crypto';
import { Keyring } from './index.js';
import { createTestPairs } from './testingPairs.js';
await cryptoWaitReady();
// Addresses `quantus developer create-test-wallets` prints for the dev accounts.
const ALICE = 'qzk1Nxai3dZD9Cn5kwGcgL6mKxsfxwqdis7kDQJ52aJS2vSn7';
const BOB = 'qzkYEQv8tQsmniZYdame3Cku18RL5g9bGK9Pdydq5TMPdpE3y';
const CHARLIE = 'qzntBpmqHZF1jxC8KJKpuxcYuHST892jyXBqRctpAxd1WQ9BL';
const MESSAGE = new Uint8Array([1, 2, 3, 4]);
const PASSWORD = 'correct horse';
// Upstream's keyring specs exercised ed25519, sr25519, ecdsa and ethereum pairs.
// Those types, and their primitives, are gone (quantus/common#6). What replaces
// them is what a post-quantum-only keyring has to guarantee instead.
describe('Keyring (post-quantum only)', (): void => {
describe('refuses quantum-unsafe keys, and says why', (): void => {
const unsafe = ['ed25519', 'sr25519', 'ecdsa', 'ethereum'] as unknown as KeypairType[];
for (const type of unsafe) {
it(`at construction: ${type}`, (): void => {
expect(() => new Keyring({ type })).toThrow(/not quantum-safe and cannot be held here/);
});
it(`from a uri: ${type}`, (): void => {
expect(() => new Keyring().createFromUri('//Alice', {}, type)).toThrow(/not quantum-safe/);
});
}
// The entry point that matters most: a backup file the user chose. This is
// the shape of a real polkadot{.js} export of an ed25519 account.
it('from a polkadot{.js} JSON backup', (): void => {
const json = {
address: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
encoded: '0x00',
encoding: { content: ['pkcs8', 'ed25519'], type: ['scrypt', 'xsalsa20-poly1305'], version: '3' },
meta: { name: 'polkadot account' }
};
expect(() => new Keyring().createFromJson(json as never)).toThrow(/ed25519 keys are not quantum-safe and cannot be held here/);
});
it('and still refuses an unknown type as unknown', (): void => {
expect(() => new Keyring({ type: 'dilithium44' as KeypairType })).toThrow(/found 'dilithium44'/);
});
});
it('defaults to ML-DSA-65', (): void => {
expect(new Keyring().type).toEqual('dilithium65');
});
describe('test pairs are the Quantus dev accounts', (): void => {
const pairs = createTestPairs({ ss58Format: 189 });
it('with the addresses the chain endows', (): void => {
expect(pairs.crystal_alice.address).toEqual(ALICE);
expect(pairs.dilithium_bob.address).toEqual(BOB);
expect(pairs.crystal_charlie.address).toEqual(CHARLIE);
expect(pairs.crystal_alice.type).toEqual('dilithium87');
});
it('and a nobody pair of a type the keyring can hold', (): void => {
expect(pairs.nobody.type).toEqual('dilithium65');
});
});
// Upstream decoded the address and passed it as the public key, which for
// Substrate is the same bytes. Here the address is a hash of the key, so every
// watch-only account reported the hash of its own address.
it('adds a watch-only account at the address it was given', (): void => {
const keyring = new Keyring({ ss58Format: 189 });
const watched = keyring.addFromAddress(ALICE, { name: 'watched' });
expect(watched.address).toEqual(ALICE);
expect(watched.addressRaw).toEqual(decodeAddress(ALICE));
expect(keyring.getPair(ALICE).meta.name).toEqual('watched');
});
describe('JSON round trip', (): void => {
for (const type of ['dilithium65', 'dilithium87'] as const) {
it(`${type}: encrypts, restores locked at the right address, and unlocks`, (): void => {
const keyring = new Keyring({ ss58Format: 189 });
const pair = keyring.addFromSeed(new Uint8Array(32).fill(7), { name: 'roundtrip' }, type);
const restored = keyring.createFromJson(pair.toJson(PASSWORD));
expect(restored.isLocked).toBe(true);
expect(restored.address).toEqual(pair.address);
expect(() => restored.decodePkcs8('wrong')).toThrow();
restored.decodePkcs8(PASSWORD);
expect(restored.publicKey).toEqual(pair.publicKey);
expect(restored.sign(MESSAGE, { context: contextForSpec(148) })).toEqual(pair.sign(MESSAGE, { context: contextForSpec(148) }));
});
}
});
describe('verify', (): void => {
const keyring = new Keyring({ ss58Format: 189 });
const alice = keyring.addFromSeed(new Uint8Array(32), {}, 'dilithium87');
const bob = keyring.addFromSeed(new Uint8Array(32).fill(1), {}, 'dilithium87');
const context = contextForSpec(148);
// what pair.sign returns: the chain's wire form, signature ‖ publicKey
const signature = alice.sign(MESSAGE, { context });
const bare = signature.slice(0, dilithiumSizes('dilithium87').signature);
it('accepts the signature ‖ publicKey form and a bare signature', (): void => {
expect(signature).toEqual(u8aConcat(bare, alice.publicKey));
expect(alice.verify(MESSAGE, signature, alice.publicKey, context)).toBe(true);
expect(alice.verify(MESSAGE, bare, alice.publicKey, context)).toBe(true);
});
it('fails under the wrong context, for the wrong signer, or for another message', (): void => {
expect(alice.verify(MESSAGE, signature, alice.publicKey)).toBe(false);
expect(alice.verify(MESSAGE, signature, bob.publicKey, context)).toBe(false);
expect(alice.verify(new Uint8Array([9]), signature, alice.publicKey, context)).toBe(false);
});
});
it('has no derivation and no VRF', (): void => {
const pair = new Keyring().addFromSeed(new Uint8Array(32));
expect(() => pair.derive('//1')).toThrow(/derive from the mnemonic/);
expect(() => pair.vrfSign(MESSAGE)).toThrow(/VRF signing is not available/);
expect(() => pair.vrfVerify(MESSAGE, new Uint8Array(96), pair.publicKey)).toThrow(/VRF verification is not available/);
});
});
+93 -61
View File
@@ -1,22 +1,43 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util-crypto/types';
import type { KeyringInstance, KeyringOptions, KeyringPair, KeyringPair$Json, KeyringPair$Meta } from './types';
import type { KeyringInstance, KeyringOptions, KeyringPair, KeyringPair$Json, KeyringPair$Meta } from './types.js';
import { assert, hexToU8a, isHex, isUndefined, stringToU8a } from '@polkadot/util';
import { base64Decode, decodeAddress, ed25519PairFromSeed as ed25519FromSeed, encodeAddress, ethereumEncode, hdEthereum, keyExtractSuri, keyFromPath, mnemonicToLegacySeed, mnemonicToMiniSecret, secp256k1PairFromSeed as secp256k1FromSeed, sr25519PairFromSeed as sr25519FromSeed } from '@polkadot/util-crypto';
import { hexToU8a, isHex } from '@polkadot/util';
import { base64Decode, decodeAddress, dilithiumPairFromMnemonic, dilithiumPairFromSeed, dilithiumPathFromSuri, encodeAddress, keyExtractSuri } from '@polkadot/util-crypto';
import { DEV_PHRASE } from './defaults';
import { createPair } from './pair';
import { Pairs } from './pairs';
import { createPair } from './pair/index.js';
import { DEV_PHRASE } from './defaults.js';
import { Pairs } from './pairs.js';
const PairFromSeed = {
ecdsa: (seed: Uint8Array): Keypair => secp256k1FromSeed(seed),
ed25519: (seed: Uint8Array): Keypair => ed25519FromSeed(seed),
ethereum: (seed: Uint8Array): Keypair => secp256k1FromSeed(seed),
sr25519: (seed: Uint8Array): Keypair => sr25519FromSeed(seed)
};
/**
* Every keypair type this keyring will construct.
*
* Was two separate inline arrays, both of which a widened `KeypairType` silently
* walked past — the union is compile-time and these checks are not. Named once so
* the next change to the union has one place to look, and so the error message
* cannot drift from the check.
*/
const KEYPAIR_TYPES: KeypairType[] = ['dilithium65', 'dilithium87'];
/** Upstream's types, refused by name so the refusal can say why. */
const QUANTUM_UNSAFE = ['ecdsa', 'ed25519', 'ethereum', 'sr25519'];
/**
* Refuse anything that is not a post-quantum keypair type.
*
* A key of upstream's types arriving here (a JSON backup from polkadot{.js}, a
* caller asking for sr25519) is not a bug in this software, and "unknown crypto
* type" would read as one. Say what it is instead. quantus/common#6
*/
function assertKeypairType (type: string | undefined): asserts type is KeypairType {
if (type && QUANTUM_UNSAFE.includes(type)) {
throw new Error(`${type} keys are not quantum-safe and cannot be held here; only ML-DSA (dilithium65, dilithium87) keys are supported`);
} else if (!KEYPAIR_TYPES.includes(type as KeypairType)) {
throw new Error(`Expected a keypair type of one of ${KEYPAIR_TYPES.map((t) => `'${t}'`).join(', ')}, found '${type || 'unknown'}'`);
}
}
function pairToPublic ({ publicKey }: KeyringPair): Uint8Array {
return publicKey;
@@ -43,14 +64,17 @@ export class Keyring implements KeyringInstance {
readonly #type: KeypairType;
#ss58?: number;
#ss58?: number | undefined;
public decodeAddress = decodeAddress;
constructor (options: KeyringOptions = {}) {
options.type = options.type || 'ed25519';
// ML-DSA-65 is the scheme new Quantus accounts use.
options.type = options.type || 'dilithium65';
assert(['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined'), () => `Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type || 'unknown'}`);
// Behind the union type: a JavaScript caller, or one casting, can still pass
// anything, and this fails at construction rather than at use.
assertKeypairType(options.type);
this.#pairs = new Pairs();
this.#ss58 = options.ss58Format;
@@ -72,7 +96,7 @@ export class Keyring implements KeyringInstance {
}
/**
* @description Returns the type of the keyring, ed25519, sr25519 or ecdsa
* @description Returns the type of the keyring: dilithium65 or dilithium87
*/
public get type (): KeypairType {
return this.#type;
@@ -95,9 +119,14 @@ export class Keyring implements KeyringInstance {
* `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.
*/
public addFromAddress (address: string | Uint8Array, meta: KeyringPair$Meta = {}, encoded: Uint8Array | null = null, type: KeypairType = this.type, ignoreChecksum?: boolean, encType?: EncryptedJsonEncoding[]): KeyringPair {
const publicKey = this.decodeAddress(address, ignoreChecksum);
assertKeypairType(type);
return this.addPair(createPair({ toSS58: this.encodeAddress, type }, { publicKey, secretKey: new Uint8Array() }, meta, encoded, encType));
// An address is a Poseidon2 hash of an ML-DSA public key, not the key, so it
// is carried as an account id. Upstream passed it as `publicKey`, which for
// these types made every watch-only account report the hash of its address.
const accountId = this.decodeAddress(address, ignoreChecksum);
return this.addPair(createPair({ toSS58: this.encodeAddress, type }, { accountId, publicKey: new Uint8Array(), secretKey: new Uint8Array() }, meta, encoded, encType));
}
/**
@@ -119,8 +148,8 @@ export class Keyring implements KeyringInstance {
* of an account backup), and then generates a keyring pair from it that it passes to
* `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.
*/
public addFromMnemonic (mnemonic: string, meta: KeyringPair$Meta = {}, type: KeypairType = this.type): KeyringPair {
return this.addFromUri(mnemonic, meta, type);
public addFromMnemonic (mnemonic: string, meta: KeyringPair$Meta = {}, type: KeypairType = this.type, wordlist?: string[]): KeyringPair {
return this.addFromUri(mnemonic, meta, type, wordlist);
}
/**
@@ -142,7 +171,7 @@ export class Keyring implements KeyringInstance {
*/
public addFromSeed (seed: Uint8Array, meta: KeyringPair$Meta = {}, type: KeypairType = this.type): KeyringPair {
return this.addPair(
createPair({ toSS58: this.encodeAddress, type }, PairFromSeed[type](seed), meta, null)
this.createFromPair(dilithiumPairFromSeed(seed, type), meta, type)
);
}
@@ -151,9 +180,9 @@ export class Keyring implements KeyringInstance {
* @summary Creates an account via an suri
* @description Extracts the phrase, path and password from a SURI format for specifying secret keys `<secret>/<soft-key>//<hard-key>///<password>` (the `///password` may be omitted, and `/<soft-key>` and `//<hard-key>` maybe repeated and mixed). The secret can be a hex string, mnemonic phrase or a string (to be padded)
*/
public addFromUri (suri: string, meta: KeyringPair$Meta = {}, type: KeypairType = this.type): KeyringPair {
public addFromUri (suri: string, meta: KeyringPair$Meta = {}, type: KeypairType = this.type, wordlist?: string[]): KeyringPair {
return this.addPair(
this.createFromUri(suri, meta, type)
this.createFromUri(suri, meta, type, wordlist)
);
}
@@ -162,7 +191,9 @@ export class Keyring implements KeyringInstance {
* @description Creates a pair from a JSON keyfile
*/
public createFromJson ({ address, encoded, encoding: { content, type, version }, meta }: KeyringPair$Json, ignoreChecksum?: boolean): KeyringPair {
assert(version !== '3' || content[0] === 'pkcs8', () => `Unable to decode non-pkcs8 type, [${content.join(',')}] found}`);
if (version === '3' && content[0] !== 'pkcs8') {
throw new Error(`Unable to decode non-pkcs8 type, [${content.join(',')}] found}`);
}
const cryptoType = version === '0' || !Array.isArray(content)
? this.type
@@ -171,17 +202,24 @@ export class Keyring implements KeyringInstance {
? [type]
: type;
assert(['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType), () => `Unknown crypto type ${cryptoType}`);
// The guard that matters most: JSON arrives from a file the user chose, and a
// polkadot{.js} backup of an sr25519 account must be refused with a reason,
// not constructed and not reported as an unknown type.
assertKeypairType(cryptoType);
// Here the address and publicKey are 32 bytes and isomorphic. This is why the address field needs to be the public key for ethereum type pairs
const publicKey = isHex(address)
const raw = isHex(address)
? hexToU8a(address)
: this.decodeAddress(address, ignoreChecksum);
const decoded = isHex(encoded)
? hexToU8a(encoded)
: base64Decode(encoded);
return createPair({ toSS58: this.encodeAddress, type: cryptoType as KeypairType }, { publicKey, secretKey: new Uint8Array() }, meta, decoded, encType);
// The account id is a one-way Poseidon2 hash, and the 1952/2592-byte public
// key is inside `decoded`, encrypted until someone supplies a password. So
// carry the account id as an account id: createPair uses it for the address
// while locked, and checks it against the real public key the moment
// `decodePkcs8` produces one.
return createPair({ toSS58: this.encodeAddress, type: cryptoType }, { accountId: raw, publicKey: new Uint8Array(), secretKey: new Uint8Array() }, meta, decoded, encType);
}
/**
@@ -189,6 +227,8 @@ export class Keyring implements KeyringInstance {
* @summary Creates a pair from an explicit publicKey/secreteKey combination
*/
public createFromPair (pair: Keypair, meta: KeyringPair$Meta = {}, type: KeypairType = this.type): KeyringPair {
assertKeypairType(type);
return createPair({ toSS58: this.encodeAddress, type }, pair, meta, null);
}
@@ -197,48 +237,40 @@ export class Keyring implements KeyringInstance {
* @summary Creates a Keypair from an suri
* @description This creates a pair from the suri, but does not add it to the keyring
*/
public createFromUri (_suri: string, meta: KeyringPair$Meta = {}, type: KeypairType = this.type): KeyringPair {
// here we only aut-add the dev phrase if we have a hard-derived path
public createFromUri (_suri: string, meta: KeyringPair$Meta = {}, type: KeypairType = this.type, _wordlist?: string[]): KeyringPair {
assertKeypairType(type);
// here we only auto-add the dev phrase if we have a hard-derived path
const suri = _suri.startsWith('//')
? `${DEV_PHRASE}${_suri}`
: _suri;
const { derivePath, password, path, phrase } = keyExtractSuri(suri);
let seed: Uint8Array;
const isPhraseHex = isHex(phrase, 256);
const { derivePath, password, phrase } = keyExtractSuri(suri);
if (isPhraseHex) {
seed = hexToU8a(phrase);
} else {
const parts = phrase.split(' ');
if ([12, 15, 18, 21, 24].includes(parts.length)) {
seed = type === 'ethereum'
? mnemonicToLegacySeed(phrase, '', false, 64)
: mnemonicToMiniSecret(phrase, password);
} else {
assert(phrase.length <= 32, 'specified phrase is not a valid mnemonic and is invalid as a raw seed at > 32 bytes');
seed = stringToU8a(phrase.padEnd(32));
// ML-DSA derives from the mnemonic itself along a hardened BIP44 path, not
// from a seed along a junction chain: lattice keys have no public
// derivability, so there is no soft junction to emulate, and the chain's own
// Pair::derive refuses for the same reason.
if (isHex(phrase, 256)) {
// A raw 32-byte seed goes straight into keygen, which is how the
// dev-genesis accounts are defined. Combining one with a derivation path
// is ambiguous (is the seed the master, or already derived?), so refuse
// rather than pick.
if (derivePath) {
throw new Error('A derivation path cannot be combined with a raw seed for post-quantum pairs');
}
return this.createFromPair(dilithiumPairFromSeed(hexToU8a(phrase), type), meta, type);
}
const derived = type === 'ethereum'
? isPhraseHex
? PairFromSeed[type](seed) // for eth, if the private key is provided as suri, it must be derived only once
: hdEthereum(seed, derivePath.substring(1))
: keyFromPath(PairFromSeed[type](seed), path, type);
return createPair({ toSS58: this.encodeAddress, type }, derived, meta, null);
return this.createFromPair(
dilithiumPairFromMnemonic(phrase, password || '', dilithiumPathFromSuri(type, derivePath), type),
meta,
type
);
}
/**
* @name encodeAddress
* @description Encodes the input into an ss58 representation
*/
public encodeAddress = (address: Uint8Array | string, ss58Format?: number): string => {
return this.type === 'ethereum'
? ethereumEncode(address)
: encodeAddress(address, isUndefined(ss58Format) ? this.#ss58 : ss58Format);
return encodeAddress(address, ss58Format ?? this.#ss58);
};
/**
+4
View File
@@ -0,0 +1,4 @@
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
export * from './index.js';
+13
View File
@@ -0,0 +1,13 @@
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
// (packageInfo imports will be kept as-is, user-editable)
import { detectPackage } from '@polkadot/util';
import { packageInfo as utilInfo } from '@polkadot/util/packageInfo';
import { packageInfo as cryptoInfo } from '@polkadot/util-crypto/packageInfo';
import { packageInfo } from './packageInfo.js';
detectPackage(packageInfo, null, [cryptoInfo, utilInfo]);
+2 -2
View File
@@ -1,6 +1,6 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
// Do not edit, auto-generated by @polkadot/dev
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '9.0.1' };
export const packageInfo = { name: '@polkadot/keyring', path: 'auto', type: 'auto', version: '14.0.3-quantus.3' };
-24
View File
@@ -1,24 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { createTestPairs } from '../testingPairs';
const keyring = createTestPairs({ type: 'ed25519' }, false);
describe('decode', (): void => {
it('fails when no data provided', (): void => {
expect(
(): void => keyring.alice.decodePkcs8()
).toThrow(/No encrypted data available/);
});
it('returns correct publicKey from encoded', (): void => {
const PASS = 'testing';
expect(
(): void => keyring.alice.decodePkcs8(
PASS, keyring.alice.encodePkcs8(PASS)
)
).not.toThrow();
});
});
+64 -26
View File
@@ -1,43 +1,81 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { EncryptedJsonEncoding } from '@polkadot/util-crypto/types';
import type { PairInfo } from './types';
import { assert, isUndefined, u8aEq } from '@polkadot/util';
import { u8aEq } from '@polkadot/util';
import { jsonDecryptData } from '@polkadot/util-crypto';
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults';
import { PAIR_DIV, PAIR_HDR, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults.js';
const SEED_OFFSET = PKCS8_HEADER.length;
const SEED_OFFSET = PAIR_HDR.length;
type DecodeResult = PairInfo & {
secretKey: Uint8Array;
};
export function decodePair (passphrase?: string, encrypted?: Uint8Array | null, _encType?: EncryptedJsonEncoding | EncryptedJsonEncoding[]): DecodeResult {
const encType = Array.isArray(_encType) || isUndefined(_encType)
/**
* Decode a pair, taking into account the generation-specific formats and headers
*
* For divisor/headers, don't rely on the magic being static. These will
* change between generations, aka with the long-awaited 4th generation
* of the format. The external decode interface is the only way to use and decode these.
*
* `secretLength` exists for keys that are not 32 or 64 bytes. The body is
* `HDR ‖ secretKey ‖ DIV ‖ publicKey`, and upstream located the divider by
* trying the two lengths every curve scheme uses. An ML-DSA secret is 4032 or
* 4896 bytes, so neither offset matches and the decode throws "Invalid encoding
* divider found in body" — a stored account that cannot be read back.
*
* The caller passes the length rather than this function searching for the
* divider. Searching would work almost always and fail catastrophically when it
* did not: PAIR_DIV is five bytes, so a 4032-byte secret contains a false match
* about once in 270 million keys, and the result would be a silently wrong key
* rather than an error. The caller knows the type, so it knows the length.
**/
export function decodePair (passphrase?: string, encrypted?: Uint8Array | null, _encType?: EncryptedJsonEncoding | EncryptedJsonEncoding[], secretLength?: number): { publicKey: Uint8Array; secretKey: Uint8Array } {
const encType = Array.isArray(_encType) || _encType === undefined
? _encType
: [_encType];
const decrypted = jsonDecryptData(encrypted, passphrase, encType);
const header = decrypted.subarray(0, PKCS8_HEADER.length);
const header = decrypted.subarray(0, PAIR_HDR.length);
assert(u8aEq(header, PKCS8_HEADER), 'Invalid Pkcs8 header found in body');
let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);
let divOffset = SEED_OFFSET + SEC_LENGTH;
let divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
// old-style, we have the seed here
if (!u8aEq(divider, PKCS8_DIVIDER)) {
divOffset = SEED_OFFSET + SEED_LENGTH;
secretKey = decrypted.subarray(SEED_OFFSET, divOffset);
divider = decrypted.subarray(divOffset, divOffset + PKCS8_DIVIDER.length);
assert(u8aEq(divider, PKCS8_DIVIDER), 'Invalid Pkcs8 divider found in body');
// check the start header (generations 1-3)
if (!u8aEq(header, PAIR_HDR)) {
throw new Error('Invalid encoding header found in body');
}
const pubOffset = divOffset + PKCS8_DIVIDER.length;
// an explicitly-sized secret (ML-DSA); there is one offset and it either
// matches or the blob is not what the caller said it was
if (secretLength) {
const divOffset = SEED_OFFSET + secretLength;
if (!u8aEq(decrypted.subarray(divOffset, divOffset + PAIR_DIV.length), PAIR_DIV)) {
throw new Error('Invalid encoding divider found in body');
}
return {
// the public key is the remainder: its length varies by scheme and the
// body ends here, so there is nothing to read past it
publicKey: decrypted.subarray(divOffset + PAIR_DIV.length),
secretKey: decrypted.subarray(SEED_OFFSET, divOffset)
};
}
// setup for generation 3 format
let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);
let divOffset = SEED_OFFSET + SEC_LENGTH;
let divider = decrypted.subarray(divOffset, divOffset + PAIR_DIV.length);
// old-style (generation 1 & 2), we have the seed here
if (!u8aEq(divider, PAIR_DIV)) {
divOffset = SEED_OFFSET + SEED_LENGTH;
secretKey = decrypted.subarray(SEED_OFFSET, divOffset);
divider = decrypted.subarray(divOffset, divOffset + PAIR_DIV.length);
// check the divisior at this point (already checked for generation 3)
if (!u8aEq(divider, PAIR_DIV)) {
throw new Error('Invalid encoding divider found in body');
}
}
const pubOffset = divOffset + PAIR_DIV.length;
const publicKey = decrypted.subarray(pubOffset, pubOffset + PUB_LENGTH);
return {
+14 -3
View File
@@ -1,9 +1,20 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
export const PKCS8_DIVIDER = new Uint8Array([161, 35, 3, 33, 0]);
export const PKCS8_HEADER = new Uint8Array([48, 83, 2, 1, 1, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32]);
/** public/secret section divider (generation 1-3, will change in 4, don't rely on value) */
export const PAIR_DIV = new Uint8Array([161, 35, 3, 33, 0]);
/** public/secret start block (generation 1-3, will change in 4, don't rely on value) */
export const PAIR_HDR = new Uint8Array([48, 83, 2, 1, 1, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32]);
/** length of a public key */
export const PUB_LENGTH = 32;
/** length of a salt */
export const SALT_LENGTH = 32;
/** length of a secret key */
export const SEC_LENGTH = 64;
/** length of a user-input seed */
export const SEED_LENGTH = 32;
@@ -0,0 +1,91 @@
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
/// <reference types="@polkadot/dev-test/globals.d.ts" />
import { contextForSpec, Scheme, sizes } from '@quantus/crypto';
import { dilithiumVerify } from '@polkadot/util-crypto';
import { Keyring } from '../keyring.js';
// crystal_alice, from the chain's dev genesis: a raw 32-byte seed straight into
// ML-DSA-87 keygen, no HD derivation. The expected address is what
// `quantus developer create-test-wallets` prints — an independent implementation,
// not this one.
const ALICE_ADDRESS = 'qzk1Nxai3dZD9Cn5kwGcgL6mKxsfxwqdis7kDQJ52aJS2vSn7';
const MESSAGE = new Uint8Array([0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64]);
describe('dilithium pairs', (): void => {
const keyring = new Keyring({ ss58Format: 189, type: 'dilithium87' });
const alice = keyring.addFromSeed(new Uint8Array(32), { name: 'crystal_alice' }, 'dilithium87');
const context = contextForSpec(148);
const s87 = sizes(Scheme.MlDsa87);
const s65 = sizes(Scheme.MlDsa65);
it('derives the address quantus-cli derives', (): void => {
expect(alice.address).toEqual(ALICE_ADDRESS);
});
// The assumption this whole fork exists to break. Everywhere else in this
// package `addressRaw` and `publicKey` are the same 32 bytes.
it('has an addressRaw that is not the publicKey', (): void => {
expect(alice.addressRaw.length).toEqual(32);
expect(alice.publicKey.length).toEqual(s87.publicKey);
});
it('signs to the wire form the runtime reads', (): void => {
const signature = alice.sign(MESSAGE, { context });
expect(signature.length).toEqual(s87.signatureWithPublicKey);
});
// `withType` prepends the signature enum's variant index. For the curve types
// that enum is Substrate's MultiSignature; here it is the runtime's
// DilithiumSignatureScheme, reached by the same mechanism.
it('prepends the chain variant byte with withType', (): void => {
const signed87 = alice.sign(MESSAGE, { context, withType: true });
const k65 = keyring.addFromSeed(new Uint8Array(32).fill(9), {}, 'dilithium65');
const signed65 = k65.sign(MESSAGE, { context, withType: true });
expect(signed87[0]).toEqual(0);
expect(signed87.length).toEqual(s87.signatureWithPublicKey + 1);
expect(signed65[0]).toEqual(1);
expect(signed65.length).toEqual(s65.signatureWithPublicKey + 1);
});
it('verifies against the account id', (): void => {
const signature = alice.sign(MESSAGE, { context });
expect(dilithiumVerify(MESSAGE, signature, alice.addressRaw, 'dilithium87', context)).toEqual(true);
});
// The spec-148 boundary. A signature made under the wrong context is
// cryptographically valid and rejected by the chain, so this is the only place
// it can be caught locally.
it('does not verify under the wrong context', (): void => {
const signature = alice.sign(MESSAGE, { context });
expect(dilithiumVerify(MESSAGE, signature, alice.addressRaw, 'dilithium87', contextForSpec(147))).toEqual(false);
});
// Verification checks the embedded public key hashes to the account being
// verified against, not merely that the signature is valid for *some* key.
it('does not verify another account signature', (): void => {
const bob = keyring.addFromSeed(new Uint8Array(32).fill(1), {}, 'dilithium87');
const signature = bob.sign(MESSAGE, { context });
expect(dilithiumVerify(MESSAGE, signature, alice.addressRaw, 'dilithium87', context)).toEqual(false);
});
it('refuses to sign without a context', (): void => {
expect(() => alice.sign(MESSAGE)).toThrow(/signing context is required/);
});
// There is no ML-DSA VRF, and faking one from an ordinary signature would
// produce output that looks like a VRF proof and cannot be verified as one.
it('refuses to VRF sign', (): void => {
expect(() => alice.vrfSign(MESSAGE)).toThrow(/not available for dilithium87/);
});
});
@@ -0,0 +1,97 @@
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
/// <reference types="@polkadot/dev-test/globals.d.ts" />
import { dilithiumPath } from '@polkadot/util-crypto';
import { Keyring } from '../keyring.js';
// The well-known Substrate development phrase — public by design, so pinning it
// commits no secret. Any account it derives is assumed compromised.
const DEV_PHRASE = 'bottom drive obey lake curtain smoke basket hold race lonely fit walk';
// What `quantus wallet import --mnemonic-file <DEV_PHRASE> --scheme <s>` prints.
// An independent implementation, not this one.
const EXPECT_65 = 'qzq29m9WvneDAeXbtgueKCREtNe1rVVs6bXSMLmjr6shqvwq6';
const EXPECT_87 = 'qzjrYTUnnE5NduTZKxe9dESCMTZg7nTueKM3bwhnkRdD1iYV4';
// crystal_alice — a raw 32-byte seed straight into keygen, no derivation.
const ALICE = 'qzk1Nxai3dZD9Cn5kwGcgL6mKxsfxwqdis7kDQJ52aJS2vSn7';
describe('dilithium derivation', (): void => {
const keyring = new Keyring({ ss58Format: 189, type: 'dilithium65' });
it('builds the paths quantus-cli uses', (): void => {
expect(dilithiumPath('dilithium65')).toEqual("m/44'/189189'/0'/0'/1'");
expect(dilithiumPath('dilithium87')).toEqual("m/44'/189189'/0'/0'/0'");
expect(dilithiumPath('dilithium65', 3)).toEqual("m/44'/189189'/3'/0'/1'");
});
// The whole derivation chain at once: BIP39 to a 64-byte seed (not Substrate's
// mnemonicToMiniSecret), the HMAC-SHA512 walk keyed with "Dilithium seed", the
// trailing hardened index carrying the scheme, and the Poseidon2 account hash.
it('derives what quantus-cli derives, both schemes', (): void => {
expect(keyring.createFromUri(DEV_PHRASE, {}, 'dilithium65').address).toEqual(EXPECT_65);
expect(keyring.createFromUri(DEV_PHRASE, {}, 'dilithium87').address).toEqual(EXPECT_87);
});
it('defaults to account index 0', (): void => {
expect(keyring.createFromUri(`${DEV_PHRASE}//0`, {}, 'dilithium65').address).toEqual(EXPECT_65);
});
it('derives distinct accounts per index', (): void => {
const zero = keyring.createFromUri(`${DEV_PHRASE}//0`, {}, 'dilithium65').address;
const one = keyring.createFromUri(`${DEV_PHRASE}//1`, {}, 'dilithium65').address;
expect(zero).not.toEqual(one);
});
it('accepts an explicit hardened path', (): void => {
const byIndex = keyring.createFromUri(`${DEV_PHRASE}//2`, {}, 'dilithium65').address;
const byPath = keyring.createFromUri(`${DEV_PHRASE}//m/44'/189189'/2'/0'/1'`, {}, 'dilithium65').address;
expect(byPath).toEqual(byIndex);
});
// The suri syntax was built for curve junctions, where `/foo` is a soft
// derivation over arbitrary bytes. Neither form exists for ML-DSA, and quietly
// reinterpreting one would hand back an address no other tool derives.
it('refuses soft derivation', (): void => {
expect(() => keyring.createFromUri(`${DEV_PHRASE}/0`, {}, 'dilithium65')).toThrow(/Soft derivation is not possible/);
});
it('refuses a named junction', (): void => {
expect(() => keyring.createFromUri(`${DEV_PHRASE}//Alice`, {}, 'dilithium65')).toThrow(/Unsupported derivation path/);
});
it('refuses an unhardened level in an explicit path', (): void => {
expect(() => keyring.createFromUri(`${DEV_PHRASE}//m/44'/189189'/0'/0'/1`, {}, 'dilithium65')).toThrow(/Unhardened derivation/);
});
// A raw seed is already key material. Whether it is the master or something
// already derived is unanswerable, so combining it with a path is refused
// rather than guessed.
it('takes a raw hex seed underived, and refuses to derive from one', (): void => {
const seed = `0x${'00'.repeat(32)}`;
expect(keyring.createFromUri(seed, {}, 'dilithium87').address).toEqual(ALICE);
expect(() => keyring.createFromUri(`${seed}//1`, {}, 'dilithium87')).toThrow(/cannot be combined with a raw seed/);
});
it('honours a BIP39 passphrase', (): void => {
const plain = keyring.createFromUri(DEV_PHRASE, {}, 'dilithium65').address;
const withPass = keyring.createFromUri(`${DEV_PHRASE}///hunter2`, {}, 'dilithium65').address;
expect(plain).not.toEqual(withPass);
});
// Deriving a child *from a pair* is not merely unimplemented here, it is
// impossible: ML-DSA keys are not derivable from one another, and the Quantus
// tree derives each account from the mnemonic independently.
it('refuses to derive from an existing pair', (): void => {
const pair = keyring.createFromUri(DEV_PHRASE, {}, 'dilithium65');
expect(() => pair.derive('//1')).toThrow(/derive from the mnemonic with createFromUri/);
});
});
@@ -0,0 +1,103 @@
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
/// <reference types="@polkadot/dev-test/globals.d.ts" />
import { contextForSpec } from '@quantus/crypto';
import { dilithiumVerify } from '@polkadot/util-crypto';
import { Keyring } from '../keyring.js';
// The address `quantus developer create-test-wallets` prints for crystal_alice.
const ALICE_ADDRESS = 'qzk1Nxai3dZD9Cn5kwGcgL6mKxsfxwqdis7kDQJ52aJS2vSn7';
const PASSWORD = 'not a good password';
const MESSAGE = new Uint8Array([0x6a, 0x73, 0x6f, 0x6e]);
describe('dilithium account JSON', (): void => {
const keyring = new Keyring({ ss58Format: 189, type: 'dilithium87' });
const context = contextForSpec(148);
const backup = (type: 'dilithium65' | 'dilithium87', fill = 0) => {
const pair = keyring.addFromSeed(new Uint8Array(32).fill(fill), { name: 'backed up' }, type);
return { json: pair.toJson(PASSWORD), original: pair };
};
// The whole point. Before this worked, an exported Quantus account could not be
// imported by anything — decodePair looked for its divider at one of two fixed
// offsets and an ML-DSA secret is at neither, so restore threw "Invalid
// encoding divider found in body". That is a data-durability bug, not a
// convenience one: it had to land before any build let a user create an account.
it('round-trips an ML-DSA-87 account', (): void => {
const { json, original } = backup('dilithium87');
const restored = keyring.createFromJson(json);
restored.decodePkcs8(PASSWORD);
expect(restored.address).toEqual(original.address);
expect(restored.publicKey).toEqual(original.publicKey);
expect(restored.isLocked).toEqual(false);
});
it('round-trips an ML-DSA-65 account', (): void => {
const { json, original } = backup('dilithium65', 5);
const restored = keyring.createFromJson(json);
restored.decodePkcs8(PASSWORD);
expect(restored.address).toEqual(original.address);
expect(restored.publicKey).toEqual(original.publicKey);
});
// A restored pair is locked, and callers read `pair.address` off it long before
// any password appears. For every other scheme that works because the address
// *is* the public key; here the key is still encrypted, so the account id has
// to be carried as data until decodePkcs8 supplies the real one.
it('reports the same address before and after unlock', (): void => {
const { json } = backup('dilithium87');
const restored = keyring.createFromJson(json);
expect(restored.isLocked).toEqual(true);
expect(restored.address).toEqual(ALICE_ADDRESS);
restored.decodePkcs8(PASSWORD);
expect(restored.address).toEqual(ALICE_ADDRESS);
});
it('restores a pair that can still sign', (): void => {
const { json, original } = backup('dilithium87');
const restored = keyring.createFromJson(json);
restored.decodePkcs8(PASSWORD);
const signature = restored.sign(MESSAGE, { context });
expect(dilithiumVerify(MESSAGE, signature, original.addressRaw, 'dilithium87', context)).toEqual(true);
});
it('fails cleanly on a wrong password', (): void => {
const { json } = backup('dilithium87');
const restored = keyring.createFromJson(json);
expect(() => restored.decodePkcs8('wrong')).toThrow();
// and must not have half-applied anything
expect(restored.isLocked).toEqual(true);
expect(restored.address).toEqual(ALICE_ADDRESS);
});
// For every other scheme a tampered `address` field cannot decode at all,
// because the address is the public key. Here it decodes perfectly and yields a
// pair reporting an address its key does not control — a user would see someone
// else's address in their own wallet and believe they held it.
it('rejects JSON whose address does not match its key', (): void => {
const { json } = backup('dilithium87');
const other = keyring.addFromSeed(new Uint8Array(32).fill(2), {}, 'dilithium87');
const tampered = { ...json, address: other.address };
const restored = keyring.createFromJson(tampered);
expect(restored.address).toEqual(other.address);
expect(() => restored.decodePkcs8(PASSWORD)).toThrow(/does not match the address/);
});
});
-26
View File
@@ -1,26 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { NONCE_LENGTH, SCRYPT_LENGTH } from '@polkadot/util-crypto/json/constants';
import { createTestPairs } from '../testingPairs';
import { PKCS8_DIVIDER, PKCS8_HEADER, PUB_LENGTH, SEC_LENGTH } from './defaults';
const PKCS8_LENGTH = PKCS8_DIVIDER.length + PKCS8_HEADER.length + PUB_LENGTH + SEC_LENGTH;
const ENCODED_LENGTH = 16 + PKCS8_LENGTH + NONCE_LENGTH + SCRYPT_LENGTH;
const keyring = createTestPairs({ type: 'ed25519' }, false);
describe('encode', (): void => {
it('returns PKCS8 when no passphrase supplied', (): void => {
expect(
keyring.alice.encodePkcs8()
).toHaveLength(PKCS8_LENGTH);
});
it('returns encoded PKCS8 when passphrase supplied', (): void => {
expect(
keyring.alice.encodePkcs8('testing')
).toHaveLength(ENCODED_LENGTH);
});
});
+12 -11
View File
@@ -1,27 +1,28 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { PairInfo } from './types';
import type { PairInfo } from './types.js';
import { assert, u8aConcat } from '@polkadot/util';
import { u8aConcat } from '@polkadot/util';
import { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';
import { PKCS8_DIVIDER, PKCS8_HEADER } from './defaults';
import { PAIR_DIV, PAIR_HDR } from './defaults.js';
/**
* Encode a pair with the latest generation format (generation 3)
**/
export function encodePair ({ publicKey, secretKey }: PairInfo, passphrase?: string): Uint8Array {
assert(secretKey, 'Expected a valid secretKey to be passed to encode');
if (!secretKey) {
throw new Error('Expected a valid secretKey to be passed to encode');
}
const encoded = u8aConcat(
PKCS8_HEADER,
secretKey,
PKCS8_DIVIDER,
publicKey
);
const encoded = u8aConcat(PAIR_HDR, secretKey, PAIR_DIV, publicKey);
if (!passphrase) {
return encoded;
}
// this is only for generation 3 (previous generations are only handled in decoding)
const { params, password, salt } = scryptEncode(passphrase);
const { encrypted, nonce } = naclEncrypt(encoded, password.subarray(0, 32));
-295
View File
@@ -1,295 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { hexToU8a, u8aToHex } from '@polkadot/util';
import { cryptoWaitReady, encodeAddress as toSS58, setSS58Format } from '@polkadot/util-crypto';
import { PAIRSSR25519 } from '../testing';
import { createTestPairs } from '../testingPairs';
import { createPair } from '.';
const keyring = createTestPairs({ type: 'ed25519' }, false);
const TEST_ADDRESS = '0x4119b2e6c3Cb618F4f0B93ac77f9BeeC7FF02887';
describe('pair', (): void => {
beforeEach(async (): Promise<void> => {
await cryptoWaitReady();
});
const SIGNATURE = new Uint8Array([80, 191, 198, 147, 225, 207, 75, 88, 126, 39, 129, 109, 191, 38, 72, 181, 75, 254, 81, 143, 244, 79, 237, 38, 236, 141, 28, 252, 134, 26, 169, 234, 79, 33, 153, 158, 151, 34, 175, 188, 235, 20, 35, 135, 83, 120, 139, 211, 233, 130, 1, 208, 201, 215, 73, 80, 56, 98, 185, 196, 11, 8, 193, 14]);
const ENCRYPTED = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 59, 53, 85, 227, 40, 107, 48, 234, 198, 238, 157, 238, 224, 235, 179, 75, 153, 241, 142, 254]);
// the last byte is changed from 254 -> 253
const ENCRYPTED_CHANGED = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 59, 53, 85, 227, 40, 107, 48, 234, 198, 238, 157, 238, 224, 235, 179, 75, 153, 241, 142, 253]);
it('has a publicKey', (): void => {
expect(
keyring.alice.publicKey
).toEqual(
new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79])
);
expect(
keyring.alice.addressRaw
).toEqual(
new Uint8Array([209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79])
);
});
it('allows signing', (): void => {
expect(
keyring.alice.sign(
new Uint8Array([0x61, 0x62, 0x63, 0x64])
)
).toEqual(SIGNATURE);
});
it('validates a correctly signed message', (): void => {
expect(
keyring.alice.verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64]),
SIGNATURE,
keyring.alice.publicKey
)
).toEqual(true);
});
it('fails a correctly signed message (signer changed)', (): void => {
expect(
keyring.alice.verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64]),
SIGNATURE,
keyring.bob.publicKey
)
).toEqual(false);
});
it('fails a correctly signed message (message changed)', (): void => {
expect(
keyring.alice.verify(
new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]),
SIGNATURE,
keyring.alice.publicKey
)
).toEqual(false);
});
it('allows vrf sign and verify', (): void => {
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
expect(
keyring.alice.vrfVerify(
message,
keyring.alice.vrfSign(message),
keyring.alice.publicKey
)
).toBe(true);
});
it('fails vrf sign and verify (publicKey changed)', (): void => {
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
expect(
keyring.alice.vrfVerify(
message,
keyring.alice.vrfSign(message),
keyring.bob.publicKey
)
).toBe(false);
});
it('allows encrypting', (): void => {
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
expect(
keyring.alice.encryptMessage(
message,
keyring.bob.publicKey,
new Uint8Array(24)
)
).toEqual(ENCRYPTED);
});
it('validates a correctly encrypted message', (): void => {
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
expect(
keyring.bob.decryptMessage(
ENCRYPTED,
keyring.alice.publicKey
)
).toEqual(message);
});
it('fails a correctly encrypted message (message changed)', (): void => {
expect(
keyring.bob.decryptMessage(
ENCRYPTED_CHANGED,
keyring.alice.publicKey
)
).toEqual(null);
});
it('fails a correctly encrypted message (sender changed)', (): void => {
expect(
keyring.bob.decryptMessage(
ENCRYPTED,
keyring.charlie.publicKey
)
).toEqual(null);
});
it('fails a correctly encrypted message (receiver changed)', (): void => {
expect(
keyring.charlie.decryptMessage(
ENCRYPTED,
keyring.alice.publicKey
)
).toEqual(null);
});
it('validates encryption between ed25519 & sr25519 key pairs', (): void => {
const PASS = 'testing';
const encodedA = keyring.alice.encodePkcs8(PASS);
const encodedB = keyring.bob.encodePkcs8(PASS);
const pairA = createPair({ toSS58, type: 'sr25519' }, { publicKey: keyring.alice.publicKey });
const pairB = createPair({ toSS58, type: 'sr25519' }, { publicKey: keyring.bob.publicKey });
pairA.decodePkcs8(PASS, encodedA);
pairB.decodePkcs8(PASS, encodedB);
const message = new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]);
// alice-sr25519 -> bob-ed25519
const encrypted1 = pairA.encryptMessage(message, keyring.bob.publicKey);
// alice-sr25519 -> bob-sr25519
const encrypted2 = pairA.encryptMessage(message, pairB.publicKey);
// alice-ed25519 -> bob-sr25519
const encrypted3 = keyring.alice.encryptMessage(message, pairB.publicKey);
// decrypt: Bob-ed25519 - use alice-ed25519 pubkey
expect(
keyring.bob.decryptMessage(encrypted3, keyring.alice.publicKey)
).toEqual(message);
// decrypt: Bob-ed25519 - use alice-sr25519 pubkey
expect(
keyring.bob.decryptMessage(encrypted1, pairA.publicKey)
).toEqual(message);
// decrypt: Bob-sr25519 - use alice-sr25519 pubkey
expect(
pairB.decryptMessage(encrypted2, pairA.publicKey)
).toEqual(message);
});
it('allows setting/getting of meta', (): void => {
keyring.bob.setMeta({ foo: 'bar', something: 'else' });
expect(keyring.bob.meta).toMatchObject({ foo: 'bar', something: 'else' });
keyring.bob.setMeta({ something: 'thing' });
expect(keyring.bob.meta).toMatchObject({ foo: 'bar', something: 'thing' });
});
it('allows encoding of address with different prefixes', (): void => {
expect(keyring.alice.address).toEqual('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua');
setSS58Format(255);
expect(keyring.alice.address).toEqual('yGHU8YKprxHbHdEv7oUK4rzMZXtsdhcXVG2CAMyC9WhzhjH2k');
setSS58Format(42);
});
it('allows getting public key after decoding', (): void => {
const PASS = 'testing';
const encoded = keyring.alice.encodePkcs8(PASS);
const pair = createPair({ toSS58, type: 'sr25519' }, { publicKey: keyring.alice.publicKey });
pair.decodePkcs8(PASS, encoded);
expect(pair.isLocked).toEqual(false);
});
it('allows derivation on the pair', (): void => {
const alice = createPair({ toSS58, type: 'sr25519' }, { publicKey: PAIRSSR25519[0].publicKey, secretKey: PAIRSSR25519[0].secretKey }, {});
const stash = alice.derive('//stash');
const soft = alice.derive('//funding/0');
expect(stash.publicKey).toEqual(PAIRSSR25519[1].publicKey);
expect(soft.address).toEqual('5ECQNn7UueWHPFda5qUi4fTmTtyCnPvGnuoyVVSj5CboJh9J');
});
it('fails to sign when locked', (): void => {
const pair = createPair({ toSS58, type: 'sr25519' }, { publicKey: keyring.alice.publicKey });
expect(pair.isLocked).toEqual(true);
expect((): Uint8Array =>
pair.sign(new Uint8Array([0]))
).toThrow('Cannot sign with a locked key pair');
});
describe('ethereum', (): void => {
const PUBLICDERIVED = new Uint8Array([
3, 129, 53, 27, 27, 70, 210, 96,
43, 9, 146, 187, 93, 85, 49, 249,
193, 105, 107, 8, 18, 254, 178, 83,
75, 104, 132, 173, 196, 126, 46, 29,
139
]);
const SECRETDERIVED = new Uint8Array([
7, 13, 195, 17, 115, 0, 1, 25,
24, 226, 107, 2, 23, 105, 69, 204,
21, 195, 213, 72, 207, 73, 253, 132,
24, 217, 127, 147, 175, 105, 158, 70
]);
it('has a valid address from a known public', (): void => {
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: hexToU8a('0x03b9dc646dd71118e5f7fda681ad9eca36eb3ee96f344f582fbe7b5bcdebb13077') });
expect(pair.address).toEqual(TEST_ADDRESS);
expect(pair.addressRaw).toEqual(hexToU8a(TEST_ADDRESS));
});
it('has a valid address from a known ethereum address (20 length)', (): void => {
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: new Uint8Array([75, 32, 205, 127, 248, 119, 52, 31, 46, 171, 170, 23, 158, 23, 46, 108, 95, 180, 186, 168]), secretKey: new Uint8Array([]) });
expect(pair.address.toLowerCase()).toEqual('0x4b20cd7ff877341f2eabaa179e172e6c5fb4baa8');
expect(pair.addressRaw).toEqual(hexToU8a('0x4b20cd7ff877341f2eabaa179e172e6c5fb4baa8'));
});
it('converts to json', (): void => {
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: PUBLICDERIVED, secretKey: SECRETDERIVED });
const json = pair.toJson('password');
expect(json.encoding).toEqual({
content: ['pkcs8', 'ethereum'],
type: ['scrypt', 'xsalsa20-poly1305'],
version: '3'
});
expect(json.address).toEqual(u8aToHex(PUBLICDERIVED));
});
it('denies access to encryptMessage/decryptMessage API', (): void => {
const PASS = 'testing';
const encoded = keyring.alice.encodePkcs8(PASS);
const pair = createPair({ toSS58, type: 'ethereum' }, { publicKey: keyring.alice.publicKey });
pair.decodePkcs8(PASS, encoded);
expect(
() => pair.encryptMessage(
new Uint8Array(4), // null message
keyring.bob.publicKey,
new Uint8Array(24)
)
).toThrow('Secp256k1 not supported yet');
});
});
});
+93 -122
View File
@@ -1,17 +1,16 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { HexString } from '@polkadot/util/types';
import type { EncryptedJsonEncoding, Keypair, KeypairType } from '@polkadot/util-crypto/types';
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types';
import type { PairInfo } from './types';
import type { EncryptedJsonEncoding, KeypairType } from '@polkadot/util-crypto/types';
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta, SignOptions } from '../types.js';
import type { PairInfo } from './types.js';
import { assert, objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';
import { blake2AsU8a, convertPublicKeyToCurve25519, convertSecretKeyToCurve25519, ed25519PairFromSeed as ed25519FromSeed, ed25519Sign, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, naclOpen, naclSeal, secp256k1Compress, secp256k1Expand, secp256k1PairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify, sr25519PairFromSeed as sr25519FromSeed, sr25519Sign, sr25519VrfSign, sr25519VrfVerify } from '@polkadot/util-crypto';
import { objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToU8a } from '@polkadot/util';
import { dilithiumAccountFromPublic, dilithiumSign, dilithiumSizes, dilithiumVerify } from '@polkadot/util-crypto';
import { decodePair } from './decode';
import { encodePair } from './encode';
import { pairToJson } from './toJson';
import { decodePair } from './decode.js';
import { encodePair } from './encode.js';
import { pairToJson } from './toJson.js';
interface Setup {
toSS58: (publicKey: Uint8Array) => string;
@@ -20,42 +19,38 @@ interface Setup {
const SIG_TYPE_NONE = new Uint8Array();
const TYPE_FROM_SEED = {
ecdsa: secp256k1FromSeed,
ed25519: ed25519FromSeed,
ethereum: secp256k1FromSeed,
sr25519: sr25519FromSeed
// The Quantus runtime's `DilithiumSignatureScheme`: `Dilithium87` is variant 0
// and `Dilithium65` variant 1. Reached through the same `withType` mechanism
// upstream used for Substrate's `MultiSignature`, so nothing above this file
// needs to know which enum it is.
//
// There are no other arms. Upstream's ed25519, sr25519, ecdsa and ethereum were
// removed with their primitives: each falls to Shor's algorithm, and this keyring
// exists to hold keys that do not. quantus/common#6
const TYPE_PREFIX: Record<KeypairType, Uint8Array> = {
dilithium65: new Uint8Array([1]),
dilithium87: new Uint8Array([0])
};
const TYPE_PREFIX = {
ecdsa: new Uint8Array([2]),
ed25519: new Uint8Array([0]),
ethereum: new Uint8Array([2]),
sr25519: new Uint8Array([1])
};
/**
* A post-quantum pair will not sign without being told which context to use.
*
* See `SignOptions.context`. The alternative — defaulting to the extrinsic
* context — produces a valid signature that a spec-147 chain rejects, with
* nothing local able to explain why.
*/
function requireContext (context?: Uint8Array): Uint8Array {
if (!context) {
throw new Error('A signing context is required for post-quantum keypairs; pass options.context (see contextForSpec)');
}
const TYPE_SIGNATURE = {
ecdsa: (m: Uint8Array, p: Partial<Keypair>) => secp256k1Sign(m, p, 'blake2'),
ed25519: ed25519Sign,
ethereum: (m: Uint8Array, p: Partial<Keypair>) => secp256k1Sign(m, p, 'keccak'),
sr25519: sr25519Sign
};
const TYPE_ADDRESS = {
ecdsa: (p: Uint8Array) => p.length > 32 ? blake2AsU8a(p) : p,
ed25519: (p: Uint8Array) => p,
ethereum: (p: Uint8Array) => p.length === 20 ? p : keccakAsU8a(secp256k1Expand(p)),
sr25519: (p: Uint8Array) => p
};
return context;
}
function isLocked (secretKey?: Uint8Array): secretKey is undefined {
return !secretKey || u8aEmpty(secretKey);
}
function vrfHash (proof: Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array {
return blake2AsU8a(u8aConcat(context || '', extra || '', proof));
}
/**
* @name createPair
* @summary Creates a keyring pair object
@@ -87,18 +82,29 @@ function vrfHash (proof: Uint8Array, context?: string | Uint8Array, extra?: stri
* an `encoded` property that is assigned with the encoded public key in hex format, and an `encoding`
* property that indicates whether the public key value of the `encoded` property is encoded or not.
*/
export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: PairInfo, meta: KeyringPair$Meta = {}, encoded: Uint8Array | null = null, encTypes?: EncryptedJsonEncoding[]): KeyringPair {
export function createPair ({ toSS58, type }: Setup, { accountId, publicKey, secretKey }: PairInfo, meta: KeyringPair$Meta = {}, encoded: Uint8Array | null = null, encTypes?: EncryptedJsonEncoding[]): KeyringPair {
const decodePkcs8 = (passphrase?: string, userEncoded?: Uint8Array | null): void => {
const decoded = decodePair(passphrase, userEncoded || encoded, encTypes);
// ML-DSA secrets are 4032/4896 bytes, which is neither of the two lengths
// decodePair would otherwise try, so it has to be told.
const decoded = decodePair(passphrase, userEncoded || encoded, encTypes, dilithiumSizes(type).secretKey);
if (decoded.secretKey.length === 64) {
publicKey = decoded.publicKey;
secretKey = decoded.secretKey;
} else {
const pair = TYPE_FROM_SEED[type](decoded.secretKey);
publicKey = decoded.publicKey;
secretKey = decoded.secretKey;
publicKey = pair.publicKey;
secretKey = pair.secretKey;
// The public key has only now arrived. If the pair was constructed from JSON
// it has been reporting an address carried as data since then, so check the
// two agree.
//
// This is not a paranoid check. A JSON file whose `address` field has been
// edited decodes perfectly and would yield a pair reporting an address its
// key does not control: a user would see an attacker's address in their own
// wallet and believe they held it.
if (accountId) {
if (!u8aEq(dilithiumAccountFromPublic(publicKey), accountId)) {
throw new Error('Decoded public key does not match the address in the account JSON');
}
accountId = undefined;
}
};
@@ -111,24 +117,19 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
return encoded;
};
const encodeAddress = (): string => {
const raw = TYPE_ADDRESS[type](publicKey);
return type === 'ethereum'
? ethereumEncode(raw)
: toSS58(raw);
};
// While a pair restored from JSON, or added by address, has no public key,
// its account id cannot be computed (it is a one-way Poseidon2 hash of that
// key), so use the one carried alongside. `decodePkcs8` clears it once the
// real key arrives and has been checked against it.
const addressRawOf = (): Uint8Array =>
accountId ?? dilithiumAccountFromPublic(publicKey);
return {
get address (): string {
return encodeAddress();
return toSS58(addressRawOf());
},
get addressRaw (): Uint8Array {
const raw = TYPE_ADDRESS[type](publicKey);
return type === 'ethereum'
? raw.slice(-20)
: raw;
return addressRawOf();
},
get isLocked (): boolean {
return isLocked(secretKey);
@@ -144,92 +145,62 @@ export function createPair ({ toSS58, type }: Setup, { publicKey, secretKey }: P
},
// eslint-disable-next-line sort-keys
decodePkcs8,
decryptMessage: (encryptedMessageWithNonce: HexString | string | Uint8Array, senderPublicKey: HexString | string | Uint8Array): Uint8Array | null => {
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
const messageU8a = u8aToU8a(encryptedMessageWithNonce);
return naclOpen(
messageU8a.slice(24, messageU8a.length),
messageU8a.slice(0, 24),
convertPublicKeyToCurve25519(u8aToU8a(senderPublicKey)),
convertSecretKeyToCurve25519(secretKey)
);
},
derive: (suri: string, meta?: KeyringPair$Meta): KeyringPair => {
assert(type !== 'ethereum', 'Unable to derive on this keypair');
assert(!isLocked(secretKey), 'Cannot derive on a locked keypair');
const { path } = keyExtractPath(suri);
const derived = keyFromPath({ publicKey, secretKey }, path, type);
return createPair({ toSS58, type }, derived, meta, null);
derive: (_suri: string, _meta?: KeyringPair$Meta): KeyringPair => {
// Not "not implemented" — not possible. A child here would have to come
// from this pair's key material, and ML-DSA keys are not derivable from
// one another at all; the Quantus tree derives every account from the
// mnemonic independently. So the caller needs the mnemonic, not this pair.
throw new Error(`Unable to derive from an existing ${type} pair; derive from the mnemonic with createFromUri instead`);
},
encodePkcs8: (passphrase?: string): Uint8Array => {
return recode(passphrase);
},
encryptMessage: (message: HexString | string | Uint8Array, recipientPublicKey: HexString | string | Uint8Array, nonceIn?: Uint8Array): Uint8Array => {
assert(!isLocked(secretKey), 'Cannot encrypt with a locked key pair');
assert(!['ecdsa', 'ethereum'].includes(type), 'Secp256k1 not supported yet');
const { nonce, sealed } = naclSeal(u8aToU8a(message), convertSecretKeyToCurve25519(secretKey), convertPublicKeyToCurve25519(u8aToU8a(recipientPublicKey)), nonceIn);
return u8aConcat(nonce, sealed);
},
lock: (): void => {
secretKey = new Uint8Array();
},
setMeta: (additional: KeyringPair$Meta): void => {
meta = objectSpread({}, meta, additional);
},
sign: (message: HexString | string | Uint8Array, options: SignOptions = {}): Uint8Array => {
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
sign: (message: string | Uint8Array, options: SignOptions = {}): Uint8Array => {
if (isLocked(secretKey)) {
throw new Error('Cannot sign with a locked key pair');
}
return u8aConcat(
options.withType
? TYPE_PREFIX[type]
: SIG_TYPE_NONE,
TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey })
dilithiumSign(u8aToU8a(message), { publicKey, secretKey }, type, requireContext(options.context))
);
},
toJson: (passphrase?: string): KeyringPair$Json => {
// NOTE: For ecdsa and ethereum, the publicKey cannot be extracted from the address. For these
// pass the hex-encoded publicKey through to the address portion of the JSON (before decoding)
// unless the publicKey is already an address
const address = ['ecdsa', 'ethereum'].includes(type)
? publicKey.length === 20
? u8aToHex(publicKey)
: u8aToHex(secp256k1Compress(publicKey))
: encodeAddress();
return pairToJson(type, { address, meta }, recode(passphrase), !!passphrase);
return pairToJson(type, { address: toSS58(addressRawOf()), meta }, recode(passphrase), !!passphrase);
},
unlock: (passphrase?: string): void => {
return decodePkcs8(passphrase);
},
verify: (message: HexString | string | Uint8Array, signature: HexString | string | Uint8Array, signerPublic: HexString | string | Uint8Array): boolean => {
return signatureVerify(message, signature, TYPE_ADDRESS[type](u8aToU8a(signerPublic))).isValid;
verify: (message: string | Uint8Array, signature: string | Uint8Array, signerPublic: string | Uint8Array, context: Uint8Array = new Uint8Array()): boolean => {
const pk = u8aToU8a(signerPublic);
const sig = u8aToU8a(signature);
const { signature: sigLength } = dilithiumSizes(type);
// Accept a bare signature or the chain's `signature ‖ publicKey` form; the
// verifier needs the latter, and the public key is at hand either way.
const sigWithPublic = sig.length === sigLength
? u8aConcat(sig, pk)
: sig;
// Unlike signing, a wrong context here cannot produce anything harmful —
// only `false` — so the empty context used for raw bytes is the default.
return dilithiumVerify(u8aToU8a(message), sigWithPublic, dilithiumAccountFromPublic(pk), type, context);
},
vrfSign: (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: string | Uint8Array): Uint8Array => {
assert(!isLocked(secretKey), 'Cannot sign with a locked key pair');
if (type === 'sr25519') {
return sr25519VrfSign(message, { secretKey }, context, extra);
}
const proof = TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey });
return u8aConcat(vrfHash(proof, context, extra), proof);
vrfSign: (): Uint8Array => {
// There is no ML-DSA VRF, and faking one out of an ordinary signature needs
// uniqueness ML-DSA does not have in the form required.
throw new Error(`VRF signing is not available for ${type}`);
},
vrfVerify: (message: HexString | string | Uint8Array, vrfResult: Uint8Array, signerPublic: HexString | Uint8Array | string, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): boolean => {
if (type === 'sr25519') {
return sr25519VrfVerify(message, vrfResult, publicKey, context, extra);
}
const result = signatureVerify(message, u8aConcat(TYPE_PREFIX[type], vrfResult.subarray(32)), TYPE_ADDRESS[type](u8aToU8a(signerPublic)));
return result.isValid && u8aEq(vrfResult.subarray(0, 32), vrfHash(vrfResult.subarray(32), context, extra));
vrfVerify: (): boolean => {
throw new Error(`VRF verification is not available for ${type}`);
}
};
}
+18 -33
View File
@@ -1,12 +1,13 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types';
import { encodeAddress } from '@polkadot/util-crypto';
import type { KeyringPair, KeyringPair$Json, KeyringPair$Meta } from '../types.js';
// empty publicKey
const publicKey = new Uint8Array(32);
const address = encodeAddress(publicKey);
// pre-computed via encodeAddress(publicKey)
const address = '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM';
const meta = {
isTesting: true,
@@ -17,7 +18,7 @@ const json: KeyringPair$Json = {
address,
encoded: '',
encoding: {
content: ['pkcs8', 'ed25519'],
content: ['pkcs8', 'dilithium65'],
type: 'none',
version: '0'
},
@@ -27,48 +28,32 @@ const json: KeyringPair$Json = {
const pair: KeyringPair = {
address,
addressRaw: publicKey,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
decodePkcs8: (passphrase?: string, encoded?: Uint8Array): void =>
decodePkcs8: (_passphrase?: string, _encoded?: Uint8Array): void =>
undefined,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
decryptMessage: (encryptedMessageWithNonce: string | Uint8Array, senderPublicKey: string | Uint8Array): Uint8Array | null =>
null,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
derive: (suri: string, meta?: KeyringPair$Meta): KeyringPair =>
derive: (_suri: string, _meta?: KeyringPair$Meta): KeyringPair =>
pair,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
encodePkcs8: (passphrase?: string): Uint8Array =>
encodePkcs8: (_passphrase?: string): Uint8Array =>
new Uint8Array(0),
// eslint-disable-next-line @typescript-eslint/no-unused-vars
encryptMessage: (message: string | Uint8Array, recipientPublicKey: string | Uint8Array, _nonce?: Uint8Array): Uint8Array =>
new Uint8Array(),
isLocked: true,
lock: (): void => {
// no locking, it is always locked
},
meta,
publicKey,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
setMeta: (meta: KeyringPair$Meta): void =>
setMeta: (_meta: KeyringPair$Meta): void =>
undefined,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
sign: (message: Uint8Array): Uint8Array =>
sign: (_message: Uint8Array): Uint8Array =>
new Uint8Array(64),
// eslint-disable-next-line @typescript-eslint/no-unused-vars
toJson: (passphrase?: string): KeyringPair$Json =>
toJson: (_passphrase?: string): KeyringPair$Json =>
json,
type: 'ed25519',
// eslint-disable-next-line @typescript-eslint/no-unused-vars
unlock: (passphrase?: string): void =>
type: 'dilithium65',
unlock: (_passphrase?: string): void =>
undefined,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
verify: (message: Uint8Array, signature: Uint8Array): boolean =>
verify: (_message: Uint8Array, _signature: Uint8Array): boolean =>
false,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
vrfSign: (message: Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array =>
vrfSign: (_message: Uint8Array, _context?: string | Uint8Array, _extra?: string | Uint8Array): Uint8Array =>
new Uint8Array(96),
// eslint-disable-next-line @typescript-eslint/no-unused-vars
vrfVerify: (message: Uint8Array, vrfResult: Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): boolean =>
vrfVerify: (_message: Uint8Array, _vrfResult: Uint8Array, _context?: string | Uint8Array, _extra?: string | Uint8Array): boolean =>
false
};
-40
View File
@@ -1,40 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { createTestPairs } from '../testingPairs';
const keyring = createTestPairs({ type: 'ed25519' }, false);
describe('toJson', (): void => {
it('creates an unencoded output with no passphrase', (): void => {
expect(
keyring.alice.toJson()
).toMatchObject({
address: '5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua',
encoded: 'MFMCAQEwBQYDK2VwBCIEIEFsaWNlICAgICAgICAgICAgICAgICAgICAgICAgICAg0XKnTNpMhlkSwyugqApXrmmrrkEOXMtZ3uhOL0Qy20+hIwMhANFyp0zaTIZZEsMroKgKV65pq65BDlzLWd7oTi9EMttP',
encoding: {
content: ['pkcs8', 'ed25519'],
type: ['none'],
version: '3'
},
meta: {
isTesting: true,
name: 'alice'
}
});
});
it('creates an encoded output with passphrase', (): void => {
const json = keyring.alice.toJson('testing');
expect(json.encoded).toHaveLength(268);
expect(json).toMatchObject({
address: '5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua',
encoding: {
content: ['pkcs8', 'ed25519'],
type: ['scrypt', 'xsalsa20-poly1305'],
version: '3'
}
});
});
});
+2 -2
View File
@@ -1,8 +1,8 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KeypairType } from '@polkadot/util-crypto/types';
import type { KeyringPair$Json, KeyringPair$Meta } from '../types';
import type { KeyringPair$Json, KeyringPair$Meta } from '../types.js';
import { objectSpread } from '@polkadot/util';
import { jsonEncryptFormat } from '@polkadot/util-crypto';
+17 -2
View File
@@ -1,8 +1,23 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
export interface PairInfo {
/**
* The 32-byte account id, when it cannot be derived from `publicKey`.
*
* Only ML-DSA pairs need this, and only while locked. Everywhere else the
* address is a cheap function of the public key, so a pair restored from JSON
* can report its address before anyone supplies a password. A Quantus account
* id is a one-way Poseidon2 hash, and the public key lives inside the
* encrypted blob — so between `createFromJson` and `decodePkcs8` there is
* nothing to compute it from, and callers read `pair.address` in exactly that
* window.
*
* Carried as data rather than derived, and checked against the real public key
* once that arrives.
*/
accountId?: Uint8Array | undefined;
publicKey: Uint8Array;
secretKey?: Uint8Array;
secretKey?: Uint8Array | undefined;
seed?: Uint8Array | null;
}
-53
View File
@@ -1,53 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KeyringPair } from '../types';
import { u8aToHex } from '@polkadot/util';
import { cryptoWaitReady, ed25519PairFromSeed, encodeAddress as toSS58, randomAsU8a, secp256k1PairFromSeed, sr25519PairFromSeed } from '@polkadot/util-crypto';
import { createPair } from '.';
const MESSAGE = 'this is a test message';
const CONTEXT = 'some context';
describe('vrf', (): void => {
let ecdsa: KeyringPair;
let ed25519: KeyringPair;
let sr25519: KeyringPair;
beforeAll(async (): Promise<void> => {
await cryptoWaitReady();
ecdsa = createPair({ toSS58, type: 'ecdsa' }, secp256k1PairFromSeed(randomAsU8a()));
ed25519 = createPair({ toSS58, type: 'ed25519' }, ed25519PairFromSeed(randomAsU8a()));
sr25519 = createPair({ toSS58, type: 'sr25519' }, sr25519PairFromSeed(randomAsU8a()));
});
it('has deterministic signature values for ecdsa', (): void => {
const sig1 = ecdsa.vrfSign(MESSAGE, CONTEXT);
const sig2 = ecdsa.vrfSign(MESSAGE, CONTEXT);
expect(u8aToHex(sig1)).toEqual(u8aToHex(sig2));
expect(ecdsa.vrfVerify(MESSAGE, sig1, ecdsa.publicKey, CONTEXT)).toEqual(true);
expect(ecdsa.vrfVerify(MESSAGE, sig2, ecdsa.publicKey, CONTEXT)).toEqual(true);
});
it('has deterministic signature values for ed25519', (): void => {
const sig1 = ed25519.vrfSign(MESSAGE, CONTEXT);
const sig2 = ed25519.vrfSign(MESSAGE, CONTEXT);
expect(u8aToHex(sig1)).toEqual(u8aToHex(sig2));
expect(ed25519.vrfVerify(MESSAGE, sig1, ed25519.publicKey, CONTEXT)).toEqual(true);
expect(ed25519.vrfVerify(MESSAGE, sig2, ed25519.publicKey, CONTEXT)).toEqual(true);
});
it('has deterministic signature values for sr25519', (): void => {
const sig1 = sr25519.vrfSign(MESSAGE, CONTEXT);
const sig2 = sr25519.vrfSign(MESSAGE, CONTEXT);
expect(u8aToHex(sig1.slice(0, 32))).toEqual(u8aToHex(sig2.slice(0, 32)));
expect(sr25519.vrfVerify(MESSAGE, sig1, sr25519.publicKey, CONTEXT)).toEqual(true);
expect(sr25519.vrfVerify(MESSAGE, sig2, sr25519.publicKey, CONTEXT)).toEqual(true);
});
});
+12 -11
View File
@@ -1,10 +1,9 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { HexString } from '@polkadot/util/types';
import type { KeyringPair, KeyringPairs } from './types';
import type { KeyringPair, KeyringPairs } from './types.js';
import { assert, isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util';
import { isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util';
import { decodeAddress } from '@polkadot/util-crypto';
type KeyringPairMap = Record<string, KeyringPair>;
@@ -22,19 +21,21 @@ export class Pairs implements KeyringPairs {
return Object.values(this.#map);
}
public get (address: HexString | string | Uint8Array): KeyringPair {
public get (address: string | Uint8Array): KeyringPair {
const pair = this.#map[decodeAddress(address).toString()];
assert(pair, () => `Unable to retrieve keypair '${
isU8a(address) || isHex(address)
? u8aToHex(u8aToU8a(address))
: address
}'`);
if (!pair) {
throw new Error(`Unable to retrieve keypair '${
isU8a(address) || isHex(address)
? u8aToHex(u8aToU8a(address))
: address
}'`);
}
return pair;
}
public remove (address: HexString | string | Uint8Array): void {
public remove (address: string | Uint8Array): void {
delete this.#map[decodeAddress(address).toString()];
}
}
-109
View File
@@ -1,109 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
// From https://github.com/paritytech/substrate/wiki/Secret-URI-Test-Vectors
import type { KeypairType } from '@polkadot/util-crypto/types';
import { u8aToHex } from '@polkadot/util';
import { cryptoWaitReady } from '@polkadot/util-crypto';
import Keyring from '.';
const PHRASE = 'bottom drive obey lake curtain smoke basket hold race lonely fit walk';
const ETHEREUM_PHRASE = 'seed sock milk update focus rotate barely fade car face mechanic mercy';
const TESTS = {
ecdsa: [
{
pk: '0x020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1',
ss: '5C7C2Z5sWbytvHpuLTvzKunnnRwQxft1jiqrLD5rhucQ5S9X',
uri: `${PHRASE}//Alice`
}
],
ethereum: [
{
pk: '0x0381351b1b46d2602b0992bb5d5531f9c1696b0812feb2534b6884adc47e2e1d8b',
ss: '0x31ea8795EE32D782C8ff41a5C68Dcbf0F5B27f6d',
uri: `${ETHEREUM_PHRASE}/m/44'/60'/0'/0/0`
},
{
pk: '0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f',
ss: '0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac',
uri: `${PHRASE}/m/44'/60'/0'/0/0`
},
{
pk: '0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518',
ss: '0x3Cd0A705a2DC65e5b1E1205896BaA2be8A07c6e0',
uri: `${PHRASE}/m/44'/60'/0'/0/1`
}
],
sr25519: [
{
pk: '0x46ebddef8cd9bb167dc30878d7113b7e168e6f0646beffd77d69d39bad76b47a',
ss: '5DfhGyQdFobKM8NsWvEeAKk5EQQgYe9AydgJ7rMB6E1EqRzV',
uri: PHRASE
},
{
pk: '0xb69355deefa7a8f33e9297f5af22e680f03597a99d4f4b1c44be47e7a2275802',
ss: '5GC6LfpV352HtJPySfAecb5JdePtf4R9Vq49NUU8RhzgBqgq',
uri: `${PHRASE}///password`
},
{
pk: '0x40b9675df90efa6069ff623b0fdfcf706cd47ca7452a5056c7ad58194d23440a',
ss: '5DXZzrDxHbkQov4QBAY4TjpwnHCMrKXkomTnKSw8UArBEY5v',
uri: `${PHRASE}/foo`
},
{
pk: '0x547d4a55642ec7ebadc0bd29b6e570b8c926059b3c0655d4948075e9a7e6f31e',
ss: '5DyV6fZuvPemWrUqBgWwTSgoV86w6xms3KhkFU6cQcWxU8eP',
uri: `${PHRASE}//foo`
},
{
pk: '0x3841947ffcde6f5fef26fb68b59bb8665637e30e32ec2051f99cf6b9c674fe09',
ss: '5DLU27is5iViNopQb2KxsTyPx6j4vCu8X3sk3j3NNLkPCqKM',
uri: `${PHRASE}//foo/bar`
},
{
pk: '0xdc142f7476a7b0aa262aeccf207f1d18daa90762db393006741e8a31f39dbc53',
ss: '5H3GPTqDSpjkfDwbHy12PD6BWm8jvGSX4xYC8UMprHpTPcRg',
uri: `${PHRASE}/foo//bar`
},
{
pk: '0xa2e56b06407a6d1e819d2fc33fa0ec604b29c2e868b70b3696bb049b8725934b',
ss: '5FkHmNgbg64MwStgCyDi2Uw3ufFu11mqQgmWT9uwK4Lghvpv',
uri: `${PHRASE}//foo/bar//42/69`
},
{
pk: '0x0e0d24e3e1ff2c07f269c99e2e0df8681fda1851ac42fc846ca2daaa90cd8f14',
ss: '5CP8S23JBNXYNpJsL7ESPJBNnUZE6itcfM4EnDxEhaVEU6dT',
uri: `${PHRASE}//foo/bar//42/69///password`
},
{
pk: '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d',
ss: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
uri: `${PHRASE}//Alice`
}
]
};
describe('keyring.addFromUri', (): void => {
Object.entries(TESTS).forEach(([type, tests]): void => {
const keyring = new Keyring({ type: type as KeypairType });
beforeEach(async (): Promise<void> => {
await cryptoWaitReady();
});
describe(type, (): void => {
tests.forEach(({ pk, ss, uri }): void => {
it(`creates ${uri}`, (): void => {
const pair = keyring.addFromUri(uri, {}, type as KeypairType);
expect(u8aToHex(pair.publicKey)).toEqual(pk);
expect(pair.address).toEqual(ss);
});
});
});
});
});
+36 -132
View File
@@ -1,144 +1,48 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KeyringInstance, KeyringOptions } from './types';
import type { KeyringInstance, KeyringOptions } from './types.js';
import { assert, hexToU8a } from '@polkadot/util';
import { KeypairType } from '@polkadot/util-crypto/types';
import { Keyring } from './keyring.js';
import { Keyring } from './keyring';
import { createPair } from './pair';
interface PairDef {
name?: string;
publicKey: Uint8Array;
seed?: string;
secretKey?: Uint8Array;
type: KeypairType
}
// NOTE This is not great since we have the secretKey here explicitly, but a testing
// keyring is for testing - what happens is that in most cases the keyring is initialises
// before anything else. Since the sr25519 crypto is async, this creates problems with
// adding the keys when only the keyring is used.
export const PAIRSSR25519: PairDef[] = [
{
publicKey: hexToU8a('0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'),
secretKey: hexToU8a('0x98319d4ff8a9508c4bb0cf0b5a78d760a0b2082c02775e6e82370816fedfff48925a225d97aa00682d6a59b95b18780c10d7032336e88f3442b42361f4a66011'), // nosemgrep
seed: 'Alice',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f'),
secretKey: hexToU8a('0xe8da6c9d810e020f5e3c7f5af2dea314cbeaa0d72bc6421e92c0808a0c584a6046ab28e97c3ffc77fe12b5a4d37e8cd4afbfebbf2391ffc7cb07c0f38c023efd'), // nosemgrep
seed: 'Alice//stash',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48'),
secretKey: hexToU8a('0x081ff694633e255136bdb456c20a5fc8fed21f8b964c11bb17ff534ce80ebd5941ae88f85d0c1bfc37be41c904e1dfc01de8c8067b0d6d5df25dd1ac0894a325'), // nosemgrep
seed: 'Bob',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e'),
secretKey: hexToU8a('0xc006507cdfc267a21532394c49ca9b754ca71de21e15a1cdf807c7ceab6d0b6c3ed408d9d35311540dcd54931933e67cf1ea10d46f75408f82b789d9bd212fde'), // nosemgrep
seed: 'Bob//stash',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22'),
secretKey: hexToU8a('0xa8f2d83016052e5d6d77b2f6fd5d59418922a09024cda701b3c34369ec43a7668faf12ff39cd4e5d92bb773972f41a7a5279ebc2ed92264bed8f47d344f8f18c'), // nosemgrep
seed: 'Charlie',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20'),
secretKey: hexToU8a('0x20e05482ca4677e0edbc58ae9a3a59f6ed3b1a9484ba17e64d6fe8688b2b7b5d108c4487b9323b98b11fe36cb301b084e920f7b7895536809a6d62a451b25568'), // nosemgrep
seed: 'Dave',
type: 'sr25519'
},
{
publicKey: hexToU8a('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e'),
secretKey: hexToU8a('0x683576abfd5dc35273e4264c23095a1bf21c14517bece57c7f0cc5c0ed4ce06a3dbf386b7828f348abe15d76973a72009e6ef86a5c91db2990cb36bb657c6587'), // nosemgrep
seed: 'Eve',
type: 'sr25519'
},
{
publicKey: hexToU8a('0x1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c'),
secretKey: hexToU8a('0xb835c20f450079cf4f513900ae9faf8df06ad86c681884122c752a4b2bf74d4303e4f21bc6cc62bb4eeed5a9cce642c25e2d2ac1464093b50f6196d78e3a7426'), // nosemgrep
seed: 'Ferdie',
type: 'sr25519'
}
];
export const PAIRSETHEREUM: PairDef[] = [
{
name: 'Alith',
publicKey: hexToU8a('0x02509540919faacf9ab52146c9aa40db68172d83777250b28e4679176e49ccdd9f'),
secretKey: hexToU8a('0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133'), // nosemgrep
type: 'ethereum'
},
{
name: 'Baltathar',
publicKey: hexToU8a('0x033bc19e36ff1673910575b6727a974a9abd80c9a875d41ab3e2648dbfb9e4b518'),
secretKey: hexToU8a('0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b'), // nosemgrep
type: 'ethereum'
},
{
name: 'Charleth',
publicKey: hexToU8a('0x0234637bdc0e89b5d46543bcbf8edff329d2702bc995e27e9af4b1ba009a3c2a5e'),
secretKey: hexToU8a('0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b'), // nosemgrep
type: 'ethereum'
},
{
name: 'Dorothy',
publicKey: hexToU8a('0x02a00d60b2b408c2a14c5d70cdd2c205db8985ef737a7e55ad20ea32cc9e7c417c'),
secretKey: hexToU8a('0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68'), // nosemgrep
type: 'ethereum'
},
{
name: 'Ethan',
publicKey: hexToU8a('0x025cdc005b752651cd3f728fb9192182acb3a9c89e19072cbd5b03f3ee1f1b3ffa'),
secretKey: hexToU8a('0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4'), // nosemgrep
type: 'ethereum'
},
{
name: 'Faith',
publicKey: hexToU8a('0x037964b6c9d546da4646ada28a99e34acaa1d14e7aba861a9055f9bd200c8abf74'),
secretKey: hexToU8a('0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df'), // nosemgrep
type: 'ethereum'
}
];
function createMeta (name?: string, seed?: string) {
assert(name || seed, 'Testing pair should have either a name or a seed');
return {
isTesting: true,
name: name || (seed && seed.replace('//', '_').toLowerCase())
};
interface DevAccount {
name: string;
/** The byte the 32-byte seed is filled with. */
seed: number;
}
/**
* @name testKeyring
* @summary Create an instance of Keyring pre-populated with locked test accounts
* @description The test accounts (i.e. alice, bob, dave, eve, ferdie)
* are available on the dev chain and each test account is initialized with DOT funds.
* The accounts a Quantus dev chain endows at genesis.
*
* From `chain:primitives/dilithium-crypto/src/pair.rs`: ML-DSA-87 keys generated
* directly from a 32-byte seed filled with one byte, with no HD derivation. Their
* account ids are pinned against `quantus-cli` in `@quantus/crypto`'s tests
* (`dev_account_ids_match_the_cli`), e.g. crystal_alice is
* `qzk1Nxai3dZD9Cn5kwGcgL6mKxsfxwqdis7kDQJ52aJS2vSn7`.
*
* They replace upstream's sr25519 Alice…Ferdie and Ethereum Alith…Faith, which
* this keyring can no longer hold. quantus/common#6
*/
export function createTestKeyring (options: KeyringOptions = {}, isDerived = true): KeyringInstance {
const keyring = new Keyring(options);
const pairs = (options.type && options.type === 'ethereum')
? PAIRSETHEREUM
: PAIRSSR25519;
export const DEV_ACCOUNTS: DevAccount[] = [
{ name: 'crystal_alice', seed: 0 },
{ name: 'dilithium_bob', seed: 1 },
{ name: 'crystal_charlie', seed: 2 }
];
for (const { name, publicKey, secretKey, seed, type } of pairs) {
const meta = createMeta(name, seed);
const pair = !isDerived && !name && seed
? keyring.addFromUri(seed, meta, options.type)
: keyring.addPair(
createPair({ toSS58: keyring.encodeAddress, type }, { publicKey, secretKey }, meta)
);
/**
* @name testKeyring
* @summary Create an instance of Keyring pre-populated with the dev accounts
* @description crystal_alice, dilithium_bob and crystal_charlie, as a Quantus
* dev chain endows them. They are always ML-DSA-87, whatever `options.type` says,
* because that is what the chain made them; `options` sets the keyring's default
* type and SS58 format for anything added afterwards. `_isDerived` is accepted for
* upstream's signature and ignored: these accounts have no derivation.
*/
export function createTestKeyring (options: KeyringOptions = {}, _isDerived = true): KeyringInstance {
const keyring = new Keyring(options);
for (const { name, seed } of DEV_ACCOUNTS) {
const pair = keyring.addFromSeed(new Uint8Array(32).fill(seed), { isTesting: true, name }, 'dilithium87');
pair.lock = (): void => {
// we don't have lock/unlock functionality here
-73
View File
@@ -1,73 +0,0 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { u8aToHex } from '@polkadot/util';
import { cryptoWaitReady } from '@polkadot/util-crypto';
import { createTestPairs } from './testingPairs';
import Keyring from '.';
const TEST_ADD = '0xf24FF3a9CF04c71Dbc94D0b566f7A27B94566cac';
describe('testingPairs', (): void => {
beforeEach(async (): Promise<void> => {
await cryptoWaitReady();
});
it('creates without failing', (): void => {
expect(
Object.keys(createTestPairs())
).toHaveLength(2 + 0 + 7); // stash, session, pairs
});
it('has the correct address for Alice (non-HDKD)', (): void => {
expect(
createTestPairs({ type: 'ed25519' }, false).alice.address
).toEqual('5GoKvZWG5ZPYL1WUovuHW3zJBWBP5eT8CbqjdRY4Q6iMaQua');
});
it('has the correct address for Alice (HDKD)', (): void => {
expect(
createTestPairs({ type: 'ed25519' }).alice.address
).toEqual('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY');
});
it('has the correct address for Alith (Eth)', (): void => {
expect(
createTestPairs({ type: 'ethereum' }).Alith.address
).toEqual(TEST_ADD);
});
it('has the correct address for Alith (Eth), same as obtained by createFromUri', (): void => {
const keyring = new Keyring({ type: 'ethereum' });
const pair = keyring.createFromUri('0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133');
expect(
pair && pair.address
).toEqual(TEST_ADD);
});
it('checks eth test addresses', (): void => {
const ring = createTestPairs({ type: 'ethereum' });
const keyring = new Keyring({ type: 'ethereum' });
// priv keys generated by ganache-cli --mnemonic "bottom drive obey lake curtain smoke basket hold race lonely fit walk"
const privKeys: string[] = ['0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133',
'0x8075991ce870b93a8870eca0c0f91913d12f47948ca0fd25b49c6fa7cdbeee8b',
'0x0b6e18cafb6ed99687ec547bd28139cafdd2bffe70e6b688025de6b445aa5c5b',
'0x39539ab1876910bbf3a223d84a29e28f1cb4e2e456503e7e91ed39b2e7223d68',
'0x7dce9bc8babb68fec1409be38c8e1a52650206a7ed90ff956ae8a6d15eeaaef4',
'0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df',
'0x96b8a38e12e1a31dee1eab2fffdf9d9990045f5b37e44d8cc27766ef294acf18',
'0x0d6dcaaef49272a5411896be8ad16c01c35d6f8c18873387b71fbc734759b0ab',
'0x4c42532034540267bf568198ccec4cb822a025da542861fcb146a5fab6433ff8',
'0x94c49300a58d576011096bcb006aa06f5a91b34b4383891e8029c21dc39fbb8b'];
delete ring.nobody;
Object.keys(ring).forEach((testKeyring, i) => {
if (i < 6) {
expect(u8aToHex(ring[testKeyring].publicKey)).toEqual(u8aToHex(keyring.createFromUri(privKeys[i]).publicKey));
}
});
});
});
+17 -7
View File
@@ -1,23 +1,33 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KeyringOptions, KeyringPair } from './types';
import type { KeyringOptions, KeyringPair } from './types.js';
import { nobody } from './pair/nobody';
import { createTestKeyring } from './testing';
import { nobody } from './pair/nobody.js';
import { createTestKeyring } from './testing.js';
export interface TestKeyringMap {
nobody: KeyringPair;
[index: string]: KeyringPair;
}
export function createTestPairs (options?: KeyringOptions, isDerived = true): TestKeyringMap {
/** The Quantus dev accounts, by name. See `DEV_ACCOUNTS`. */
export interface TestKeyringMapQuantus extends TestKeyringMap {
crystal_alice: KeyringPair;
crystal_charlie: KeyringPair;
dilithium_bob: KeyringPair;
}
export function createTestPairs <O extends KeyringOptions, M = TestKeyringMapQuantus> (options?: O, isDerived = true): M {
const keyring = createTestKeyring(options, isDerived);
const pairs = keyring.getPairs();
const map: TestKeyringMap = { nobody: nobody() };
for (const p of pairs) {
map[p.meta.name as string] = p;
if (p.meta.name) {
map[p.meta.name] = p;
}
}
return map;
return map as M;
}
+81 -12
View File
@@ -1,22 +1,89 @@
// Copyright 2017-2022 @polkadot/keyring authors & contributors
// Copyright 2017-2026 @polkadot/keyring authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { HexString } from '@polkadot/util/types';
import type { EncryptedJson, Keypair, KeypairType, Prefix } from '@polkadot/util-crypto/types';
export interface KeyringOptions {
/** The ss58Format to use for address encoding (defaults to 42) */
ss58Format?: Prefix;
/** The type of keyring to create (defaults to dilithium65, ML-DSA-65) */
type?: KeypairType;
}
export type KeyringPair$Meta = Record<string, unknown>;
export interface KeyringPair$MetaHardware {
accountIndex?: number;
accountOffset?: number;
addressOffset?: number;
hardwareType?: 'ledger';
}
export interface KeyringPair$MetaFlags {
isDefaultAuthSelected?: boolean;
isExternal?: boolean;
isHardware?: boolean;
isHidden?: boolean;
isInjected?: boolean;
isMultisig?: boolean;
isProxied?: boolean;
isRecent?: boolean;
isTesting?: boolean;
}
export interface KeyringPair$MetaContract {
abi: string;
genesisHash?: HexString | null;
}
export interface KeyringPair$MetaExtension {
source?: string;
}
export interface KeyringPair$MetaMultisig {
threshold?: number;
who?: string[];
}
export interface KeyringPair$MetaParent {
parentAddress?: string;
parentName?: string;
}
export interface KeyringPair$Meta extends KeyringPair$MetaExtension, KeyringPair$MetaFlags, KeyringPair$MetaHardware, KeyringPair$MetaMultisig, KeyringPair$MetaParent {
address?: string;
contract?: KeyringPair$MetaContract;
genesisHash?: HexString | null;
name?: string;
suri?: string;
tags?: string[];
type?: KeypairType;
whenCreated?: number;
whenEdited?: number;
whenUsed?: number;
[key: string]: unknown;
}
export interface KeyringPair$Json extends EncryptedJson {
address: string | HexString;
/** The ss58 encoded address or the hex-encoded version (the latter is for ETH-compat chains) */
address: string;
/** The underlying metadata associated with the keypair */
meta: KeyringPair$Meta;
}
export interface SignOptions {
/**
* The FIPS 204 domain-separation context, for post-quantum pairs.
*
* Mandatory for `dilithium65`/`dilithium87` and ignored by every other type.
* There is deliberately no default: Quantus extrinsics on spec >= 148 are
* verified under `QUANTUS_EXTRINSIC` and earlier ones under the empty context,
* and a signature made under the wrong one is cryptographically valid, rejected
* by the chain, and locally indistinguishable from a correct one. Only the
* caller knows the spec version, so only the caller can answer.
*/
context?: Uint8Array;
/** Create a MultiSignature-compatible output with an indicator type */
withType?: boolean;
}
@@ -33,14 +100,16 @@ export interface KeyringPair {
encodePkcs8 (passphrase?: string): Uint8Array;
lock (): void;
setMeta (meta: KeyringPair$Meta): void;
sign (message: HexString | string | Uint8Array, options?: SignOptions): Uint8Array;
sign (message: string | Uint8Array, options?: SignOptions): Uint8Array;
toJson (passphrase?: string): KeyringPair$Json;
unlock (passphrase?: string): void;
encryptMessage (message: HexString | string | Uint8Array, recipientPublicKey: HexString | string | Uint8Array, nonce?: Uint8Array): Uint8Array;
decryptMessage (encryptedMessageWithNonce: HexString | string | Uint8Array, senderPublicKey: HexString | string | Uint8Array): Uint8Array | null;
verify (message: HexString | string | Uint8Array, signature: Uint8Array, signerPublic: HexString | string | Uint8Array): boolean;
vrfSign (message: HexString | string | Uint8Array, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): Uint8Array;
vrfVerify (message: HexString | string | Uint8Array, vrfResult: Uint8Array, signerPublic: HexString | Uint8Array | string, context?: HexString | string | Uint8Array, extra?: HexString | string | Uint8Array): boolean;
/**
* Verify an ML-DSA signature, bare or as the chain's `signature ‖ publicKey`,
* under `context` (default: the empty context used for raw bytes).
*/
verify (message: string | Uint8Array, signature: Uint8Array, signerPublic: string | Uint8Array, context?: Uint8Array): boolean;
vrfSign (message: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): Uint8Array;
vrfVerify (message: string | Uint8Array, vrfResult: Uint8Array, signerPublic: string | Uint8Array, context?: string | Uint8Array, extra?: string | Uint8Array): boolean;
}
export interface KeyringPairs {
@@ -62,13 +131,13 @@ export interface KeyringInstance {
addPair (pair: KeyringPair): KeyringPair;
addFromAddress (address: string | Uint8Array, meta?: KeyringPair$Meta, encoded?: Uint8Array | null, type?: KeypairType, ignoreChecksum?: boolean): KeyringPair;
addFromJson (pair: KeyringPair$Json, ignoreChecksum?: boolean): KeyringPair;
addFromMnemonic (mnemonic: string, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair;
addFromMnemonic (mnemonic: string, meta?: KeyringPair$Meta, type?: KeypairType, wordlist?: string[]): KeyringPair;
addFromPair (pair: Keypair, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair
addFromSeed (seed: Uint8Array, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair;
addFromUri (suri: string, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair;
addFromUri (suri: string, meta?: KeyringPair$Meta, type?: KeypairType, wordlist?: string[]): KeyringPair;
createFromJson (json: KeyringPair$Json, ignoreChecksum?: boolean): KeyringPair;
createFromPair (pair: Keypair, meta: KeyringPair$Meta, type: KeypairType): KeyringPair
createFromUri (suri: string, meta?: KeyringPair$Meta, type?: KeypairType): KeyringPair;
createFromUri (suri: string, meta?: KeyringPair$Meta, type?: KeypairType, wordlist?: string[]): KeyringPair;
getPair (address: string | Uint8Array): KeyringPair;
getPairs (): KeyringPair[];
getPublicKeys (): Uint8Array[];
+4
View File
@@ -5,6 +5,10 @@
"outDir": "./build",
"rootDir": "./src"
},
"exclude": [
"**/*.spec.ts",
"**/mod.ts"
],
"references": [
{ "path": "../util/tsconfig.build.json" },
{ "path": "../util-crypto/tsconfig.build.json" }
+18
View File
@@ -0,0 +1,18 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "..",
"outDir": "./build",
"rootDir": "./src",
"emitDeclarationOnly": false,
"noEmit": true
},
"include": [
"**/*.spec.ts"
],
"references": [
{ "path": "../keyring/tsconfig.build.json" },
{ "path": "../util/tsconfig.build.json" },
{ "path": "../util-crypto/tsconfig.build.json" }
]
}
-201
View File
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+6 -9
View File
@@ -1,14 +1,12 @@
{
"author": "Jaco Greeff <jacogr@gmail.com>",
"bugs": "https://github.com/polkadot-js/common/issues",
"contributors": [],
"description": "A list of all available Substrate networks and their applicable prefixes",
"engines": {
"node": ">=14.0.0"
"node": ">=18"
},
"homepage": "https://github.com/polkadot-js/common/tree/master/packages/networks#readme",
"license": "Apache-2.0",
"maintainers": [],
"name": "@polkadot/networks",
"repository": {
"directory": "packages/networks",
@@ -17,15 +15,14 @@
},
"sideEffects": false,
"type": "module",
"version": "9.0.1",
"version": "14.0.3-quantus.3",
"main": "index.js",
"dependencies": {
"@babel/runtime": "^7.17.9",
"@polkadot/util": "9.0.1",
"@substrate/ss58-registry": "^1.17.0"
"@polkadot/util": "14.0.3",
"@substrate/ss58-registry": "^1.51.0",
"tslib": "^2.8.0"
},
"devDependencies": {
"@polkadot/hw-ledger": "9.0.1",
"@polkadot/x-fetch": "9.0.1"
"@polkadot/hw-ledger": "14.0.3"
}
}
-75
View File
@@ -1,75 +0,0 @@
// Copyright 2017-2022 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Ss58Registry } from './types';
import fs from 'fs';
import { objectKeys, stringify } from '@polkadot/util';
import { fetch } from '@polkadot/x-fetch';
import { allNetworks } from './';
const REGISTRY = 'https://raw.githubusercontent.com/paritytech/ss58-registry/main/ss58-registry.json';
const OUTPUT = './.github/ss58-check.md';
function assertAndLog (check: boolean, error: string): void {
if (!check) {
process.env.CI_LOG && fs.appendFileSync(OUTPUT, `
${error}
`);
throw new Error(error);
}
}
describe('check latest Substrate ss58 registry', (): void => {
let original: Ss58Registry;
beforeAll(async (): Promise<void> => {
original = (await (await fetch(REGISTRY)).json()) as Ss58Registry;
});
it('has the same number as the original', (): void => {
assertAndLog(allNetworks.length === original.registry.length, `Number of entries mismatched:: Expected ${original.registry.length} found ${allNetworks.length}`);
});
it('has no missing any entries', (): void => {
const missing = original.registry
.filter(({ prefix }) => !allNetworks.some((n) => n.prefix === prefix))
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
assertAndLog(!missing.length, `Missing entries found: ${stringify(missing, 2)}`);
});
it('has no extra entries', (): void => {
const missing = allNetworks
.filter(({ prefix }) => !original.registry.some((n) => n.prefix === prefix))
.map(({ displayName, prefix }) => `${displayName} (${prefix})`);
assertAndLog(!missing.length, `Extra entries found: ${stringify(missing, 2)}`);
});
it('has the same values as the original', (): void => {
const fields = objectKeys(original.schema);
const errors = original.registry
.map((n): [string, string[]] => {
const other = allNetworks.find(({ prefix }) => prefix === n.prefix);
return [
`${n.displayName} (${n.prefix})`,
other
? fields.filter((f) =>
['decimals', 'symbols'].includes(f)
? stringify(n[f] || []) !== stringify(other[f] || [])
: stringify(n[f]) !== stringify(other[f])
)
: []
];
})
.filter(([, fields]) => fields.length);
assertAndLog(!errors.length, `Mismatches found: ${stringify(errors.map(([n, m]) => `${n}:: ${m.join(', ')}`), 2)}`);
});
});
+23 -5
View File
@@ -1,25 +1,43 @@
// Copyright 2017-2022 @polkadot/networks authors & contributors
// Copyright 2017-2026 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
/// <reference types="@polkadot/dev-test/globals.d.ts" />
import { ledgerApps } from '@polkadot/hw-ledger/defaults';
import { isHex } from '@polkadot/util';
import { knownGenesis, knownLedger } from './defaults';
import { knownGenesis, knownLedger, knownTestnet } from './defaults/index.js';
describe('defaults', (): void => {
const genesisKeys = Object.keys(knownGenesis);
const ledgerKeys = Object.keys(knownLedger);
describe('genesis', (): void => {
it('has hex values for all genesis chains', (): void => {
expect(
Object.keys(knownGenesis).filter((network) =>
genesisKeys.filter((network) =>
!knownGenesis[network].length ||
knownGenesis[network].some((g) => !isHex(g, 256))
)
).toEqual([]);
});
// Upstream asserted the opposite: that no testnet appears in knownGenesis.
// This fork carries Quantus testnets deliberately — a wallet for a chain
// under development has to reach its testnet — so the assertion becomes that
// any testnet listed here is one we meant to list. See defaults/genesis.ts.
it('has genesis entries only for testnets we deliberately support', (): void => {
expect(
genesisKeys.filter((network) =>
knownTestnet[network] &&
!network.startsWith('quantus')
)
).toEqual([]);
});
it('has genesis for all Ledger chains', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
ledgerKeys.filter((network) =>
!knownGenesis[network]
)
).toEqual([]);
@@ -29,7 +47,7 @@ describe('defaults', (): void => {
describe('Ledger', (): void => {
it('has entries for each of the apps (hwledger -> networks)', (): void => {
expect(
Object.keys(knownLedger).filter((network) =>
ledgerKeys.filter((network) =>
!ledgerApps[network]
)
).toEqual([]);
+145 -8
View File
@@ -1,16 +1,37 @@
// Copyright 2017-2022 @polkadot/networks authors & contributors
// Copyright 2017-2026 @polkadot/networks authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { KnownGenesis } from '../types';
import type { KnownGenesis } from '../types.js';
// NOTE: In the case where the network was hard-spooned and multiple genesisHashes
// are provided, it needs to be in reverse order, i.e. most-recent first, oldest
// last. This make lookups for the current a simple genesisHash[0]
// (See Kusama as an example)
// In the case where the network was hard-spooned and multiple genesisHashes
// are provided, it needs to be in reverse order, i.e. most-recent goes first,
// oldest goes last. This make lookups for the current a simple genesisHash[0]
// where the latest ios always the first entry (See Kusama as an example)
//
// UPSTREAM SAID: "Apart from the test relays, this list is limited to live
// parachains and live production networks. It does not and should not contain
// any testnets, either stand-alone or connected to test relays such as
// Westend/Rococo"
//
// THIS FORK DOES NOT. That rule keeps testnets out of polkadot-js/apps' chain
// picker, which is a sensible product decision for a production explorer and the
// wrong one for us. Quantus is a chain under active development, and a wallet
// that cannot talk to its testnet is a wallet that cannot be tested against
// anything but real funds. Testnets are first-class here.
//
// `isTestnet` is still set honestly, so a consumer that wants to hide them can;
// what changed is that we no longer make that choice on the consumer's behalf.
// See `toExpanded` in ../interfaces.ts.
export const knownGenesis: KnownGenesis = {
acala: [
'0xfc41b9bd8ef8fe53d58c7ea67c794c7ec9a73daf05e6d54b14ff6342c99ba64c'
],
ajuna: [
'0xe358eb1d11b31255a286c12e44fe6780b7edb171d657905a97e39f71d9c6c3ee'
],
'aleph-node': [
'0x70255b4d28de0fc4e1a193d7e175ad1ccef431598211c55538f1018651a0344e'
],
astar: [
'0x9eb76c5184c4ab8679d2d5d819fdf90b9c001403e9e17da2e14b6d8aec4029c6'
],
@@ -18,11 +39,35 @@ export const knownGenesis: KnownGenesis = {
'0xa85cfb9b9fd4d622a5b28289a02347af987d8f73fa3108450e2b4a11c1ce5755'
],
bifrost: [
'0x262e1b2ad728475fd6fe88e62d34c200abe6fd693931ddad144059b1eb884e5b'
],
'bifrost-kusama': [
'0x9f28c6a68e0fc9646eff64935684f6eeeece527e37bbe1f213d22caa1d9d6bed'
],
bittensor: [
'0x2f0555cc76fc2840a25a6ea3b9637146806f1f44b090c175ffde2a7e5ab36c03'
],
centrifuge: [
'0xb3db41421702df9a7fcac62b53ffeac85f7853cc4e689e0b93aeb3db18c09d82',
'0x67dddf2673b69e5f875f6f25277495834398eafd67f492e09f3f3345e003d1b5'
],
cere: [
'0x81443836a9a24caaa23f1241897d1235717535711d1d3fe24eae4fdc942c092c'
],
composable: [
'0xdaab8df776eb52ec604a5df5d388bb62a050a0aaec4556a64265b9d42755552d'
],
creditcoin3: [
'0x4436a7d64e363df85e065a894721002a86643283f9707338bf195d360ba2ee71', // cc3 mainnet
'0xfc4ec97a1c1f119c4353aecb4a17c7c0cf7b40d5d660143d8bad9117e9866572', // cc3 testnet/drynet
'0xfc9df99a665f964aed6649f275055e54df5e3420489538ed31d7788f53d11ef6' // cc3 devnet
],
darwinia: [
'0xe71578b37a7c799b0ab4ee87ffa6f059a6b98f71f06fb8c84a8d88013a548ad6'
],
dentnet: [
'0x0313f6a011d128d22f996703cbab05162e2fdc9e031493314fe6db79979c5ca7'
],
'dock-mainnet': [
'0x6bfe24dca2a3be10f22212678ac13a6446ec764103c0f3471c71609eac384aae',
'0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'
@@ -30,21 +75,41 @@ export const knownGenesis: KnownGenesis = {
edgeware: [
'0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'
],
encointer: [
'0x7dd99936c1e9e6d1ce7d90eb6f33bea8393b4bf87677d675aa63c9cb3e8c5b5b'
],
enjin: [
'0xd8761d3c88f26dc12875c00d3165f7d67243d56fc85b4cf19937601a7916e5a9'
],
equilibrium: [
'0x6f1a800de3daff7f5e037ddf66ab22ce03ab91874debeddb1086f5f7dbd48925'
],
frequency: [
'0x4a587bf17a404e3572747add7aab7bbe56e805a5479c6c436f07f36fcc8d3ae1'
],
genshiro: [
'0x9b8cefc0eb5c568b527998bdd76c184e2b76ae561be76e4667072230217ea243'
],
hydradx: [
'0xafdc188f45c71dacbaa0b62e16a91f726c7b8699a9748cdf715459de6b7f366d', // Hydration | HydraDX Parachain
'0xd2a620c27ec5cbc5621ff9a522689895074f7cca0d08e7134a7804e1a3ba86fc', // Snakenet Gen3-1
'0x10af6e84234477d84dc572bac0789813b254aa490767ed06fb9591191d1073f9', // Snakenet Gen3
'0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047', // Snakenet Gen2
'0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2' // Snakenet Gen1
],
integritee: [
'0xcdedc8eadbfa209d3f207bba541e57c3c58a667b05a2e1d1e86353c9000758da', // on Kusama
'0xe13e7af377c64e83f95e0d70d5e5c3c01d697a84538776c5b9bbe0e7d7b6034c' // on Polkadot
],
'interlay-parachain': [
'0xbf88efe70e9e0e916416e8bed61f2b45717f517d7f3523e33c7b001e5ffcbc72'
],
karura: [
'0xbaf5aabe40646d11f0ee8abbdc64f4a4b7674925cba08e4a05ff9ebed6e2126b'
],
khala: [
'0xd43540ba6d3eb4897c28a77d48cb5b729fea37603cbbfc7a86a73b72adb3be8d'
],
kulupu: [
'0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'
],
@@ -53,19 +118,69 @@ export const knownGenesis: KnownGenesis = {
'0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636', // Kusama CC2
'0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf' // Kusama CC1
],
'nodle-chain': [
'0xa3d114c2b8d0627c1aa9b134eafcf7d05ca561fdc19fb388bb9457f81809fb23'
liberland: [
'0x6bd89e052d67a45bb60a9a23e8581053d5e0d619f15cb9865946937e690c42d6'
],
matrixchain: [
'0x3af4ff48ec76d2efc8476730f423ac07e25ad48f5f4c9dc39c778b164d808615'
],
mythos: [
'0xf6ee56e9c5277df5b4ce6ae9983ee88f3cbed27d31beeb98f9f84f997a1ab0b9'
],
nodle: [
'0x97da7ede98d7bad4e36b4d734b6055425a3be036da2a332ea5a7037656427a21'
],
origintrail: [
'0xe7e0962324a3b86c83404dbea483f25fb5dab4c224791c81b756cfc948006174'
],
p3d: [
'0x6c5894837ad89b6d92b114a2fb3eafa8fe3d26a54848e3447015442cd6ef4e66'
],
parallel: [
'0xe61a41c53f5dcd0beb09df93b34402aada44cb05117b71059cce40a2723a4e97'
],
peaq: [
'0xd2a5d385932d1f650dae03ef8e2748983779ee342c614f80854d32b8cd8fa48c'
],
pendulum: [
'0x5d3c298622d5634ed019bf61ea4b71655030015bde9beb0d6a24743714462c86'
],
phala: [
'0x1bb969d85965e4bb5a651abbedf21a54b6b31a21f66b5401cc3f1e286268d736'
],
picasso: [
'0x6811a339673c9daa897944dcdac99c6e2939cc88245ed21951a0a3c9a2be75bc',
'0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
],
polimec: [
'0x7eb9354488318e7549c722669dcbdcdc526f1fef1420e7944667212f3601fdbd'
],
polkadex: [
'0x3920bcb4960a1eef5580cd5367ff3f430eef052774f78468852f7b9cb39f8a3c'
],
polkadot: [
'0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'
],
polymesh: [
'0x6fbd74e5e1d0a61d52ccfe9d4adaed16dd3a7caa37c6bc4d0c2fa12e8b2f4063'
],
// Quantus mainnet, read from the node with `chain_getBlockHash(0)` on
// 2026-09-09, the day it launched. Not the staging chain, which is
// `0xb0e90ed9f291a9194f79…` and which telemetry confusingly calls
// "Quantus Staging Mainnet".
quantus: [
'0xfb5487c0be6ae4ade2d41d16e50465129861636c2b8d61fa94d7a19631626fba'
],
// Heisenberg, the public Quantus testnet. A testnet carrying a genesis hash is
// a deliberate departure from upstream — see the note above.
'quantus-heisenberg': [
'0xa5aa9e5c84d4a3722c152295e7973c9af522f2fb1ef7db5afaa3d5f4dc8d3b4f'
],
quartz: [
'0xcd4d732201ebe5d6b014edda071c4203e16867305332301dc8d092044b28e554'
],
rococo: [
'0x6408de7737c59c238890533af25896a2c20608d8b380bb01029acb392781063e',
'0xaaf2cd1b74b5f726895921259421b534124726263982522174147046b8827897',
'0x037f5f3c8e67b314062025fc886fcd6238ea25a4a9b45dce8d246815c9ebe770',
'0xc196f81260cf1686172b47a79cf002120735d7cb0eb1474e8adce56618456fff',
@@ -87,10 +202,32 @@ export const knownGenesis: KnownGenesis = {
statemine: [
'0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a'
],
statemint: [
'0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f'
],
subsocial: [
'0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
],
ternoa: [
'0x6859c81ca95ef624c9dfe4dc6e3381c33e5d6509e35e147092bfbc780f777c4e'
],
unique: [
'0x84322d9cddbf35088f1e54e9a85c967a41a56a4f43445768125e61af166c7d31'
],
vara: [
'0xfe1b4c55fd4d668101126434206571a7838a8b6b93a6d1b95d607e78e6c53763'
],
vtb: [
'0x286bc8414c7000ce1d6ee6a834e29a54c1784814b76243eb77ed0b2c5573c60f',
'0x7483b89572fb2bd687c7b9a93b242d0b237f9aba463aba07ec24503931038aaa'
],
westend: [
'0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e'
],
xxnetwork: [
'0x50dd5d206917bf10502c68fb4d18a59fc8aa31586f4e8856b493e43544aa82aa'
],
zeitgeist: [
'0x1bf2a2ecb4a868de66ea8610f2ce7c8c43706561b6476031315f6640fe38e060'
]
};

Some files were not shown because too many files have changed in this diff Show More