Skip to content

Commit ca85523

Browse files
authored
Merge pull request #47 from iamnotstatic/impr/payload
refactor: standardize wallet helper functions to use structured paylo…
2 parents 524483f + 76a67df commit ca85523

File tree

12 files changed

+212
-168
lines changed

12 files changed

+212
-168
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "0.2.9",
2+
"version": "0.2.10",
33
"license": "MIT",
44
"main": "dist/index.js",
55
"typings": "dist/index.d.ts",

src/common/helpers/bitcoinHelper.ts

Lines changed: 54 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,25 @@ import * as utxolib from '@bitgo/utxo-lib';
1010

1111
import { _apiFallbacks } from '../fallbacks/btc';
1212
import { fallback, retryNTimes } from '../utils/retry';
13-
import { GetTransactionPayload, TransferPayload } from '../utils/types';
13+
import {
14+
BalancePayload,
15+
CreateWalletPayload,
16+
GenerateWalletFromMnemonicPayload,
17+
GetAddressFromPrivateKeyPayload,
18+
GetTransactionPayload,
19+
IResponse,
20+
Network,
21+
TransferPayload,
22+
} from '../utils/types';
1423
import { BitgoUTXOLib } from '../libs/bitgoUtxoLib';
1524

1625
const bip32 = BIP32Factory(ecc);
1726
const ECPair = ECPairFactory(ecc);
1827

19-
const createWallet = (network: string, derivationPath?: string) => {
28+
const createWallet = ({
29+
network,
30+
derivationPath,
31+
}: CreateWalletPayload): IResponse => {
2032
if (derivationPath) {
2133
const purpose = derivationPath?.split('/')[1];
2234
if (purpose !== "44'") {
@@ -30,12 +42,7 @@ const createWallet = (network: string, derivationPath?: string) => {
3042

3143
const node = bip32.fromSeed(seed);
3244
const child = node.derivePath(path);
33-
const actualNetwork =
34-
network === 'bitcoin'
35-
? bitcoin.networks.bitcoin
36-
: network === 'bitcoin-testnet'
37-
? bitcoin.networks.testnet
38-
: bitcoin.networks.bitcoin;
45+
const actualNetwork = getNetwork(network);
3946

4047
const { address } = bitcoin.payments.p2pkh({
4148
pubkey: child.publicKey,
@@ -51,11 +58,11 @@ const createWallet = (network: string, derivationPath?: string) => {
5158
});
5259
};
5360

54-
const generateWalletFromMnemonic = (
55-
network: string,
56-
mnemonic: string,
57-
derivationPath?: string
58-
) => {
61+
const generateWalletFromMnemonic = ({
62+
network,
63+
mnemonic,
64+
derivationPath,
65+
}: GenerateWalletFromMnemonicPayload): IResponse => {
5966
if (derivationPath) {
6067
const purpose = derivationPath?.split('/')[1];
6168
if (purpose !== "44'") {
@@ -68,12 +75,7 @@ const generateWalletFromMnemonic = (
6875

6976
const node = bip32.fromSeed(seed);
7077
const child = node.derivePath(path);
71-
const actualNetwork =
72-
network === 'bitcoin'
73-
? bitcoin.networks.bitcoin
74-
: network === 'bitcoin-testnet'
75-
? bitcoin.networks.testnet
76-
: bitcoin.networks.bitcoin;
78+
const actualNetwork = getNetwork(network);
7779

7880
const { address } = bitcoin.payments.p2pkh({
7981
pubkey: child.publicKey,
@@ -89,13 +91,11 @@ const generateWalletFromMnemonic = (
8991
});
9092
};
9193

92-
const getAddressFromPrivateKey = (privateKey: string, network: string) => {
93-
const actualNetwork =
94-
network === 'bitcoin'
95-
? bitcoin.networks.bitcoin
96-
: network === 'bitcoin-testnet'
97-
? bitcoin.networks.testnet
98-
: bitcoin.networks.bitcoin;
94+
const getAddressFromPrivateKey = ({
95+
privateKey,
96+
network,
97+
}: GetAddressFromPrivateKeyPayload): IResponse => {
98+
const actualNetwork = getNetwork(network);
9999

100100
const keyPair = ECPair.fromWIF(privateKey);
101101

@@ -109,9 +109,11 @@ const getAddressFromPrivateKey = (privateKey: string, network: string) => {
109109
});
110110
};
111111

112-
const getBalance = async (address: string, network: string) => {
113-
const testnet =
114-
network === 'bitcoin' ? false : network === 'bitcoin-testnet' ? true : true;
112+
const getBalance = async ({
113+
address,
114+
network,
115+
}: BalancePayload): Promise<IResponse> => {
116+
const testnet = isTestnet(network);
115117

116118
const endpoints = _apiFallbacks.fetchUTXOs(testnet, address, 0);
117119
const utxos = await fallback(endpoints);
@@ -125,13 +127,8 @@ const getBalance = async (address: string, network: string) => {
125127
});
126128
};
127129

128-
const transfer = async (args: TransferPayload) => {
129-
const testnet =
130-
args.network === 'bitcoin'
131-
? false
132-
: args.network === 'bitcoin-testnet'
133-
? true
134-
: true;
130+
const transfer = async (args: TransferPayload): Promise<IResponse> => {
131+
const testnet = isTestnet(args.network);
135132

136133
const keyPair = ECPair.fromWIF(args.privateKey);
137134

@@ -142,8 +139,10 @@ const transfer = async (args: TransferPayload) => {
142139
: utxolib.networks.testnet
143140
);
144141

145-
const fromAddress = getAddressFromPrivateKey(args.privateKey, args.network)
146-
.address;
142+
const fromAddress = getAddressFromPrivateKey({
143+
privateKey: args.privateKey,
144+
network: args.network,
145+
}).address;
147146

148147
const changeAddress = fromAddress;
149148
const endpoints = _apiFallbacks.fetchUTXOs(testnet, fromAddress, 0);
@@ -196,14 +195,15 @@ const transfer = async (args: TransferPayload) => {
196195
}
197196
};
198197

199-
const getTransaction = async ({ hash, network }: GetTransactionPayload) => {
200-
const testnet =
201-
network === 'bitcoin' ? false : network === 'bitcoin-testnet' ? true : true;
198+
const getTransaction = async ({
199+
hash,
200+
network,
201+
}: GetTransactionPayload): Promise<IResponse> => {
202+
const testnet = isTestnet(network);
202203

203204
const transaction = await fallback(_apiFallbacks.fetchUTXO(testnet, hash, 0));
204205
const bigAmount = new BigNumber(transaction.amount);
205206

206-
// Convert amount from Satoshi to Bitcoin
207207
const amount = bigAmount.dividedBy(new BigNumber(10).exponentiatedBy(8));
208208

209209
return successResponse({
@@ -212,6 +212,18 @@ const getTransaction = async ({ hash, network }: GetTransactionPayload) => {
212212
});
213213
};
214214

215+
function getNetwork(network: Network) {
216+
return network === 'bitcoin'
217+
? bitcoin.networks.bitcoin
218+
: network === 'bitcoin-testnet'
219+
? bitcoin.networks.testnet
220+
: bitcoin.networks.bitcoin;
221+
}
222+
223+
function isTestnet(network: Network) {
224+
return network === 'bitcoin-testnet';
225+
}
226+
215227
export default {
216228
createWallet,
217229
generateWalletFromMnemonic,

src/common/helpers/ethereumHelper.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import {
1010
IGetTokenInfoPayload,
1111
ITokenInfo,
1212
ISmartContractCallPayload,
13+
CreateWalletPayload,
14+
GetAddressFromPrivateKeyPayload,
15+
GenerateWalletFromMnemonicPayload,
16+
IResponse,
1317
} from '../utils/types';
1418
import { successResponse } from '../utils';
1519

@@ -64,7 +68,7 @@ const getContract = async ({
6468
};
6569
};
6670

67-
const createWallet = (derivationPath?: string) => {
71+
const createWallet = ({ derivationPath }: CreateWalletPayload): IResponse => {
6872
const path = derivationPath || "m/44'/60'/0'/0/0";
6973
const wallet = ethers.Wallet.createRandom({
7074
path,
@@ -77,18 +81,20 @@ const createWallet = (derivationPath?: string) => {
7781
});
7882
};
7983

80-
const getAddressFromPrivateKey = (privateKey: string) => {
84+
const getAddressFromPrivateKey = ({
85+
privateKey,
86+
}: GetAddressFromPrivateKeyPayload): IResponse => {
8187
const wallet = new ethers.Wallet(privateKey);
8288

8389
return successResponse({
8490
address: wallet.address,
8591
});
8692
};
8793

88-
const generateWalletFromMnemonic = (
89-
mnemonic: string,
90-
derivationPath?: string
91-
) => {
94+
const generateWalletFromMnemonic = ({
95+
mnemonic,
96+
derivationPath,
97+
}: GenerateWalletFromMnemonicPayload): IResponse => {
9298
const path = derivationPath || "m/44'/60'/0'/0/0";
9399
const wallet = ethers.Wallet.fromMnemonic(mnemonic, path);
94100

@@ -103,7 +109,7 @@ const getBalance = async ({
103109
rpcUrl,
104110
tokenAddress,
105111
address,
106-
}: BalancePayload) => {
112+
}: BalancePayload): Promise<IResponse> => {
107113
const { contract, providerInstance } = await getContract({
108114
rpcUrl,
109115
contractAddress: tokenAddress,
@@ -137,7 +143,7 @@ const transfer = async ({
137143
tokenAddress,
138144
rpcUrl,
139145
...args
140-
}: TransferPayload) => {
146+
}: TransferPayload): Promise<IResponse> => {
141147
const { contract, providerInstance, gasPrice, nonce } = await getContract({
142148
rpcUrl,
143149
privateKey,
@@ -189,7 +195,7 @@ const transfer = async ({
189195
}
190196
};
191197

192-
const getTransaction = async ({ hash, rpcUrl }: GetTransactionPayload) => {
198+
const getTransaction = async ({ hash, rpcUrl }: GetTransactionPayload): Promise<IResponse> => {
193199
const { providerInstance } = await getContract({ rpcUrl });
194200

195201
try {
@@ -204,7 +210,7 @@ const getTransaction = async ({ hash, rpcUrl }: GetTransactionPayload) => {
204210

205211
const getEncryptedJsonFromPrivateKey = async (
206212
args: GetEncryptedJsonFromPrivateKey
207-
) => {
213+
): Promise<IResponse> => {
208214
const wallet = new ethers.Wallet(args.privateKey);
209215
const json = await wallet.encrypt(args.password);
210216

@@ -213,7 +219,7 @@ const getEncryptedJsonFromPrivateKey = async (
213219

214220
const getWalletFromEncryptedJson = async (
215221
args: GetWalletFromEncryptedjsonPayload
216-
) => {
222+
): Promise<IResponse> => {
217223
const wallet = await ethers.Wallet.fromEncryptedJson(
218224
args.json,
219225
args.password
@@ -225,7 +231,7 @@ const getWalletFromEncryptedJson = async (
225231
});
226232
};
227233

228-
const getTokenInfo = async ({ address, rpcUrl }: IGetTokenInfoPayload) => {
234+
const getTokenInfo = async ({ address, rpcUrl }: IGetTokenInfoPayload): Promise<IResponse> => {
229235
const { contract } = await getContract({ contractAddress: address, rpcUrl });
230236

231237
if (contract) {
@@ -249,7 +255,7 @@ const getTokenInfo = async ({ address, rpcUrl }: IGetTokenInfoPayload) => {
249255
throw new Error('Contract not found');
250256
};
251257

252-
const smartContractCall = async (args: ISmartContractCallPayload) => {
258+
const smartContractCall = async (args: ISmartContractCallPayload): Promise<IResponse> => {
253259
const { contract, gasPrice, nonce } = await getContract({
254260
rpcUrl: args.rpcUrl,
255261
contractAddress: args.contractAddress,

0 commit comments

Comments
 (0)