@tatumio/bch 2.0.1-alpha.203
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +28 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +5 -0
- package/src/index.js.map +1 -0
- package/src/lib/bch.sdk.d.ts +119 -0
- package/src/lib/bch.sdk.errors.d.ts +8 -0
- package/src/lib/bch.sdk.errors.js +24 -0
- package/src/lib/bch.sdk.errors.js.map +1 -0
- package/src/lib/bch.sdk.js +22 -0
- package/src/lib/bch.sdk.js.map +1 -0
- package/src/lib/bch.sdk.tx.d.ts +5 -0
- package/src/lib/bch.sdk.tx.js +82 -0
- package/src/lib/bch.sdk.tx.js.map +1 -0
- package/src/lib/bch.sdk.wallet.d.ts +5 -0
- package/src/lib/bch.sdk.wallet.js +28 -0
- package/src/lib/bch.sdk.wallet.js.map +1 -0
- package/src/lib/utils/bch.address.d.ts +15 -0
- package/src/lib/utils/bch.address.js +87 -0
- package/src/lib/utils/bch.address.js.map +1 -0
package/package.json
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
{
|
2
|
+
"name": "@tatumio/bch",
|
3
|
+
"version": "v2.0.1-alpha.203",
|
4
|
+
"license": "MIT",
|
5
|
+
"main": "./src/index.js",
|
6
|
+
"typings": "./src/index.d.ts",
|
7
|
+
"dependencies": {
|
8
|
+
"@tatumio/shared-testing": "v2.0.1-alpha.202",
|
9
|
+
"@tatumio/shared-blockchain-btc-based": "v2.0.1-alpha.202",
|
10
|
+
"@tatumio/shared-core": "v2.0.1-alpha.202",
|
11
|
+
"axios": "^0.24.0",
|
12
|
+
"@tatumio/api-client": "v2.0.1-alpha.202",
|
13
|
+
"cross-blob": "^3.0.0",
|
14
|
+
"form-data": "^4.0.0",
|
15
|
+
"@tatumio/shared-blockchain-abstract": "v2.0.1-alpha.202",
|
16
|
+
"@tatumio/shared-abstract-sdk": "v2.0.1-alpha.202",
|
17
|
+
"bignumber.js": "^9.0.2",
|
18
|
+
"bip32": "^2.0.5",
|
19
|
+
"bip39": "^3.0.2",
|
20
|
+
"bitcoinjs-lib": "^5.2.0",
|
21
|
+
"hdkey": "^2.0.1",
|
22
|
+
"bitcore-lib": "^8.25.25",
|
23
|
+
"coininfo": "^5.1.0",
|
24
|
+
"@tatumio/bitcoincashjs2-lib": "^4.1.2",
|
25
|
+
"cashaddrjs": "^0.4.4"
|
26
|
+
},
|
27
|
+
"peerDependencies": {}
|
28
|
+
}
|
package/src/index.d.ts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export * from './lib/bch.sdk';
|
package/src/index.js
ADDED
package/src/index.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/blockchain/bch/src/index.ts"],"names":[],"mappings":";;;AAAA,6DAA6B"}
|
@@ -0,0 +1,119 @@
|
|
1
|
+
import { BlockchainBitcoinCashService } from '@tatumio/api-client';
|
2
|
+
import { SDKArguments } from '@tatumio/shared-abstract-sdk';
|
3
|
+
export declare const TatumBchSDK: (args: SDKArguments) => {
|
4
|
+
wallet: import("../../../../../dist/packages/shared/blockchain/abstract/src").SdkWithWalletFunctions;
|
5
|
+
transaction: import("@tatumio/shared-blockchain-btc-based").BtcBasedTx<import("@tatumio/api-client").BchTransaction | import("@tatumio/api-client").BchTransactionKMS>;
|
6
|
+
blockchain: {
|
7
|
+
info: typeof BlockchainBitcoinCashService.bchGetBlockChainInfo;
|
8
|
+
broadcast: typeof BlockchainBitcoinCashService.bchBroadcast;
|
9
|
+
getBlockHash: typeof BlockchainBitcoinCashService.bchGetBlockHash;
|
10
|
+
getBlock: typeof BlockchainBitcoinCashService.bchGetBlock;
|
11
|
+
getTxForAccount: typeof BlockchainBitcoinCashService.bchGetTxByAddress;
|
12
|
+
getTransaction: typeof BlockchainBitcoinCashService.bchGetRawTransaction;
|
13
|
+
send: typeof BlockchainBitcoinCashService.bchTransferBlockchain;
|
14
|
+
};
|
15
|
+
kms: {
|
16
|
+
sign(tx: import("@tatumio/shared-core").ChainTransactionKMS, privateKeys: string[]): Promise<string>;
|
17
|
+
getAllPending(signatures?: string): import("@tatumio/api-client").CancelablePromise<import("@tatumio/api-client").PendingTransaction>;
|
18
|
+
get: typeof import("@tatumio/api-client").SecurityKeyManagementSystemService.getPendingTransactionToSign;
|
19
|
+
complete: typeof import("@tatumio/api-client").SecurityKeyManagementSystemService.completePendingSignature;
|
20
|
+
delete: typeof import("@tatumio/api-client").SecurityKeyManagementSystemService.deletePendingTransactionToSign;
|
21
|
+
};
|
22
|
+
offchain: {
|
23
|
+
depositAddress: {
|
24
|
+
checkExists: (address: string, index?: number) => Promise<import("@tatumio/api-client").Account>;
|
25
|
+
create: typeof import("@tatumio/api-client").OffChainAccountService.generateDepositAddress;
|
26
|
+
createMultiple: typeof import("@tatumio/api-client").OffChainAccountService.generateDepositAddressesBatch;
|
27
|
+
assign: typeof import("@tatumio/api-client").OffChainAccountService.assignAddress;
|
28
|
+
remove: typeof import("@tatumio/api-client").OffChainAccountService.removeAddress;
|
29
|
+
getByAccount: typeof import("@tatumio/api-client").OffChainAccountService.getAllDepositAddresses;
|
30
|
+
};
|
31
|
+
withdrawal: {
|
32
|
+
getAll: (status?: "InProgress" | "Done" | "Cancelled", pageSize?: number, offset?: number) => Promise<import("@tatumio/api-client").WithdrawalObject[]>;
|
33
|
+
};
|
34
|
+
storeTokenAddress: typeof import("@tatumio/api-client").OffChainBlockchainService.storeTokenAddress;
|
35
|
+
};
|
36
|
+
getExchangeRate(basePair?: import("@tatumio/shared-core").Fiat): import("@tatumio/api-client").CancelablePromise<import("@tatumio/api-client").ExchangeRate>;
|
37
|
+
storage: {
|
38
|
+
upload: typeof import("@tatumio/api-client").StorageIpfsService.storeIpfs;
|
39
|
+
get: typeof import("@tatumio/api-client").StorageIpfsService.getIpfsData;
|
40
|
+
};
|
41
|
+
subscriptions: typeof import("@tatumio/api-client").LedgerSubscriptionService;
|
42
|
+
ledger: {
|
43
|
+
customer: {
|
44
|
+
get: typeof import("@tatumio/api-client").LedgerCustomerService.getCustomerByExternalOrInternalId;
|
45
|
+
getAll: typeof import("@tatumio/api-client").LedgerCustomerService.findAllCustomers;
|
46
|
+
update: typeof import("@tatumio/api-client").LedgerCustomerService.updateCustomer;
|
47
|
+
activate: typeof import("@tatumio/api-client").LedgerCustomerService.activateCustomer;
|
48
|
+
deactivate: typeof import("@tatumio/api-client").LedgerCustomerService.deactivateCustomer;
|
49
|
+
enable: typeof import("@tatumio/api-client").LedgerCustomerService.enableCustomer;
|
50
|
+
disable: typeof import("@tatumio/api-client").LedgerCustomerService.disableCustomer;
|
51
|
+
};
|
52
|
+
orderBook: {
|
53
|
+
getHistorical: typeof import("@tatumio/api-client").LedgerOrderBookService.getHistoricalTradesBody;
|
54
|
+
getActiveBuyTrades: typeof import("@tatumio/api-client").LedgerOrderBookService.getBuyTradesBody;
|
55
|
+
getActiveSellTrades: typeof import("@tatumio/api-client").LedgerOrderBookService.getBuyTradesBody;
|
56
|
+
newTrade: typeof import("@tatumio/api-client").LedgerOrderBookService.storeTrade;
|
57
|
+
get: typeof import("@tatumio/api-client").LedgerOrderBookService.getTradeById;
|
58
|
+
cancel: typeof import("@tatumio/api-client").LedgerOrderBookService.deleteTrade;
|
59
|
+
cancelByAccount: typeof import("@tatumio/api-client").LedgerOrderBookService.deleteAccountTrades;
|
60
|
+
};
|
61
|
+
transaction: {
|
62
|
+
send: typeof import("@tatumio/api-client").LedgerTransactionService.sendTransaction;
|
63
|
+
sendMultiple: typeof import("@tatumio/api-client").LedgerTransactionService.sendTransactionBatch;
|
64
|
+
getAll: typeof import("@tatumio/api-client").LedgerTransactionService.getTransactions;
|
65
|
+
getAllByAccount: typeof import("@tatumio/api-client").LedgerTransactionService.getTransactionsByAccountId;
|
66
|
+
getAllByCustomer: typeof import("@tatumio/api-client").LedgerTransactionService.getTransactionsByCustomerId;
|
67
|
+
getAllByReference: typeof import("@tatumio/api-client").LedgerTransactionService.getTransactionsByReference;
|
68
|
+
countByAccount: (filter: import("@tatumio/api-client").TransactionFilter) => any;
|
69
|
+
countByCustomer: (filter: import("@tatumio/api-client").TransactionFilterCustomer) => any;
|
70
|
+
};
|
71
|
+
virtualCurrency: {
|
72
|
+
create: typeof import("@tatumio/api-client").LedgerVirtualCurrencyService.createCurrency;
|
73
|
+
mint: typeof import("@tatumio/api-client").LedgerVirtualCurrencyService.mintCurrency;
|
74
|
+
revoke: typeof import("@tatumio/api-client").LedgerVirtualCurrencyService.revokeCurrency;
|
75
|
+
getByName: typeof import("@tatumio/api-client").LedgerVirtualCurrencyService.getCurrency;
|
76
|
+
update: typeof import("@tatumio/api-client").LedgerVirtualCurrencyService.updateCurrency;
|
77
|
+
};
|
78
|
+
blockAmount: {
|
79
|
+
block: typeof import("@tatumio/api-client").LedgerAccountService.blockAmount;
|
80
|
+
unblock: typeof import("@tatumio/api-client").LedgerAccountService.deleteBlockAmount;
|
81
|
+
unblockWithTransaction: typeof import("@tatumio/api-client").LedgerAccountService.unblockAmountWithTransaction;
|
82
|
+
};
|
83
|
+
account: {
|
84
|
+
get: typeof import("@tatumio/api-client").LedgerAccountService.getAccountByAccountId;
|
85
|
+
getAll: typeof import("@tatumio/api-client").LedgerAccountService.getAllAccounts;
|
86
|
+
getByCustomerId: typeof import("@tatumio/api-client").LedgerAccountService.getAccountsByCustomerId;
|
87
|
+
getBalance: typeof import("@tatumio/api-client").LedgerAccountService.getAccountBalance;
|
88
|
+
create: typeof import("@tatumio/api-client").LedgerAccountService.createAccount;
|
89
|
+
createMultiple: typeof import("@tatumio/api-client").LedgerAccountService.createAccountBatch;
|
90
|
+
update: typeof import("@tatumio/api-client").LedgerAccountService.updateAccountByAccountId;
|
91
|
+
getBlockedAmountsByAccountId: typeof import("@tatumio/api-client").LedgerAccountService.getBlockAmountById;
|
92
|
+
activate: typeof import("@tatumio/api-client").LedgerAccountService.activateAccount;
|
93
|
+
deactivate: typeof import("@tatumio/api-client").LedgerAccountService.deactivateAccount;
|
94
|
+
freeze: typeof import("@tatumio/api-client").LedgerAccountService.freezeAccount;
|
95
|
+
unfreeze: typeof import("@tatumio/api-client").LedgerAccountService.unfreezeAccount;
|
96
|
+
generate: (account: import("@tatumio/api-client").CreateAccount, generateNewWalletFn: any, generateNewWallet?: boolean, testnet?: boolean, webhookUrl?: string) => Promise<any>;
|
97
|
+
};
|
98
|
+
};
|
99
|
+
security: {
|
100
|
+
checkMaliciousAddress: typeof import("@tatumio/api-client").SecurityAddressService.checkMalicousAddress;
|
101
|
+
};
|
102
|
+
tatum: {
|
103
|
+
getCredits: typeof import("@tatumio/api-client").TatumServiceService.getCredits;
|
104
|
+
getVersion: typeof import("@tatumio/api-client").TatumServiceService.getVersion;
|
105
|
+
freezeApiKey: typeof import("@tatumio/api-client").TatumServiceService.freezeApiKey;
|
106
|
+
unfreezeApiKey: typeof import("@tatumio/api-client").TatumServiceService.unfreezeApiKey;
|
107
|
+
};
|
108
|
+
nft: {
|
109
|
+
mintNFT: typeof import("@tatumio/api-client").BlockchainNftService.nftMintErc721;
|
110
|
+
getNFTTransaction: typeof import("@tatumio/api-client").BlockchainNftService.nftGetTransactErc721;
|
111
|
+
getNFTTransactionsByToken: typeof import("@tatumio/api-client").BlockchainNftService.nftGetTransactionByToken;
|
112
|
+
getNFTTransactionsByAddress: typeof import("@tatumio/api-client").BlockchainNftService.nftGetTransactionByAddress;
|
113
|
+
getNFTsByAddress: typeof import("@tatumio/api-client").BlockchainNftService.nftGetBalanceErc721;
|
114
|
+
getNFTProvenanceData: typeof import("@tatumio/api-client").BlockchainNftService.nftGetProvenanceDataErc721;
|
115
|
+
getNFTMetadataURI: typeof import("@tatumio/api-client").BlockchainNftService.nftGetMetadataErc721;
|
116
|
+
getNFTRoyalty: typeof import("@tatumio/api-client").BlockchainNftService.nftGetRoyaltyErc721;
|
117
|
+
prepareAddNFTMinterAbstraction: typeof import("@tatumio/api-client").BlockchainNftService.nftGetRoyaltyErc721;
|
118
|
+
};
|
119
|
+
};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { SdkError, SdkErrorCode } from '@tatumio/shared-abstract-sdk';
|
2
|
+
export declare const BCH_ERRORS_MAPPING: {
|
3
|
+
'Transaction has absurd fees': SdkErrorCode;
|
4
|
+
};
|
5
|
+
export declare type BchSdkErrorCode = SdkErrorCode.BTC_FEE_TOO_SMALL | SdkErrorCode.BTC_UTXO_NOT_FOUND | SdkErrorCode.BTC_NOT_ENOUGH_BALANCE;
|
6
|
+
export declare class BchSdkError extends SdkError {
|
7
|
+
constructor(error: Error | BchSdkErrorCode);
|
8
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.BchSdkError = exports.BCH_ERRORS_MAPPING = void 0;
|
4
|
+
const shared_abstract_sdk_1 = require("@tatumio/shared-abstract-sdk");
|
5
|
+
exports.BCH_ERRORS_MAPPING = {
|
6
|
+
'Transaction has absurd fees': shared_abstract_sdk_1.SdkErrorCode.BTC_FEE_IS_TOO_LARGE,
|
7
|
+
};
|
8
|
+
class BchSdkError extends shared_abstract_sdk_1.SdkError {
|
9
|
+
constructor(error) {
|
10
|
+
if (typeof error === 'string') {
|
11
|
+
super({
|
12
|
+
code: error,
|
13
|
+
});
|
14
|
+
}
|
15
|
+
else {
|
16
|
+
super({
|
17
|
+
originalError: error,
|
18
|
+
errorSubstringMapping: exports.BCH_ERRORS_MAPPING,
|
19
|
+
});
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
exports.BchSdkError = BchSdkError;
|
24
|
+
//# sourceMappingURL=bch.sdk.errors.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bch.sdk.errors.js","sourceRoot":"","sources":["../../../../../../packages/blockchain/bch/src/lib/bch.sdk.errors.ts"],"names":[],"mappings":";;;AAAA,sEAAqE;AAExD,QAAA,kBAAkB,GAAG;IAChC,6BAA6B,EAAE,kCAAY,CAAC,oBAAoB;CACjE,CAAA;AAOD,MAAa,WAAY,SAAQ,8BAAQ;IACvC,YAAY,KAA8B;QACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,KAAK,CAAC;gBACJ,IAAI,EAAE,KAAK;aACZ,CAAC,CAAA;SACH;aAAM;YACL,KAAK,CAAC;gBACJ,aAAa,EAAE,KAAK;gBACpB,qBAAqB,EAAE,0BAAkB;aAC1C,CAAC,CAAA;SACH;IACH,CAAC;CACF;AAbD,kCAaC"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.TatumBchSDK = void 0;
|
4
|
+
const shared_core_1 = require("@tatumio/shared-core");
|
5
|
+
const shared_blockchain_btc_based_1 = require("@tatumio/shared-blockchain-btc-based");
|
6
|
+
const api_client_1 = require("@tatumio/api-client");
|
7
|
+
const bch_sdk_tx_1 = require("./bch.sdk.tx");
|
8
|
+
const bch_sdk_wallet_1 = require("./bch.sdk.wallet");
|
9
|
+
const blockchain = shared_core_1.Blockchain.BCH;
|
10
|
+
const TatumBchSDK = (args) => {
|
11
|
+
return Object.assign(Object.assign({}, (0, shared_blockchain_btc_based_1.btcBasedSdk)(Object.assign(Object.assign({}, args), { blockchain }))), { wallet: (0, bch_sdk_wallet_1.bchWallet)(Object.assign(Object.assign({}, args), { blockchain })), transaction: (0, bch_sdk_tx_1.bchTransactions)(), blockchain: {
|
12
|
+
info: api_client_1.BlockchainBitcoinCashService.bchGetBlockChainInfo,
|
13
|
+
broadcast: api_client_1.BlockchainBitcoinCashService.bchBroadcast,
|
14
|
+
getBlockHash: api_client_1.BlockchainBitcoinCashService.bchGetBlockHash,
|
15
|
+
getBlock: api_client_1.BlockchainBitcoinCashService.bchGetBlock,
|
16
|
+
getTxForAccount: api_client_1.BlockchainBitcoinCashService.bchGetTxByAddress,
|
17
|
+
getTransaction: api_client_1.BlockchainBitcoinCashService.bchGetRawTransaction,
|
18
|
+
send: api_client_1.BlockchainBitcoinCashService.bchTransferBlockchain,
|
19
|
+
} });
|
20
|
+
};
|
21
|
+
exports.TatumBchSDK = TatumBchSDK;
|
22
|
+
//# sourceMappingURL=bch.sdk.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bch.sdk.js","sourceRoot":"","sources":["../../../../../../packages/blockchain/bch/src/lib/bch.sdk.ts"],"names":[],"mappings":";;;AAAA,sDAAiD;AACjD,sFAAkE;AAClE,oDAAkE;AAElE,6CAA8C;AAC9C,qDAA4C;AAE5C,MAAM,UAAU,GAAG,wBAAU,CAAC,GAAG,CAAA;AAE1B,MAAM,WAAW,GAAG,CAAC,IAAkB,EAAE,EAAE;IAChD,uCACK,IAAA,yCAAW,kCAAM,IAAI,KAAE,UAAU,IAAG,KACvC,MAAM,EAAE,IAAA,0BAAS,kCAAM,IAAI,KAAE,UAAU,IAAG,EAC1C,WAAW,EAAE,IAAA,4BAAe,GAAE,EAC9B,UAAU,EAAE;YACV,IAAI,EAAE,yCAA4B,CAAC,oBAAoB;YACvD,SAAS,EAAE,yCAA4B,CAAC,YAAY;YACpD,YAAY,EAAE,yCAA4B,CAAC,eAAe;YAC1D,QAAQ,EAAE,yCAA4B,CAAC,WAAW;YAClD,eAAe,EAAE,yCAA4B,CAAC,iBAAiB;YAC/D,cAAc,EAAE,yCAA4B,CAAC,oBAAoB;YACjE,IAAI,EAAE,yCAA4B,CAAC,qBAAqB;SACzD,IACF;AACH,CAAC,CAAA;AAfY,QAAA,WAAW,eAevB"}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import { BchTransaction, BchTransactionKMS } from '@tatumio/api-client';
|
2
|
+
import { BtcBasedTx } from '@tatumio/shared-blockchain-btc-based';
|
3
|
+
declare type BchTransactionBody = BchTransaction | BchTransactionKMS;
|
4
|
+
export declare const bchTransactions: () => BtcBasedTx<BchTransactionBody>;
|
5
|
+
export {};
|
@@ -0,0 +1,82 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.bchTransactions = void 0;
|
4
|
+
const tslib_1 = require("tslib");
|
5
|
+
const api_client_1 = require("@tatumio/api-client");
|
6
|
+
const bch_address_1 = require("./utils/bch.address");
|
7
|
+
const bch_sdk_errors_1 = require("./bch.sdk.errors");
|
8
|
+
const shared_abstract_sdk_1 = require("@tatumio/shared-abstract-sdk");
|
9
|
+
const coininfo_1 = (0, tslib_1.__importDefault)(require("coininfo"));
|
10
|
+
const bitcoincashjs2_lib_1 = require("@tatumio/bitcoincashjs2-lib");
|
11
|
+
const bignumber_js_1 = (0, tslib_1.__importDefault)(require("bignumber.js"));
|
12
|
+
const sendTransaction = (body, args) => (0, tslib_1.__awaiter)(void 0, void 0, void 0, function* () {
|
13
|
+
return api_client_1.ApiServices.blockchain.bcash.bchBroadcast({
|
14
|
+
txData: yield prepareSignedTransaction(body, args),
|
15
|
+
});
|
16
|
+
});
|
17
|
+
// @TODO add support - by address
|
18
|
+
const prepareSignedTransaction = (body, args) => (0, tslib_1.__awaiter)(void 0, void 0, void 0, function* () {
|
19
|
+
try {
|
20
|
+
const network = args.testnet
|
21
|
+
? coininfo_1.default.bitcoincash.test.toBitcoinJS()
|
22
|
+
: coininfo_1.default.bitcoincash.main.toBitcoinJS();
|
23
|
+
const transactionBuilder = new bitcoincashjs2_lib_1.TransactionBuilder(network);
|
24
|
+
const privateKeysToSign = [];
|
25
|
+
const amountToSign = [];
|
26
|
+
const txs = yield getTransactions(body.fromUTXO.map((u) => u.txHash));
|
27
|
+
for (const [i, item] of body.fromUTXO.entries()) {
|
28
|
+
transactionBuilder.addInput(item.txHash, item.index, 0xffffffff, null);
|
29
|
+
if ('signatureId' in item)
|
30
|
+
privateKeysToSign.push(item.signatureId);
|
31
|
+
else if ('privateKey' in item)
|
32
|
+
privateKeysToSign.push(item.privateKey);
|
33
|
+
const vout = txs[i].vout[item.index];
|
34
|
+
if (!vout)
|
35
|
+
throw new bch_sdk_errors_1.BchSdkError(shared_abstract_sdk_1.SdkErrorCode.BTC_UTXO_NOT_FOUND);
|
36
|
+
amountToSign.push(shared_abstract_sdk_1.amountUtils.toSatoshis(vout.value));
|
37
|
+
const fromUTXO = body.fromUTXO;
|
38
|
+
if (fromUTXO && 'signatureId' in fromUTXO[0] && fromUTXO[0].signatureId) {
|
39
|
+
return JSON.stringify({ txData: JSON.stringify(txs[i]), privateKeysToSign });
|
40
|
+
}
|
41
|
+
}
|
42
|
+
body.to.forEach((item) => {
|
43
|
+
transactionBuilder.addOutput(bch_address_1.bcashAddressHelper.getAddress(item.address), shared_abstract_sdk_1.amountUtils.toSatoshis(item.value));
|
44
|
+
});
|
45
|
+
verifyAmounts(amountToSign, body);
|
46
|
+
for (let i = 0; i < privateKeysToSign.length; i++) {
|
47
|
+
const ecPair = bitcoincashjs2_lib_1.ECPair.fromWIF(privateKeysToSign[i], network);
|
48
|
+
transactionBuilder.sign(i, ecPair, undefined, 0x01, amountToSign[i], undefined, bitcoincashjs2_lib_1.ECSignature.SCHNORR);
|
49
|
+
}
|
50
|
+
return transactionBuilder.build().toHex();
|
51
|
+
}
|
52
|
+
catch (e) {
|
53
|
+
throw new bch_sdk_errors_1.BchSdkError(e);
|
54
|
+
}
|
55
|
+
});
|
56
|
+
function verifyAmounts(amountToSign, body) {
|
57
|
+
const outputsSum = body.to
|
58
|
+
.map((to) => shared_abstract_sdk_1.amountUtils.toSatoshis(to.value))
|
59
|
+
.reduce((e, acc) => e.plus(acc), new bignumber_js_1.default(0));
|
60
|
+
const inputsSum = amountToSign
|
61
|
+
.map((i) => new bignumber_js_1.default(i))
|
62
|
+
.reduce((v, acc) => v.plus(acc), new bignumber_js_1.default(0));
|
63
|
+
if (outputsSum.eq(inputsSum)) {
|
64
|
+
throw new bch_sdk_errors_1.BchSdkError(shared_abstract_sdk_1.SdkErrorCode.BTC_FEE_TOO_SMALL);
|
65
|
+
}
|
66
|
+
if (outputsSum.gt(inputsSum)) {
|
67
|
+
throw new bch_sdk_errors_1.BchSdkError(shared_abstract_sdk_1.SdkErrorCode.BTC_NOT_ENOUGH_BALANCE);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
const getTransactions = (txHash) => (0, tslib_1.__awaiter)(void 0, void 0, void 0, function* () {
|
71
|
+
const result = [];
|
72
|
+
for (const tx of txHash) {
|
73
|
+
result.push(api_client_1.ApiServices.blockchain.bcash.bchGetRawTransaction(tx));
|
74
|
+
}
|
75
|
+
return Promise.all(result);
|
76
|
+
});
|
77
|
+
const bchTransactions = () => ({
|
78
|
+
sendTransaction,
|
79
|
+
prepareSignedTransaction,
|
80
|
+
});
|
81
|
+
exports.bchTransactions = bchTransactions;
|
82
|
+
//# sourceMappingURL=bch.sdk.tx.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bch.sdk.tx.js","sourceRoot":"","sources":["../../../../../../packages/blockchain/bch/src/lib/bch.sdk.tx.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.bchWallet = void 0;
|
4
|
+
const tslib_1 = require("tslib");
|
5
|
+
const shared_core_1 = require("@tatumio/shared-core");
|
6
|
+
const bitcoincashjs2_lib_1 = (0, tslib_1.__importDefault)(require("@tatumio/bitcoincashjs2-lib"));
|
7
|
+
const cashaddrjs_1 = (0, tslib_1.__importDefault)(require("cashaddrjs"));
|
8
|
+
const shared_blockchain_btc_based_1 = require("@tatumio/shared-blockchain-btc-based");
|
9
|
+
const bch_address_1 = require("./utils/bch.address");
|
10
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
11
|
+
const bchWallet = (args) => {
|
12
|
+
const btcBased = (0, shared_blockchain_btc_based_1.btcBasedWallet)(args);
|
13
|
+
return Object.assign(Object.assign({}, btcBased), { generateAddressFromXPub: (xpub, i, options) => {
|
14
|
+
const network = shared_core_1.blockchainUtils.getNetworkConfig(args.blockchain, options);
|
15
|
+
const hdNode = bitcoincashjs2_lib_1.default.HDNode.fromBase58(xpub, network);
|
16
|
+
const legacy = hdNode.derivePath(String(i)).getAddress();
|
17
|
+
const decoded = bch_address_1.bcashAddressHelper.decode(legacy);
|
18
|
+
return cashaddrjs_1.default.encode(decoded.prefix, decoded.type, decoded.hash);
|
19
|
+
}, generateAddressFromPrivateKey: (privateKey, options) => {
|
20
|
+
const network = shared_core_1.blockchainUtils.getNetworkConfig(args.blockchain, options);
|
21
|
+
const keyPair = bitcoinjs_lib_1.ECPair.fromWIF(privateKey, network);
|
22
|
+
const legacy = bitcoinjs_lib_1.payments.p2pkh({ pubkey: keyPair.publicKey, network }).address;
|
23
|
+
const decoded = bch_address_1.bcashAddressHelper.decode(legacy);
|
24
|
+
return cashaddrjs_1.default.encode(decoded.prefix, decoded.type, decoded.hash);
|
25
|
+
} });
|
26
|
+
};
|
27
|
+
exports.bchWallet = bchWallet;
|
28
|
+
//# sourceMappingURL=bch.sdk.wallet.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bch.sdk.wallet.js","sourceRoot":"","sources":["../../../../../../packages/blockchain/bch/src/lib/bch.sdk.wallet.ts"],"names":[],"mappings":";;;;AAAA,sDAA0E;AAE1E,kGAA+C;AAC/C,yEAAiC;AACjC,sFAAqE;AACrE,qDAAwD;AAExD,iDAAgD;AAEzC,MAAM,SAAS,GAAG,CAAC,IAAwC,EAA0B,EAAE;IAC5F,MAAM,QAAQ,GAAG,IAAA,4CAAc,EAAC,IAAI,CAAC,CAAA;IAErC,uCACK,QAAQ,KACX,uBAAuB,EAAE,CAAC,IAAY,EAAE,CAAS,EAAE,OAA8B,EAAU,EAAE;YAC3F,MAAM,OAAO,GAAG,6BAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAC1E,MAAM,MAAM,GAAG,4BAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YACrD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;YAExD,MAAM,OAAO,GAAG,gCAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAEjD,OAAO,oBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QACpE,CAAC,EACD,6BAA6B,EAAE,CAAC,UAAkB,EAAE,OAA8B,EAAU,EAAE;YAC5F,MAAM,OAAO,GAAG,6BAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAC1E,MAAM,OAAO,GAAG,sBAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YACnD,MAAM,MAAM,GAAG,wBAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAA;YAC7E,MAAM,OAAO,GAAG,gCAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAEjD,OAAO,oBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QACpE,CAAC,IACF;AACH,CAAC,CAAA;AAvBY,QAAA,SAAS,aAuBrB"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
interface Hash {
|
3
|
+
hash: Buffer;
|
4
|
+
}
|
5
|
+
interface Decoded extends Hash {
|
6
|
+
prefix: string;
|
7
|
+
type: string;
|
8
|
+
format: string;
|
9
|
+
}
|
10
|
+
export declare const bcashAddressHelper: {
|
11
|
+
getAddress: (address: string) => any;
|
12
|
+
toLegacyAddress: (address: string) => any;
|
13
|
+
decode: (address: string) => Decoded;
|
14
|
+
};
|
15
|
+
export {};
|
@@ -0,0 +1,87 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.bcashAddressHelper = void 0;
|
4
|
+
const tslib_1 = require("tslib");
|
5
|
+
// @ts-ignore
|
6
|
+
const coininfo_1 = (0, tslib_1.__importDefault)(require("coininfo"));
|
7
|
+
// @ts-ignore
|
8
|
+
const bitcoincashjs2_lib_1 = (0, tslib_1.__importDefault)(require("@tatumio/bitcoincashjs2-lib"));
|
9
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
10
|
+
exports.bcashAddressHelper = {
|
11
|
+
getAddress: (address) => {
|
12
|
+
try {
|
13
|
+
return exports.bcashAddressHelper.toLegacyAddress(address);
|
14
|
+
}
|
15
|
+
catch (e) {
|
16
|
+
return address;
|
17
|
+
}
|
18
|
+
},
|
19
|
+
toLegacyAddress: (address) => {
|
20
|
+
const { prefix, type, hash } = exports.bcashAddressHelper.decode(address);
|
21
|
+
let bitcoincash = coininfo_1.default.bitcoincash.main;
|
22
|
+
switch (prefix) {
|
23
|
+
case 'bitcoincash':
|
24
|
+
bitcoincash = coininfo_1.default.bitcoincash.main;
|
25
|
+
break;
|
26
|
+
case 'bchtest':
|
27
|
+
bitcoincash = coininfo_1.default.bitcoincash.test;
|
28
|
+
break;
|
29
|
+
}
|
30
|
+
let version = bitcoincash.versions.public;
|
31
|
+
switch (type) {
|
32
|
+
case 'P2PKH':
|
33
|
+
version = bitcoincash.versions.public;
|
34
|
+
break;
|
35
|
+
case 'P2SH':
|
36
|
+
version = bitcoincash.versions.scripthash;
|
37
|
+
break;
|
38
|
+
}
|
39
|
+
const hashBuf = Buffer.from(hash);
|
40
|
+
return bitcoincashjs2_lib_1.default.address.toBase58Check(hashBuf, version);
|
41
|
+
},
|
42
|
+
decode: (address) => {
|
43
|
+
const { version, hash } = bitcoincashjs2_lib_1.default.address.fromBase58Check(address);
|
44
|
+
let decoded = {
|
45
|
+
prefix: '',
|
46
|
+
type: '',
|
47
|
+
hash,
|
48
|
+
format: '',
|
49
|
+
};
|
50
|
+
switch (version) {
|
51
|
+
case bitcoinjs_lib_1.networks.bitcoin.pubKeyHash:
|
52
|
+
decoded = {
|
53
|
+
prefix: 'bitcoincash',
|
54
|
+
type: 'P2PKH',
|
55
|
+
hash,
|
56
|
+
format: 'legacy',
|
57
|
+
};
|
58
|
+
break;
|
59
|
+
case bitcoinjs_lib_1.networks.bitcoin.scriptHash:
|
60
|
+
decoded = {
|
61
|
+
prefix: 'bitcoincash',
|
62
|
+
type: 'P2SH',
|
63
|
+
hash,
|
64
|
+
format: 'legacy',
|
65
|
+
};
|
66
|
+
break;
|
67
|
+
case bitcoinjs_lib_1.networks.testnet.pubKeyHash:
|
68
|
+
decoded = {
|
69
|
+
prefix: 'bchtest',
|
70
|
+
type: 'P2PKH',
|
71
|
+
hash,
|
72
|
+
format: 'legacy',
|
73
|
+
};
|
74
|
+
break;
|
75
|
+
case bitcoinjs_lib_1.networks.testnet.scriptHash:
|
76
|
+
decoded = {
|
77
|
+
prefix: 'bchtest',
|
78
|
+
type: 'P2SH',
|
79
|
+
hash,
|
80
|
+
format: 'legacy',
|
81
|
+
};
|
82
|
+
break;
|
83
|
+
}
|
84
|
+
return decoded;
|
85
|
+
},
|
86
|
+
};
|
87
|
+
//# sourceMappingURL=bch.address.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bch.address.js","sourceRoot":"","sources":["../../../../../../../packages/blockchain/bch/src/lib/utils/bch.address.ts"],"names":[],"mappings":";;;;AAAA,aAAa;AACb,qEAA+B;AAC/B,aAAa;AACb,kGAA+C;AAC/C,iDAAwC;AAgB3B,QAAA,kBAAkB,GAAG;IAChC,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE;QAC9B,IAAI;YACF,OAAO,0BAAkB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;SACnD;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,OAAO,CAAA;SACf;IACH,CAAC;IACD,eAAe,EAAE,CAAC,OAAe,EAAE,EAAE;QACnC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAY,0BAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1E,IAAI,WAAW,GAAG,kBAAQ,CAAC,WAAW,CAAC,IAAI,CAAA;QAC3C,QAAQ,MAAM,EAAE;YACd,KAAK,aAAa;gBAChB,WAAW,GAAG,kBAAQ,CAAC,WAAW,CAAC,IAAI,CAAA;gBACvC,MAAK;YACP,KAAK,SAAS;gBACZ,WAAW,GAAG,kBAAQ,CAAC,WAAW,CAAC,IAAI,CAAA;gBACvC,MAAK;SACR;QAED,IAAI,OAAO,GAAW,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAA;QACjD,QAAQ,IAAI,EAAE;YACZ,KAAK,OAAO;gBACV,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAA;gBACrC,MAAK;YACP,KAAK,MAAM;gBACT,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAA;gBACzC,MAAK;SACR;QAED,MAAM,OAAO,GAAW,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEzC,OAAO,4BAAK,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACtD,CAAC;IACD,MAAM,EAAE,CAAC,OAAe,EAAW,EAAE;QACnC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAU,4BAAK,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QAEvE,IAAI,OAAO,GAAY;YACrB,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,EAAE;YACR,IAAI;YACJ,MAAM,EAAE,EAAE;SACX,CAAA;QACD,QAAQ,OAAO,EAAE;YACf,KAAK,wBAAQ,CAAC,OAAO,CAAC,UAAU;gBAC9B,OAAO,GAAG;oBACR,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,OAAO;oBACb,IAAI;oBACJ,MAAM,EAAE,QAAQ;iBACjB,CAAA;gBACD,MAAK;YACP,KAAK,wBAAQ,CAAC,OAAO,CAAC,UAAU;gBAC9B,OAAO,GAAG;oBACR,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,MAAM;oBACZ,IAAI;oBACJ,MAAM,EAAE,QAAQ;iBACjB,CAAA;gBACD,MAAK;YACP,KAAK,wBAAQ,CAAC,OAAO,CAAC,UAAU;gBAC9B,OAAO,GAAG;oBACR,MAAM,EAAE,SAAS;oBACjB,IAAI,EAAE,OAAO;oBACb,IAAI;oBACJ,MAAM,EAAE,QAAQ;iBACjB,CAAA;gBACD,MAAK;YACP,KAAK,wBAAQ,CAAC,OAAO,CAAC,UAAU;gBAC9B,OAAO,GAAG;oBACR,MAAM,EAAE,SAAS;oBACjB,IAAI,EAAE,MAAM;oBACZ,IAAI;oBACJ,MAAM,EAAE,QAAQ;iBACjB,CAAA;gBACD,MAAK;SACR;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;CACF,CAAA"}
|