JavaScript SDK to communicate with CoolWallet.
This is the monorepo of all the packages you need to build your own app with CoolWallet hardware wallet.
1. Define your transport layer
Depending on your platform, you may can choose different transport object to use in you application.
To register you application with the wallet, take a look at the wallet module in core
package. This guide you through the process of registeration and seed generation.
Take a look at all the supported modules at Coin Apps. Used the keys generated in the previous step to initiate coin instances, then you can sign transactions, message with different coin instances.
To communicate with CoolWallet device, you need to specify a bluetooth transport.
Package | Version | Description |
---|---|---|
@coolwallet/transport-web-ble |
Web Bluetooth transport | |
@coolwallet/transport-react-native-ble |
React-Native Bluetooth transport |
Package | Version | Description |
---|---|---|
@coolwallet/core |
APDU commands, default encryptions and keypair generation for other SDKs. |
Used to sign transactions of different cryptocurrencies.
Package | Version | Coin Name |
---|---|---|
@coolwallet/atom |
Cosmos | |
@coolwallet/bch |
Bitcoin Cash | |
@coolwallet/bnb |
Binance | |
@coolwallet/bsc |
Binance Smart Chain | |
@coolwallet/btc |
Bitcoin/USDT | |
@coolwallet/dot |
Polkadot/Kusama | |
@coolwallet/eth |
Ethereum (Ether, ERC20, Smart Contract, EIP-1559 etc.) | |
@coolwallet/icx |
Icon | |
@coolwallet/ltc |
LiteCoin | |
@coolwallet/trx |
Tron | |
@coolwallet/xlm |
Stellar/Kinesis | |
@coolwallet/xrp |
Ripple | |
@coolwallet/zen |
Zen Cash |
npm install @coolwallet/core
npm install @coolwallet/transport-web-ble
import WebBleTransport from "@coolwallet/transport-web-ble";
import * as core from "@coolwallet/core";
Create a connection to obtain the Card Name and SE Public Key.
connect = async () => {
WebBleTransport.listen(async (error, device) => {
const cardName = device.name;
const transport = await WebBleTransport.connect(device);
const SEPublicKey = await core.config.getSEPublicKey(transport)
this.setState({ transport, cardName, SEPublicKey });
localStorage.setItem('cardName', cardName)
localStorage.setItem('SEPublicKey', SEPublicKey)
});
};
disconnect = () => {
WebBleTransport.disconnect(this.state.transport.device.id);
this.setState({ transport: undefined, cardName: "" });
};
- transport: The object use to communicate with CoolWallet
- SEPublicKey: The key used to authenticate SE.
Obtain app key pairs.
const keyPair = crypto.key.generateKeyPair()
localStorage.setItem('appPublicKey', keyPair.publicKey)
localStorage.setItem('appPrivateKey', keyPair.privateKey)
- keyPair: The keys use to check your app.
Register card and obtain the appId.
const name = 'your app name'
const SEPublicKey = localStorage.getItem('SEPublicKey')
const appId = await apdu.pair.register(transport, appPublicKey, password, name, SEPublicKey);
- password: Pairing password for the app to establish the connection with CoolWallet Pro. The password could be supplied by the user (max length: 8).
NOTE: A single CoolWallet Pro could only be paired to 3 apps.
Use function setSeed
to create or recover your wallet.
const seedHex = bip39.mnemonicToSeedSync(mnemonic).toString('hex');
await apdu.wallet.setSeed(transport, appId, appPrivateKey, seedHex, SEPublicKey)
If you want to create seed by card, you can use function createSeedByCard
. And also choose the length of seed(12, 18, 24).
await apdu.wallet.createSeedByCard(transport, appId, appPrivateKey, 12);
npm install @coolwallet/eth
import cwsETH from '@coolwallet/eth'
const ETH = new cwsETH();
const address = await ETH.getAddress(
transport,
appPrivateKey,
appId,
addressIdx
);
The address generated is compatible to BIP44 with account and change set to 0, which means calling getAddress(i)
will get the address of folllowing BIP44 path:
m/44'/60'/0'/0/{i}
In the design of current hardware, we only support path m/44'/60'/0'/0/{i}
for speed optimization. This might change in the future and we will then open a more general interface to deal with custom path.
If you have accountPublicKey
and accountChainCode
, you can use the function ETH.getAddressByAccountKey()
to get the address.
const address = await ETH.getAddressByAccountKey(
accountPublicKey,
accountChainCode,
addressIndex
);
The signedTx is signed by CoolWallet, which can be sent directly.
const transaction = {
nonce: "0x21d",
gasPrice: "0x59682f00",
gasLimit: "0x5208",
to: "0x81bb32e4A7e4d0500d11A52F3a5F60c9A6Ef126C",
value: "0x5af3107a4000",
data: "0x00",
chainId: 1
};
const signTxData = {
transport,
appPrivateKey,
appId,
transaction,
addressIndex,
};
const signedTx = await ETH.signTransaction(signTxData);
bootstrap
: Initialize monorepo environment with lerna.build
: Build all packages.clean
: Remove all packages's node_modules.ci
: Script for CI.update:lock
: Update package-lock.json information.
If you're interested to develop new coin for CoolWallet Pro, please see CONTRIBUTING for more information.