zetrix-connect-wallet-sdk
v1.1.8
Published
A library for mobile wallet and non-Chrome browsers to connect with the Zetrix blockchain.
Downloads
150
Readme
Zetrix Connect Wallet SDK
First install the npm package:
npm install Zetrix-connect-wallet-sdk
The 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'
}
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 |
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. 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 qrcode:true and authorization is granted, the MESSAGE signature SDK will automatically notify Zetrix Wallet app to perform the signature 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 |
5. 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 |
6. 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 |
7. 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 |
8. 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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