UNPKG

@handcash/handcash-connect

Version:
6 lines (5 loc) 16.1 kB
"use strict";var A=Object.create;var v=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var R=(r,e)=>{for(var t in e)v(r,t,{get:e[t],enumerable:!0})},w=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of U(e))!H.call(r,s)&&s!==t&&v(r,s,{get:()=>e[s],enumerable:!(n=x(e,s))||n.enumerable});return r};var D=(r,e,t)=>(t=r!=null?A(B(r)):{},w(e||!r||!r.__esModule?v(t,"default",{value:r,enumerable:!0}):t,r)),M=r=>w(v({},"__esModule",{value:!0}),r);var L={};R(L,{Environments:()=>o,HandCashConnect:()=>y,HandCashConnectApiError:()=>m,HandCashMinter:()=>I,HandCashOwner:()=>f,HandCashPurse:()=>P,Permissions:()=>K,Types:()=>q});module.exports=M(L);var T=D(require("crypto"),1),E=require("@noble/curves/secp256k1");var b=require("nanoid"),S=require("@noble/curves/secp256k1"),O=require("node:crypto");var m=class extends Error{message;path;method;httpStatusCode;info;constructor(e){super(e.message),this.method=e.method,this.path=e.path,this.httpStatusCode=e.httpStatusCode,this.message=e.message,this.info=e.info,this.stack=e.stack}toString(){return JSON.stringify(this)}};var i=class r{privateKey;appSecret;appId;baseApiEndpoint;baseTrustholderEndpoint;constructor({authToken:e,appSecret:t,appId:n,baseApiEndpoint:s,baseTrustholderEndpoint:a}){if(e&&!S.secp256k1.utils.isValidPrivateKey(e))throw Error("Invalid authToken");if(!n)throw Error("Missing appId");this.privateKey=e,this.appSecret=t,this.appId=n,this.baseApiEndpoint=s,this.baseTrustholderEndpoint=a}getRequest(e,t,n={},s={}){let a=new Date().toISOString(),c=(0,b.nanoid)(),u=JSON.stringify(n)==="{}"?"":JSON.stringify(n),p=r.getEncodedEndpoint(t,s),d={"app-id":this.appId,...this.appSecret&&{"app-secret":this.appSecret},consumer:"connect-sdk","content-type":"application/json"};if(this.privateKey){let k=S.secp256k1.getPublicKey(this.privateKey);d["oauth-publickey"]=Buffer.from(k).toString("hex"),d["oauth-timestamp"]=a.toString(),d["oauth-nonce"]=c,d["oauth-signature"]=r.getRequestSignature(e,p,u,a,this.privateKey,c)}return{url:this.baseApiEndpoint+p,method:e,headers:d,...e!=="GET"&&{body:u}}}getTrustholderRequest(e,t,n,s={}){let a=r.getEncodedEndpoint(t,s);return{url:this.baseTrustholderEndpoint+a,method:e,headers:{"content-type":"application/json"},...e!=="GET"&&{body:JSON.stringify(n)}}}static getEncodedEndpoint(e,t){let n=new URL(e,"http://localhost");return Object.entries(t).forEach(([s,a])=>{n.searchParams.append(s,a)}),n.toString().replace("http://localhost","")}static getRequestSignature(e,t,n,s,a,c){let u=r.getRequestSignaturePayload(e,t,n,s,c),p=(0,O.createHash)("sha256").update(u).digest("hex");return S.secp256k1.sign(p,a).toDERHex(!0)}static getRequestSignaturePayload(e,t,n,s,a){return`${e} ${t} ${s} ${n}${a?` ${a}`:""}`}async getCurrentProfile(){let e=this.getRequest("GET","/v1/connect/profile/currentUserProfile");return r.handleRequest(e,new Error().stack)}async getPublicProfilesByHandle(e){let t=e.map((s,a)=>[`aliases[${a}]`,s]),n=this.getRequest("GET","/v1/connect/profile/publicUserProfiles",{},{...Object.fromEntries(t)});return r.handleRequest(n,new Error().stack)}async getUserPermissions(){let e=this.getRequest("GET","/v1/connect/profile/permissions");return r.handleRequest(e,new Error().stack)}async getEncryptionKeypair(e){let t=this.getRequest("GET","/v1/connect/profile/encryptionKeypair",{},{encryptionPublicKey:e});return r.handleRequest(t,new Error().stack)}async signData(e){let t=this.getRequest("POST","/v1/connect/profile/signData",{format:e.format,value:e.value});return r.handleRequest(t,new Error().stack)}async getUserFriends(){let e=this.getRequest("GET","/v1/connect/profile/friends");return r.handleRequest(e,new Error().stack)}async getSpendableBalance(e){let t=this.getRequest("GET","/v1/connect/wallet/spendableBalance",{},e?{currencyCode:e}:{});return r.handleRequest(t,new Error().stack)}async getTotalBalance(){let e=this.getRequest("GET","/v1/connect/wallet/balance");return r.handleRequest(e,new Error().stack)}async getDepositAddress(){let e=this.getRequest("GET","/v1/connect/wallet/address");return r.handleRequest(e,new Error().stack)}async pay(e){let t=this.getRequest("POST","/v1/connect/wallet/pay",{description:e.description,appAction:e.appAction,receivers:e.payments,attachment:e.attachment});return r.handleRequest(t,new Error().stack)}async payPaymentRequest(e){let t=this.getRequest("POST","/v3/wallet/transactions/send/paymentRequest",{paymentRequestId:e});return r.handleRequest(t,new Error().stack)}async getPayment(e){let t=this.getRequest("GET","/v1/connect/wallet/payment",{},{transactionId:e});return r.handleRequest(t,new Error().stack)}async getExchangeRate(e){let t=this.getRequest("GET",`/v1/connect/wallet/exchangeRate/${e}`);return r.handleRequest(t,new Error().stack)}async pursePay(e,t){let n=this.getRequest("POST","/v1/connect/runExtension/purse/pay",{rawTransaction:e,inputParents:t});return r.handleRequest(n,new Error().stack)}async purseBroadcast(e){let t=this.getRequest("POST","/v1/connect/runExtension/purse/broadcast",{rawTransaction:e});return r.handleRequest(t,new Error().stack)}async ownerNextAddress(e){let t=this.getRequest("GET","/v1/connect/runExtension/owner/next",{},{alias:e});return r.handleRequest(t,new Error().stack)}async ownerSign(e,t,n){let s=this.getRequest("POST","/v1/connect/runExtension/owner/sign",{rawTransaction:e,inputParents:t,locks:n});return r.handleRequest(s,new Error().stack)}async getNftLocations(){let e=this.getRequest("GET","/v1/connect/runExtension/owner/nftLocations");return r.handleRequest(e,new Error().stack)}async requestEmailCode(e,t){let n=this.getRequest("POST","/v1/connect/account/requestEmailCode",{email:e,customEmailParameters:t});return(await r.handleRequest(n,new Error().stack)).requestId.requestId}async verifyEmailCode(e,t,n){let s=this.getTrustholderRequest("POST","/auth/verifyCode",{requestId:e,verificationCode:t,publicKey:n});return r.handleRequest(s,new Error().stack)}async createNewAccount(e){let t=this.getRequest("POST","/v1/connect/account",e);return r.handleRequest(t,new Error().stack)}async getItemsInventory(e){let t=this.getRequest("POST","/v3/wallet/items/inventory",e);return r.handleRequest(t,new Error().stack)}async getItemListings(e){let t={...e,onlyUserListings:!0},n=this.getRequest("POST","/v3/itemListing/list",t);return r.handleRequest(n,new Error().stack)}async createOrder(e){let t=this.getRequest("POST","/v3/itemCreationOrder",e);return r.handleRequest(t,new Error().stack)}async getCreateItemsOrder(e){let t=this.getRequest("GET",`/v3/itemCreationOrder/${e}`);return r.handleRequest(t,new Error().stack)}async getItemsByOrder(e){let t=this.getRequest("GET",`/v3/itemCreationOrder/${e}/items`);return r.handleRequest(t,new Error().stack)}async addOrderItems({orderId:e,items:t,itemCreationOrderType:n}){let s=this.getRequest("POST",`/v3/itemCreationOrder/${e}/add`,{items:t,itemCreationOrderType:n});return r.handleRequest(s,new Error().stack)}async create(e){let t=this.getRequest("POST","/v3/itemCreationOrder/issueItems",e);return r.handleRequest(t,new Error().stack)}async burnAndCreateItems(e){let t=this.getRequest("POST","/v3/itemCreationOrder/burnAndCreate",e);return r.handleRequest(t,new Error().stack)}async commitOrder(e){let t=this.getRequest("POST",`/v3/itemCreationOrder/${e}/commit`);return r.handleRequest(t,new Error().stack)}async inscribeNextBatch(e){let t=this.getRequest("POST","/v3/itemCreationOrder/createBatch",{itemCreationOrderId:e});return r.handleRequest(t,new Error().stack)}async transferItems(e){let t=this.getRequest("POST","/v3/wallet/items/send",e);return r.handleRequest(t,new Error().stack)}async getLockedItems(e){let t=this.getRequest("GET","/v3/wallet/items/locked",{},e);return r.handleRequest(t,new Error().stack)}async lockItems(e){let t=this.getRequest("POST",`/v3/wallet/items/lock/${e}`);await r.handleRequest(t,new Error().stack)}async unlockItems(e){let t=this.getRequest("POST",`/v3/wallet/items/unlock/${e}`);await r.handleRequest(t,new Error().stack)}async getItemByOrigin(e){let t=this.getRequest("GET",`/v3/wallet/items/${e}`);return r.handleRequest(t,new Error().stack)}static async handleRequest(e,t){let n=await fetch(e.url,e);if(n.ok)return await n.json();throw await r.handleApiError({response:n,request:e,stack:t})}static async handleApiError({response:e,request:t,stack:n}){let s;if(e.headers.get("content-type")?.includes("application/json"))try{s=await e.json()}catch(a){s=e.bodyUsed?a.toString():await e.text()}return s??=e.bodyUsed&&await e.text(),new m({method:t.method,path:t.url,httpStatusCode:e.status,message:s.message??s,info:s.info,stack:n})}};var l=class{handCashConnectService;constructor(e){this.handCashConnectService=e}async getSpendableBalance(e){return this.handCashConnectService.getSpendableBalance(e)}async getTotalBalance(){return this.handCashConnectService.getTotalBalance()}async getDepositAddress(){return this.handCashConnectService.getDepositAddress().then(e=>e.base58Address)}async pay(e){return this.handCashConnectService.pay(e)}async getPayment(e){return this.handCashConnectService.getPayment(e)}async getExchangeRate(e){return this.handCashConnectService.getExchangeRate(e)}};var h=class{handCashConnectService;constructor(e){this.handCashConnectService=e}async getCurrentProfile(){return this.handCashConnectService.getCurrentProfile()}async getPublicProfilesByHandle(e){return this.handCashConnectService.getPublicProfilesByHandle(e).then(t=>t.items)}async getFriends(){return this.handCashConnectService.getUserFriends().then(e=>e.items)}async getPermissions(){return this.handCashConnectService.getUserPermissions().then(e=>e.items)}async getPermissionsInfo(){return this.handCashConnectService.getUserPermissions().then(e=>e)}async signData(e){return this.handCashConnectService.signData(e)}};var g=class{handCashConnectService;constructor(e){this.handCashConnectService=e}async getItemsInventory(e){return this.handCashConnectService.getItemsInventory(e).then(t=>t.items)}async getItemListings(e){return this.handCashConnectService.getItemListings(e).then(t=>t.items)}async transfer(e){return this.handCashConnectService.transferItems(e)}async getItemByOrigin(e){return this.handCashConnectService.getItemByOrigin(e)}async getLockedItems(e){return(await this.handCashConnectService.getLockedItems(e)).items}async lockItems(e){return this.handCashConnectService.lockItems(e)}async unlockItems(e){return this.handCashConnectService.unlockItems(e)}};var C=class r{wallet;profile;items;constructor(e,t,n){this.wallet=e,this.profile=t,this.items=n}static fromAuthToken({authToken:e,appSecret:t,appId:n,baseApiEndpoint:s,baseTrustholderEndpoint:a}){if(!t)throw Error("Missing appSecret");let c=new i({authToken:e,baseApiEndpoint:s,baseTrustholderEndpoint:a,appSecret:t,appId:n}),u=new l(c),p=new h(c),d=new g(c);return new r(u,p,d)}};var N={prod:{apiEndpoint:"https://cloud.handcash.io",clientUrl:"https://app.handcash.io",trustholderEndpoint:"https://trust.hastearcade.com"},qae:{apiEndpoint:"https://qae.cloud.handcash.io",clientUrl:"https://qa-market.handcash.io",trustholderEndpoint:"https://trustholder-service.qae.cloud.handcash.io"},iae:{apiEndpoint:"https://iae.cloud.handcash.io",clientUrl:"https://iae-app.handcash.io",trustholderEndpoint:"https://trustholder-service.iae.cloud.handcash.io"}},o=N;var y=class{appId;appSecret;handCashConnectService;env;constructor({appId:e,appSecret:t,env:n=o.prod}){this.appId=e,this.appSecret=t,this.env=n,this.handCashConnectService=new i({appId:this.appId,appSecret:this.appSecret,baseApiEndpoint:this.env.apiEndpoint,baseTrustholderEndpoint:this.env.trustholderEndpoint})}getRedirectionUrl(e={}){e.appId=this.appId;let t=Object.entries(e).map(([n,s])=>`${encodeURIComponent(n)}=${encodeURIComponent(s.toString())}`).join("&");return`${this.env.clientUrl}/#/authorizeApp?${t}`}getChangeSpendLimitsUrl(e){return`${this.env.clientUrl}/#/settings/spendLimits`+(e?`?redirectUrl=${e}`:"")}generateAuthenticationKeyPair=()=>{let e=E.secp256k1.utils.randomPrivateKey(),t=E.secp256k1.getPublicKey(e,!0);return{privateKey:Buffer.from(e).toString("hex"),publicKey:Buffer.from(t).toString("hex")}};requestEmailCode(e,t){return this.handCashConnectService.requestEmailCode(e,t)}verifyEmailCode(e,t,n){return this.handCashConnectService.verifyEmailCode(e,t,n)}createNewAccount(e,t){return this.handCashConnectService.createNewAccount({accessPublicKey:e,email:t})}createAccount(e){return this.handCashConnectService.createNewAccount(e)}getAccountFromAuthToken(e){return C.fromAuthToken({authToken:e,appSecret:this.appSecret,appId:this.appId,baseApiEndpoint:this.env.apiEndpoint,baseTrustholderEndpoint:this.env.trustholderEndpoint})}getWebhookEvent=(e,t)=>{if(!e)throw new Error("No signature provided");let n=new Date(new Date().getTime()-5*6e4);if(new Date(t.created)<n)throw new Error("Timestamp is too old");let s=T.default.createHmac("sha256",this.appSecret);if(s.update(JSON.stringify(t)),s.digest("hex")!==e)throw new Error("Invalid signature");switch(t.event){case"item_listing_payment_completed":return t;case"items_transferred":return t;case"item_creation_order_completed":return t;default:throw new Error(`Unknown event type: ${t.event}`)}}};var P=class r{handCashConnectService;constructor(e){this.handCashConnectService=e}static fromAuthToken(e,t=o.prod,n="",s=""){let a=new i({authToken:e,baseApiEndpoint:t.apiEndpoint,baseTrustholderEndpoint:t.trustholderEndpoint,appSecret:n,appId:s});return new r(a)}async pay(e,t){return(await this.handCashConnectService.pursePay(e,t)).partiallySignedTx}async broadcast(e){await this.handCashConnectService.purseBroadcast(e)}};var f=class r{handCashConnectService;constructor(e){this.handCashConnectService=e}static fromAuthToken(e,t=o.prod,n="",s=""){let a=new i({authToken:e,baseApiEndpoint:t.apiEndpoint,baseTrustholderEndpoint:t.trustholderEndpoint,appSecret:n,appId:s});return new r(a)}async nextOwner(e){return(await this.handCashConnectService.ownerNextAddress(e)).ownerAddress}async sign(e,t,n){return(await this.handCashConnectService.ownerSign(e,t,n)).signedTransaction}async getNftLocations(){return(await this.handCashConnectService.getNftLocations()).nftLocations}};var I=class r{handCashConnectService;static fromAppCredentials(e){let t=e.env||o.prod;return new r({handCashConnectService:new i({appId:e.appId,appSecret:e.appSecret,authToken:e.authToken,baseApiEndpoint:t.apiEndpoint,baseTrustholderEndpoint:t.trustholderEndpoint})})}constructor({handCashConnectService:e}){this.handCashConnectService=e}async createItemsOrder(e){return this.handCashConnectService.create({items:e.items,itemCreationOrderType:"collectionItem",referencedCollection:e.collectionId,uid:e.uid})}async burnAndCreateItemsOrder(e){let t=e.issue?{items:e.issue.items,uid:e.issue.uid,referencedCollection:e.issue.collectionId,itemCreationOrderType:"collectionItem"}:void 0;return this.handCashConnectService.burnAndCreateItems({issue:t,burn:e.burn})}async createCollectionOrder(e){return this.handCashConnectService.create({items:[e],itemCreationOrderType:"collection"})}createCollectionItemsOrder(e){return this.handCashConnectService.createOrder({items:[],itemCreationOrderType:"collectionItem",referencedCollection:e})}async addOrderItems(e){return this.handCashConnectService.addOrderItems(e)}commitOrder(e){return this.handCashConnectService.commitOrder(e)}inscribeNextBatch(e){return this.handCashConnectService.inscribeNextBatch(e)}getOrder(e){return this.handCashConnectService.getCreateItemsOrder(e)}getOrderItems(e){return this.handCashConnectService.getItemsByOrder(e).then(t=>t.items)}payPaymentRequest(e){return this.handCashConnectService.payPaymentRequest(e)}};var q={};R(q,{sortableFields:()=>G});var G={name:"name"};var K={Pay:"PAY",UserPublicProfile:"USER_PUBLIC_PROFILE",UserPrivateProfile:"USER_PRIVATE_PROFILE",Friends:"FRIENDS",Decryption:"DECRYPTION",SignData:"SIGN_DATA",ReadBalance:"READ_BALANCE"};0&&(module.exports={Environments,HandCashConnect,HandCashConnectApiError,HandCashMinter,HandCashOwner,HandCashPurse,Permissions,Types});