Skip to content

Commit

Permalink
Algorand generate wallet (#142)
Browse files Browse the repository at this point in the history
* update

* deleted algo_constant

* fixed

Co-authored-by: Samuel@Tatum <[email protected]>
  • Loading branch information
JeyDev310 and samuelsramko authored Sep 7, 2021
1 parent 83c56f0 commit adc75ec
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 8 deletions.
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"dist/"
],
"scripts": {
"test": "jest",
"clean": "rimraf dist*",
"build": "tsc",
"prepublish": "npm run clean && npm run build",
Expand Down Expand Up @@ -40,8 +41,10 @@
"@onflow/types": "^0.0.4",
"@onflow/util-encode-key": "^0.0.2",
"@tatumio/bitcoincashjs2-lib": "4.1.2",
"algosdk": "^1.11.1",
"axios": "^0.21.1",
"axios-retry": "^3.1.9",
"base32.js": "^0.1.0",
"bech32": "^1.1.4",
"bignumber.js": "^9.0.0",
"bip32": "^2.0.5",
Expand All @@ -61,6 +64,7 @@
"ethereumjs-wallet": "^1.0.0",
"form-data": "^4.0.0",
"hdkey": "^2.0.1",
"js-sha512": "^0.8.0",
"neon": "^2.0.0",
"reflect-metadata": "^0.1.13",
"ripple-lib": "^1.7.1",
Expand Down
1 change: 1 addition & 0 deletions src/model/request/Currency.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ export enum Currency {
USDT_MATIC = 'USDT_MATIC',
QTUM = 'QTUM',
EGLD = 'EGLD',
ALGO = 'ALGO',
}

export const ERC20_CURRENCIES = [
Expand Down
17 changes: 17 additions & 0 deletions src/wallet/address.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import {getAddressFromPrivateKey} from '@binance-chain/javascript-sdk/lib/crypto';
import {HarmonyAddress} from '@harmony-js/crypto';
const algosdk = require('algosdk');
const base32 = require('base32.js');
const sha512_256 = require('js-sha512').sha512_256;
// @ts-ignore
// import {ECDSA_secp256k1, encodeKey, SHA3_256} from '@onflow/util-encode-key';
import * as bech32 from 'bech32';
Expand Down Expand Up @@ -640,6 +643,20 @@ const convertXdcPrivateKey = (testnet: boolean, privKey: string) => {
return wallet.getAddressString().replace('0x', 'xdc')
}

/**
* Generate Algo Address From Private Key
* @param privKey Private key to use
* @returns blockchain address
*/
export const generateAlgodAddressFromPrivatetKey = (privKey: string) => {
const decoder = new base32.Decoder({type: "rfc4648"})
const scretKey = decoder.write(privKey).buf;
let mn = algosdk.secretKeyToMnemonic(scretKey)
const address = algosdk.mnemonicToSecretKey(mn).addr;
return address;
}


/**
* Generate address
* @param currency type of blockchain
Expand Down
17 changes: 17 additions & 0 deletions src/wallet/algorand.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import {Currency} from '../model'
import {
generateAlgoWallet
} from './wallet'

import {
generateAlgodAddressFromPrivatetKey
} from './address'

describe('Algo Wallet tests', () => {
it('should generate wallet for Algorand', async () => {
const account = await generateAlgoWallet('artist alarm clerk obscure timber firm reopen provide ankle vicious exhibit waste math toilet believe puppy lucky coast post kind black suspect mule able market');
expect(account.secret).toBe('NBYMCVEEDFYV3TPWVRE6APE7PKHUJD4XAKXCKNCLKGUXOC3LFNJGZQCJCRA53HB7ZAHF6NFJH2QIVQ5USQNWG35QCJLD4KZ5IWMB24Q')
const address = await generateAlgodAddressFromPrivatetKey(account.secret);
expect(address).toBe('NTAESFCB3WOD7SAOL42KSPVARLB3JFA3MNX3AESWHYVT2RMYDVZI6YLG4Y');
})
})
20 changes: 20 additions & 0 deletions src/wallet/wallet.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import {generatePrivateKey, getAddressFromPrivateKey} from '@binance-chain/javascript-sdk/lib/crypto';
const algosdk = require('algosdk');
const base32 = require('base32.js');
import Neon, {wallet} from '@cityofzion/neon-js';
import {generateMnemonic, mnemonicToSeed} from 'bip39';
import {bip32, networks} from 'bitcoinjs-lib';
Expand All @@ -7,6 +9,7 @@ import {hdkey as ethHdKey} from 'ethereumjs-wallet';
import hdkey from 'hdkey';
import {RippleAPI} from 'ripple-lib';
import {Keypair} from 'stellar-sdk';
import {derivePath, getPublicKey} from 'ed25519-hd-key';
import {
BCH_DERIVATION_PATH,
BTC_DERIVATION_PATH,
Expand Down Expand Up @@ -308,6 +311,21 @@ export const generateAdaWallet = async (mnemonic: string): Promise<Wallet> => {
return {mnemonic, xpub: await cardano.generateXPublicKey(mnemonic)}
}

/**
* Generate Algo wallet
* @param mnem mnemonic seed to use
* @returns address and secret
*/
export const generateAlgoWallet = async (mnem: string) => {
const account = algosdk.mnemonicToSecretKey(mnem);
const encoder = new base32.Encoder({type: "rfc4648"});
const secret = encoder.write(account.sk).finalize();
return {
address: account.addr,
secret: secret,
}
}

/**
* Generate wallet
* @param currency blockchain to generate wallet for
Expand Down Expand Up @@ -400,6 +418,8 @@ export const generateWallet = (currency: Currency, testnet: boolean, mnemonic?:
return generateLyraWallet(testnet, mnem)
case Currency.ADA:
return generateAdaWallet(mnem)
case Currency.ALGO:
return generateAlgoWallet(mnem)
default:
throw new Error('Unsupported blockchain.')
}
Expand Down
84 changes: 76 additions & 8 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2205,6 +2205,27 @@ ajv@^8.0.1:
require-from-string "^2.0.2"
uri-js "^4.2.2"

algo-msgpack-with-bigint@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6"
integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==

algosdk@^1.11.1:
version "1.11.1"
resolved "https://registry.yarnpkg.com/algosdk/-/algosdk-1.11.1.tgz#58bfc8e85de3624de0fb5f51c9f7408f96d841c0"
integrity sha512-2B7Tz8NSaME1aQDrzvhAuTm67c/2KCXTeuzgKvB61YXUU3pe0zyDzEw7bgv1sC6lbbD6BihroiUtidP+Fdh+cQ==
dependencies:
algo-msgpack-with-bigint "^2.1.1"
buffer "^6.0.2"
hi-base32 "^0.5.1"
js-sha256 "^0.9.0"
js-sha3 "^0.8.0"
js-sha512 "^0.8.0"
json-bigint "^1.0.0"
superagent "^6.1.0"
tweetnacl "^1.0.3"
url-parse "^1.5.1"

ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
Expand Down Expand Up @@ -3015,7 +3036,7 @@ [email protected]:
base64-js "^1.0.2"
ieee754 "^1.1.4"

[email protected]:
[email protected], buffer@^6.0.2:
version "6.0.3"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
Expand Down Expand Up @@ -3370,7 +3391,7 @@ commander@^6.1.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==

component-emitter@^1.2.1:
component-emitter@^1.2.1, component-emitter@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
Expand Down Expand Up @@ -3423,7 +3444,7 @@ [email protected]:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==

cookiejar@^2.1.1:
cookiejar@^2.1.1, cookiejar@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
Expand Down Expand Up @@ -4579,6 +4600,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=

fast-safe-stringify@^2.0.7:
version "2.0.8"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f"
integrity sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==

fastq@^1.6.0:
version "1.11.1"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807"
Expand Down Expand Up @@ -4757,6 +4783,11 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"

formidable@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==

[email protected]:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
Expand Down Expand Up @@ -5182,6 +5213,11 @@ hdkey@^2.0.1:
safe-buffer "^5.1.1"
secp256k1 "^4.0.0"

hi-base32@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e"
integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==

hmac-drbg@^1.0.0, hmac-drbg@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
Expand Down Expand Up @@ -6156,6 +6192,11 @@ jest@^26.6.3:
import-local "^3.0.2"
jest-cli "^26.6.3"

js-sha256@^0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==

[email protected], js-sha3@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
Expand All @@ -6166,6 +6207,11 @@ [email protected], js-sha3@^0.8.0:
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==

js-sha512@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4"
integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==

js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
Expand Down Expand Up @@ -6230,7 +6276,7 @@ jsesc@^2.5.1:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==

[email protected]:
[email protected], json-bigint@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1"
integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==
Expand Down Expand Up @@ -6669,7 +6715,7 @@ merkle-lib@^2.0.10:
resolved "https://registry.yarnpkg.com/merkle-lib/-/merkle-lib-2.0.10.tgz#82b8dbae75e27a7785388b73f9d7725d0f6f3326"
integrity sha1-grjbrnXieneFOItz+ddyXQ9vMyY=

methods@~1.1.2:
methods@^1.1.2, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
Expand Down Expand Up @@ -6726,6 +6772,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==

mime@^2.4.6:
version "2.5.2"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==

mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
Expand Down Expand Up @@ -7653,7 +7704,7 @@ pushdata-bitcoin@^1.0.1:
dependencies:
bitcoin-ops "^1.3.0"

[email protected]:
[email protected], qs@^6.9.4:
version "6.10.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
Expand Down Expand Up @@ -8728,6 +8779,23 @@ strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=

superagent@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6"
integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==
dependencies:
component-emitter "^1.3.0"
cookiejar "^2.1.2"
debug "^4.1.1"
fast-safe-stringify "^2.0.7"
form-data "^3.0.0"
formidable "^1.2.2"
methods "^1.1.2"
mime "^2.4.6"
qs "^6.9.4"
readable-stream "^3.6.0"
semver "^7.3.2"

supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
Expand Down Expand Up @@ -9065,7 +9133,7 @@ tunnel-agent@^0.6.0:
dependencies:
safe-buffer "^5.0.1"

[email protected], tweetnacl@^1.0.0:
[email protected], tweetnacl@^1.0.0, tweetnacl@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
Expand Down Expand Up @@ -9300,7 +9368,7 @@ url-parse-lax@^3.0.0:
dependencies:
prepend-http "^2.0.0"

url-parse@^1.4.3:
url-parse@^1.4.3, url-parse@^1.5.1:
version "1.5.3"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862"
integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==
Expand Down

0 comments on commit adc75ec

Please sign in to comment.