Connect to Device
As outlined in the workflow, synchronizing hardware wallet data is a prerequisite for transactions. This article explains how to achieve this using the SDK.
tip
The private key never leaves the hardware wallet.
APIs
MultiAccount
The CryptoMultiAccounts class synchronizes all currency information from the hardware wallet.
function parseMultiAccounts(ur) {
// ...Implementation using gs-ur-js...
}
Parameters
The input parameter ur is a UR object, the output of the URDecoder.
Returns
-
device: the device model name.
-
masterFingerprint: the master fingerprint.
-
keys: the hdkey list.
-
deviceId: the device ID, such as serial numbers.
-
version: The versions.
-
nickName: the wallet account name.
Example
import { parseMultiAccounts } from 'gs-ur-js';
export const MultiAccounts = () => {
const onSucceed = ({ type, cbor }) => {
const multiAccounts = parseMultiAccounts(new UR(Buffer.from(cbor, "hex"), type))
console.log("multiAccounts: ", multiAccounts);
}
const onError = (errorMessage) => {
console.log("error: ", errorMessage);
}
const onCameraStatus = (isCameraReady, error) => {
if (!isCameraReady) {
if (error === "NO_WEBCAM_FOUND") {
console.log("No camera");
} else if (error === "NO_WEBCAM_ACCESS") {
console.log("No camera permission");
}
} else {
console.log("Camera ready");
}
}
const onProgress = (progress) => {
console.log("scan progress: ", progress);
}
return <button onClick={() => <AnimatedQRScanner
handleScan={onSucceed}
handleError={onError}
urTypes={[URType.CryptoMultiAccounts]}
onProgress={onProgress}
videoLoaded={onCameraStatus}
/>
}>Scan GsWallet</button>;
}
If successfully synchronized, you can get wallet information similar to the following content:
{
"device": "GSWALLET",
"masterFingerprint": "27c3831f",
"keys": [
{
"chain": "BTC",
"path": "m/44'/0'/0'",
"publicKey":
"037fb66bad14245d08994f715480b276b73fd33e109f94f589021be6275984c861",
"name": null,
"xfp": "27c3831f",
"chainCode":
"529aa275a0e19c9d3e0fc82381927f9b63f8dbcc8332d1c36250db6ede23aba4",
"extendedPublicKey":
"xpub6CdezvjFXdc95pLVoAAfGEnS9MyVW1d763AMwDzDgr6aj6Fx67kzxmq3ugpSxYLHi6A8yNciYxTjg3sPy5UAJQptMwH2gBm4APtsrT3pd51",
"note": "{\"chain\":[\"Bitcoin\"]}"
},
{
"chain": "BTC",
"path": "m/86'/0'/0'",
"publicKey":
"033cdf0f1101dbf2e4a877b6b779aa59d345cb649c507cef76928e68c00789f83a",
"name": null,
"xfp": "27c3831f",
"chainCode":
"30884b52c8ed7c80eb42d967c62a3e26e5f5ea8c071f2a0bb3c47c7f4604de24",
"extendedPublicKey":
"xpub6DUp5pGy2P3emgQgoes1Qqmf2SmVB4c6tXAqcgDuKfXmNMv7kdnXmmFFcrNmaTbZiN4bNDcrEd6rHxkUE24J3Ehj14CVuGtJQhQhoccgAyZ",
"note": "{\"chain\":[\"Bitcoin\"]}"
},
{
"chain": "ETH",
"path": "m/44'/60'/0'",
"publicKey":
"0377d99c1b2762804f04263aeb470f9a89ece15cbc44977249e5c8e4843126dd27",
"name": null,
"xfp": "27c3831f",
"chainCode":
"b154fee3bf6210099ba1eab2c86fe525fc63abe1c8509abe88aa814574cc6e60",
"extendedPublicKey":
"xpub6DHPziqQ7we7dDW3MfEZN6GiTpj6mXM9SFdtu3gBvVUYm3D1LQHk6Cpf6DfBWojtwqPqHggXKqVqPacAV5R2MHqfJuECXZHFNxekjd4L31N",
"note":
"{\"chain\":[\"Ethereum\", \"BNB\", \"Polygon\", \"zkSync_Era\", \"Base\", \"Fantom\", \"Optimism\", \"Avalanche\", \"Arbitrum\"]}"
},
...
{
"chain": "KAS",
"path": "m/44'/111111'/0'",
"publicKey":
"02075aefa9ab67f17d9eb60854e2d6357859d4df67810315edc0573f61208063a9",
"name": null,
"xfp": "27c3831f",
"chainCode":
"bcb27cad4ccda2b6d0a450d76c65a5c1f8f518b4b531482a7dc9f66474b0ab5b",
"extendedPublicKey":
"xpub6CyUGvaHsKmHKSgyTssHgZUcdymuNxwcVY431h6psm1J57mftsgyhioCErvohw5fRLj5jnbNuQ9J4m6JZ7GkRCmZhS24SrcgTVxK1hAvdFe",
"note": "{\"chain\":[\"Kaspa\"]}"
}
],
"deviceId": "HQ01BI4217DE2973",
"version": "0.0.7",
"nickName": "baby"
}