zetrix-connect-wallet-sdk
v1.2.15
Published
A library for mobile wallet and non-Chrome browsers to connect with the Zetrix blockchain.
Readme
Zetrix Connect Wallet SDK
First install the npm package:
npm install zetrix-connect-wallet-sdkThe syntax shown below is Javascript ES6, which needs to be translated to run in a Web browser
1. Initialize the SDK
import ZetrixWalletConnect from 'zetrix-connect-wallet-sdk';
const options = {
bridge: 'wss://test-wscw.zetrix.com',
callMode: 'web', // 'web' for browser pages; use 'webView' when inside Zetrix webview
qrcode: true, // recommended for PC so the SDK can generate a QR for scanning
appType: 'zetrix' // zetrixwv3 OR pixa OR myid OR muma
};
const ZetrixWalletConnect = new ZetrixWalletConnect(options)Initialization parameters:
| param | type | required | description |
| --- | --- | --- | --- |
| bridge | String | Yes | Bridge service IP for communication between H5 JS and App |
| qrcode | Boolean | No | Whether to enable the code scan authorization mode (it is recommended to configure this mode on the PC) |
| callMode | String | Yes | If the passed in parameter 'web' is used in the web page. If the incoming parameter 'webView' is used in webView |
| testnet | Boolean | No | Add this flag and set to true if you want to operate on the testnet, otherwise it will default to operating on mainnet |
| appType | String | Yes | Choose between 'zetrix', 'zetrixwv3', 'pixa', 'myid', 'muma' depending on the application used |
| customQrUi | Boolean | No | Enable custom QR UI mode - SDK will call your callback instead of displaying built-in QR (requires qrcode: true and qrDataCallback) |
| qrDataCallback | Function | No | Callback function that receives QR content string when custom QR UI is enabled. Format: (qrContent: string) => void |
2. The connection
After initialization, the JS plug-in is required to establish a connection with the WebSocket service
If authorized in Zetrix Wallet app, the authorized account address in Zetrix Wallet App will be returned
ZetrixWalletConnect.connect().then(res => {
}).catch(error => {
})Return Parameter Description:
| param | type | description | | --- | --- | --- | | code | Int | Status code | | data.address | String | App authorized account address | | message | String | Return messages |
resp:
{
code: 0,
data: {
address: 'ZTX3YgemDoX7JXkqsyeyprQVpoMJHkp5Qu8US'
},
message: ''
}Status Code Description:
| code | description | promise | | --- | --- | --- | | 0 | Success | Resolve | | 90001 | This plug-in cannot be used because the browser does not support the API syntax used by the plug-in | Reject | | 90002 | Browsers do not support Websocket communication and cannot use this plug-in | Reject |
3. Authorized to connect
By invoking the authorization SDK, Zetrix Wallet App can be notified to perform authorization connection and authorize the current App account. After authorization, the application side can use Zetrix Wallet App's signature, transfer and other functions.
Note: the SDK is used on the PC, and it is recommended to set the initialization parameters qrcode:true. After invoking the authorization SDK, the authorization qrcode will be automatically generated. Zetrix wallet app can scan the code for authorization connection
ZetrixWalletConnect.auth().then(res => {
}).catch(error => {
})Return Parameter Description:
| param | type | description | | --- | --- | --- | | code | Int | Status code | | data.address | String | App authorized account address | | message | String | Return messages |
resp:
{
code: 0,
data: {
address: 'ZTX3YgemDoX7JXkqsyeyprQVpoMJHkp5Qu8US'
},
message: ''
}Status Code Description:
| code | description | promise | | --- | --- | --- | | 0 | Success | Resolve | | 1 | Cancel | Reject |
4. Custom QR UI Mode
The SDK supports custom QR UI mode, allowing you to display QR codes in your own custom interface instead of using the built-in QR display.
When to use:
- You need custom branding or styling for the QR code
- You're using modern frameworks (React, Vue, Angular)
- You want to display QR in modals, dialogs, or custom layouts
- You need full control over QR code presentation
Example with React:
import React, { useState } from 'react';
import QRCode from 'qrcode.react';
import ZetrixWalletConnect from 'zetrix-connect-wallet-sdk';
function App() {
const [qrData, setQRData] = useState(null);
const [authResult, setAuthResult] = useState(null);
// Initialize SDK with custom QR callback
const sdk = new ZetrixWalletConnect({
bridge: 'wss://wscw.zetrix.com',
callMode: 'web',
qrcode: true,
customQrUi: true, // Enable custom QR mode
qrDataCallback: (qrContent, closeCallback) => {
console.log('QR data received:', qrContent);
setQRData(qrContent); // Display in your custom UI
// Store closeCallback if you need to programmatically close
},
appType: 'zetrix'
});
const handleAuth = async () => {
try {
await sdk.connect();
const result = await sdk.auth();
setQRData(null); // Close your custom QR UI when auth completes
setAuthResult(result);
} catch (error) {
console.error('Auth failed:', error);
setQRData(null); // Close on error
}
};
return (
<div>
<button onClick={handleAuth}>Authenticate</button>
{/* Custom QR Modal */}
{qrData && (
<div className="qr-modal">
<h2>Scan QR Code with Wallet App</h2>
<QRCode value={qrData} size={300} />
<p>QR Content: {qrData}</p>
<button onClick={() => setQRData(null)}>Close</button>
</div>
)}
{authResult && (
<div>
<p>Authenticated: {authResult.data.address}</p>
</div>
)}
</div>
);
}Key Points:
- Set
customQrUi: trueand provideqrDataCallback - SDK calls your callback with two parameters:
qrContent(string): QR content in format"{rms}&{sessionId}&{type}"closeCallback(function): Optional callback to programmatically signal closure
- You are responsible for displaying and closing the QR UI
- The SDK automatically closes when wallet responds (auth completes/rejects)
- Works with all QR operations:
auth(),signMessage(),authAndSignMessage(), etc.
5. The message signature
Zetrix Wallet App can display and sign the content to be signed by calling this method. After signing, the user will return the app signature account public key, App signature account address, signature string, etc.
Note: When the SDK is used on the PC side, the initial parameter is set with qrcode:true. After authorization is granted, the message signing will automatically notify Zetrix Wallet app to perform the signing function.
const obj = {
message: 'Hello world'
}
ZetrixWalletConnect.signMessage(obj).then(res => {
}).catch(error => {
})Request param:
| param | type | description | | --- | --- | --- | | message | String | Information to be signed provided by the service side |
Return Parameter Description:
| param | type | description | | --- | --- | --- | | code | Int | Status code | | data.address | String | App authorized account address | | data.publicKey | String | App signed the public key of the account | | data.signData | String | Signature string | | message | String | Return messages |
resp:
{
code: 0,
data: {
address: 'ZTX3YgemDoX7JXkqsyeyprQVpoMJHkp5Qu8US',
publicKey: 'b001226ed6ee3bdae141e5e2686b2034fd7db1d3e4b562a3d315a14af71de6ab7c844ef786b6',
signData: '2ed1e99b92377fdf9ed8e7d55d7de322cd59d9df91d8e9c4a4f495931ad5d4da14b1c9258e2e0fdc33d77a48921b0a4acf46492cd171495deec30954ac2eef07',
},
message: ''
}Status Code Description:
| code | description | promise | | --- | --- | --- | | 0 | Success | Resolve | | 1 | Cancel | Reject | | 10011 | Unauthorized | Reject |
6. Authorize to connect and sign a message
Zetrix Wallet app can support a 2 step process of connecting the wallet as well as signing a message (step 3 & 4 combined into one). The content to be signed will be displayed on the app and it will return the account's public key, account address, and the signed string.
Note: When the SDK is used on the PC side, the initial parameter is set with qrcode:true. After authorization is granted, the message signing will automatically notify Zetrix Wallet app to perform the signing function.
const obj = {
message: 'Hello world'
}
ZetrixWalletConnect.authAndSignMessage(obj).then(res => {
}).catch(error => {
})Request param:
| param | type | description | | --- | --- | --- | | message | String | Information to be signed provided by the service side |
Return Parameter Description:
| param | type | description | | --- | --- | --- | | code | Int | Status code | | data.address | String | App authorized account address | | data.publicKey | String | App signed the public key of the account | | data.signData | String | Signature string | | data.sessionId | String | Session ID | | message | String | Return messages |
resp:
{
code: 0,
data: {
address: 'ZTX3YgemDoX7JXkqsyeyprQVpoMJHkp5Qu8US',
publicKey: 'b001226ed6ee3bdae141e5e2686b2034fd7db1d3e4b562a3d315a14af71de6ab7c844ef786b6',
signData: '2ed1e99b92377fdf9ed8e7d55d7de322cd59d9df91d8e9c4a4f495931ad5d4da14b1c9258e2e0fdc33d77a48921b0a4acf46492cd171495deec30954ac2eef07',
},
message: ''
}Status Code Description:
| code | description | promise | | --- | --- | --- | | 0 | Success | Resolve | | 1 | Cancel | Reject | | 10011 | Unauthorized | Reject |
7. Blob signature
By calling this method, blob can be passed into the application side and signed by Zetrix Wallet App. After signing, the user will return the app signature account public key, App signature account address, signature string, etc.
Note: PC side using SDK, initial parameter configuration qrcode:true after authorization, call message signature SDK will automatically notify Zetrix Wallet app to perform BLOB signature function (signature only)
const obj = {
message: '0a255a54583364703475586b32415742576758386648675833353263666b567050366550357835106222b401080712255a54583364703475586b32415742576758386648675833353263666b5670503665503578356288010a255a5458334b5a4d7a4b4451483851525236516d7152346b385a7241366e55693546377a73341a5f7b226d6574686f64223a227472616e73666572222c22706172616d73223a7b22746f223a225a545833545857635879416a4634617959706d6244656165387a414a38726f587a31385941222c2276616c7565223a2231303030303030227d7d30a64a380a'
}
ZetrixWalletConnect.signBlob(obj).then(res => {
}).catch(error => {
})Request param:
| param | type | description | | --- | --- | --- | | message | String | Information to be signed provided by the service side |
Return Parameter Description:
| param | type | description | | --- | --- | --- | | code | Int | Status code | | data.address | String | App authorized account address | | data.publicKey | String | App signed the public key of the account | | data.signData | String | Signature string | | message | String | Return messages |
resp:
resp:
{
code: 0,
data: {
address: "ZTX3YgemDoX7JXkqsyeyprQVpoMJHkp5Qu8US"
publicKey: "b001226ed6ee3bdae141e5e2686b2034fd7db1d3e4b562a3d315a14af71de6ab7c844ef786b6"
signData: "00bb613675c634f1586fb31274572ed5211972d94ff3fe25f78997a683744957753ebce3d31913d17ea53d9048b0c30daf6a2dba023486a65c1cae2ca5dea40d
},
message: ''
}Status Code Description:
| code | description | promise | | --- | --- | --- | | 0 | Success | Resolve | | 1 | Cancel | Reject | | 10011 | Unauthorized | Reject |
8. Obtain account nonce value before transfer
The account Nonce value (account transaction serial number) needs to be obtained before the transfer, and the account continuity needs to be guaranteed, and the nonce value of the account needs to be added by 1 when the new transaction occurs
const obj = {
address: 'ZTX3dp4uXk2AWBWgX8fHgX352cfkVpP6eP5x5',
chainId: '2'
}
// SDK
const nonce = this.ZetrixWalletConnect.getNonce(obj)
// code example
async getNonce () {
let nonceResult = await this.ZetrixWalletConnect.getNonce(obj)
const nonce = nonceResult + 1
return nonce
}Request param:
| param | type | description | | --- | --- | --- | | address | String | Address of the account whose nonce value needs to be queried | | chainId | String | Network environment: 1 Primary network, 2 Test network |
Return Parameter Description:
| param | type | description | | --- | --- | --- | | nonce | Int | Account transaction serial number |
9. Transaction
This method can support transfer of ZTX, ZTP20 and other protocols and creation and invocation of smart contracts. This SDK is usually used for transactions on the Zetrix Wallet app chain, and developers need to assemble their own data structures from the following data templates before invoking the SDK. The confirmation page is for the App account to sign the transaction independently. After signing, the App will broadcast the transaction to the blockchain node, and the App will respond to the submission status. The final status of the transaction requires the developer to confirm the final state of the transaction by calling the transaction query interface after returning the hash value of the transaction.
Note: When the SDK is used on PC side, the initial parameter configuration qrcode:true and authorization is made, the MESSAGE signature SDK will automatically notify Zetrix Wallet App to execute the transaction function
var obj = {
from:'ZTX3dp4uXk2AWBWgX8fHgX352cfkVpP6eP5x5',
to:'ZTX3KZMzKDQH8QRR6QmqR4k8ZrA6nUi5F7zs4',
nonce: 98,
amount:'1',
gasFee: '0.01',
data:'{"method":"transfer","params":{"to":"ZTX3TXWcXyAjF4ayYpmbDeae8zAJ8roXz18YA","value":"1000000"}}',
chainId:'2'
}
ZetrixWalletConnect.sendTransaction(obj).then(res => {
}).catch(error => {
})Request param:
| param | type | description | | --- | --- | --- | | from | String | Account address of the party initiating the transaction | | to | String | Target account address | | nonce | Int | Account transaction sequence number. The account must be continuous and the nonce of the account must be added by 1 when a new transaction occurs | | amount | String | ZTX transfer quantity; If to is the smart contract address, the number of transfers supported is 0 | | gasFee | String | Transaction prepaid expenses, such as 0.01ZTX pre-paid, the real cost consumed after the transaction is successful will be less than 0.00674 ZTX | | data | String | The contract calls the function, usually a JSON string | | chainId | String | Network environment: 1 Primary network, 2 Test network |
Return Parameter Description:
| param | type | description | | --- | --- | --- | | code | Int | Status code | | data.hash | String | Trading hash | | message | String | Return messages |
resp:
{
code: 0,
data: {
hash: 'f38436d58a1df817bfd6b5e3d1474ca5feced26a8c37beb2591862ba2a01d91d',
},
message: ''
}Status Code Description:
| code | description | promise | | --- | --- | --- | | 0 | Success | Resolve | | 1 | Cancel | Reject |
10. Verify VC (verifyVC)
This method requests the mobile wallet to verify a (VC). The SDK will open the wallet (or delegate to the WebView) and wait for the mobile app response.
const obj = {
templateId: 'TEMPLATE_ID'
}
ZetrixWalletConnect.verifyVC(obj).then(res => {
// res.data.status -> e.g. 'true@false'
// res.data.details > e.g. 'Verification details'
}).catch(error => {
// handle cancel / failed / timeout
})Request param:
| param | type | description | | --- | --- | --- | | templateId | String | The template (VC) identifier to verify on the wallet side |
Return Parameter Description:
| param | type | description | | --- | --- | --- | | code | Int | Status code | | data.status | Boolean | Verification status returned by the wallet (e.g. true, false) | | data.details | Object | The full VC verification result (see below) | | message | String | Return messages |
resp:
{
"code": 0,
"data": {
"status": true,
"details": {
"errMsg": null,
"vcDetail": [
{
"id": "did:zid:69bd3c95f51fc2ca134fe67e6303e3e83633bbbdb14cf00400e87cd3388a8eeb",
"issuer": "did:zid:d545dc623b0562e9b02a0b4f280b32bd060c9ff1b3582290e6d760e3cc3bfd15",
"issuanceDate": "2025-07-02T00:00:00Z",
"expirationDate": "2035-07-02T00:00:00Z",
"credentialSubject": {
"passport": {
"name": "John Doe",
"nationality": "Myanmarese"
}
}
}
],
"verified": true
}
}
}Status Code Description:
| code | description | promise | | --- | --- | --- | | 0 | Success | Resolve | | 1 | Cancel / Rejected by user | Reject | | 10011 | Unauthorized | Reject |
Note: the SDK will reject the promise when the wallet returns a FAILED or CANCELLED status. The WebView implementation mirrors the H5 flow; ensure templateId is provided.
WebView:
The WebView implementation returns the same structure as the H5 flow. Always provide a valid templateId.
11. Get VP (getVP)
This method requests the mobile wallet to generate and return a Verifiable Presentation (VP) UUID based on a template ID. The SDK will open the wallet (or delegate to the WebView) and wait for the mobile app to return the UUID.
const obj = {
templateId: 'TEMPLATE_ID',
attributes: ['name', 'nationality', 'dateOfBirth']
}
ZetrixWalletConnect.getVP(obj).then(res => {
// res.data.uuid -> the generated UUID string
console.log('UUID:', res.data.uuid);
}).catch(error => {
// handle cancel / failed / timeout
})Request param:
| param | type | description | | --- | --- | --- | | templateId | String | The template identifier used to generate the VP UUID | | attributes | Array | Array of attribute names to be included in the VP (e.g., ['name', 'nationality']) |
Return Parameter Description:
| param | type | description | | --- | --- | --- | | code | Int | Status code | | data.uuid | String | The generated UUID for the Verifiable Presentation | | message | String | Return messages |
resp:
{
"code": 0,
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000"
}
}Status Code Description:
| code | description | promise | | --- | --- | --- | | 0 | Success | Resolve | | 1 | Cancel / Rejected by user | Reject | | 10011 | Unauthorized (not authenticated) | Reject | | -1 | Missing templateId/attributes or system error | Reject |
Note: the SDK will reject the promise if the user cancels, the session is not authenticated, or if templateId or attributes is not provided. The attributes parameter must be an array of strings. The WebView implementation mirrors the H5 flow.
WebView:
The WebView implementation returns the same structure as the H5 flow. Always provide a valid templateId and attributes array.
12. Cancel the authorization
Call this method to cancel the authorization status between the application and the Zetrix Wallet app
ZetrixWalletConnect.disconnect()webview SDK
With zetrix-connect-wallet-sdk, the various capabilities of the Zetrix App can also be accessed and used in the webview environment.
The syntax shown below is Javascript ES6, which needs to be translated to run in a webview
1. To initialize the webview SDK
import ZetrixWalletConnect from 'zetrix-connect-wallet-sdk';
const ZetrixWalletConnect = new ZetrixWalletConnect()1.1 Customize the App header style
Preload URL Options allows you to define a number of parameters on the URL address, the Zetrix app parses these parameters and prepares all the design styles for you on a native level. Faster, more elegant, easier to configure, less invasive
In fact, the above configuration only requires a string at the end of the URL, for example: https://test-appcredential.Zetrix.com/?navStyle=0&appType=1, no APIs or SDK required.
When Zetrix's WebView reads the query parameters in the URL, it serializes and analyzes them, if the parameters meet the agreed criteria, the WebView pre-configures the layout at the native level according to this configuration.
1.1.1 navStyle
Configure this field to be immersive
0: navigation bar bright color style, the title button is black, and the background is white
1: navigation bar Dark style, the title button is white, and the background is black
f this field is not configured, it is considered non immersive
<img src='data:image/png;base64,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
