@aeternity/aepp-sdk 11.0.1 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/dist/aepp-sdk.browser-script.js +1 -1
- package/dist/aepp-sdk.browser-script.js.LICENSE.txt +12 -19
- package/dist/aepp-sdk.browser-script.js.map +1 -1
- package/dist/aepp-sdk.browser.js +1 -1
- package/dist/aepp-sdk.browser.js.map +1 -1
- package/dist/aepp-sdk.js +1 -1
- package/dist/aepp-sdk.js.map +1 -1
- package/es/AeSdk.d.ts +37 -0
- package/es/AeSdk.mjs +81 -0
- package/es/AeSdk.mjs.map +1 -0
- package/es/AeSdkAepp.d.ts +69 -0
- package/es/AeSdkAepp.mjs +175 -0
- package/es/AeSdkAepp.mjs.map +1 -0
- package/es/AeSdkBase.d.ts +212 -0
- package/es/AeSdkBase.mjs +310 -0
- package/es/AeSdkBase.mjs.map +1 -0
- package/es/AeSdkWallet.d.ts +103 -0
- package/es/AeSdkWallet.mjs +322 -0
- package/es/AeSdkWallet.mjs.map +1 -0
- package/es/Node.d.ts +44 -0
- package/es/Node.mjs +141 -0
- package/es/Node.mjs.map +1 -0
- package/es/account/Base.d.ts +65 -0
- package/es/account/Base.mjs +123 -0
- package/es/account/Base.mjs.map +1 -0
- package/es/account/Memory.d.ts +25 -0
- package/es/account/Memory.mjs +81 -0
- package/es/account/Memory.mjs.map +1 -0
- package/es/account/Rpc.d.ts +27 -0
- package/es/account/Rpc.mjs +79 -0
- package/es/account/Rpc.mjs.map +1 -0
- package/es/aens.d.ts +209 -0
- package/es/aens.mjs +332 -0
- package/es/aens.mjs.map +1 -0
- package/es/aepp-wallet-communication/connection/Browser.d.ts +32 -0
- package/es/aepp-wallet-communication/connection/Browser.mjs +70 -0
- package/es/aepp-wallet-communication/connection/Browser.mjs.map +1 -0
- package/es/aepp-wallet-communication/connection/BrowserRuntime.d.ts +17 -0
- package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs +57 -0
- package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs.map +1 -0
- package/es/aepp-wallet-communication/connection/BrowserWindowMessage.d.ts +35 -0
- package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs +142 -0
- package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs.map +1 -0
- package/es/aepp-wallet-communication/connection-proxy.d.ts +10 -0
- package/{src/utils/crypto-ts.ts → es/aepp-wallet-communication/connection-proxy.mjs} +15 -11
- package/es/aepp-wallet-communication/connection-proxy.mjs.map +1 -0
- package/es/aepp-wallet-communication/rpc/RpcClient.d.ts +33 -0
- package/es/aepp-wallet-communication/rpc/RpcClient.mjs +169 -0
- package/es/aepp-wallet-communication/rpc/RpcClient.mjs.map +1 -0
- package/es/aepp-wallet-communication/rpc/types.d.ts +77 -0
- package/es/aepp-wallet-communication/rpc/types.mjs +3 -0
- package/es/aepp-wallet-communication/rpc/types.mjs.map +1 -0
- package/es/aepp-wallet-communication/schema.d.ts +90 -46
- package/es/aepp-wallet-communication/schema.mjs +214 -0
- package/es/aepp-wallet-communication/schema.mjs.map +1 -0
- package/es/aepp-wallet-communication/wallet-detector.d.ts +24 -0
- package/es/aepp-wallet-communication/wallet-detector.mjs +63 -0
- package/es/aepp-wallet-communication/wallet-detector.mjs.map +1 -0
- package/es/apis/compiler/compiler.d.ts +92 -0
- package/es/apis/compiler/compiler.mjs +576 -0
- package/es/apis/compiler/compiler.mjs.map +1 -0
- package/es/apis/compiler/index.d.ts +2 -0
- package/es/apis/compiler/index.mjs +3 -0
- package/es/apis/compiler/index.mjs.map +1 -0
- package/es/apis/compiler/models/index.d.ts +248 -0
- package/es/apis/compiler/models/index.mjs +48 -0
- package/es/apis/compiler/models/index.mjs.map +1 -0
- package/es/apis/compiler/models/mappers.d.ts +23 -0
- package/es/apis/compiler/models/mappers.mjs +585 -0
- package/es/apis/compiler/models/mappers.mjs.map +1 -0
- package/es/apis/compiler/models/parameters.d.ts +13 -0
- package/es/apis/compiler/models/parameters.mjs +71 -0
- package/es/apis/compiler/models/parameters.mjs.map +1 -0
- package/es/apis/node/index.d.ts +2 -0
- package/es/apis/node/index.mjs +3 -0
- package/es/apis/node/index.mjs.map +1 -0
- package/es/apis/node/models/index.d.ts +1061 -0
- package/es/apis/node/models/index.mjs +2 -0
- package/es/apis/node/models/index.mjs.map +1 -0
- package/es/apis/node/models/mappers.d.ts +95 -0
- package/es/apis/node/models/mappers.mjs +4164 -0
- package/es/apis/node/models/mappers.mjs.map +1 -0
- package/es/apis/node/models/parameters.d.ts +17 -0
- package/es/apis/node/models/parameters.mjs +165 -0
- package/es/apis/node/models/parameters.mjs.map +1 -0
- package/es/apis/node/node.d.ts +215 -0
- package/es/apis/node/node.mjs +1165 -0
- package/es/apis/node/node.mjs.map +1 -0
- package/es/chain.d.ts +220 -0
- package/es/chain.mjs +524 -0
- package/es/chain.mjs.map +1 -0
- package/es/channel/handlers.d.ts +34 -0
- package/es/channel/handlers.mjs +147 -112
- package/es/channel/handlers.mjs.map +1 -1
- package/es/channel/index.d.ts +634 -0
- package/es/channel/index.mjs +898 -900
- package/es/channel/index.mjs.map +1 -1
- package/es/channel/internal.d.ts +100 -0
- package/es/channel/internal.mjs +97 -51
- package/es/channel/internal.mjs.map +1 -1
- package/es/contract/Compiler.d.ts +17 -0
- package/es/contract/Compiler.mjs +67 -0
- package/es/contract/Compiler.mjs.map +1 -0
- package/es/contract/aci.d.ts +125 -0
- package/es/contract/aci.mjs +199 -180
- package/es/contract/aci.mjs.map +1 -1
- package/es/contract/ga.d.ts +68 -0
- package/es/contract/ga.mjs +190 -0
- package/es/contract/ga.mjs.map +1 -0
- package/es/contract/methods.d.ts +68 -0
- package/es/contract/methods.mjs +101 -0
- package/es/contract/methods.mjs.map +1 -0
- package/es/index.d.ts +32 -0
- package/es/index.mjs +32 -40
- package/es/index.mjs.map +1 -1
- package/es/oracle.d.ts +154 -0
- package/es/oracle.mjs +288 -0
- package/es/oracle.mjs.map +1 -0
- package/es/spend.d.ts +61 -0
- package/es/spend.mjs +122 -0
- package/es/spend.mjs.map +1 -0
- package/es/tx/builder/constants.d.ts +41 -0
- package/es/tx/builder/constants.mjs +11 -19
- package/es/tx/builder/constants.mjs.map +1 -1
- package/es/tx/builder/field-types.d.ts +62 -0
- package/es/tx/builder/field-types.mjs +62 -10
- package/es/tx/builder/field-types.mjs.map +1 -1
- package/es/tx/builder/helpers.d.ts +131 -0
- package/es/tx/builder/helpers.mjs +71 -169
- package/es/tx/builder/helpers.mjs.map +1 -1
- package/es/tx/builder/index.d.ts +75 -0
- package/es/tx/builder/index.mjs +141 -323
- package/es/tx/builder/index.mjs.map +1 -1
- package/es/tx/builder/schema.d.ts +350 -0
- package/es/tx/builder/schema.mjs +173 -510
- package/es/tx/builder/schema.mjs.map +1 -1
- package/es/tx/index.d.ts +63 -0
- package/es/tx/index.mjs +171 -265
- package/es/tx/index.mjs.map +1 -1
- package/es/tx/min-fee.d.ts +20 -0
- package/es/tx/min-fee.mjs +148 -0
- package/es/tx/min-fee.mjs.map +1 -0
- package/es/tx/validator.d.ts +19 -0
- package/es/tx/validator.mjs +64 -71
- package/es/tx/validator.mjs.map +1 -1
- package/es/typings/@aeternity__argon2-browser/index.d.mjs +2 -0
- package/es/typings/@aeternity__argon2-browser/index.d.mjs.map +1 -0
- package/es/typings/@aeternity__uuid/index.d.mjs +2 -0
- package/es/typings/@aeternity__uuid/index.d.mjs.map +1 -0
- package/es/typings/bip32-path/index.d.mjs +2 -0
- package/es/typings/bip32-path/index.d.mjs.map +1 -0
- package/es/typings/blakejs/index.d.mjs.map +1 -1
- package/es/typings/tweetnacl-auth/index.d.mjs +2 -0
- package/es/typings/tweetnacl-auth/index.d.mjs.map +1 -0
- package/es/utils/amount-formatter.d.ts +42 -0
- package/es/utils/amount-formatter.mjs +28 -41
- package/es/utils/amount-formatter.mjs.map +1 -1
- package/es/utils/autorest.d.ts +6 -0
- package/es/utils/autorest.mjs +97 -0
- package/es/utils/autorest.mjs.map +1 -0
- package/es/utils/bignumber.d.ts +13 -0
- package/es/utils/bignumber.mjs +10 -8
- package/es/utils/bignumber.mjs.map +1 -1
- package/es/{bytes.d.ts → utils/bytes.d.ts} +10 -13
- package/es/utils/bytes.mjs +10 -14
- package/es/utils/bytes.mjs.map +1 -1
- package/es/utils/crypto.d.ts +103 -0
- package/es/utils/crypto.mjs +60 -68
- package/es/utils/crypto.mjs.map +1 -1
- package/es/utils/encoder.d.ts +26 -0
- package/es/utils/encoder.mjs +47 -51
- package/es/utils/encoder.mjs.map +1 -1
- package/es/{errors.d.ts → utils/errors.d.ts} +254 -57
- package/es/utils/errors.mjs +318 -125
- package/es/utils/errors.mjs.map +1 -1
- package/es/utils/hd-wallet.d.ts +34 -0
- package/es/utils/hd-wallet.mjs +27 -16
- package/es/utils/hd-wallet.mjs.map +1 -1
- package/es/utils/json-big.d.ts +5 -0
- package/es/utils/json-big.mjs +10 -14
- package/es/utils/json-big.mjs.map +1 -1
- package/es/utils/keystore.d.ts +51 -0
- package/es/utils/keystore.mjs +98 -193
- package/es/utils/keystore.mjs.map +1 -1
- package/es/{mptree.d.ts → utils/mptree.d.ts} +5 -8
- package/es/utils/mptree.mjs +13 -14
- package/es/utils/mptree.mjs.map +1 -1
- package/es/utils/other.d.ts +14 -0
- package/es/utils/other.mjs +21 -36
- package/es/utils/other.mjs.map +1 -1
- package/es/{semver-satisfies.d.ts → utils/semver-satisfies.d.ts} +0 -0
- package/es/utils/semver-satisfies.mjs.map +1 -1
- package/es/utils/string.d.ts +24 -0
- package/es/utils/string.mjs +8 -10
- package/es/utils/string.mjs.map +1 -1
- package/package.json +49 -39
- package/src/AeSdk.ts +65 -0
- package/src/AeSdkAepp.ts +167 -0
- package/src/AeSdkBase.ts +320 -0
- package/src/AeSdkWallet.ts +332 -0
- package/src/Node.ts +167 -0
- package/src/account/Base.ts +114 -0
- package/src/account/Memory.ts +83 -0
- package/src/account/Rpc.ts +67 -0
- package/src/aens.ts +391 -0
- package/src/aepp-wallet-communication/connection/Browser.ts +68 -0
- package/src/aepp-wallet-communication/connection/BrowserRuntime.ts +58 -0
- package/src/aepp-wallet-communication/connection/BrowserWindowMessage.ts +111 -0
- package/{es/utils/crypto-ts.mjs → src/aepp-wallet-communication/connection-proxy.ts} +16 -17
- package/src/aepp-wallet-communication/rpc/RpcClient.ts +137 -0
- package/src/aepp-wallet-communication/rpc/types.ts +66 -0
- package/src/aepp-wallet-communication/schema.ts +181 -0
- package/src/aepp-wallet-communication/wallet-detector.ts +71 -0
- package/src/apis/compiler/code-model-v4.yaml +2649 -0
- package/src/apis/compiler/compiler.ts +585 -0
- package/src/apis/compiler/index.ts +2 -0
- package/src/apis/compiler/models/index.ts +301 -0
- package/src/apis/compiler/models/mappers.ts +583 -0
- package/src/apis/compiler/models/parameters.ts +93 -0
- package/src/apis/node/code-model-v4.yaml +10046 -0
- package/src/apis/node/index.ts +2 -0
- package/src/apis/node/models/index.ts +1253 -0
- package/src/apis/node/models/mappers.ts +4278 -0
- package/src/apis/node/models/parameters.ts +188 -0
- package/src/apis/node/node.ts +1299 -0
- package/src/chain.ts +444 -0
- package/src/channel/{handlers.js → handlers.ts} +220 -128
- package/src/channel/index.ts +991 -0
- package/src/channel/internal.ts +345 -0
- package/src/contract/Compiler.ts +66 -0
- package/src/contract/aci.ts +529 -0
- package/src/contract/ga.ts +178 -0
- package/src/contract/methods.ts +118 -0
- package/src/index.ts +51 -0
- package/src/oracle.ts +342 -0
- package/src/spend.ts +152 -0
- package/src/tx/builder/{constants.js → constants.ts} +12 -16
- package/src/tx/builder/field-types.ts +111 -0
- package/src/tx/builder/helpers.ts +253 -0
- package/src/tx/builder/index.ts +394 -0
- package/src/tx/builder/schema.ts +771 -0
- package/src/tx/index.ts +199 -0
- package/src/tx/min-fee.ts +136 -0
- package/src/tx/validator.ts +226 -0
- package/src/typings/@aeternity__argon2-browser/index.d.ts +3 -0
- package/src/typings/@aeternity__uuid/index.d.ts +3 -0
- package/src/typings/bip32-path/index.d.ts +33 -0
- package/src/typings/tweetnacl-auth/index.d.ts +14 -0
- package/src/utils/amount-formatter.ts +29 -42
- package/src/utils/autorest.ts +90 -0
- package/src/utils/bignumber.ts +9 -11
- package/src/utils/bytes.ts +12 -14
- package/src/utils/crypto.ts +217 -0
- package/src/utils/encoder.ts +52 -55
- package/src/utils/errors.ts +268 -134
- package/src/utils/hd-wallet.ts +134 -0
- package/src/utils/json-big.ts +26 -0
- package/src/utils/keystore.ts +179 -0
- package/src/utils/mptree.ts +14 -14
- package/src/utils/other.ts +28 -43
- package/src/utils/string.ts +8 -10
- package/es/account/base.mjs +0 -179
- package/es/account/base.mjs.map +0 -1
- package/es/account/memory.mjs +0 -99
- package/es/account/memory.mjs.map +0 -1
- package/es/account/multiple.mjs +0 -179
- package/es/account/multiple.mjs.map +0 -1
- package/es/ae/aens.mjs +0 -404
- package/es/ae/aens.mjs.map +0 -1
- package/es/ae/aepp.mjs +0 -45
- package/es/ae/aepp.mjs.map +0 -1
- package/es/ae/contract.mjs +0 -159
- package/es/ae/contract.mjs.map +0 -1
- package/es/ae/index.mjs +0 -207
- package/es/ae/index.mjs.map +0 -1
- package/es/ae/oracle.mjs +0 -339
- package/es/ae/oracle.mjs.map +0 -1
- package/es/ae/universal.mjs +0 -45
- package/es/ae/universal.mjs.map +0 -1
- package/es/ae/wallet.mjs +0 -50
- package/es/ae/wallet.mjs.map +0 -1
- package/es/amount-formatter.d.ts +0 -58
- package/es/bignumber.d.ts +0 -18
- package/es/chain/index.mjs +0 -272
- package/es/chain/index.mjs.map +0 -1
- package/es/chain/node.mjs +0 -442
- package/es/chain/node.mjs.map +0 -1
- package/es/contract/compiler.mjs +0 -115
- package/es/contract/compiler.mjs.map +0 -1
- package/es/contract/ga/helpers.mjs +0 -30
- package/es/contract/ga/helpers.mjs.map +0 -1
- package/es/contract/ga/index.mjs +0 -178
- package/es/contract/ga/index.mjs.map +0 -1
- package/es/crypto-ts.d.ts +0 -9
- package/es/encoder.d.ts +0 -26
- package/es/node-pool/index.mjs +0 -188
- package/es/node-pool/index.mjs.map +0 -1
- package/es/node.mjs +0 -133
- package/es/node.mjs.map +0 -1
- package/es/other.d.ts +0 -31
- package/es/string.d.ts +0 -26
- package/es/tx/tx-object.mjs +0 -283
- package/es/tx/tx-object.mjs.map +0 -1
- package/es/tx/tx.mjs +0 -938
- package/es/tx/tx.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/connection/browser-runtime.mjs +0 -132
- package/es/utils/aepp-wallet-communication/connection/browser-runtime.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/connection/browser-window-message.mjs +0 -183
- package/es/utils/aepp-wallet-communication/connection/browser-window-message.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/connection/index.mjs +0 -87
- package/es/utils/aepp-wallet-communication/connection/index.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/content-script-bridge.mjs +0 -98
- package/es/utils/aepp-wallet-communication/content-script-bridge.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/helpers.mjs +0 -92
- package/es/utils/aepp-wallet-communication/helpers.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.mjs +0 -375
- package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/rpc/rpc-client.mjs +0 -275
- package/es/utils/aepp-wallet-communication/rpc/rpc-client.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.mjs +0 -541
- package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/schema.mjs +0 -102
- package/es/utils/aepp-wallet-communication/schema.mjs.map +0 -1
- package/es/utils/aepp-wallet-communication/wallet-detector.mjs +0 -110
- package/es/utils/aepp-wallet-communication/wallet-detector.mjs.map +0 -1
- package/es/utils/async-init.mjs +0 -64
- package/es/utils/async-init.mjs.map +0 -1
- package/es/utils/crypto-ts.mjs.map +0 -1
- package/es/utils/swagger.mjs +0 -164
- package/es/utils/swagger.mjs.map +0 -1
- package/src/account/base.js +0 -153
- package/src/account/memory.js +0 -83
- package/src/account/multiple.js +0 -162
- package/src/ae/aens.js +0 -361
- package/src/ae/aepp.js +0 -45
- package/src/ae/contract.js +0 -148
- package/src/ae/index.js +0 -168
- package/src/ae/oracle.js +0 -311
- package/src/ae/universal.js +0 -47
- package/src/ae/wallet.js +0 -50
- package/src/chain/index.js +0 -269
- package/src/chain/node.js +0 -320
- package/src/channel/index.js +0 -903
- package/src/channel/internal.js +0 -236
- package/src/contract/aci.js +0 -376
- package/src/contract/compiler.js +0 -100
- package/src/contract/ga/helpers.js +0 -19
- package/src/contract/ga/index.js +0 -150
- package/src/index.js +0 -89
- package/src/node-pool/index.js +0 -172
- package/src/node.js +0 -116
- package/src/tx/builder/field-types.js +0 -61
- package/src/tx/builder/helpers.js +0 -334
- package/src/tx/builder/index.js +0 -465
- package/src/tx/builder/schema.js +0 -1100
- package/src/tx/index.js +0 -301
- package/src/tx/tx-object.js +0 -187
- package/src/tx/tx.js +0 -631
- package/src/tx/validator.js +0 -181
- package/src/utils/aepp-wallet-communication/connection/browser-runtime.js +0 -119
- package/src/utils/aepp-wallet-communication/connection/browser-window-message.js +0 -165
- package/src/utils/aepp-wallet-communication/connection/index.js +0 -85
- package/src/utils/aepp-wallet-communication/content-script-bridge.js +0 -86
- package/src/utils/aepp-wallet-communication/helpers.js +0 -60
- package/src/utils/aepp-wallet-communication/rpc/aepp-rpc.js +0 -294
- package/src/utils/aepp-wallet-communication/rpc/rpc-client.js +0 -232
- package/src/utils/aepp-wallet-communication/rpc/wallet-rpc.js +0 -401
- package/src/utils/aepp-wallet-communication/schema.ts +0 -80
- package/src/utils/aepp-wallet-communication/wallet-detector.js +0 -92
- package/src/utils/async-init.js +0 -45
- package/src/utils/crypto.js +0 -219
- package/src/utils/hd-wallet.js +0 -100
- package/src/utils/json-big.js +0 -26
- package/src/utils/keystore.js +0 -219
- package/src/utils/swagger.js +0 -156
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import nacl from 'tweetnacl'
|
|
2
|
+
import { full as hmac } from 'tweetnacl-auth'
|
|
3
|
+
import { fromString } from 'bip32-path'
|
|
4
|
+
import { decryptKey, encryptKey } from './crypto'
|
|
5
|
+
import { encode } from './encoder'
|
|
6
|
+
import { CryptographyError } from './errors'
|
|
7
|
+
import { bytesToHex } from './bytes'
|
|
8
|
+
import { concatBuffers } from './other'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @category exception
|
|
12
|
+
*/
|
|
13
|
+
export class DerivationError extends CryptographyError {
|
|
14
|
+
constructor (message: string) {
|
|
15
|
+
super(message)
|
|
16
|
+
this.name = 'DerivationError'
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const ED25519_CURVE = Buffer.from('ed25519 seed')
|
|
21
|
+
const HARDENED_OFFSET = 0x80000000
|
|
22
|
+
|
|
23
|
+
interface KeyTreeNode {
|
|
24
|
+
secretKey: Uint8Array
|
|
25
|
+
chainCode: Uint8Array
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface HDWallet {
|
|
29
|
+
secretKey: string
|
|
30
|
+
chainCode: string
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface Account {
|
|
34
|
+
secretKey: string
|
|
35
|
+
publicKey: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
type Dec<N extends number> = [-1, 0, 1, 2, 3, 4][N]
|
|
39
|
+
type Bip32PathT<MaxLen extends number, H extends 'H' | 'h' | '\''> = MaxLen extends -1
|
|
40
|
+
? `${number}${H}`
|
|
41
|
+
: Bip32PathT<Dec<MaxLen>, H> | `${Bip32PathT<Dec<MaxLen>, H>}/${number}${H}`
|
|
42
|
+
type Bip32Path<MaxLen extends number> =
|
|
43
|
+
'' | Bip32PathT<MaxLen, 'H'> | Bip32PathT<MaxLen, 'h'> | Bip32PathT<MaxLen, '\''>
|
|
44
|
+
|
|
45
|
+
export function derivePathFromKey (path: Bip32Path<5>, key: KeyTreeNode): KeyTreeNode {
|
|
46
|
+
const segments = path === '' ? [] : fromString(path).toPathArray()
|
|
47
|
+
segments.forEach((segment, i) => {
|
|
48
|
+
if (segment < HARDENED_OFFSET) {
|
|
49
|
+
throw new DerivationError(`Segment #${i + 1} is not hardened`)
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
return segments.reduce((parentKey, segment) => deriveChild(parentKey, segment), key)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function derivePathFromSeed (path: 'm' | `m/${Bip32Path<5>}`, seed: Uint8Array): KeyTreeNode {
|
|
57
|
+
if (!['m', 'm/'].includes(path.slice(0, 2))) {
|
|
58
|
+
throw new DerivationError('Root element is required')
|
|
59
|
+
}
|
|
60
|
+
const masterKey = getMasterKeyFromSeed(seed)
|
|
61
|
+
return derivePathFromKey(path.slice(2) as Bip32Path<5>, masterKey)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function formatAccount (keys: nacl.SignKeyPair): Account {
|
|
65
|
+
const { secretKey, publicKey } = keys
|
|
66
|
+
return {
|
|
67
|
+
secretKey: bytesToHex(secretKey),
|
|
68
|
+
publicKey: encode(publicKey, 'ak')
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function getKeyPair (secretKey: Uint8Array): nacl.SignKeyPair {
|
|
73
|
+
return nacl.sign.keyPair.fromSeed(secretKey)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function getMasterKeyFromSeed (seed: Uint8Array): KeyTreeNode {
|
|
77
|
+
const I = hmac(seed, ED25519_CURVE)
|
|
78
|
+
const IL = I.slice(0, 32)
|
|
79
|
+
const IR = I.slice(32)
|
|
80
|
+
return {
|
|
81
|
+
secretKey: IL,
|
|
82
|
+
chainCode: IR
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function deriveChild ({ secretKey, chainCode }: KeyTreeNode, index: number): KeyTreeNode {
|
|
87
|
+
if (index < HARDENED_OFFSET) {
|
|
88
|
+
throw new DerivationError(`Segment ${index} is not hardened`)
|
|
89
|
+
}
|
|
90
|
+
const indexBuffer = Buffer.allocUnsafe(4)
|
|
91
|
+
indexBuffer.writeUInt32BE(index, 0)
|
|
92
|
+
|
|
93
|
+
const data = concatBuffers([Buffer.alloc(1, 0), secretKey, indexBuffer])
|
|
94
|
+
|
|
95
|
+
const I = hmac(data, chainCode)
|
|
96
|
+
const IL = I.slice(0, 32)
|
|
97
|
+
const IR = I.slice(32)
|
|
98
|
+
return {
|
|
99
|
+
secretKey: IL,
|
|
100
|
+
chainCode: IR
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function generateSaveHDWalletFromSeed (seed: Uint8Array, password: string): HDWallet {
|
|
105
|
+
const walletKey = derivePathFromSeed('m/44h/457h', seed)
|
|
106
|
+
return {
|
|
107
|
+
secretKey: bytesToHex(encryptKey(password, walletKey.secretKey)),
|
|
108
|
+
chainCode: bytesToHex(encryptKey(password, walletKey.chainCode))
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function getSaveHDWalletAccounts (
|
|
113
|
+
saveHDWallet: HDWallet, password: string, accountCount: number
|
|
114
|
+
): Account[] {
|
|
115
|
+
const walletKey = {
|
|
116
|
+
secretKey: decryptKey(password, Buffer.from(saveHDWallet.secretKey, 'hex')),
|
|
117
|
+
chainCode: decryptKey(password, Buffer.from(saveHDWallet.chainCode, 'hex'))
|
|
118
|
+
}
|
|
119
|
+
return (new Array(accountCount)).fill(undefined)
|
|
120
|
+
.map((_, idx) =>
|
|
121
|
+
formatAccount(getKeyPair(derivePathFromKey(`${idx}h/0h/0h`, walletKey).secretKey)))
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export const getHdWalletAccountFromSeed = (
|
|
125
|
+
seed: Uint8Array, accountIdx: number
|
|
126
|
+
): Account & { idx: number } => {
|
|
127
|
+
const walletKey = derivePathFromSeed('m/44h/457h', seed)
|
|
128
|
+
const derived = derivePathFromKey(`${accountIdx}h/0h/0h`, walletKey)
|
|
129
|
+
const keyPair = getKeyPair(derived.secretKey)
|
|
130
|
+
return {
|
|
131
|
+
...formatAccount(keyPair),
|
|
132
|
+
idx: accountIdx
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import JsonBig from 'json-bigint'
|
|
2
|
+
import BigNumber from 'bignumber.js'
|
|
3
|
+
import { mapObject } from './other'
|
|
4
|
+
|
|
5
|
+
const jsonBig = JsonBig({ storeAsString: true })
|
|
6
|
+
|
|
7
|
+
const convertValuesToBigNumbers = (value: any): any => {
|
|
8
|
+
if (typeof value === 'object' && value !== null && value.constructor === Object) {
|
|
9
|
+
return mapObject(value, ([key, value]) => [key, convertValuesToBigNumbers(value)])
|
|
10
|
+
}
|
|
11
|
+
if (Array.isArray(value)) {
|
|
12
|
+
return value.map(item => convertValuesToBigNumbers(item))
|
|
13
|
+
}
|
|
14
|
+
if (typeof value === 'string' && new BigNumber(value).toString(10) === value) {
|
|
15
|
+
const bn = new BigNumber(value)
|
|
16
|
+
bn.toJSON = () => bn.toString(10)
|
|
17
|
+
return bn
|
|
18
|
+
}
|
|
19
|
+
return value
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default {
|
|
23
|
+
stringify: (...args: Parameters<typeof JsonBig['stringify']>): string =>
|
|
24
|
+
jsonBig.stringify(convertValuesToBigNumbers(args[0]), ...args.slice(1)),
|
|
25
|
+
parse: jsonBig.parse
|
|
26
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import nacl from 'tweetnacl'
|
|
2
|
+
import { v4 as uuid } from '@aeternity/uuid'
|
|
3
|
+
import { ArgonType, hash } from '@aeternity/argon2-browser/dist/argon2-bundled.min.js'
|
|
4
|
+
import { getAddressFromPriv } from './crypto'
|
|
5
|
+
import { bytesToHex, hexToBytes } from './bytes'
|
|
6
|
+
import { InvalidPasswordError } from './errors'
|
|
7
|
+
|
|
8
|
+
const DERIVED_KEY_FUNCTIONS = {
|
|
9
|
+
async argon2id (
|
|
10
|
+
pass: string | Uint8Array,
|
|
11
|
+
salt: string | Uint8Array,
|
|
12
|
+
params: Partial<Keystore['crypto']['kdf_params']>
|
|
13
|
+
): Promise<Uint8Array> {
|
|
14
|
+
const { memlimit_kib: mem, opslimit: time } = params
|
|
15
|
+
|
|
16
|
+
return (await hash({
|
|
17
|
+
hashLen: 32,
|
|
18
|
+
pass,
|
|
19
|
+
salt,
|
|
20
|
+
time,
|
|
21
|
+
mem,
|
|
22
|
+
type: ArgonType.Argon2id
|
|
23
|
+
})).hash
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const CRYPTO_FUNCTIONS = {
|
|
28
|
+
'xsalsa20-poly1305': {
|
|
29
|
+
encrypt: nacl.secretbox,
|
|
30
|
+
decrypt (...args: Parameters<typeof nacl.secretbox.open>): Uint8Array {
|
|
31
|
+
const res = nacl.secretbox.open(...args)
|
|
32
|
+
if (res == null) throw new InvalidPasswordError()
|
|
33
|
+
return res
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface Keystore {
|
|
39
|
+
name: string
|
|
40
|
+
version: 1
|
|
41
|
+
public_key: string
|
|
42
|
+
id: string
|
|
43
|
+
crypto: {
|
|
44
|
+
secret_type: 'ed25519'
|
|
45
|
+
symmetric_alg: keyof typeof CRYPTO_FUNCTIONS
|
|
46
|
+
ciphertext: string
|
|
47
|
+
cipher_params: {
|
|
48
|
+
nonce: string
|
|
49
|
+
}
|
|
50
|
+
kdf: keyof typeof DERIVED_KEY_FUNCTIONS
|
|
51
|
+
kdf_params: {
|
|
52
|
+
memlimit_kib: number
|
|
53
|
+
opslimit: number
|
|
54
|
+
parallelism: number
|
|
55
|
+
salt: string
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const CRYPTO_DEFAULTS = {
|
|
61
|
+
secret_type: 'ed25519',
|
|
62
|
+
symmetric_alg: 'xsalsa20-poly1305',
|
|
63
|
+
kdf: 'argon2id',
|
|
64
|
+
kdf_params: {
|
|
65
|
+
memlimit_kib: 65536,
|
|
66
|
+
opslimit: 3,
|
|
67
|
+
parallelism: 1
|
|
68
|
+
}
|
|
69
|
+
} as const
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Symmetric private key encryption using secret (derived) key.
|
|
73
|
+
* @param plaintext - Data to be encrypted.
|
|
74
|
+
* @param key - Secret key.
|
|
75
|
+
* @param nonce - Randomly generated nonce.
|
|
76
|
+
* @param algo - Encryption algorithm.
|
|
77
|
+
* @returns Encrypted data.
|
|
78
|
+
*/
|
|
79
|
+
function encrypt (
|
|
80
|
+
plaintext: Uint8Array,
|
|
81
|
+
key: Uint8Array,
|
|
82
|
+
nonce: Uint8Array,
|
|
83
|
+
algo: keyof typeof CRYPTO_FUNCTIONS = CRYPTO_DEFAULTS.symmetric_alg
|
|
84
|
+
): Uint8Array {
|
|
85
|
+
return CRYPTO_FUNCTIONS[algo].encrypt(plaintext, nonce, key)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Symmetric private key decryption using secret (derived) key.
|
|
90
|
+
* @param ciphertext - Data to be decrypted.
|
|
91
|
+
* @param key - Secret key.
|
|
92
|
+
* @param nonce - Nonce from key-object.
|
|
93
|
+
* @param algo - Encryption algorithm.
|
|
94
|
+
* @returns Decrypted data.
|
|
95
|
+
*/
|
|
96
|
+
function decrypt (
|
|
97
|
+
ciphertext: Uint8Array,
|
|
98
|
+
key: Uint8Array,
|
|
99
|
+
nonce: Uint8Array,
|
|
100
|
+
algo: keyof typeof CRYPTO_FUNCTIONS = CRYPTO_DEFAULTS.symmetric_alg
|
|
101
|
+
): Uint8Array {
|
|
102
|
+
return CRYPTO_FUNCTIONS[algo].decrypt(ciphertext, nonce, key)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Derive secret key from password with key derivation function.
|
|
107
|
+
* @param password - User-supplied password.
|
|
108
|
+
* @param nonce - Randomly generated nonce.
|
|
109
|
+
* @param kdf - Key derivation function.
|
|
110
|
+
* @param kdfParams - KDF parameters.
|
|
111
|
+
* @returns Secret key derived from password.
|
|
112
|
+
*/
|
|
113
|
+
async function deriveKey (
|
|
114
|
+
password: string | Uint8Array,
|
|
115
|
+
nonce: string | Uint8Array,
|
|
116
|
+
kdf: Keystore['crypto']['kdf'],
|
|
117
|
+
kdfParams: Omit<Keystore['crypto']['kdf_params'], 'salt'>
|
|
118
|
+
): Promise<Uint8Array> {
|
|
119
|
+
return await DERIVED_KEY_FUNCTIONS[kdf](password, nonce, kdfParams)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Recover plaintext private key from secret-storage key object.
|
|
124
|
+
* @param password - Keystore object password.
|
|
125
|
+
* @param keystore - Keystore object.
|
|
126
|
+
* @returns Plaintext private key.
|
|
127
|
+
*/
|
|
128
|
+
export async function recover (
|
|
129
|
+
password: string | Uint8Array, { crypto }: Keystore
|
|
130
|
+
): Promise<string> {
|
|
131
|
+
const salt = hexToBytes(crypto.kdf_params.salt)
|
|
132
|
+
return bytesToHex(decrypt(
|
|
133
|
+
hexToBytes(crypto.ciphertext),
|
|
134
|
+
await deriveKey(password, salt, crypto.kdf, crypto.kdf_params),
|
|
135
|
+
hexToBytes(crypto.cipher_params.nonce),
|
|
136
|
+
crypto.symmetric_alg
|
|
137
|
+
))
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Export private key to keystore secret-storage format.
|
|
142
|
+
* @param name - Key name.
|
|
143
|
+
* @param password - User-supplied password.
|
|
144
|
+
* @param privateKey - Private key as hex-string or a Buffer.
|
|
145
|
+
* @param nonce - Randomly generated 24byte nonce.
|
|
146
|
+
* @param salt - Randomly generated 16byte salt.
|
|
147
|
+
* @param options - Encryption parameters.
|
|
148
|
+
* @param options.kdf - Key derivation function.
|
|
149
|
+
* @param options.kdf_params - KDF parameters.
|
|
150
|
+
*/
|
|
151
|
+
export async function dump (
|
|
152
|
+
name: string,
|
|
153
|
+
password: string | Uint8Array,
|
|
154
|
+
privateKey: string | Uint8Array,
|
|
155
|
+
nonce: Uint8Array = nacl.randomBytes(24),
|
|
156
|
+
salt: Uint8Array = nacl.randomBytes(16),
|
|
157
|
+
options?: Partial<Keystore['crypto']>
|
|
158
|
+
): Promise<Keystore> {
|
|
159
|
+
const opt = { ...CRYPTO_DEFAULTS, ...options }
|
|
160
|
+
const derivedKey = await deriveKey(password, salt, opt.kdf, opt.kdf_params)
|
|
161
|
+
const payload = typeof privateKey === 'string' ? hexToBytes(privateKey) : privateKey
|
|
162
|
+
return {
|
|
163
|
+
name,
|
|
164
|
+
version: 1,
|
|
165
|
+
public_key: getAddressFromPriv(payload),
|
|
166
|
+
id: uuid(),
|
|
167
|
+
crypto: {
|
|
168
|
+
secret_type: opt.secret_type,
|
|
169
|
+
symmetric_alg: opt.symmetric_alg,
|
|
170
|
+
ciphertext: bytesToHex(encrypt(payload, derivedKey, nonce, opt.symmetric_alg)),
|
|
171
|
+
cipher_params: { nonce: bytesToHex(nonce) },
|
|
172
|
+
kdf: opt.kdf,
|
|
173
|
+
kdf_params: {
|
|
174
|
+
...opt.kdf_params,
|
|
175
|
+
salt: bytesToHex(salt)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
package/src/utils/mptree.ts
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import { encode as rlpEncode } from 'rlp'
|
|
19
19
|
import type { Input } from 'rlp'
|
|
20
|
-
import { hash } from './crypto
|
|
20
|
+
import { hash } from './crypto'
|
|
21
21
|
import {
|
|
22
22
|
MerkleTreeHashMismatchError,
|
|
23
23
|
MissingNodeInTreeError,
|
|
@@ -43,9 +43,8 @@ export default class MPTree {
|
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Deserialize Merkle Patricia Tree
|
|
46
|
-
* @
|
|
47
|
-
* @
|
|
48
|
-
* @return {MPTree} Merkle Patricia Tree
|
|
46
|
+
* @param binary - Binary
|
|
47
|
+
* @returns Merkle Patricia Tree
|
|
49
48
|
*/
|
|
50
49
|
constructor (binary: MPTreeBinary) {
|
|
51
50
|
this.rootHash = binary[0].toString('hex')
|
|
@@ -80,17 +79,20 @@ export default class MPTree {
|
|
|
80
79
|
return this.rootHash === tree.rootHash
|
|
81
80
|
}
|
|
82
81
|
|
|
83
|
-
private static parseNode (node: Buffer[]): {
|
|
82
|
+
private static parseNode (node: Buffer[]): {
|
|
83
|
+
type: NodeType
|
|
84
|
+
payload: Buffer[]
|
|
85
|
+
path: string | null
|
|
86
|
+
} {
|
|
84
87
|
switch (node.length) {
|
|
85
88
|
case 17:
|
|
86
89
|
return { type: NodeType.Branch, payload: node, path: null }
|
|
87
90
|
case 2: {
|
|
88
|
-
const
|
|
89
|
-
const nibble = parseInt(path[0], 16)
|
|
91
|
+
const nibble = node[0][0] >> 4
|
|
90
92
|
if (nibble > 3) throw new UnknownPathNibbleError(nibble)
|
|
91
93
|
const type = nibble <= 1 ? NodeType.Extension : NodeType.Leaf
|
|
92
94
|
const slice = [0, 2].includes(nibble) ? 2 : 1
|
|
93
|
-
return { type, payload: [node[1]], path:
|
|
95
|
+
return { type, payload: [node[1]], path: node[0].toString('hex').slice(slice) }
|
|
94
96
|
}
|
|
95
97
|
default:
|
|
96
98
|
throw new UnknownNodeLengthError(node.length)
|
|
@@ -99,8 +101,7 @@ export default class MPTree {
|
|
|
99
101
|
|
|
100
102
|
/**
|
|
101
103
|
* Serialize Merkle Patricia Tree
|
|
102
|
-
* @
|
|
103
|
-
* @return {Array} Binary
|
|
104
|
+
* @returns Binary
|
|
104
105
|
*/
|
|
105
106
|
serialize (): MPTreeBinary {
|
|
106
107
|
return [
|
|
@@ -114,9 +115,8 @@ export default class MPTree {
|
|
|
114
115
|
|
|
115
116
|
/**
|
|
116
117
|
* Retrieve value from Merkle Patricia Tree
|
|
117
|
-
* @
|
|
118
|
-
* @
|
|
119
|
-
* @return {Buffer} Value associated to the specified key
|
|
118
|
+
* @param key - The key of the element to retrieve
|
|
119
|
+
* @returns Value associated to the specified key
|
|
120
120
|
*/
|
|
121
121
|
get (key: string): Buffer | undefined {
|
|
122
122
|
let searchFrom = this.rootHash
|
|
@@ -125,7 +125,7 @@ export default class MPTree {
|
|
|
125
125
|
switch (type) {
|
|
126
126
|
case NodeType.Branch:
|
|
127
127
|
if (key.length === 0) return payload[16]
|
|
128
|
-
searchFrom = payload[
|
|
128
|
+
searchFrom = payload[+`0x${key[0]}`].toString('hex')
|
|
129
129
|
key = key.substr(1)
|
|
130
130
|
break
|
|
131
131
|
case NodeType.Extension:
|
package/src/utils/other.ts
CHANGED
|
@@ -1,51 +1,36 @@
|
|
|
1
|
-
import { snakeToPascal, pascalToSnake } from './string'
|
|
2
|
-
|
|
3
1
|
export const pause = async (duration: number): Promise<void> =>
|
|
4
2
|
await new Promise(resolve => setTimeout(resolve, duration))
|
|
5
3
|
|
|
6
|
-
export const mapObject = (
|
|
7
|
-
object:
|
|
8
|
-
fn: (
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
object: object,
|
|
13
|
-
fn: (value: [string, any], index: number, array: Array<[string, any]>) => boolean
|
|
14
|
-
): object => Object.fromEntries(Object.entries(object).filter(fn))
|
|
4
|
+
export const mapObject = <InputV, OutputV>(
|
|
5
|
+
object: { [k: string]: InputV },
|
|
6
|
+
fn: (
|
|
7
|
+
value: [string, InputV], index: number, array: Array<[string, InputV]>
|
|
8
|
+
) => [number | string, OutputV]
|
|
9
|
+
): { [k: string]: OutputV } => Object.fromEntries(Object.entries(object).map(fn))
|
|
15
10
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export const traverseKeys = (fn: Function, object: any): any => {
|
|
26
|
-
if (typeof object !== 'object' || object === null) return object
|
|
27
|
-
if (Array.isArray(object)) return object.map(i => traverseKeys(fn, i))
|
|
28
|
-
return mapObject(object, ([key, value]: [string, any]) => [
|
|
29
|
-
fn(key), traverseKeys(fn, value)
|
|
30
|
-
])
|
|
31
|
-
}
|
|
11
|
+
// remove after dropping webpack4 support
|
|
12
|
+
const isWebpack4Buffer = (() => {
|
|
13
|
+
try {
|
|
14
|
+
Buffer.concat([Uint8Array.from([])])
|
|
15
|
+
return false
|
|
16
|
+
} catch (error) {
|
|
17
|
+
return true
|
|
18
|
+
}
|
|
19
|
+
})()
|
|
32
20
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
* @param {Object} object - Object to traverse
|
|
38
|
-
* @return {Object} Transformed object
|
|
39
|
-
* @see pascalToSnake
|
|
40
|
-
*/
|
|
41
|
-
export const snakizeKeys = traverseKeys.bind(null, pascalToSnake)
|
|
21
|
+
export const concatBuffers = isWebpack4Buffer
|
|
22
|
+
? (list: readonly Uint8Array[], totalLength?: number): Buffer =>
|
|
23
|
+
Buffer.concat(list.map(el => Buffer.from(el)), totalLength)
|
|
24
|
+
: Buffer.concat
|
|
42
25
|
|
|
43
26
|
/**
|
|
44
|
-
*
|
|
45
|
-
* @
|
|
46
|
-
* @
|
|
47
|
-
* @param {Object} object - Object to traverse
|
|
48
|
-
* @return {Object} Transformed object
|
|
49
|
-
* @see snakeToPascal
|
|
27
|
+
* Object key type guard
|
|
28
|
+
* @param key - Object key
|
|
29
|
+
* @param object - object
|
|
50
30
|
*/
|
|
51
|
-
export
|
|
31
|
+
export function isKeyOfObject<T> (
|
|
32
|
+
key: string | number | symbol,
|
|
33
|
+
object: T
|
|
34
|
+
): key is keyof T {
|
|
35
|
+
return key in object
|
|
36
|
+
}
|
package/src/utils/string.ts
CHANGED
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Convert string from snake_case to PascalCase
|
|
20
|
-
* @
|
|
21
|
-
* @
|
|
22
|
-
* @return {String} Converted string
|
|
20
|
+
* @param s - String to convert
|
|
21
|
+
* @returns Converted string
|
|
23
22
|
*/
|
|
24
23
|
export function snakeToPascal (s: string): string {
|
|
25
24
|
return s.replace(/_./g, match => match[1].toUpperCase())
|
|
@@ -27,9 +26,8 @@ export function snakeToPascal (s: string): string {
|
|
|
27
26
|
|
|
28
27
|
/**
|
|
29
28
|
* Convert string from PascalCase to snake_case
|
|
30
|
-
* @
|
|
31
|
-
* @
|
|
32
|
-
* @return {String} Converted string
|
|
29
|
+
* @param s - String to convert
|
|
30
|
+
* @returns Converted string
|
|
33
31
|
*/
|
|
34
32
|
export function pascalToSnake (s: string): string {
|
|
35
33
|
return s.replace(/[A-Z]/g, match => `_${match.toLowerCase()}`)
|
|
@@ -37,8 +35,8 @@ export function pascalToSnake (s: string): string {
|
|
|
37
35
|
|
|
38
36
|
/**
|
|
39
37
|
* Check whether a string is valid hex.
|
|
40
|
-
* @param
|
|
41
|
-
* @
|
|
38
|
+
* @param str - String to validate.
|
|
39
|
+
* @returns True if the string is valid hex, false otherwise.
|
|
42
40
|
*/
|
|
43
41
|
export function isHex (str: string): boolean {
|
|
44
42
|
return str.length % 2 === 0 && /^[0-9a-f]+$/i.test(str)
|
|
@@ -46,8 +44,8 @@ export function isHex (str: string): boolean {
|
|
|
46
44
|
|
|
47
45
|
/**
|
|
48
46
|
* Check whether a string is valid base-64.
|
|
49
|
-
* @param
|
|
50
|
-
* @
|
|
47
|
+
* @param str - String to validate.
|
|
48
|
+
* @returns True if the string is valid base-64, false otherwise.
|
|
51
49
|
*/
|
|
52
50
|
export function isBase64 (str: string): boolean {
|
|
53
51
|
if (str.length % 4 > 0 || /[^0-9a-z+/=]/i.test(str)) return false
|