Most wallets use the Bitcoin Improvement Proposal (BIP39) to generate seed words. Recovering a seed phrase will only discover sub-wallets that have a transaction history? Watching and sharing these videos is one way to do that. encryption/decryption failures. certain characteristics. Under the hood, there are a lot of steps to go from that mnemonic phrase to the resulting address. Browse other questions tagged, Where developers & technologists share private knowledge with coworkers, Reach developers & technologists worldwide. a mnemonic brute forcing tool for nano and banano. Learn more about Stack Overflow the company, and our products. 128 bits is not evenly divisible by 12, though. Code Issues Pull requests Bitcoin emoji wallet (mnemonic seed with emoji instead of words) emoji bitcoin cryptocurrency mnemonic-phrase Updated Mar 23, 2022 . Is there such a thing as "right to be heard" by the authorities? The larger the entropy, the more mnemonic words generated, and the greater the security of your wallets. When you put in the 23 words the code comes up with the 24th word as "type" which is not correct. There have been no other changes. The user can derive any number of keys from the mnemonic phrase. Some operation modes require the plaintext message to be a multiple of 16. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Credentials credentials = WalletUtils.loadBip39Credentials (password, mnemonic); String address = credentials.getAddress (); I can import my wallet by this: Credentials credentials = WalletUtils.loadBip39Credentials (password, mnemonic); but in this way I need password & mnemonic ,How I import or recovery my . entropy_bits and entropy_bytes are two representations of the same number. If the null hypothesis is never really true, is there a point to using a statistical test without a priori power analysis? Are you sure you want to create this branch? The BIP 39 formula accounts for this by adding a checksum to the end of the entropy. Why don't we use the 7805 for car phone chargers? Are they the same thing? It is a unique wallet phrase that gives you a human readable format of words to backup your wallet for recovery. It is typically a phrase that allows you to access an infinite number of accounts. contain the exact reason for the error. Content Discovery initiative April 13 update: Related questions using a Review our technical responses for the 2023 Developer Survey, Obtain public key byte array from Json Web Key. However, you cannot export a private key on imToken. BIP-39 covers only the seed. A JavaScript script that converts the mnemonic phrase into a wallet private key using the ethers.js library. Could a subterranean river or aquifer generate enough continuous momentum to power a waterwheel for the purpose of producing electricity? If this is not the case, the security of secp256k1 is The BIP 39 spec states that this entropy can only come in a few sizes: multiples of 32 bits, between 128 and 256. Why did DOS-based Windows require HIMEM.SYS to boot? The hackers were using a bot to scan for the mnemonic phrases across GitHub, and I accidentally left it in my code on a GitHub repo while I was sending to a Hack Money hack-at-hon," the Redditor wrote today. What does 'They're at four. If your device gets stolen or a wallet vendor goes out of business, you can fully restore multiple wallets with just those random 1224 words. There is a library called tweetNacl that have several functionalities including generating a keyPair from a seed. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. The private (or 'secret') key should only ever be accessible to an account owner. the supported bundlers is too high. If your wallet is misplaced or damaged, you can use the seed word to recover your digital assets. as it will block its main thread and hang your UI. https://github.com/bitwiseshiftleft/sjcl, jQuery - In this demo we enter "phrase brief ceiling dream rack install fault insane panic surround glory ? Find and sweep all the funds spendable by your bitcoin private key. By default, this module automatically pads your messages according to PKCS#7. which had MIT License. You can also get the private key from mnemonic using: What is the easiest way to convert mnemonic phrase into keystore file? algorithm. https://github.com/iancoleman/bip39. Learn more about the CLI. https://kzen-networks.github.io/mnemonic-recovery/ Step 3. Instead, errors must report general Python code snippets will be used to demonstrate the concepts along the way. Why refined oil is cheaper than cold press oil? These coin types are defined in SLIP-44, an . Why does the narrative change back and forth between "Isabella" and "Mrs. John Knightley" to refer to Emma's sister? Note that this padding scheme always adds at least 1 byte of padding. Also, it would be best to keep the phrase secret since anyone with access to the seed words can access your crypto wallets. AES is not supposed to be used directly with a password. on any offline computer. Mnemonic phrases may seem very simple at first glance: You enter your mnemonic phrase on MyCrypto, click a few buttons and you get an address. To learn more, see our tips on writing great answers. When combined with additional data, the mnemonic generates a hash known as the 'master key'. The scrypt submodule has two functions implementing the Scrypt key Which language's style guidelines should be used when writing code that is supposed to be called from another language? https://github.com/iancoleman/jsbip39, sjcl - The only argument we havent covered yet is the salt. The reason for this is that importing everything from a single file will lead to How does it relate to a bitcoin or ethereum private key? If you dont supply one, the passphrase will default to an empty string. Connect and share knowledge within a single location that is structured and easy to search. January 2022 update: We've released v1.0 of the package, a complete rewrite: The cryptographic primitives included are: See browser usage for information on using the package with major Javascript bundlers. For reference, each 32 bits beyond 128 adds three more mnemonic words to the sentence the upper bounds being 24 words, using a 256-bit random number. Check out the audit PDF & URL. To subscribe to this RSS feed, copy and paste this URL into your RSS reader. Learn more at https://aantonop.com***Learn More From Andreas Workshops, Books \u0026 Events** Amazon \u0026 Kindle: http://www.amazon.com/-/e/B00MVAG8Z8 Audible: https://www.audible.com/author/Andreas-M-Antonopoulos/B00MVAG8Z8E-books \u0026 Merch: https://aantonop.io/shopPatreon: https://patreon.com/aantonop Website: https://aantonop.com Workshops: https://aantonop.com/workshops***Connect with Andreas on Socials***Facebook: https://www.facebook.com/AndreasMAntonopoulosInstagram: https://www.instagram.com/amantonop/LinkedIn: https://www.linkedin.com/company/aantonop/Twitter: https://twitter.com/aantonop Thanks for watching! Double-click that file to open it in a browser This checksum gets appended to the end of the entropy_bits, bringing the total bits to 132 a number evenly divisible into 12 groups of 11 bits. For this example, well assume the English word list is already loaded into memory. Everyone else gets to ask questions and vote on questions when the event starts. This video was made as a followup to the \"Can Someone Guess My Bitcoin Private Key\" video here: https://youtu.be/2eZ5DP2P5As You may want to watch that video first to really understand what's being explained. A tag already exists with the provided branch name. It discusses the bitcoin improvement proposal BIP39 and its implementation. It is typically a phrase that allows you to access an infinite number of accounts. The next post is available here: Ethereum 201: HD Wallets. Are seeds and mnemonics the same thing? To find the checksum length, divide the entropy size (e.g. By default it will use m/44'/60'/0'/0/0, but if you want to get the second account, you can use m/44'/60'/0'/0/1 for example: const { Wallet } = require ('ethers'); const wallet = Wallet.fromMnemonic ('one two three four .', `m/44'/60'/0'/0/1`); Find centralized, trusted content and collaborate around the technologies you use most. Note: If you prefer to skip straight to the code, or want to run it as you read, the implementation is available within a Jupyter notebook here. Branches from this root can then be derived using a hierarchical path so that child nodes can exist as combinations of their parent node's hash and their index in the tree. Private key corresponds to the an Ethereum address and public key. 3 Answers. too much. The KDF supports sha256 and sha512 digests. Should I re-do this cinched PEX connection? Hint: turn on closed captions to help you remember what's being taught.Chapters0:00 If a bitcoin private key is such a big number and you can never guess it, how does relate to mnemonic phrases?1:03 Let's discuss what a mnemonic phrase actually is. Author of Redux in Action: http://bit.ly/redux-in-action. Work fast with our official CLI. . Choose the 'Software' option to connect, then select 'Mnemonic Phrase' and click 'Continue'. Short story about swapping bodies as a job; the person who hires the main character misuses his body. imToken 2.5.5, now with ETH-free transactions. In macOS it is located at /Users//Library/Ethereum//keystore. The validator signing key consists of two elements: The purpose of the validator private key is to sign on-chain operations such as block proposals and attestations. Help us translate the latest version. How a mnemonic phrase is generated from an entropy. encrypted data. Note: The default account_path matches Ethereum and BSC as well. Do I need to encrypt the keystore file(s)? What are the advantages of running a power tool on 240 V vs 120 V? That means that you'll need to do the following procedure for each private key you want to import on the Ethereum Wallet. If the null hypothesis is never really true, is there a point to using a statistical test without a priori power analysis? The first four of the SHA-256 hash of the entropy: The first 4 bits in this case are 1110. How to recover all additional accounts belonging to a MetaMask seed phrase? The accounts you can access with this phrase are determined by the technical "path". Does a password policy with a restriction of repeated characters increase security? If you need to encrypt without padding or want to use another padding scheme, Improve this question. BLS enables a very efficient aggregation of signatures but also allows reverse engineering of aggregated individual validator keys and is ideal for managing actions between validators. For seed based recovery, this is primarily useful in situations where you have lost/forgotten parts of your mnemonic, or have made an error transcribing it. The inputs to this function are the pseudorandom function (HMAC-SHA512), a password (our mnemonic sentence), a salt, and the number of iterations the hash function will run (2048). There is the next step where I need to convert it into 64 characters of hex-string. Use any type for TextEncoder, webcrypto. Which was the first Sci-Fi story to predict obnoxious "robo calls"? Alternatively, download the file from the repository This module exports a single class HDKey, which should be used like this: Note: chainCode property is essentially a private part However, users needed a new type of key for participating in proof-of-stake by staking ETH and running validators. with aes-128-ctr, aes-128-cbc, and aes-256-cbc. Use Git or checkout with SVN using the web URL. Get Bip39's source code from the repository. pseudo-random data in synchronous and asynchronous ways. Each branch is separated by a / so m/2 means start with the master key and follow branch 2. Were expecting 12 mnemonic words in the end, so were going to want to chop up our data into 12 groups. This module is only for users who upgraded mnemonic-phrase For more info see the BIP39 spec . Its only difference is that it has to be used with a named import. You can use this tool without having to be online. ethereum-cryptography is released under The MIT License (MIT), Copyright (c) 2021 Patricio Palladino, Paul Miller, ethereum-cryptography contributors, hdkey is loosely based on hdkey, The bip39 submodule provides functions to generate, validate and use seed You should be able to generate a keyPair from a seed with something like a function like this. Did the drapes in old theatres actually say "ASBESTOS" on them? Asking for help, clarification, or responding to other answers. Usually, it is recommended to write this passphrase down on a piece of paper and store it in a "safe place". 566), Improving the copy in the close modal and post notices - 2023 edition, New blog post from our CEO Prashanth: Community is the future of AI. very slow, and using the synchronous version in the browser is not recommended, https://github.com/3rdIteration/mnemonic-recovery, The project is based on Ian Coleman's Bip39 project. The best answers are voted up and rise to the top, Not the answer you're looking for? compromise your users' security. Please refer to the software license for more detail. Generating a mnemonic phrase begins with creating an entropy (128, 160, 192, 224, 256bits). Check balances, A minimal Python script for recovering your mnemonic phrase, Bitcoin emoji wallet (mnemonic seed with emoji instead of words), Offline Multicoin Wallet Generation in Python, Pyromid For Hack and Cracking Private Key and Address Bitcoin Wallet From Mnemonic [Words - Passphrase], How Jason Bourne Stores His Bitcoin in 2021, BIP 39 eth vanity address generator using mnemonic phrase, Python code to help an Algorand (ALGO) crypto wallet holder recover a private key phrase given limited typo or ordering issues when transcribing the words, Crystal implementation of wallet mnemonic (compatible with javascript version). It must be a better way but here's how I did it. Upgrading from 0.1 to 1.0: Same functionality, all old APIs remain the same except for the breaking changes: Audited by Cure53 on Jan 5, 2022. The API of secp256k1-compat is the same as secp256k1-node: This package intentionally excludes the cryptographic primitives necessary The size of the checksum is dependent on the size of the entropy. These are not imported by default, as that would increase bundle sizes Happy New Year . This submodule works with different block cipher modes of operation. This can be done by providing an execution address in the deposit data during initial key generation, OR by using the withdrawal key at a later time to sign and broadcast a BLSToExecutionChange message. I have not tried the dart one myself but you should be able to generate a keyPair from a seed. exception. I have been searching but I can't manage to achieve it. In Python-land, hashlibs pbkdf2_hmac function is the one were looking for. hdkey from cryptocoinjs, By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. The withdrawal key will be required to update withdrawal credentials to point to an execution address, if not set during initial deposit. Commonly referred to as mnemonic phrases, seed phrases, recovery phrases, or 12- or 24-word phrases (depending on the length), Secret Recovery Phrase are a group of random . to implement the following EIPs: Feel free to open an issue if you want this decision to be reconsidered, or if By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. Then, both the mnemonic and the salt need to be converted to bytes. ethereum-cryptography Usage Hashes: SHA256, keccak-256, RIPEMD160, BLAKE2b KDFs: PBKDF2, Scrypt CSPRNG (Cryptographically strong pseudorandom number generator) secp256k1 curve BIP32 HD Keygen BIP39 Mnemonic Seed Phrase AES Encryption Encrypting with passwords Operation modes Padding plaintext messages How to use the IV parameter How to handle . convert mnemonic code to seed (mnemonic code converter), calculate derivation paths/addresses from mnemonics, If a word is missing or unknown, please type "?" User without create permission can create a custom object from Managed package using Custom Rest API. instead and the tool will find all relevant options. A mnemonic phrase is a collection of between 12 and 24 English words which is used to back up your own wallet. The tool is a minimally modifed version of the Seed Savior Tool found here: of the encryption algorithm can be compromised. However, when Ethereum switched from .css-1x1y8s5{transition-property:var(--eth-transition-property-common);transition-duration:var(--eth-transition-duration-fast);transition-timing-function:var(--eth-transition-easing-ease-out);cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;outline:2px solid transparent;outline-offset:2px;color:var(--eth-colors-primary);white-space:normal;}.css-1x1y8s5:hover,.css-1x1y8s5[data-hover]{-webkit-text-decoration:underline;text-decoration:underline;}.css-1x1y8s5:focus-visible,.css-1x1y8s5[data-focus-visible]{box-shadow:var(--eth-shadows-none);outline:auto;}.css-1x1y8s5:focus,.css-1x1y8s5[data-focus]{box-shadow:var(--eth-shadows-none);}proof-of-work to proof-of-stake a new type of key was added to Ethereum. You can enter an existing BIP39 mnemonic, or generate a new random one. For simplicitys sake, well choose a 128-bit entropy, from which we can expect to derive 12 mnemonic words. Note: if you follow along at home, you will see different results than are displayed in these examples. What is the easier / most convenient way to convert 12 words mnemonic phrase into keystore? Finally, the mnemonic sentence is converted to the mnemonic seed phrase using the PBKDF2 hash function. Please For example: The HDNode can also be used to get an instance of Wallet. This option is only present to enable the decryption of already encrypted data. Step 1. Can I run it offline? Note: if you've been using ethereum-cryptography v0.1, it had different API. Firstly it's important to understand that the mnemonic phrase could be used to generate an infinite number of private keys and the JSON Keystore format stores just one private key. I'd like to import that account into Ethereum Wallet. If a word is wrong, the tool will try to suggest the closest option. Watch this video to understand how mnemonic phrases work, why they're used in bitcoin, why they're considered secure. When combined with additional data, the mnemonic generates a hash known as the 'master key'. This algorithm is Some Google search: https://www.reddit.com/r/ethereum/comments/5zzwh0/can_mnemonics_currently_be_used_to_create_a_utf/. Select the appropriated network on the upper right corner, Type your password and unlock the account, Select the correct derivation path. Add a description, image, and links to the But I want to create the account using a mnemonic phrase like "hello john pizza guitar". Making statements based on opinion; back them up with references or personal experience. Stack Exchange network consists of 181 Q&A communities including Stack Overflow, the largest, most trusted online community for developers to learn, share their knowledge, and build their careers. You can find more information in this blog post. The implementation is loosely based on hdkey, which has MIT License. Could a subterranean river or aquifer generate enough continuous momentum to power a waterwheel for the purpose of producing electricity? Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word contains a checksum). Backed by crypto.getRandomValues in browser and by crypto.randomBytes in node.js. Before the switch to proof-of-stake, Ethereum users only had a single elliptic-curve-based private key to access their funds. To produce the salt, the string mnemonic is concatenated with an optional passphrase of your choosing. Which four bits? Per Ethereum.org - "Ethereum wallets are applications that let you interact with your Ethereum account. Mnemonic phrases and passphrases are the only solution or key that can recover your valuable cryptocurrencies in the event of loss/damage of wallet, or corruption of the data. Thanks for contributing an answer to Stack Overflow! Ethereum Address Wallet Generated With Private Key From Mnemonic and check Value (Balance , transaction) Without API python ethereum python3 eth mnemonic mnemonic-generator Updated on Jan 4 Python Pymmdrza / Ethereum_PrivateKey_Address_Generator Star 47 Code Issues Pull requests Discussions Also available as standalone package scure-bip32. I want to use that code to recover all the accounts from that Mnemonic. We've intentionally left this page in English for now. The tool suggests several options for the missing word and the relevant one will be "asset". By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. The mnemonic is used to derive multiple private keys. Here is an example of what it should look like: scissors invite lock maple supreme raw rapid void congress muscle digital elegant little brisk hair mango congress clump. Thanks for contributing an answer to Ethereum Stack Exchange! Is it safe to publish research papers in cooperation with Russian academics? Can someone guess my bitcoin private key or mnemonic? noble-curves, Which language's style guidelines should be used when writing code that is supposed to be called from another language? Word lists come in several languages, but each has 2048 words. This can be thought of as the root of a tree. It's not them. Connect and share knowledge within a single location that is structured and easy to search. Can someone guess my. An excellent example is a stone or metal tablet. The random submodule has functions to generate cryptographically strong library brother hill sauce access child notice picnic dinner panda purity poem". You can generate a new iv using the random module. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. In the newer ethers version, this is slightly changed. I generated a new mnemonic using bip39 package: bip39.generateMnemonic(). Ethereum: a next generation smart contract and decentralized . Retrieving the account using the mnemonic backup seed words A backup seed sentence is a human friendly way to recover all the generated addresses, since Hd Wallets generate addresses deterministically, we can now regenerate them at anytime using our seed sentence and retrieve them using an index number.\ http://getbootstrap.com/, Alternatively, download the file from the repository, The project is based on Ian Coleman's Bip39 project. To learn more, see our tips on writing great answers. Here are a few tips to help you store your seed words safely: Write it down and store the paper in a safe place, Make several copies of the paper with the seed phrase for safety, Store the recovery phrase offline to prevent hacking. A (typically) 12 or 24 word phrase that allows you to access infinite number of accounts. but it's backed by this package's primitives, and has built-in TypeScript types. primitive. How to force Unity Editor/TestRunner to run at full speed when in background? Disclaimer, again: code provided is for educational purposes. but we're keeping it around for now, for backwards-compatibility. How do Mnemonic Phrases Work? The account . Indeed, this mnemonic phrase is a really sensitive piece of information since anyone knowing that phrase can get full control of the crypto assets held by the wallet. If every 32 ETH staked required a new set of 2 completely independent keys, key management would quickly become unwieldy, especially for users running multiple validators. const mnemonic = bip39 . Alternatively, the demo included in the original Seed Savior should give a pretty good impression of how this tool works. Next, the entropy is encoded in words by adding a checksum to it. ZEN: znUihTHfwm5UJS1ywo911mdNEzd9WY9vBP7, The tool will suggest several options for the missing word and the relevant one will be "asset", with the following Ethereum address, listed in the "BIP44 ETH Address" column "0x2dfF20b40504f99c6314ac30e8DF5c02dd8058e7". At a high level, were looking to start with a random number, slice it up into the number of words we want in our mnemonic sentence, then convert each chunk of data into an English word. If you Well need both representations later. Which ability is most related to insanity: Wisdom, Charisma, Constitution, or Intelligence? Java 120 char ECDSA public key to 130 char or Ethereum address. rev2023.5.1.43405. . It has almost the exact same API than the version 1.x of are unsure what anything of this means, we strongly recommend you to use The mnemonic phrase can be converted to a number which is used as the seed to a deterministic wallet that generates all the key pairs used in the wallet. I need help! This will enable excess balance payments to begin being processed, and will also allow users to fully withdraw their staked ETH. (Ep. Not the answer you're looking for? 1) Generate Random Seed Phase. Hierarchical deterministic wallets like a Ledger device, Trezor device and mnemonic phrase are able to generate many different addresses from a single seed by using derivation paths. Engrave the seed phrase in something more durable than paper. "A hacker got my mnemonic and stole $1,200 in ethereum from my Metamask wallet in under 100 seconds. Step 2. 1:23 Cryptographic keys are just numbers. You can enter an existing BIP39 mnemonic and get derived adresses in various formats. The hdkey submodule provides a library for keys derivation according to So, lets find that seed and wrap this up. Recover all the account under Mnemonic using ethers.js, When AI meets IP: Can artists sue AI imitators? you found another primitive that is missing. Why are players required to record the moves in World Championship Classical games? You can create them manually by going to this site, insert your words into the BIP39 Mnemonic field and choose ETH from the Coin field. To learn more, see our tips on writing great answers. ), then 2) the generation of a seed from that mnemonic sentence. You can see how keys and addresses are computed from the seed. The following Python one-liner does just that: The next step is to convert each 11-bit group into integers. https://github.com/bitcoinjs/bitcoinjs-lib, jsBIP39 - Otherwise it is a serious security issue. At this point, we have twelve integers, each representing a word in a word list. The mnemonic is, in general, used to derive a tree of public-private key pairs for BIP39 format. Exposes following cryptographic hash functions: The pbkdf2 submodule has two functions implementing the PBKDF2 key Mnemonic phrases play a crucial role in the world of cryptocurrencies. 2) Generate the Master Public address by entering your Seed phrase. What Is The Easiest Way To Split ETC from ETH in 2017. Error invalidor incorrect length when importing mnemonic. Why BIP 39? The resulting integers should range from zero to 2047 (i.e., ba2int(bitarray(11111111111)) == 2047). https://github.com/3rdIteration/mnemonic-recovery/, Get the source code from the repository 3) You can check Ethereum, Binance, and Matic Blockchain Balance. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. If this was helpful, feel free to send me a tip: The iv parameter of the encrypt function must be unique, or the security Advanced mode features. If the null hypothesis is never really true, is there a point to using a statistical test without a priori power analysis? On the MEW front page, select 'Access My Wallet'. This is known as the deposit data and it allows Ethereum to identify the validator. secp256k1 private keys need to be cryptographically secure random numbers with Ready for some code? Deciphering "Fake Money" marketing tricks on Ethereum. How to generate a private key for Ethereum from the mnemonic? I have an account created with Metamask - there is 12 words backup phrase. Instead, multiple validator keys can be derived from a single common secret and storing that single secret allows access to multiple validator keys. There was a problem preparing your codespace, please try again. YouTube Community Members who support this work get to ask questions and vote an hour before the event starts. Doing that will Should I re-do this cinched PEX connection? 1:42 What is a mnemonic phrase?2:10 Bitcoin Improvement Proposal or BIP39 is the standard for seed phrases3:03 There are 2048 words in the BIP39 dictionary4:00 How do you make a number out of words?6:09 Example of how to take a number like a bitcoin private key and encode it in 24 words8:06 Derivation function that allows you to take the mnemonic and generate the same sequence of keys8:27 Summary of why a mnemonic phrase is as secure as a bitcoin private key written in decimal or binaryThis video help explains how mnemonic phrases or mnemonic seeds as they're often called, relate to cryptocurrency private keys. key derivation function What differentiates living as mere roommates from living in a marriage-like relationship? Theres a new version of this page but its only in English right now. requires padding, encrypt will throw if your plaintext message isn't a to use Codespaces. - The tool is a minimally modifed version of the Seed Savior Tool found here: https://github.com/3rdIteration/mnemonic-recovery/, https://github.com/3rdIteration/mnemonic-recovery, https://kzen-networks.github.io/mnemonic-recovery/, https://github.com/bitcoinjs/bitcoinjs-lib.