当前位置: 首页 > news >正文

Kaspa钱包ts代码封装

文章目录

    • 1. 配置wasm
    • 2. 钱包地址创建
    • 3. KAS转账&余额查询
    • 4. KRC-20 处理
    • 5. 使用demo

1. 配置wasm

下载wasm地址:https://kaspa.aspectron.org/nightly/downloads/
在项目根目录下添加wasm目录, 将下载的wasm文件中web目录下kaspa和kaspa-dev文件家复制到项目wasm下

2. 钱包地址创建

import { EventEmitter } from 'events';
import {kaspaToSompi,type IPaymentOutput,createTransactions,PrivateKey,UtxoProcessor,UtxoContext,RpcClient
} from "../wasm/kaspa-dev";class TransactionSender extends EventEmitter {private networkId: string;private privateKey: PrivateKey;private processor: UtxoProcessor;private context: UtxoContext;private rpc: RpcClient;constructor(networkId: string, privKey: PrivateKey, rpc: RpcClient) {super();this.networkId = networkId;this.privateKey = privKey;this.processor = new UtxoProcessor({ rpc, networkId });this.rpc = this.processor.rpc;this.context = new UtxoContext({ processor: this.processor });this.registerProcessor();}async transferFunds(address: string, amount: string): Promise<string> {const payments: IPaymentOutput[] = [{address: address,amount: kaspaToSompi(amount)!}];return await this.send(payments);}private async send(outputs: IPaymentOutput[]): Promise<string> {const { transactions, summary } = await createTransactions({entries: this.context,outputs,changeAddress: this.privateKey.toPublicKey().toAddress(this.networkId).toString(),priorityFee: kaspaToSompi("0.02")});for (let i = 0; i < transactions.length; i++) {await this.submitTransaction(transactions[i]);}return summary.finalTransactionId;}private async submitTransaction(transaction: any) {transaction.sign([this.privateKey]);await transaction.submit(this.rpc);}private registerProcessor() {this.processor.addEventListener("utxo-proc-start", async () => {await this.context.clear();await this.context.trackAddresses([this.privateKey.toPublicKey().toAddress(this.networkId).toString()]);});this.processor.start();}
}export default TransactionSender;

3. KAS转账&余额查询

import {RpcClient,Encoding,Resolver,PrivateKey,IGetServerInfoResponse,type IPaymentOutput,kaspaToSompi,createTransactions,IGetBalanceByAddressResponse
} from "../wasm/kaspa-dev";
import {IGetBalanceByAddressRequest, UtxoEntryReference} from "../wasm/kaspa";class Sender {public client: RpcClient;private network: string;constructor(network: string = 'testnet-10') {this.network = network;this.client = new RpcClient({resolver: new Resolver(),encoding: Encoding.Borsh,networkId: network});}public async connect() {await this.client.connect();}public async disconnect() {await this.client.disconnect();}public async getServerInfo(): Promise<IGetServerInfoResponse> {return await this.client.getServerInfo()}public async transfer(fromPrivateKey: string, address: string, amount: string): Promise<string> {try {const privateKey = new PrivateKey(fromPrivateKey);const sourceAddress = privateKey.toKeypair().toAddress(this.network);let {entries} = (await this.client.getUtxosByAddresses([sourceAddress]));const payments: IPaymentOutput[] = [{address: address,amount: kaspaToSompi(amount)!}];return await this.send(privateKey, entries, payments);} catch (error) {return error}}private async send(privateKey: PrivateKey, entries: UtxoEntryReference[], outputs: IPaymentOutput[]): Promise<string> {const { transactions, summary } = await createTransactions({entries: entries,outputs,changeAddress: privateKey.toPublicKey().toAddress(this.network).toString(),priorityFee: kaspaToSompi("0"),networkId: this.network});for (const transaction of transactions) {transaction.sign([privateKey]);await transaction.submit(this.client);}return summary.finalTransactionId;}// Method to get the balance of the addresspublic async getBalance(address: string): Promise<IGetBalanceByAddressResponse> {const balanceRequest: IGetBalanceByAddressRequest = {address: address,};return this.client.getBalanceByAddress(balanceRequest);}
}export default Sender;

4. KRC-20 处理

import {RpcClient, Encoding, Resolver, ScriptBuilder, Opcodes, PrivateKey,addressFromScriptPublicKey, createTransactions, kaspaToSompi, createTransaction, calculateTransactionFee
} from "../wasm/kaspa";const u64MaxValue = 18446744073709551615;
const baseKasToP2SHAddress = "1.3";export interface KRC20Data {p: "krc-20";op: 'mint' | 'deploy' | 'transfer';tick: string;to?: string;amt?: string;max?: string;lim?: string;dec?: "8";pre?: string;
}class KRC20 {public client: RpcClient;private network: string;constructor(network: string = 'testnet-10') {this.network = network;this.client = new RpcClient({resolver: new Resolver(),encoding: Encoding.Borsh,networkId: network});}public async connect() {await this.client.connect();}public async disconnect() {await this.client.disconnect();}public async mint(_privateKey: string, data: KRC20Data) {return this.send(_privateKey, data)}public async deploy(_privateKey: string, data: KRC20Data) {return this.send(_privateKey, data)}public async transfer(_privateKey: string, data: KRC20Data) {return this.send(_privateKey, data)}public async send(_privateKey: string, data: KRC20Data) {const privateKey = new PrivateKey(_privateKey);const publicKey = privateKey.toPublicKey();const address = publicKey.toAddress(this.network);const script = new ScriptBuilder().addData(privateKey.toPublicKey().toXOnlyPublicKey().toString()).addOp(Opcodes.OpCheckSig).addOp(Opcodes.OpFalse).addOp(Opcodes.OpIf).addData(Buffer.from("kasplex")).addI64(0n).addData(Buffer.from(JSON.stringify(data, null, 0))).addOp(Opcodes.OpEndIf);let scriptPublicKey = script.createPayToScriptHashScript()const P2SHAddress = addressFromScriptPublicKey(scriptPublicKey, this.network)!;try {const {entries} = await this.client.getUtxosByAddresses({addresses: [address.toString()]});const {transactions, summary} = await createTransactions({priorityEntries: [],entries,outputs: [{address: P2SHAddress.toString(),amount: kaspaToSompi(baseKasToP2SHAddress)!}],changeAddress: address.toString(),priorityFee: kaspaToSompi("0"),networkId: this.network});for (const transaction of transactions) {transaction.sign([privateKey]);await transaction.submit(this.client);}const hash = summary.finalTransactionIdconsole.log(`summary finalTransactionId transaction on: ${hash}`, 'INFO');var revealEntries = [{"address": P2SHAddress.toString(),"amount":kaspaToSompi(baseKasToP2SHAddress)!,"outpoint":{"transactionId":hash,"index":0},"scriptPublicKey":"0000" + scriptPublicKey.script,"blockDaaScore":u64MaxValue,"isCoinbase":false}];var fee = kaspaToSompi(this.getFee(data.op))!.valueOf()let tx = createTransaction(revealEntries, [], kaspaToSompi("0")!)fee = fee + calculateTransactionFee(this.network, tx).valueOf()return await this.sendRevealTransaction(privateKey, address, revealEntries, script, fee)} catch (error) {return error}}// Helper function to determine the KASPA amount based on the operation typeprivate getFee(optype): string {switch (optype) {case 'deploy':return "1000";case 'mint':return "1";case 'transfer':return "1";default:return "2";  // Default to "2" if the operation is unknown}}public async sendRevealTransaction(privateKey, address, revealEntries, script, fee) {const { transactions, summary } = await createTransactions({priorityEntries: revealEntries,entries: revealEntries,outputs: [],changeAddress: address.toString(),priorityFee: fee,networkId: this.network});for (const transaction of transactions) {transaction.sign([privateKey], false);const ourOutput = transaction.transaction.inputs.findIndex((input) => input.signatureScript === '');if (ourOutput !== -1) {const signature = await transaction.createInputSignature(ourOutput, privateKey);transaction.fillInput(ourOutput, script.encodePayToScriptHashSignatureScript(signature));}await transaction.submit(this.client);}return summary.finalTransactionId}}
export default KRC20;

5. 使用demo

import Rpc from "./src/transaction";
import KRC20 from "./src/script";//   -------------------------------------- server information --------------------------------------
// let rpc = new Rpc()
// await rpc.connect()
// let serverInfo = await rpc.getServerInfo()
// console.log("serverInfo;",serverInfo)
// if (!serverInfo.isSynced || !serverInfo.hasUtxoIndex) {
//   await rpc.disconnect();
//   process.exit(1);
// }//   -------------------------------------- KAS balance--------------------------------------
// let rpc = new Rpc()
// await rpc.connect()
// let address = "kaspatest:*******"
// let balance = await rpc.getBalance(address)
// console.log("balance:", balance)//   -------------------------------------- transfer KAS --------------------------------------
// let rpc = new Rpc()
// await rpc.connect()
// let privateKey = "****"
// let address = "kaspatest:****"
// let amount = "1"
// let txhash = await rpc.transfer(privateKey, address, amount)
// console.log("txhash;",txhash)//   -------------------------------------- mint --------------------------------------
let privateKey = "*****"
let krc20 = new KRC20()
await krc20.connect()
var mintdata = {p: "krc-20",op: 'mint',tick: "****"
}
let txid = await krc20.mint(privateKey, mintdata)
console.log("txsh", txid)// -------------------------------------- transfer --------------------------------------
// let krc20 = new KRC20()
// let privateKey = "****"
// await krc20.connect()
// var transferdata = {
//     p: "krc-20",
//     op: 'transfer',
//     tick: "SNOWDN",
//     to: "kaspatest:****",
//     amt: "1000000000",
// }
// let txid = await krc20.transfer(privateKey, transferdata)
// console.log("txsh", txid)// -------------------------------------- deploy --------------------------------------
// let krc20 = new KRC20()
// await krc20.connect()
// var deploydata = {
//     p: "krc-20",
//     op: 'deploy',
//     tick: "JEMES1",
//     to: "kaspatest:*****",
//     amt: "1000000000",
//     max: "1000000000000000",
//     lim: "1000000000",
//     dec: "8",
//     pre: "1000000000000000",
// }
// let txid = await krc20.deploy(privateKey, deploydata)
// console.log("txsh", txid)process.exit(1);

相关文章:

Kaspa钱包ts代码封装

文章目录 1. 配置wasm2. 钱包地址创建3. KAS转账&余额查询4. KRC-20 处理5. 使用demo 1. 配置wasm 下载wasm地址&#xff1a;https://kaspa.aspectron.org/nightly/downloads/ 在项目根目录下添加wasm目录&#xff0c; 将下载的wasm文件中web目录下kaspa和kaspa-dev文件家…...

MySQL 数据库中 MyISAM 和 InnoDB 的区别:深入解析

MySQL 是目前最流行的开源数据库管理系统之一&#xff0c;支持多种存储引擎&#xff0c;其中最常用的就是 MyISAM 和 InnoDB。这两种存储引擎各有其特点&#xff0c;适用于不同的使用场景。理解它们之间的区别有助于数据库开发者和管理者根据应用需求选择合适的存储引擎。本文将…...

python中怎样实现闭包?

在Python中&#xff0c;闭包是指一个函数可以访问其自身范围之外的变量&#xff0c;即可以访问其外部函数作用域中的变量。要实现一个闭包&#xff0c;可以按照以下步骤进行&#xff1a; 内部函数引用外部函数的变量&#xff1a;在外部函数中定义一个内部函数&#xff0c;并在…...

论文阅读:MultiUI 利用网页UI进行丰富文本的视觉理解

《HARNESSING WEBPAGE UIS FOR TEXT-RICH VISUAL UNDERSTANDING》 利用网页UI进行丰富文本的视觉理解 总结 grounding和QA部分的数据集占比较大、同时消融实验显示其作用相对较大&#xff0c;并且grounding部分作用和效果呈现scaling正相关提供了很多web数据处理成多模态训练…...

【云原生】云原生后端详解:架构与实践

目录 引言一、云原生后端的核心概念1.1 微服务架构1.2 容器化1.3 可编排性1.4 弹性和可伸缩性 二、云原生后端的架构示意图三、云原生后端的最佳实践3.1 使用服务网格3.2 监控与日志管理3.3 CI/CD 流水线3.4 安全性 总结参考资料 引言 随着云计算的迅猛发展&#xff0c;云原生…...

MySQL覆盖索引

覆盖索引&#xff08;Covering Index&#xff09;是数据库优化中的一种重要技术 覆盖索引是指一个查询语句在执行时&#xff0c;所需的数据可以完全通过索引来获取&#xff0c;而无需访问实际的数据行。也就是说&#xff0c;查询语句所需的列都包含在了创建的索引中&#xff0c…...

「C/C++」C/C++ 之 循环结构详解

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

json-server的基本使用

一、json-server工具的使用 可以快速的搭建符合RESTful API服务。返回符合RESTful规范的数据&#xff1b; 1、全局引入json-server包 npm install -g json-server2、创建json格式的db.json文件 {"jsonData": [{"name": "小明"}] }3、在json文…...

华为配置BFD状态与接口状态联动实验

组网图形 图1 配置BFD状态与接口状态联动组网图 BFD简介配置注意事项组网需求配置思路操作步骤配置文件 BFD简介 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网络设备需要能够尽快检测到与相邻设备间的通信故障&#xff0c;以便及时采取措施&…...

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22目录1. PoisonedRAG: Knowledge corruption attacks to retrieval-augmented generation of large language models摘要创新点…...

理解消息队列

消息队列&#xff08;Message Queue&#xff09;有下面四大作用&#xff1a; 解耦。几个业务系统之间可以通过 MQ 解耦&#xff0c;例如做数据同步数据的顺序性和可恢复性异步通讯缓冲能力 理解 MQ MQ 的前两个特点且不说&#xff0c;我们看看另外两个的。 异步通讯&#x…...

!什么,matlab也有网页版了

已经脱离matlab一下下几天的困境了&#xff0c;是的&#xff0c;matlab也有网页版了 附上网址&#xff1a; MATLAB Login | MATLAB & Simulink...

安卓屏幕息屏唤醒

背景&#xff0c;今天遇项目需要&#xff0c;需要在下载在后台任务运行时&#xff08;如下载、上传或进行长时间计算&#xff09;&#xff0c;保持 CPU 活动&#xff0c;然后就写了这个实现方法&#xff0c;废话不多说上代码 第一步&#xff0c;再清单AndroidManifest文件声明权…...

类文件具有错误的版本 61.0, 应为 55.0

启动项目的时候报这个错误. 项目所使用的redis版本是jdk17的&#xff0c;而我使用的是Java11.所以要将redis版本降下来。 另一种方式就是修改jdk的版本&#xff0c;在设置修改编译版本&#xff0c;在版本控制里面修改jdk的版本。...

vue点击菜单,出现2个相同tab,啥原因

点击菜单&#xff0c;出现相同的tab 出现的原因&#xff1a; 1.组件中的name 和配置路由文件js, 的大小写不一致导致 2、跳转的路由整个地址&#xff0c;大小写不一致大致...

【网络原理】——图解HTTPS如何加密(通俗简单易懂)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;HTTP为什么不安全 二&#xff1a;HTTPS加密过程 1&#xff1a;密码学中的概念 &…...

CentOS 修改服务器登录密码的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…...

【PnP】详细公式推导,使用DLT直接线性变换法求解相机外参

文章目录 &#x1f680;PnP1️⃣ 求解不考虑尺度的解2️⃣ 恢复解的尺度3️⃣ 另一种解法 &#x1f680;PnP PnP(Perspective-n-Point)是求解3D到2D点相机外参的算法。PnP算法有DLT直接线性变换、P3P三对点估计位姿、EPnP(Efficient PnP)、BA(Bundle Adjustment)光速法平差。这…...

怎样把书上的事件图改编成活动图-《分析模式》漫谈43

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》中模型图的UML改编&#xff0c;之前也有人做过&#xff0c;Martin Fowler网站上给出了部分改编成果。 这些改编成果只覆盖了部分章节&#xff0c;而且只是把类型图&#…...

CodeFormer——基于代码本查找变换器的鲁棒盲人脸修复翻译

文章目录 原文翻译摘要1 Introduction2 Related Work3 Methodology3.1 Codebook Learning (Stage I)3.2 Codebook Lookup Transformer Learning (Stage II)3.3 Controllable Feature Transformation (Stage III) 4 Experiments4.1 Datasets4.2 Experimental Settings and Metri…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...