diff --git a/CHANGELOG.md b/CHANGELOG.md index a73464899..471ad5741 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 2.17.0-beta.x +- Add `encode{Derived, Multi}Address` to encode derived/multi addresses - Correctly handle 0 inputs in `numberToU8a` - Simplify and flatten base58 dependencies diff --git a/package.json b/package.json index 3e6bea21c..df1123804 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@babel/core": "^7.10.4", - "@polkadot/dev": "^0.55.18", + "@polkadot/dev": "^0.55.19", "@polkadot/ts": "^0.3.27", "@types/jest": "^26.0.3" }, diff --git a/packages/util-crypto/src/address/encodeDerived.spec.ts b/packages/util-crypto/src/address/encodeDerived.spec.ts new file mode 100644 index 000000000..41f4286d5 --- /dev/null +++ b/packages/util-crypto/src/address/encodeDerived.spec.ts @@ -0,0 +1,13 @@ +// Copyright 2017-2020 @polkadot/util-crypto authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import encodeDerivedAddress from './encodeDerived'; + +describe('encodeDerivedAddress', (): void => { + it('creates a valid known derived address', (): void => { + expect( + encodeDerivedAddress('5GvUh7fGKsdBEh5XpypkfkGuf7j3vXLxH9BdxjxnJNVXRYi1', 0) + ).toEqual('5E5XxqPxm7QbEs6twYfp3tyjXidn4kqRrNPH4o6JK9JSLUeD'); + }); +}); diff --git a/packages/util-crypto/src/address/encodeDerived.ts b/packages/util-crypto/src/address/encodeDerived.ts new file mode 100644 index 000000000..870f71161 --- /dev/null +++ b/packages/util-crypto/src/address/encodeDerived.ts @@ -0,0 +1,21 @@ +// Copyright 2017-2020 @polkadot/util-crypto authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import { Prefix } from './types'; + +import BN from 'bn.js'; + +import decode from './decode'; +import encode from './encode'; +import keyDerived from './keyDerived'; + +/** + * @name encodeDerivedAddress + * @summary Creates a derived address. + * @description + * Creates a Substrate derived address based on the input address/publicKey and the index supplied. + */ +export default function encodeDerivedAddress (who: Uint8Array | string, index: BigInt | BN | number, ss58Format?: Prefix): string { + return encode(keyDerived(decode(who), index), ss58Format); +} diff --git a/packages/util-crypto/src/address/encodeMulti.spec.ts b/packages/util-crypto/src/address/encodeMulti.spec.ts new file mode 100644 index 000000000..c24da9c80 --- /dev/null +++ b/packages/util-crypto/src/address/encodeMulti.spec.ts @@ -0,0 +1,17 @@ +// Copyright 2017-2020 @polkadot/util-crypto authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import encodeMultiAddress from './encodeMulti'; + +describe('encodeMultiAddress', (): void => { + it('creates a valid known multi address', (): void => { + expect( + encodeMultiAddress([ + '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', + '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty', + '5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y' + ], 2) + ).toEqual('5DjYJStmdZ2rcqXbXGX7TW85JsrW6uG4y9MUcLq2BoPMpRA7'); + }); +}); diff --git a/packages/util-crypto/src/address/encodeMulti.ts b/packages/util-crypto/src/address/encodeMulti.ts new file mode 100644 index 000000000..da444f823 --- /dev/null +++ b/packages/util-crypto/src/address/encodeMulti.ts @@ -0,0 +1,20 @@ +// Copyright 2017-2020 @polkadot/util-crypto authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import { Prefix } from './types'; + +import BN from 'bn.js'; + +import encode from './encode'; +import keyMulti from './keyMulti'; + +/** + * @name encodeMultiAddress + * @summary Creates a multisig address. + * @description + * Creates a Substrate multisig address based on the input address and the required threshold. + */ +export default function encodeMultiAddress (who: (Uint8Array | string)[], threshold: BigInt | BN | number, ss58Format?: Prefix): string { + return encode(keyMulti(who, threshold), ss58Format); +} diff --git a/packages/util-crypto/src/address/index.ts b/packages/util-crypto/src/address/index.ts index 5d8e7c3b1..853e9c01b 100644 --- a/packages/util-crypto/src/address/index.ts +++ b/packages/util-crypto/src/address/index.ts @@ -8,6 +8,8 @@ import createKeyMulti from './keyMulti'; import createKeyDerived from './keyDerived'; import decodeAddress from './decode'; import encodeAddress from './encode'; +import encodeDerivedAddress from './encodeDerived'; +import encodeMultiAddress from './encodeMulti'; import addressEq from './eq'; import setSS58Format from './setSS58Format'; import sortAddresses from './sort'; @@ -20,6 +22,8 @@ export { createKeyMulti, decodeAddress, encodeAddress, + encodeDerivedAddress, + encodeMultiAddress, setSS58Format, sortAddresses }; diff --git a/packages/util-crypto/src/address/keyDerived.spec.ts b/packages/util-crypto/src/address/keyDerived.spec.ts index 3656d35b5..6d40d309f 100644 --- a/packages/util-crypto/src/address/keyDerived.spec.ts +++ b/packages/util-crypto/src/address/keyDerived.spec.ts @@ -4,7 +4,7 @@ import createKeyDerived from './keyDerived'; -describe('createKeySub', (): void => { +describe('createKeyDerived', (): void => { it('matches sub accounts with Rust', (): void => { expect( createKeyDerived(new Uint8Array([1, 0, 0, 0, 0, 0, 0, 0]), 0) diff --git a/yarn.lock b/yarn.lock index fdefb6458..169735ffd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2654,9 +2654,9 @@ __metadata: languageName: node linkType: hard -"@polkadot/dev@npm:^0.55.18": - version: 0.55.18 - resolution: "@polkadot/dev@npm:0.55.18" +"@polkadot/dev@npm:^0.55.19": + version: 0.55.19 + resolution: "@polkadot/dev@npm:0.55.19" dependencies: "@babel/cli": ^7.10.4 "@babel/core": ^7.10.4 @@ -2739,7 +2739,7 @@ __metadata: polkadot-exec-typedoc: scripts/polkadot-exec-typedoc.js polkadot-exec-vuepress: scripts/polkadot-exec-vuepress.js polkadot-exec-webpack: scripts/polkadot-exec-webpack.js - checksum: 3/96b25c14c9bd66d670ad49d63f37edb2226444530464a10899c0b9121448f246f0b7df28c92393e317ffe86be7f34e30f4bbad0bc48fa4151b07f31fd766001d + checksum: 3/5f690f0995be5cbbf0b3522f7e494c3a23c1e35632918af0c34842363b5c93431192b058878c9cc91a1110a84c5aef1fd3100ed84ea2371d2c5af5322f877d31 languageName: node linkType: hard @@ -15736,7 +15736,7 @@ __metadata: resolution: "root-workspace-0b6124@workspace:." dependencies: "@babel/core": ^7.10.4 - "@polkadot/dev": ^0.55.18 + "@polkadot/dev": ^0.55.19 "@polkadot/ts": ^0.3.27 "@types/jest": ^26.0.3 languageName: unknown