Categorygithub.com/coming-chat/wallet-SDK
module
55.66.88+incompatible
Repository: https://github.com/coming-chat/wallet-sdk.git
Documentation: pkg.go.dev

# README

wallet-SDK

BitcoinEthereumPolkaCosmos
import mnemonic
import keystore
pri/pub key & address
multi network
publicKey to address
address to publicKey
sign data☑️☑️☑️
query balance
fetch transaction detail
gas fee☑️
send taw transaction✅ ☑️✅ ☑️
multi token✅ erc20✅ XBTC

If there are two icons, the first icon indicates development status, and the second icon indicates test status. ✅: Completed ☑️: TODO ❌: Unsupported

Usage

About Wallet

SDK provide wallet import, account public and private key and address acquisition.

Import Wallet

// import mnemonic
wallet, err = NewWalletFromMnemonic(mnemonic)

// import keystore
// It only supports Polka keystore.
wallet, err = NewWalletFromKeyStore(keyStoreJson, password)

Create Account

We currently support accounts in Bitcoin, Ethereum and Polkadot ecosystems.

// Polka
polkaAccount, err = wallet.GetOrCreatePolkaAccount(network)

// Bitcoin
bitcoinAccount, err = wallet.GetOrCreateBitcoinAccount(chainnet)

// Ethereum
ethereumAccount, err = wallet.GetOrCreateEthereumAccount()

// Cosmos
cosmosAccount, err = wallet.GetOrCreateCosmosAccount()

// Terra is a type of cosmos
terraAccount, err = wallet.GetOrCreateCosmosTypeAccount(330, "terra")

Get PrivateKey, PublicKey, Address

privateData, err = account.PrivateKeyData()

privateKey, err = account.PrivateKey()

publicKey = account.PublicKey()

address = account.Address()

About Chain

We can use chain tools to do chain related work.

  • query balance
  • query estimate fees
  • send transaction
  • fetch transaction detail
  • support multi token:
    • eth contract erc20 token
    • xbtc

Create Chain

polkaChain, err = polka.NewChainWithRpc(rpcUrl, scanUrl, network)

bitcoinChain, err = btc.NewChainWithChainnet(chainnet)

ethereumChain, err = eth.NewChainWithRpc(rpcUrl)

cosmosChain, err = cosmos.NewChainWithRpc(rpcUrl, restUrl)
terraChain, err = cosmos.NewChainWithRpc(terraRpcUrl, terraRestUrl)

Methods


// query balance
balance, err = chain.BalanceOfAddress(address)
balance, err = chain.BalanceOfPublicKey(publicKey)
balance, err = chain.BalanceOfAccount(account)

// send transaction
txHash, err = chain.SendRawTransaction(signedTx)

// fetch transaction detail
detail, err = chain.FetchTransactionDetail(hashString)
status = chain.FetchTransactionStatus(hashString)

Chain's Token

// MainToken
token = chain.MainToken()

// btc have not tokens

// polka (only support XBTC of ChainX currently)
xbtcToken = polkaChain.XBTCToken()

// ethereum erc20 token
erc20Token = ethereumChain.Erc20Token(contractAddress)

// cosmos token
atomToken = cosmosChain.DenomToken("cosmos", "uatom")
ustToken = terraChain.DenomToken("terra", "uusd")

// token balance (similar to chain's balance)
balance, err = anyToken.BalanceOfAddress(address)
balance, err = anyToken.BalanceOfPublicKey(publicKey)
balance, err = anyToken.BalanceOfAccount(account)

Estimate fee

// sbtc's estimate fee is compute by utxo

// polka 
transaction = // ...
fee, err = polkaChain.EstimateFeeForTransaction(transaction)

// ethereum
gasPrice, err = ethChain.SuggestGasPrice()
gasLimit, err = anyEthToken.EstimateGasLimit(fromAddress, receiverAddress, gasPrice, amount)


Cosmos & Terra Demo

Creator

// Import mnemonic
wallet, err = NewWalletFromMnemonic(mnemonic)

// Cosmos account
cosmosAccount, err = wallet.GetOrCreateCosmosAccount()
// Terra is a type of cosmos
terraAccount, err = wallet.GetOrCreateCosmosTypeAccount(330, "terra")

// Create Chain
chain, err = cosmos.NewChainWithRpc(rpcUrl, restUrl)

// Create a coin token
atomToken = cosmosChain.DenomToken("cosmos", "uatom")
lunaToken = terraChain.DenomToken("terra", "uluna")
ustToken = terraChain.DenomToken("terra", "uusd")

Query balance

// query balance with token
atomBalance, err = atomToken.BalanceOfAddress("cosmos1lkw6n8efpj7mk29yvajpn9zue099l359cgzf0t")
lunaBalance, err = lunaToken.BalanceOfAddress("terra1ncjg4a59x2pgvqy9qjyqprlj8lrwshm0wleht5")
ustBalance , err =  ustToken.BalanceOfAddress("terra1dr7ackrxsqwmac2arx26gre6rj6q3sv29fnn7k")

// you can query balance with chain directly
atomBalance, err = cosmosChain.BalanceOfAddressAndDenom("cosmos1lkw6n8efpj7mk29yvajpn9zue099l359cgzf0t", "uatom") // uatom
lunaBalance, err =  terraChain.BalanceOfAddressAndDenom("terra1ncjg4a59x2pgvqy9qjyqprlj8lrwshm0wleht5", "uluna")  // uluna
ustBalance , err =  terraChain.BalanceOfAddressAndDenom("terra1dr7ackrxsqwmac2arx26gre6rj6q3sv29fnn7k", "uusd")   // uusd

Fetch Transaction Detail

atomDetail, err = cosmosChain.FetchTransactionDetail("F068275DE4A4CC904D3E6A412A50DFACC235C62770BCD001E54E00BC4C17B1F0")

lunaDetail, err =  terraChain.FetchTransactionDetail("19771A22934641DBD3D347DCCAE939DAC37F39ABD88005AA735B8AAEA78599BA")

// exactly the same as luna detail.
ustDetail , err =  terraChain.FetchTransactionDetail("25ACF16526D3A4DEE5FE7C5CCEB597B5691134647829AD30CA1E36EDBEAC32B6")

Sign & Send transaction

cosmosAccount = // create a cosmos account
toAddress = "cosmos1lkw6n8efpj7mk29yvajp......"
amount = "100000"
gasPrice = "0.01"
gasLimit = "80000"

chain = cosmos.NewChainWithRpc(rpcUrl, restUrl)
token = chain.DenomToken(prefix, denom)

signedTx, err = token.BuildTransferTx(account.PrivateKeyHex(), toAddress, gasPrice, gasLimit, amount)

txHash, err = chain.SendRawTransaction(signedTx)



Ethereum Sign Transaction

ethereumChain, err = eth.NewChainWithRpc(rpcUrl)

// make an transaction object
transaction = NewTransaction(nonce, gasPrice, gasLimit, to, value, data)
// transaction.MaxPriorityFeePerGas = "10000" // if send EIP1559 tx

// sign with hexed privatekey
signedTxObj, err = ethereumChain.SignTransaction(privateKeyHex, transaction)
// sign with ethereum account
signedTxObj, err = ethereumChain.SignTransactionWithAccount(ethAccount, transaction) 

signedHashString = signedTxObj.Value // signed transaction hash string


ComingChat substrate wallet SDK

build android && ios

  • make buildAllAndroid
  • make buildAllIOS

Struct

Wallet

Wallet 工具类方法(静态方法)

  • 获取助记词:
    String mnemonicString = Wallet.genMnemonic();
    

    throw err

  • 创建钱包:
    1. 从助记词或私钥
    Wallet wallet = Wallet.newWallet(seedOrPhrase);
    
    参数类型描述获取方式
    seedOrPhrasestring助记词或者私钥
    networkintss58

    throw err

    1. 从keystore
    Wallet wallet = Wallet.NewWalletFromKeyStore(keyStoreJson, password);
    
    参数类型描述获取方式
    keyStoreJsonstringkeystore
    passwordstring密码

    throw err

  • 地址转公钥
    String publicKey = Wallet.addressToPublicKey(address);
    
    参数类型描述获取方式
    addressstring地址

​ throw err

  • 公钥转地址
    String address = Wallet.publicKeyToAddress(publicKey, network);
    
    参数类型描述获取方式
    publicKeystring公钥16进制字符串
    networkintss58

​ throw err

Wallet类方法

  • 获取公钥:
    String publicKeyHex = wallet.getPublicKeyHex();
    byte[] publicKey = wallet.getPublicKey();
    
  • 获取私钥:
    String privateKey = wallet.getPrivateKeyHex();
    

    throw err

  • 签名:
    byte[] signature = wallet.sign(message, password);
    
    参数类型描述获取方式
    message[]byte签名内容
    passwordstringkeystore 密码,如果是助记词或者私钥创建则随便填

    throw err

  • 检查Keystore密码
    bool isCorrect = wallet.checkPassword(password);
    
    参数类型描述获取方式
    passwordstring

throw err

  • 获取地址:
    String address = wallet.getAddress(network);
    
    参数类型描述获取方式
    networkintss58

    throw err

Tx

  • 创建Tx
    Tx tx = Tx.NewTx(metadataString);
    
    参数类型描述获取方式
    metadataStringstringmetadata的16进制string接口获取

    throw err

  • 从Hex创建Transaction
    Transaction t = tx.newTransactionFromHex(txHex)
    
    参数类型描述获取方式
    txHexstringtx的16进制数据从Wallet Connect获取

    throw err

  • 创建Balance转账
    Transaction t = tx.newBalanceTransferTx(dest, amount);
    
    参数类型描述获取方式
    deststring对方address输入
    amountstring金额用户输入

    throw err

  • 创建ChainX转账
    Transaction t = tx.newBalanceTransferTx(dest, amount);
    

    参数同上

    throw err

  • 创建NFT转账
    Transaction t = tx.newComingNftTransferTx(dest, cid);
    
    参数类型描述获取方式
    deststring对方address输入
    cidlongcid用户输入

    throw err

  • 创建XBTC转账
    Transaction t = tx.newXAssetsTransferTx(dest, amount);
    

    参数同上

    throw err

  • 创建mini门限转账
    Transaction t = tx.NewThreshold(thresholdPublicKey, destAddress, aggSignature, aggPublicKey, controlBlock, message, scriptHash, transferAmount, blockNumber);
    
    参数类型描述获取方式
    thresholdPublicKeystring门限钱包公钥generateThresholdPubkey()
    destAddressstring对方地址
    aggSignaturestring聚合签名getAggSignature()
    aggPublicKeystring聚合公钥getAggPubkey()
    controlBlockstringcontrolBlockgenerateControlBlock()
    messagestring576520617265206c6567696f6e21写死
    scriptHashstringscriptHash接口获取
    transferAmountstring转账金额用户输入
    blockNumberint32blockNumber与scriptHash同接口获取

    throw err

Transaction

  • 获取未签名Tx
    String unSignTx = t.getUnSignTx();
    

    throw err 此方法用于预估矿工费使用

  • 获取需要签名内容
    byte[] signData = t.getSignData(genesisHashString, nonce, specVersion, transVersion);
    
    参数类型描述获取方式
    genesisHashStringstringgenesisHash接口获取
    nonceint64nonce接口获取
    specVersionint32接口获取
    transVersionint32接口获取

    throw err

  • 获取Tx
    String sendTx = t.getTx(signerPublicKey, signatureData);
    
    参数类型描述获取方式
    signerPublicKeybyte[]签名者公钥获取公钥的getPublicKey方法
    signatureDatabyte[]签名结果

    throw err

交易构造流程

  1. 导入助记词或私钥,生成钱包对象

  2. 调用创建钱包获得钱包对象wallet用于签名

  3. 调用接口获取构造参数(nonce, specVersion, transVersion )

  4. Metadata的获取根据接口判断

  5. 调用创建Tx获得tx对象用于构造交易

  6. 通过tx对象创建交易t

  7. 用钱包Sign方法对交易t的内容(获取需要签名内容)签名

  8. 将签名方公钥(获取公钥)和签名内容放入GetTx的方法中

  9. 交易t调用获取Tx获得SendTx

try {
  String mnemonicString = Wallet.genMnemonic();
	Wallet wallet = Wallet.newWallet(mnemonicString);
  Tx tx = Tx.NewTx(metadataString);
  String dest = "5UczqUVGsoQpZnBCZkDtxvLxJ42KnUfaGTzPkQmZeAAug4s9";
  String genesisHashString = "0xfb58f83706a065ced8f658fafaba97e6e49b772287e332077c499784184eda9f";
  long amount = "100000";
  Transaction t = tx.newBalanceTransferTx(dest, amount);
  byte[] signedMessage = wallet.sign(t.getSignData(genesisHashString, 0, 115, 1));
  String sendTx = t.getTx(wallet.getPublicKey(), signedMessage);
}catch  (Exception e){
  
}

Eth 交易golang代码,两端调用参考下,具体看sdk打包后源码

goland 代码

package main

import (
	"fmt"
	"math/big"

	coin "github.com/0xhelloweb3/go-coin-wallet/eth"
	"github.com/ethereum/go-ethereum/common"
)

var (
	rpcUrl = "https://data-seed-prebsc-1-s1.binance.org:8545"

	walletAddress = "0xB553803EE21b486BB86f2A63Bd682529Aa7FCE8D"

	privateKey = ""

	// bsc 测试网 busd 合约地址
	busdContractAddress = "0xeD24FC36d5Ee211Ea25A80239Fb8C4Cfd80f12Ee"
)


func main() {
	wallet := coin.NewEthChain()
	wallet.CreateRemote(rpcUrl)

	// 获取主网代币 BNB 余额
	balance, _ := wallet.Balance(walletAddress)
	fmt.Printf("bnb balance: %v\n", balance)

	// 获取 Erc20代币 余额
	busdBalance, _ := wallet.TokenBalance(busdContractAddress, walletAddress)

	tokenDecimal, err := wallet.TokenDecimal(busdContractAddress, walletAddress)
	fmt.Printf("busdBalance balance: %v, decimal: %v \n", busdBalance, tokenDecimal)

	if err != nil {
		fmt.Printf("get busdt balance error: %v\n", err)
		return
	}
	nonce, _ := wallet.Nonce(walletAddress)

	// 构造多笔交易则nonce + 1
	callMethodOpts := &coin.CallMethodOpts{
		Nonce: nonce,
	}

	// erc20 代币转账
	buildTxResult, err := wallet.BuildCallMethodTx(
		privateKey,
		busdContractAddress,
		coin.Erc20AbiStr,
		// 调用的合约方法名
		"transfer",
		callMethodOpts,
		// 转账目标地址
		common.HexToAddress("0x4165FD787ffF9f659A3B9A239a1d70fc5B8aB6d1"),
		big.NewInt(10000000000))

	if err != nil {
		fmt.Printf("build call method tx error: %v\n", err)
	}
	// 发送交易
	sendTxResult, err := wallet.SendRawTransaction(buildTxResult.TxHex)
	if err != nil {
		fmt.Printf("send raw transaction error: %v\n", err)
	}
	// 打印交易hash
	fmt.Printf("sendTxResult: %v\n", sendTxResult)

	// 检测 transfer 事件, fromBlock 和 toBlock 参数可以不传
	eventlogs, _ := wallet.FindLogs(busdContractAddress, coin.Erc20AbiStr, "Transfer",
		big.NewInt(17174691), big.NewInt(17174691), nil)
	fmt.Printf("eventlogs: %v\n", eventlogs)
}

Android 调用代码 (ERC20 转账)

 // 钱包地址
 private String walletAddress = "0xB553803EE21b486BB86f2A63Bd682529Aa7FCE8D";
 // 钱包对应的私钥
 private String privateKey = "";
 // busd 测试网合约地址
 private String busdContractAddress = "0xeD24FC36d5Ee211Ea25A80239Fb8C4Cfd80f12Ee";
 // bsc测试网rpc 节点
 bscRpc ="https://data-seed-prebsc-1-s1.binance.org:8545"

 EthChain ethChain = new EthChain();
 ethChain.createRemote(bscRpc);
 // 查询bnb余额
 long balance = ethChain.balance(walletAddress);
 Toast.makeText(getApplicationContext(),String.valueOf(balance),Toast.LENGTH_LONG).show();
 long Nonce =  ethChain.nonce(walletAddress);
 CallMethodOpts opts = new CallMethodOpts();
 // 设置nonce,可选
 opts.setNonce(Nonce);
 // 设置 gas 可选
 BuildTxResult buildTxResult = ethChain.buildCallMethodTx(
                    privateKey,
                    busdContractAddress,
                    Eth.getErc20AbiStr(),
                    "transfer",
                    opts,
                    {\"toAddress\":\"0x178a8AB44b71858b38Cc68f349A06f397A73bFf5\", \"amount\":1000000, \"method\":\"transfer\"}");
  Log.d("tx hex",buildTxResult.getTxHex());
  String tx = ethChain.sendRawTransaction(buildTxResult.getTxHex());
  Log.d("send tx success", tx);

PolkaChain Metadata 相关用法

// 只通过 rpcUrl 来初始化
chain = NewPolkaChain(rpc, scan)

// 通过传入本地缓存的 metadata 来初始化, 如果没有可以传空
chain = NewPolkaChainWithRpc(rpc, scan, metadata)

// 获取 metadata string
metadata, err = chain.GetMetadataString()

// 刷新 metadata string (可以从返回值取得最新的 metadata)
metadata, err = chain.ReloadMetadata()

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author