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地址:https://kaspa.aspectron.org/nightly/downloads/ 在项目根目录下添加wasm目录, 将下载的wasm文件中web目录下kaspa和kaspa-dev文件家…...
MySQL 数据库中 MyISAM 和 InnoDB 的区别:深入解析
MySQL 是目前最流行的开源数据库管理系统之一,支持多种存储引擎,其中最常用的就是 MyISAM 和 InnoDB。这两种存储引擎各有其特点,适用于不同的使用场景。理解它们之间的区别有助于数据库开发者和管理者根据应用需求选择合适的存储引擎。本文将…...
python中怎样实现闭包?
在Python中,闭包是指一个函数可以访问其自身范围之外的变量,即可以访问其外部函数作用域中的变量。要实现一个闭包,可以按照以下步骤进行: 内部函数引用外部函数的变量:在外部函数中定义一个内部函数,并在…...
论文阅读:MultiUI 利用网页UI进行丰富文本的视觉理解
《HARNESSING WEBPAGE UIS FOR TEXT-RICH VISUAL UNDERSTANDING》 利用网页UI进行丰富文本的视觉理解 总结 grounding和QA部分的数据集占比较大、同时消融实验显示其作用相对较大,并且grounding部分作用和效果呈现scaling正相关提供了很多web数据处理成多模态训练…...
【云原生】云原生后端详解:架构与实践
目录 引言一、云原生后端的核心概念1.1 微服务架构1.2 容器化1.3 可编排性1.4 弹性和可伸缩性 二、云原生后端的架构示意图三、云原生后端的最佳实践3.1 使用服务网格3.2 监控与日志管理3.3 CI/CD 流水线3.4 安全性 总结参考资料 引言 随着云计算的迅猛发展,云原生…...
MySQL覆盖索引
覆盖索引(Covering Index)是数据库优化中的一种重要技术 覆盖索引是指一个查询语句在执行时,所需的数据可以完全通过索引来获取,而无需访问实际的数据行。也就是说,查询语句所需的列都包含在了创建的索引中,…...
「C/C++」C/C++ 之 循环结构详解
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「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规范的数据; 1、全局引入json-server包 npm install -g json-server2、创建json格式的db.json文件 {"jsonData": [{"name": "小明"}] }3、在json文…...
华为配置BFD状态与接口状态联动实验
组网图形 图1 配置BFD状态与接口状态联动组网图 BFD简介配置注意事项组网需求配置思路操作步骤配置文件 BFD简介 为了减小设备故障对业务的影响,提高网络的可靠性,网络设备需要能够尽快检测到与相邻设备间的通信故障,以便及时采取措施&…...
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22目录1. PoisonedRAG: Knowledge corruption attacks to retrieval-augmented generation of large language models摘要创新点…...
理解消息队列
消息队列(Message Queue)有下面四大作用: 解耦。几个业务系统之间可以通过 MQ 解耦,例如做数据同步数据的顺序性和可恢复性异步通讯缓冲能力 理解 MQ MQ 的前两个特点且不说,我们看看另外两个的。 异步通讯&#x…...
!什么,matlab也有网页版了
已经脱离matlab一下下几天的困境了,是的,matlab也有网页版了 附上网址: MATLAB Login | MATLAB & Simulink...
安卓屏幕息屏唤醒
背景,今天遇项目需要,需要在下载在后台任务运行时(如下载、上传或进行长时间计算),保持 CPU 活动,然后就写了这个实现方法,废话不多说上代码 第一步,再清单AndroidManifest文件声明权…...
类文件具有错误的版本 61.0, 应为 55.0
启动项目的时候报这个错误. 项目所使用的redis版本是jdk17的,而我使用的是Java11.所以要将redis版本降下来。 另一种方式就是修改jdk的版本,在设置修改编译版本,在版本控制里面修改jdk的版本。...
vue点击菜单,出现2个相同tab,啥原因
点击菜单,出现相同的tab 出现的原因: 1.组件中的name 和配置路由文件js, 的大小写不一致导致 2、跳转的路由整个地址,大小写不一致大致...
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:HTTP为什么不安全 二:HTTPS加密过程 1:密码学中的概念 &…...
CentOS 修改服务器登录密码的完整指南
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...
【PnP】详细公式推导,使用DLT直接线性变换法求解相机外参
文章目录 🚀PnP1️⃣ 求解不考虑尺度的解2️⃣ 恢复解的尺度3️⃣ 另一种解法 🚀PnP PnP(Perspective-n-Point)是求解3D到2D点相机外参的算法。PnP算法有DLT直接线性变换、P3P三对点估计位姿、EPnP(Efficient PnP)、BA(Bundle Adjustment)光速法平差。这…...
怎样把书上的事件图改编成活动图-《分析模式》漫谈43
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》中模型图的UML改编,之前也有人做过,Martin Fowler网站上给出了部分改编成果。 这些改编成果只覆盖了部分章节,而且只是把类型图&#…...
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…...
监控场景下,视频SDK的应用策略
在当今数字化、智能化的时代背景下,音视频技术的快速发展正深刻改变着各行各业。特别是在监控领域,音视频SDK的应用不仅极大地提升了监控系统的性能与效率,还推动了监控技术的智能化转型。 一、音视频SDK 音视频SDK是一套集成了音视频编解码…...
前端面试必备!HTML 超实用考点全解析
在前端开发的广阔领域中,面试是检验开发者能力的关键环节。而 HTML 作为前端开发的基础,在面试中常常占据重要地位。无论是初入前端领域的新人,还是经验丰富的开发者,都可能在 HTML 的相关问题上遭遇挑战。今天,就让我…...
自动驾驶系统研发系列—避免事故的利器:AEB自动紧急制动系统详解
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学…...
zabbix 6.0 监控clickhouse(单机)
zabbix 6.0 LTS已经包含了clickhouse的监控模板,所以我们可以直接使用自带的模板来监控clickhouse了。 0.前置条件 clickhouse 已经安装,我安装的是24.3.5.47zabbix-agent 已经安装并配置。系统是ubuntu 2204 server 1. 新建监控用户 使用xml的方式为…...
Redis的RDB执行原理
文章目录 引入‘页表’的概念Copy-On-WriteRDB快照 引入‘页表’的概念 Linux里面每个进程都是无法直接操作物理内存的,每个进程只能用页表映射本进程的虚拟内存到物理内存的映射。 bgsave的时候,主进程会fork(复制)一个子进程&am…...
速度背!24下软考网工“经典100道母题来了”!
2024下软考已经迫在眉睫了,准备考下半年软考多媒体应用设计师的小伙伴们准备得怎么样了? 单单只啃书肯定不太够,今天给大家整理了多媒体100道经典题, 这些都是历年高频考点整理,包含24下软考80%以上考点,跟…...
three.js 纹理(Texture)、深度纹理(DepthTexture)、视频纹理(VideoTexture)
纹理(Texture) 创建一个纹理贴图,将其应用到一个表面,或者作为反射/折射贴图。 构造函数 Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) // load a texture, set wrap…...
广东自闭症全托机构:提供高质量的康复服务
在广东这片充满活力的土地上,自闭症儿童的康复需求日益受到社会各界的关注。在众多自闭症全托机构中,位于广州的星贝育园自闭症儿童寄宿制学校以其专业的团队、全面的服务体系以及显著的康复成效,成为了众多家庭的信赖之选。 星贝育园&#…...
Nodejs安装配置及创建vue项目
文章目录 Node简介Node官网安装node.js验证是否安装成功 npm简介配置node远程拉取仓库安装cnpm(国内插件管理命令)npm相关参数解读 vue简介创建vue项目 Node 简介 Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境,它让开发人员能…...
浅析正交投影矩阵和透视投影矩阵的推导
先上矩阵的内容。在opengl中,分别通过glOrtho函数和glFrustum函数得到正交投影矩阵和透视投影矩阵。 glOrtho 函数描述生成正交投影矩阵。 (左、 下、 近) 和 (右、 上、 近) 参数分别指定近剪裁平面上映射到窗口左下角和右上角的点,假定眼睛位于 (0、0…...
500m主机空间能做视频网站吗/游戏推广合作
最近蚂蚁金服的名字变了,全称已从“蚂蚁小微金融服务股份有限公司”改为“蚂蚁科技集团股份有限公司”。金服变为科技,浙江的区域标签也拿掉,凸显了数字化、全球战略的升级。这岂不意味着新一波的招聘需求?打开 boss 一看…...
枣庄市庄里水库建设管理处网站/网络视频营销
CPrimer第五版 习题答案 【总目录】:https://blog.csdn.net/Dust_Evc/article/details/114334124 练习4.1 表达式 5 10 * 20 / 2 的求值结果是多少? 105。 练习4.2 根据4.12节中的表,在下述表达式的合理位置添加括号,使得添加括…...
万网网站备案多久/百度广告商
如今智能手机大部分已经得到广泛的应用,可玩性的东西也是越来越多,但是手机时间用久了以后便会发现很卡,于是很多机友们都很想知道手机很卡怎么办,如何保持手机系统的流畅性呢?下面小编就为智能手机使用中占多数的安卓…...
基于aws ec2免费实例进行网站建设/营销策划书范文案例
介绍: 一个富有动感的Sheet(选择器), 支持背景虚化,背景暗化,支持快速拓展.支持从 Menu 中填充数据。运行效果: 使用说明: 上面是设计图,demo运行效果图: MainActivity.class 1234567891011121314151617181…...
wordpress去掉链接中的m/山东seo推广公司
原文 Oracle查看和修改其最大的游标数 以下的文章主要是介绍Oracle查看和修改其最大的游标数,本文主要是通过相关代码的方式来引出Oracle查看和修改其最大的游标数的实际操作步骤,以下就是文章的具体内容的描述,望你在浏览完之后,…...
12380网站的建设情况/电商关键词查询工具
在原生中事件调用就需要加上on,例如:onmouseenter,onclick, 但是由于jquery自己封装了,不属于原生,所以我们在调用事件的时候不会用到on $(document).ready(function(){ $(".parent").mouseenter(function(){ $(".…...